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

Arduino:Примеры/MasterWriter

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

Перевод: Максим Кузьмин (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-линии.

Начальные 8 бит (т.е. 8 тактовых импульсов) от ведущего устройства к ведомому содержат адрес девайса, от которого ведущее устройство хочет получить данные. Последующие биты содержат адрес памяти у ведомого устройства, откуда ведущее устройство хочет сосчитать данные или записать их туда.

У каждого ведомого устройства есть собственный уникальный адрес, причем и ведущее устройство, и ведомое поочередно коммуницируют по одной и той же линии. Таким образом, ваша Arduino может «общаться» с несколькими девайсами или другими Arduino, используя лишь два своих контакта и уникальные адреса других устройств.

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

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

Цепь

5-ый (SCL) и 4-ый (SDA) контакты на ведущей Arduino 1 подключите к 5-ому и 4-ому контактам на ведомой Arduino 2. Кроме того, убедитесь, что контакты с «землей» у обеих плат тоже подключены друг к другу. Также, чтобы иметь возможность запустить последовательную передачу данных, ведомая Arduino должна быть через 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. }
  18.  
  19. byte x = 0;
  20.  
  21. void loop()
  22. {
  23.   Wire.beginTransmission(4); // начинаем передачу девайсу #4
  24.   Wire.write("x is ");       // отправляем 5 байт
  25.   Wire.write(x);             // отправляем 1 байт  
  26.   Wire.endTransmission();    // останавливаем передачу данных
  27.  
  28.   x++;
  29.   delay(500);
  30. }

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

  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.  
  13. #include <Wire.h>
  14.  
  15. void setup()
  16. {
  17.   Wire.begin(4);                // подключаем шину I2C с адресом #4
  18.   Wire.onReceive(receiveEvent); // регистрируем событие
  19.   Serial.begin(9600);           // запускаем последовательную передачу данных, чтобы отображать данные на Serial Monitor
  20. }
  21.  
  22. void loop()
  23. {
  24.   delay(100);
  25. }
  26.  
  27. // Эта функция будет выполнятся всякий раз, когда от ведущей платы
  28. // будут получены какие-либо данные.
  29. // Она зарегистрирована как событие (см. блок setup):
  30. void receiveEvent(int howMany)
  31. {
  32.   while(1 < Wire.available()) // пробегаемся по всем, кроме последнего
  33.   {
  34.     char c = Wire.read();     // получаем байт как символ
  35.     Serial.print(c);          // показываем символ на Serial Monitor
  36.   }
  37.   int x = Wire.read();        // получаем байт как целое число
  38.   Serial.println(x);          // показываем это целое число на Serial Monitor
  39. }

См.также

  1. Wire.begin()
  2. Wire.beginTransmission()
  3. Wire.endTransmission()
  4. Wire.send()
  5. Wire.OnReceive()
  6. Wire.available)
  7. Wire Library
  8. digital_potentiometer
  9. master_reader

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

  1. Arduino - Master Writer/Slave Receiver