Arduino:Примеры/MasterReader

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

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


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

См.также

  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

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