Arduino:Примеры/MasterReader

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Ведущий считывает/ведомый отправляет[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

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