Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/MasterReader

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ведущий считывает/ведомый отправляет[1]

В некоторых ситуациях может быть полезно использовать не одну, а две (или больше!) платы Arduino, чтобы они обменивались информацией друг с другом. В этом примере две Arduino будут запрограммированы таким образом, чтобы «общаться» друг с другом по принципу «ведущий считывает / ведомый отправляет» через синхронный последовательный протокол I2C. Для того, чтобы выполнить эту задачу, нам понадобятся ряд функций из библиотеки Wire. Плата Arduino 1 (т.е. ведущее устройство) будет запрограммирована таким образом, чтобы делать запрос, а затем считывать 6 байтов, присланных от Arduino 2 (т.е. от ведомого устройства) с уникальным адресом. Кода сообщение будет получено, его можно будет наблюдать в окне Serial Monitor.

В протоколе I2C для отправки и передачи данных используется два контакта: Serial Clock (SCL), через который Arduino отбивает тактовый импульс, и Serial Data (SDA), по которому и проходит обмен данными между девайсами.

Если тактовый импульс меняется с LOW на HIGH (этот сценарий известен как «положительный фронт тактового сигнала»), Arduino через SDA-линию отсылает I2C-девайсу бит информации, содержащий адрес конкретного устройства, а также запрос на отправку данных. Если тактовый импульс меняется с HIGH на LOW («отрицательный фронт тактового сигнала»), «разбуженный» I2C-девайс в ответ на запрос отсылает Arduino необходимые данные по той же SDA-линии.

Поскольку I2C-протокол позволяет всем подключенным девайсам иметь свой уникальный адрес, а оба устройства (и ведущее, и ведомое) обмениваются информацией по одной и той же линии, Arduino может коммуницировать с несколькими девайсами (но по очереди), при этом используя лишь два своих контакта.

Необходимое оборудование

  • Две платы Arduino;
  • Провода-перемычки;

Цепь

4-ый (SDA) и 5-ый (SCL) контакты ведущей Arduino 1 подключите к 4-ому и 5-ому контактам ведомой Arduino 2. Также убедитесь, что контакты с «землей» у обеих плат тоже подключены друг к другу. Кроме того, чтобы иметь возможность запустить последовательную передачу данных, ведущая Arduino 1 должна быть через USB подключена к компьютеру.

Если независимое питание плат сделать затруднительно, подключите 5V-контакт ведущей Arduino к VIN-контакту на ведомой.

Master Sender bb.png

Схема

Master Sender sch.png

Код

Код для ведущей платы, т.е. для Arduino 1:

  1. // Пример «Ведущая считывающая плата; библиотека Wire»
  2. // от Николаса Замбетти (Nicholas Zambetti, http://www.zambetti.com)
  3.  
  4. // Демонстрирует использование библиотеки Wire.
  5. // Считывает данные от ведомого устройства через I2C/TWI.
  6. // Работает в паре с примером «Ведомая отправляющая плата, библиотека // Wire».
  7.  
  8. // Создан 29 марта 2006.
  9.  
  10. // Этот пример не защищен авторским правом.
  11.  
  12. #include <Wire.h>
  13.  
  14. void setup()
  15. {
  16.   Wire.begin();         // запускаем шину I2C (для ведомой платы адрес опционален)
  17.    Serial.begin(9600);   // запускаем последовательную передачу данных
  18. }
  19.  
  20. void loop()
  21. {
  22.   Wire.requestFrom(2, 6);    // запрашиваем 6 байт у ведомой платы #2
  23.  
  24.   while(Wire.available())    // ведомая плата может отправить меньше, чем мы запрашиваем
  25.   {
  26.    char c = Wire.read();     //  отсылаем байт как char
  27.    Serial.print(c);          // отображаем присланный символ на Serial Monitor
  28.   }
  29.        
  30.    delay(500);
  31. }

Код для ведомой платы, т.е. для Arduino 2:

  1.  
  2. // Пример «Ведомая отправляющая плата, библиотека Wire»
  3. // от Николаса Замбетти (Nicholas Zambetti, http://www.zambetti.com).
  4.  
  5. // Демонстрирует использование библиотеки Wire.
  6. // Отправляет данные ведущему устройству через I2C/TWI.
  7. // Работает в паре с примером «Ведущая считывающая плата; библиотека Wire».
  8.  
  9. // Создан 29 марта 2006.
  10.  
  11. // Этот код не защищен авторским правом.
  12.  
  13. #include <Wire.h>
  14.  
  15. void setup()
  16. {
  17.   Wire.begin(2);                // подключаем шину I2C с адресом #2
  18.   Wire.onRequest(requestEvent); // зарегистрированное событие, которое будет возникать в ответ на вопрос
  19. }
  20.  
  21. void loop()
  22. {
  23.   delay(100);
  24. }
  25.  
  26. // Эта пользовательская функция будет выполняться всякий раз,
  27. когда ведущее устройство будет делать запрос данных.
  28. // Она зарегистрирована как событие (см. блок setup).
  29. void requestEvent()
  30. {
  31.   Wire.write("hello "); // отвечаем сообщением из 6 байтов, как ведущая плата того и ждет
  32. }

См.также

  1. Wire.begin()
  2. Wire.RequestFrom()
  3. Wire.receive()
  4. Wire.send()
  5. Wire.onRequest()
  6. Wire Library
  7. digital_potentiometer
  8. Master Writer/Slave Receiver

Внешние ссылки

  1. Arduino - Master Reader/Slave Sender