Подключение raspberry pi к arduino через usb
В этой статье мы покажем вам, как обмениваться данными между Raspberry Pi и платой Arduino через последовательный интерфейс.
Для начала, кратко объясним, что такое последовательный интерфейс. Затем посмотрим, как настроить оборудование и программное обеспечение, а затем углубимся в код Python (Cpp для Arduino). Разберем простой пример, ведущий к более совершенному использованию Raspberry Pi, Arduino и других электронных устройств.
Это руководство подходит для плат Raspberry Pi 4 (и ранних: 3B, 3B +) и любой платы Arduino. Мы будем использовать в основном Arduino Uno, но также более подробно расскажем о различиях между платами Arduino, когда дело касается последовательной передачи данных.
При работе с электронными устройствами передача данных является ключевым моментом. Каждое устройство – помимо своей основной функции – должно четко обмениваться данными с другими устройствами. Это одна из самых важных вещей, с которыми нужно уметь работать, чтобы перейти от очень простых приложений к более сложным.
Объяснение программы для Raspberry Pi
В плате Raspberry Pi значения угла поворота оси сервомотора (0,10,45,90,135,180,135,90,45,10,0) будут передаваться с помощью протокола RS-485 через последовательный порт плате Arduino Uno и управлять сервомотором, подключенным к ней. Для осуществления последовательной связи в Raspberry Pi в ней необходимо включить последовательный порт (UART). Для этого вам нужно выполнить следующую последовательность шагов:
1. Откройте терминал и напечатайте в нем sudo raspi-config.
2. В открывшемся меню выберите Interfacing options (настройки подключения).
3. В настройках подключения выберите serial (последовательную связь).
4. Затем нажмите на ‘No’ – этим мы отключаем консоль последовательной связи (UART console) в Linux.
5. После этого выйдите из настроек.
6. Перезагрузите Raspberry Pi.
Теперь последовательный порт готов к использованию.
Примечание : перед передачей данных в модуль RS-485 необходимо на контакты DE и RE данного модуля подать напряжение высокого уровня (HIGH).
Первым делом в программе необходимо подключить (импортировать) все необходимые библиотеки: time, serial (для последовательной связи), GPIO (для использования контактов ввода-вывода) и sleep.
One way to connect the Raspberry Pi and Arduino is by connecting the GPIO on the Raspberry Pi and the Serial Pins on the Arduino.
Because there is a voltage difference between the two device on these interface, a voltage divider or logic level converter would be required.
Check my article about connecting the two using I2C if you haven’t already seen it. Before we start, we need to set up the Raspberry Pi so it’s ready for serial communication.
- Buy the Arduino from: Banggood | Amazon
- Buy the Raspberry Pi from: Banggood | Amazon
1. In order to use the Raspberry Pi’s serial port, we need to disable getty (the program that displays login screen) by find this line in file /etc/inittab
2. To prevents the Raspberry Pi from sending out data to the serial ports when it boots, go to file /boot/cmdline.txt and find the line and remove it
3. reboot the Raspberry Pi using this command: sudo reboot
4. Now, Install minicom
And that’s the end of the software configuration.
Load this program on your Arduino first:
[sourcecode language=”cpp”]
byte number = 0;
void setup() Serial.begin(9600);
>
void loop() if (Serial.available()) number = Serial.read();
Serial.print(“character recieved: “);
Serial.println(number, DEC);
>
>
[/sourcecode]
Then connect your Arduino, Raspberry Pi and Logic Level Converter like this:
This is how the wires are connected.
And this is the GPIO pins on the Raspberry Pi. Make sure you connect the correct pin otherwise you might damage your Pi.
Программа для Arduino Uno
Вначале необходимо подсоединить плату Arduino Uno к компьютеру и загрузить в нее программу, приведенную в конце данной статьи. Затем необходимо отсоединить плату Arduino Uno от компьютера и соединить ее с платой Raspberry Pi, а также подсоединить к ней кнопку и светодиод как показано на представленной выше схеме.
В программе происходит инициализация последовательной связи платы Arduino Uno. Когда мы будем нажимать кнопку, подключенную к Arduino Uno, она будет передавать на плату Raspberry Pi несколько символов. После их передачи загорится светодиод, свидетельствующий о том, что данные были переданы.
Вы, наверное, уже знакомы с библиотекой Serial для Arduino
Когда вы используете монитор последовательного порта, в общем случае ваша среда разработки Arduino запускает последовательный интерфейс с вашим Arduino. Вы можете получать и отправлять данные прямо с монитора последовательного порта.
Давайте теперь посмотрим, как физически соединить две платы вместе.
Схема проекта
Для подключения модуля MAX485 TTL to RS-485 к плате Raspberry Pi мы будем использовать контакты GPIO14 и GPIO15 как показано на следующем рисунке.
Схема проекта последовательной связи с помощью интерфейса RS-485 между Raspberry Pi и Arduino Uno представлена на следующем рисунке.
В следующей таблице представлены необходимые соединения между платой Raspberry Pi 3 B+ (Master) и модулем RS-485.
Модуль RS-485 | Raspberry Pi 3 B+ |
DI | GPIO14 (TX) |
DE RE | GPIO4 |
R0 | GPIO15(RX) |
VCC | 5V |
GND | GND |
A | To A of Slave RS-485 |
B | To B of Slave RS-485 |
В следующей таблице представлены необходимые соединения между платой Arduino Uno (Slave) и модулем RS-485.
Модуль RS-485 | Arduino Uno |
DI | 1 (TX) |
DE RE | 2 |
R0 | 0 (RX) |
VCC | 5V |
GND | GND |
A | To A of Master RS-485 |
B | To B of Master RS-485 |
В следующей таблице представлены необходимые соединения между платой Arduino Uno и сервомотором SG-90.
Сервомотор SG-90 | Arduino Uno |
RED (красный) | +5V |
ORANGE (PWM) (оранжевый) | 3 |
BROWN (коричневый) | GND |
В следующей таблице представлены необходимые соединения между платой Arduino Uno и ЖК дисплеем 16x2.
ЖК дисплей 16x2 | Arduino Uno |
VSS | GND |
VDD | +5V |
V0 | к среднему контакту потенциометра для управления контрастностью ЖК дисплея |
RS | 8 |
RW | GND |
E | 9 |
D4 | 10 |
D5 | 11 |
D6 | 12 |
D7 | 13 |
A | +5V |
K | GND |
Схему проекта мы рассмотрели, можем приступать к написанию программ.
Общие принципы работы модуля MAX485 TTL to RS485
Для использования протокола RS-485 в данном проекте мы будем использовать модуль 5V MAX485 TTL to RS485, в основе которого лежит микросхема Maxim MAX485. Модуль является двунаправленным и обеспечивает последовательную связь на расстояние до 1200 метров. В полудуплексном режиме он обеспечивает скорость передачи данных 2,5 Мбит/с.
Модуль 5V MAX485 TTL to RS485 использует питающее напряжение 5V и логический уровень напряжения также 5V, что позволяет без проблем подключать его к платам Arduino.
Данный модуль имеет следующие особенности:
- работает с напряжениями 5V;
- имеет в своем составе чип MAX485;
- отличается низким энергопотреблением;
- всеми его контактами можно управлять с помощью микроконтроллера;
- размеры платы модуля: 44 x 14mm.
Внешний вид модуля RS-485 показан на следующем рисунке.
Назначение контактов (распиновка) модуля RS-485 приведена в следующей таблице.
Название контакта | Назначение контакта |
VCC | 5V |
A | вход/выход линии RS-485 |
B | вход/выход линии RS-485 |
GND | GND (0V) |
R0 | выход приемника (RX pin) |
RE | разрешение работы приемника |
DE | разрешение работы передатчика |
DI | вход передатчика (TX pin) |
Что такое последовательный интерфейс (UART)?
Последовательная передача данных – это просто способ их передачи. Данные отправляются последовательно, по одному биту (1 байт = 8 бит), в отличие от параллельной связи, когда одновременно отправляется много битов.
Исходный код программ
Код программы для 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.
Выбор протокола (интерфейса) связи между микроконтроллером и периферийными устройствами является важной частью встраиваемых систем. От правильности его выбора зависят многие параметры подобной системы: стоимость, скорость передачи данных, максимальное расстояние связи и т.д.
В одной из предыдущих статей на нашем сайте мы рассмотрели последовательную связь с помощью RS-485 между двумя платами Arduino, в этой же статье мы рассмотрим связь с помощью RS-485 между Raspberry Pi и Arduino Uno.
В данном проекте мы будем управлять углом поворота сервомотора, подключенного к плате Arduino Uno, с помощью передачи данных от платы Raspberry Pi к плате Arduino Uno с помощью интерфейса последовательной связи RS-485. Raspberry Pi будет ведущим устройством (Master), а плата Arduino Uno – ведомым (slave). На экране ЖК дисплея 16x2 мы будем показывать текущий угол поворота оси сервомотора.
1. С помощью USB
Самый простой способ – соединить обе платы кабелем USB.
Со стороны Raspberry Pi USB-разъем – это все, что вам нужно. Вы можете выбрать любой из 4 портов USB, имеющихся на плате.
Для Arduino вы будете использовать USB-порт, который вы используете для загрузки кода с вашего компьютера (со среды разработки Arduino) на вашу плату. Выбор USB-разъема зависит от того, какая у вас версия. Для таких плат, как Arduino Uno и Mega, разъем будет отличаться от Arduino Nano и от Arduino Zero.
В этом примере мы использовали плату Arduino Uno.
Как видите, это простейшее аппаратное соединение, которое вы можете установить между Raspberry Pi и Arduino.
Примечание: сначала вам нужно подключить Arduino к компьютеру, чтобы вы могли загрузить код в плату. После этого подключите USB-кабель к Raspberry Pi. Raspberry Pi будет питать Arduino через этот кабель
Объяснение работы программ
Example with Python Program
Using Python programming language, you can make Raspberry Pi do many fascinating stuff with the Arduino when they are connected. Install Py-Serial first:
Here’s a simple application that sends the string ‘testing’ over the GPIO serial interface
import serial
ser = serial.Serial(‘/dev/ttyAMA0’, 9600, timeout=1)
ser.open()
ser.write(“testing”)
try:
while 1:
response = ser.readline()
print response
except KeyboardInterrupt:
ser.close()
To exit, press CTRL + C
Apart from replacing the Login Level Converter with a voltage divider, the way it works is the same as above. Anyway, I will show you a different example to demonstrate this. A voltage divider is basically just two resistors.
There is something you should be aware of before we continue. The RX pin on the Arduino is held at 5 Volts even when it is not initialized. The reason could be that the Arduino is flashed from the Arduino IDE through these pins when you program it, and there are weak external pull-ups to keep the lines to 5 Volts at other times. So this method might be risky. I recommend using a proper level converter, if you insist on doing it this way, try adding a resistor in series to the RX pin, and never connect the Raspberry Pi to Arduino RX pin before you flash the program to Arduino, otherwise you may end up with a damaged Pi!
The Arduino serial pin is held at 5 volts and Raspberry Pi’s at 3.3 volts. Therefore a voltage divider would be required, it’s basically just two resistors.
Here is the program you need to write to the Arduino board.
void setup() Serial.begin(9600);
>
void loop() if (Serial.available() > 0) int incoming = Serial.read();
Serial.print(“character recieved: “)
Serial.print(incoming, DEC);
>
>
[/sourcecode]
Now you can connect directly from your computer to the Raspberry Pi on the tty-device of the Arduino, just like we described above. (type below into your putty)
And as you type in characters in the console, you should see something like this:
Хотя Raspberry Pi и Arduino являются, по своей сути, разными аппаратными платформами по своей структуре, тем не менее, в современном мире они являются конкурирующими платформами с открытым исходным кодом. Обе эти платформы имеют достаточно большое сообщество во всем мире и хорошую поддержку. В этой статье мы постараемся показать как можно совместно использовать преимущества обеих этих платформ – мы будем с помощью платы Raspberry Pi и языка программирования Python управлять платой Arduino.
Мы будем использовать программное обеспечение PyFirmata чтобы передавать команды плате Arduino с помощью платы Raspberry Pi и скрипта на python. PyFirmata представляет собой пакет библиотек на языке python, который можно установить в Arduino чтобы осуществлять последовательную связь между скриптом на python на любом компьютере и платой Arduino. С помощью этого пакета библиотек можно считывать и записывать информацию на любые контакты платы Arduino. В данном случае мы будем запускать программу на python в Arduino используя Raspberry Pi.
Как настроить программное обеспечение Raspberry Pi?
Для Arduino не требуется никаких специальных настроек. Просто убедитесь, что вы скачали и установили среду разработки Arduino.
Однако, на вашем Raspberry Pi требуется несколько вещей, чтобы интерфейс заработал.
Подключитесь к Raspberry Pi через протокол SSH или с помощью экрана, мыши и клавиатуры, и откройте консоль. Если вы еще не установили ОС на плату, вы можете очень легко установить Raspbian или Ubuntu на SD-карту.
A Simple Example with Minicom
Now to connect to the Arduino via serial port using this command in putty or terminal
When you type a character into the console, it will received by the Arduino, and it will send the corresponding ASCII code back. Check here for ASCII Table. And there it is, the Raspberry Pi is talking to the Arduino over GPIO serial port.
To exit, press CTRL + A release then press Q
Принципы работы интерфейса последовательной связи RS-485
RS-485 представляет собой асинхронный интерфейс последовательной связи, не требующий для своей работы импульсов синхронизации. Для передачи двоичных данных от одного устройства к другому протокол использует дифференциальный сигнал.
Если следовать определению из википедии, дифференциальный сигнал представляет собой способ электрической передачи информации с помощью двух противофазных сигналов. В данном методе один электрический сигнал передаётся в виде дифференциальной пары сигналов, каждый по своему проводнику, но один представляет инвертированный сигнал другого, противоположный по знаку. Пара проводников может представлять собой витую пару, твинаксиальный кабель или разводиться по печатной плате. Приёмник дифференциального сигнала реагирует на разницу между двумя сигналами, а не на различие между одним проводом и потенциалом земли.
В нашем случае дифференциальный сигнал образуется при помощи использования положительного и отрицательного напряжения 5V. Интерфейс RS-485 обеспечивает полудуплексную связь (Half-Duplex) при использовании 2-х линий (проводов) и полноценную дуплексную связь (Full-Duplex) при использовании 4-х линий (проводов).
Основные особенности данного интерфейса:
- Максимальная скорость передачи данных в интерфейсе RS-485 – 30 Мбит/с.
- Максимальная дистанция связи – 1200 метров, что значительно больше чем в интерфейсе RS-232.
- Основным достоинством интерфейса RS-485 по сравнению с RS-232 является использование нескольких ведомых (multiple slave) при одном ведущем (single master) в то время как RS-232 поддерживает только одного ведомого.
- Максимальное число устройств, которое можно подключить по интерфейсу RS-485 – 32.
- Также к достоинствам интерфейса RS-485 относится хорошая помехоустойчивость вследствие использования дифференциального сигнала.
- RS-485 обеспечивает более высокую скорость передачи по сравнению с интерфейсом I2C.
Программа для Raspberry Pi
Также мы должны написать программу для Raspberry Pi (представлена в конце статьи) чтобы она могла принять данные, переданные ей платой Arduino Uno. Рассмотрим несколько команд, которые нам понадобятся для этого.
Мы будем задействовать библиотеку последовательной связи, с помощью которой мы сможем последовательно передавать или принимать данные при помощи USB порта.
После этого мы должны установить параметры последовательной связи (в первую очередь скорость), чтобы мы могли принимать данные от Arduino Uno без ошибок. Ниже приведенная команда задействует последовательную связь на порту ACM0 со скоростью 9600 бит/с.
ser = serial.Serial('/dev/ttyACM0', 9600)
Чтобы определить к какому порту подключена плата Arduino Uno, мы должны в терминале Raspberry Pi ввести команду:
В результате выполнения этой команды вы увидите список всех устройств, подключенных к Raspberry Pi. Теперь соедините Arduino Uno с Raspberry Pi с помощью USB кабеля и введите команду снова. После этого вы легко сможете определить к какому порту подключена Arduino Uno.
Следующая команда формирует бесконечный цикл – команды внутри него будут выполняться снова и снова.
После приема данных последовательно мы можем отобразить принятые символы на экране Raspberry Pi.
То есть после нажатия кнопки, подключенной к плате Arduino Uno, мы увидим переданные символы на экране Raspberry Pi. Таким образом, мы установили своеобразное коммуникационное "рукопожатие" между Arduino Uno и Raspberry Pi.
Настройка оборудования для последовательного интерфейса
Есть 2 способа подключить Raspberry Pi и Arduino для последовательного интерфейса.
1. Найдите плату Arduino
При подключении к Arduino через USB, вы должны обнаружить ее по адресу /dev/ttyACM0 или /dev/ttyUSB0 (иногда цифра в адресе может отличаться, к примеру /dev/ttyACM1).
В настоящее время Raspberry Pi и Arduino являются самыми популярными платами с открытым исходным кодом. Причем они популярны не только среди инженеров электроники, но также среди школьников, студентов и просто энтузиастов благодаря простоте в их освоении. Но на их основе можно не только конструировать какие-нибудь простые устройства, но и делать весьма сложные проекты.
В этой статье мы рассмотрим взаимодействие плат Raspberry Pi и Arduino с помощью последовательной связи через порты USB. Когда это может быть востребовано? Дело в том, что Raspberry Pi имеет 26 контактов ввода-вывода общего назначения, но не имеет ни одного канала АЦП. Поэтому взаимодействие Raspberry Pi с рядом устройств и датчиков несколько осложнено. Также в некоторых проектах количество контактов платы Raspberry Pi может быть недостаточно. Поэтому, установив последовательную связь Raspberry Pi с Arduino, мы можем задействовать все функции платы Arduino Uno так же, как если бы они были функциями платы Raspberry Pi.
Внешний вид этих плат показан на следующем рисунке.
Работа схемы
Схема устройства представлена на следующем рисунке.
На схеме видно, что мы соединили USB порт платы Arduino Uno с USB портом платы Raspberry Pi при помощи USB кабеля. На плате Raspberry Pi четыре USB порта – вы можете выбрать любой из них. Кнопка на схеме нужна для запуска процесса последовательной связи, а светодиод – для индикации того, что данные переданы.
Установка PyFirmata в Arduino используя Raspberry Pi
Чтобы загрузить программное обеспечение PyFirmata в Arduino мы сначала должны установить Arduino IDE в Raspberry Pi. Необходимо выполнить следующую последовательность шагов:
Шаг 1. Соедините Raspberry Pi с сетью интернет. Откройте терминал команд, напечатайте в нем следующую команду и нажмите ввод (enter):
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Плата Raspberry Pi 2 Model B with Raspbian Jessie OS.
- Резистор 220 Ом или 1 кОм (2 шт.).
- Кнопка.
- Источник питания.
- Соединительные провода.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Raspberry Pi 3 B+ (с установленной Raspbian OS) (купить на AliExpress).
- MAX485 TTL to RS485 Converter Module (модуль преобразования логики TTL в RS485, купить на AliExpress) – 2 шт.
- Потенциометр 10 кОм (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Сервомотор SG-90 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Необходимые компоненты
- Плата Arduino Uno (или любая другая) (купить на AliExpress).
- Плата Raspberry Pi с установленной операционной системой Raspbian OS.
- USB кабель для Arduino.
- Светодиод.
В этом проекте мы использовали внешний монитор с HDMI кабелем чтобы соединиться с Raspberry Pi. Если у вас нет лишнего монитора для этих целей вы можете использовать SSH client (Putty) или VNC server чтобы соединиться с Raspberry Pi используя компьютер.
Что такое протокол UART?
Говоря более конкретно, когда вы используете последовательный порт с Arduino и Raspberry Pi, вы используете протокол UART. UART означает «Универсальный асинхронный приёмопередатчик».
По сути, это асинхронный multi-master протокол, основанный на последовательном интерфейсе, который позволяет обмениваться данными между двумя платами. Будьте уверены, есть библиотеки, которые справятся со всеми низкими уровнями за вас.
Multi-master означает, что все подключенные устройства смогут отправлять данные, когда требуется. Это одно из основных отличий от протоколов «master-slaves», где только главное устройство может инициировать обмен данными.
Обычно используются другие протоколы, такие как I2C и SPI, когда вам нужны конфигурации ведущий-ведомый: например, когда у вас есть одна плата Arduino и несколько датчиков или исполнительных механизмов.
На плате Arduino Uno есть один UART, который можно использовать либо с USB-кабелем, либо с контактами RX / TX (не используйте его с обоими одновременно). Некоторые платы имеют больше доступных UART.
Например, Arduino Mega имеет разные последовательные интерфейсы (Serial, Serial1, Serial2, Serial3), а Arduino Zero имеет только порт USB (используйте SerialUSB вместо Serial).
На Raspberry Pi возможно подключить множество последовательных устройств к портам USB. У каждого устройства будет свое имя (посмотрим как их найти позже в этой статье). Вы также можете использовать GPIO (RX0 / TX0) для дополнительного UART.
2. С помощью интерфейса ввода/вывода общего назначения (GPIO)
Чтобы установить последовательное соединение, вы также можете использовать простые провода между интерфейсом ввода/вывода Raspberry Pi и контактами Arduino
В зависимости от типа вашей платы Arduino вам может потребоваться переключатель уровня напряжения. Raspberry Pi работает при напряжении 3,3 В. Для плат Arduino, таких как Due, 101, это тоже подойдет, так как они также используют 3,3 В.
Но для многих Arduino, таких как Uno, Mega, Leonardo, Nano и многих других, плата работает при напряжении 5 В. Таким образом, вам понадобится переключатель напряжения 3,3 В / 5 В для защиты Raspberry Pi при подключении RX и TX.
В оставшейся части этого руководства мы будем использовать настройку с помощью кабеля USB. С ним будет проще работать, поэтому советуем использовать USB-кабель вместо GPIO для последовательного интерфейса.
Читайте также: