Arduino:Примеры/MasterReader
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Ведущий считывает/ведомый отправляет[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-контакту на ведомой.
Схема
Код
Код для ведущей платы, т.е. для Arduino 1:
// Пример «Ведущая считывающая плата; библиотека Wire»
// от Николаса Замбетти (Nicholas Zambetti, http://www.zambetti.com)
// Демонстрирует использование библиотеки Wire.
// Считывает данные от ведомого устройства через I2C/TWI.
// Работает в паре с примером «Ведомая отправляющая плата, библиотека // Wire».
// Создан 29 марта 2006.
// Этот пример не защищен авторским правом.
#include <Wire.h>
void setup()
{
Wire.begin(); // запускаем шину I2C (для ведомой платы адрес опционален)
Serial.begin(9600); // запускаем последовательную передачу данных
}
void loop()
{
Wire.requestFrom(2, 6); // запрашиваем 6 байт у ведомой платы #2
while(Wire.available()) // ведомая плата может отправить меньше, чем мы запрашиваем
{
char c = Wire.read(); // отсылаем байт как char
Serial.print(c); // отображаем присланный символ на Serial Monitor
}
delay(500);
}
Код для ведомой платы, т.е. для Arduino 2:
// Пример «Ведомая отправляющая плата, библиотека Wire»
// от Николаса Замбетти (Nicholas Zambetti, http://www.zambetti.com).
// Демонстрирует использование библиотеки Wire.
// Отправляет данные ведущему устройству через I2C/TWI.
// Работает в паре с примером «Ведущая считывающая плата; библиотека Wire».
// Создан 29 марта 2006.
// Этот код не защищен авторским правом.
#include <Wire.h>
void setup()
{
Wire.begin(2); // подключаем шину I2C с адресом #2
Wire.onRequest(requestEvent); // зарегистрированное событие, которое будет возникать в ответ на вопрос
}
void loop()
{
delay(100);
}
// Эта пользовательская функция будет выполняться всякий раз,
когда ведущее устройство будет делать запрос данных.
// Она зарегистрирована как событие (см. блок setup).
void requestEvent()
{
Wire.write("hello "); // отвечаем сообщением из 6 байтов, как ведущая плата того и ждет
}
См.также
- Wire.begin()
- Wire.RequestFrom()
- Wire.receive()
- Wire.send()
- Wire.onRequest()
- Wire Library
- digital_potentiometer
- Master Writer/Slave Receiver