Рубрики
Схемы на Arduino

Взаимодействие Arduino и Raspberry Pi с помощью последовательной связи

В настоящее время Raspberry Pi и Arduino являются самыми популярными платами с открытым исходным кодом. Причем они популярны не только среди инженеров электроники, но также среди школьников, студентов и просто энтузиастов благодаря простоте в их освоении. Но на их основе можно не только конструировать какие-нибудь простые устройства, но и делать весьма сложные проекты.

В этой статье мы рассмотрим взаимодействие плат Raspberry Pi и Arduino с помощью последовательной связи через порты USB. Когда это может быть востребовано? Дело в том, что Raspberry Pi имеет 26 контактов ввода-вывода общего назначения, но не имеет ни одного канала АЦП. Поэтому взаимодействие Raspberry Pi с рядом устройств и датчиков несколько осложнено. Также в некоторых проектах количество контактов платы Raspberry Pi может быть недостаточно. Поэтому, установив последовательную связь Raspberry Pi с Arduino, мы можем задействовать все функции платы Arduino Uno так же, как если бы они были функциями платы Raspberry Pi.

Внешний вид этих плат показан на следующем рисунке.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Плата Raspberry Pi 2 Model B или другая аналогичная (купить на AliExpress).
  3. Резистор 220 Ом или 1 кОм (2 шт.).
  4. Кнопка.
  5. Источник питания.
  6. Соединительные провода.

Работа схемы

Схема устройства представлена на следующем рисунке.

На схеме видно, что мы соединили USB порт платы Arduino Uno с USB портом платы Raspberry Pi при помощи USB кабеля. На плате Raspberry Pi четыре USB порта – вы можете выбрать любой из них. Кнопка на схеме нужна для запуска процесса последовательной связи, а светодиод – для индикации того, что данные переданы.

Объяснение работы программ

Программа для Arduino Uno

Вначале необходимо подсоединить плату Arduino Uno к компьютеру и загрузить в нее программу, приведенную в конце данной статьи. Затем необходимо отсоединить плату Arduino Uno от компьютера и соединить ее с платой Raspberry Pi, а также подсоединить к ней кнопку и светодиод как показано на представленной выше схеме.

В программе происходит инициализация последовательной связи платы Arduino Uno. Когда мы будем нажимать кнопку, подключенную к Arduino Uno, она будет передавать на плату Raspberry Pi несколько символов. После их передачи загорится светодиод, свидетельствующий о том, что данные были переданы.

Программа для Raspberry Pi

Также мы должны написать программу для Raspberry Pi (представлена в конце статьи) чтобы она могла принять данные, переданные ей платой Arduino Uno. Рассмотрим несколько команд, которые нам понадобятся для этого.

Мы будем задействовать библиотеку последовательной связи, с помощью которой мы сможем последовательно передавать или принимать данные при помощи USB порта.

import serial

После этого мы должны установить параметры последовательной связи (в первую очередь скорость), чтобы мы могли принимать данные от Arduino Uno без ошибок. Ниже приведенная команда задействует последовательную связь на порту ACM0 со скоростью 9600 бит/с.

ser = serial.Serial('/dev/ttyACM0', 9600)

Чтобы определить к какому порту подключена плата Arduino Uno, мы должны в терминале Raspberry Pi ввести команду:

ls /dev/tty*

В результате выполнения этой команды вы увидите список всех устройств, подключенных к Raspberry Pi. Теперь соедините Arduino Uno с Raspberry Pi с помощью USB кабеля и введите команду снова. После этого вы легко сможете определить к какому порту подключена Arduino Uno.

Следующая команда формирует бесконечный цикл – команды внутри него будут выполняться снова и снова.

While 1:

После приема данных последовательно мы можем отобразить принятые символы на экране Raspberry Pi.

print (ser.readline())

То есть после нажатия кнопки, подключенной к плате Arduino Uno, мы увидим переданные символы на экране Raspberry Pi. Таким образом, мы установили своеобразное коммуникационное «рукопожатие» между Arduino Uno и Raspberry Pi.

Исходный код программ

Код программы для Arduino Uno.

void setup()
{
pinMode(2,INPUT); // PIN2 конфигурируем в режим ввода данных
pinMode(3,OUTPUT); // PIN3 конфигурируем в режим вывода данных
Serial.begin(9600); // последовательная связь со скоростью 9600 бит/с
}
void loop() // бесконечный цикл
{
if(digitalRead(2)==LOW) // если кнопка нажата
{
digitalWrite(3,HIGH); // зажечь светодиод, подключенный к PIN3
Serial.println( "ButtonPressed" ); // передать строку "ButtonPressed" по последовательному каналу связи
delay(200); // ждем 200 миллисекунд
digitalWrite(3,LOW); // выключаем светодиод
}
}

Код программы для  Raspberry Pi.

import time
import serial
ser = serial.Serial('/dev/ttyACM0', 9600) # задействовать последовательный порт
while 1: # бесконечный цикл
ser.readline() # считать последовательные данные, переданные платой Arduino Uno
print (ser.readline()) # напечатать на экране данные, переданные платой Arduino Uno

Видео, демонстрирующее работу схемы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *