Простой проект в котором происходит передача значения датчика, подключенного к одной Arduino, в другую с получением требуемого результата.
Компоненты
Для реализации данного урока нам потребуется набор компонентов. Обратите внимание, что нам понадобится две платы Ардуино:
- Arduino UNO × 2
- Светодиод LED (универсальный) × 1
- Поворотный потенциометр (универсальный) × 1
- Перемычки (на выбор) × 1
Программное обеспечение
Проект
Цель этого проекта проста - понять, как передавать данные с одной платы Arduino на другую. В этом случае передаваемое значение поступает от потенциометра, подключенного к первой плате Arduino. Если значение пересекает определенный порог, включается светодиод, подключенный ко второй плате Arduino.
Как перенести значения с одной платы Arduino на другую?
Существует много разных протоколов, которые могут быть реализованы для достижения вышеупомянутой цели. Здесь мы собираемся использовать протокол I2C с конфигурацией Master Writer / Slave.
Что такое протокол I2C?
Проще говоря, в протоколе связи I2C у вас есть 2 устройства, главное и подчиненное, которые связаны между собой двумя линиями, линией данных и линией синхронизации. В Arduino Uno линией данных является аналоговый вывод 4 (A4) и для тактового сигнала - аналоговый вывод 5 (A5), что может отличаться для разных плат.
Когда тактовый вывод переключается с низкого на высокий уровень, через вывод данных передается 1 бит данных. Затем подчиненная плата может либо отправлять обратно данные через тот же вывод данных, либо выполнять задачу (как в нашем случае). Однако первые 8 бит зарезервированы для адреса ведомой платы Arduino, на которую мастер отправляет значения.
Как работает проект и что он делает?
Используется аналоговое считывание на основной (главной) плате Arduino, чтобы получить значение подключенного к нему потенциометра. Затем это значение передается на подчиненную плату Arduino, и если оно превышает пороговое значение, загорается светодиод, подключенный к подчиненному Arduino.
Схема соединения
Схема соединения представлена на рисунке выше. Схемы такого плана очень удобно создавать в программном обеспечении Fritzing. Две платы должны иметь общее заземление, поэтому соедините заземления обеих плат вместе.
Как это получается в реальности можно посмотреть на фотографиях ниже.
Код проекта
Ниже представлены две программы: одна для главной платы и вторая для ведомой. Напоминаем, что директива #include ничего умного не делает, она просто целиком подставляет файл, который передан параметром директиве.
Для работы нам нужно обязательно загрузить библиотеку Wire, которую можно взять здесь.
Мастер код
// Код для Основной платы #include <Wire.h> // Эта библиотека используется для связи I2C int x; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { x = analogRead(A0); // Чтение значения с потенциометра x/=4; Wire.beginTransmission(9); // Цифра 9 - адрес ведомой платы Wire.write(x); // Передает значение потенциометра на ведомую плату Wire.endTransmission(); Serial.print(x); delay(1000); }
Наследник
// Код для ведомой платы #include <Wire.h> int x; void setup() { pinMode (13, OUTPUT); // Светодиод на пин (pin) 13 Wire.begin(9); // 9 здесь адрес (упоминается также в коде основной платы) Wire.onReceive(receiveEvent); Serial.begin(9600); } void receiveEvent(int bytes) { x = Wire.read(); // Получите значения от основной платы Serial.print(x); } void loop() { if (x > 88) { // Взято пороговое значение 88, вы можете изменить его на своё digitalWrite(LED, HIGH); delay(200); } else{ digitalWrite(LED, LOW); delay(400); } }
Чтобы подытожить идею проекту, нужно сказать, что есть много приложений для связи I2C, особенно в области IoT (Интернет вещей). Кроме того, этот пример также может быть использован в случае, когда не хватает контактов на плате для конкретного проекта и имеется несколько плат под рукой.