Подключение Arduino к Raspberry Pi


Как я уже писал ранее, во многих сценариях интернета вещей бывает полезно иметь один достаточно мощный встраиваемый компьютер (в роли которого может выступать Raspberry Pi), который может связываться с множеством расположенных в разных местах сенсоров, управляемых простыми микроконтроллерами семейства Arduino. При этом можности Raspberry Pi хватает, чтобы передавать данные по защищенным каналам HTTPS в облако, а также чтобы осуществлять взаимодействие с пользователем посредством развитого интерфейса (например, при работе под управлением Windows 10).

Для соединения Arduino с Raspberry Pi существует несколько сценариев подключения:

    • Использование явного последовательного канала передачи данных. При этом возникают сложности, связанные с разностью уровней питания: Raspberry Pi работает на напряжении 3.3В, в то время как Arduino использует 5 вольт. При этом для обеспечения безопасного соединения рекомендуется использовать специальные преобразователи уровня.
    • Использование последовательной шины I2C, что позволяет подключать к одной Raspberry Pi до 128 устройств Arduino в режиме slave, при этом такое подключение также не требует преобразователей уровня.
    • Подключение по USB является пожалуй самым простым способом, поскольку для этого достаточно всего лишь воткнуть Arduino через стандартный кабель в USB-разъем Raspberry Pi. Именно этот способ мы и рассмотрим.

В качестве примера рассмотрим простейший датчик температуры и давления BMP-180, подключенный к Arduino Uno по стандартной схеме. После этого контроллер Arduino включается в USB-разъем Raspberry Pi, а сам Raspberry Pi затем подключается обычным образом к питанию, монитору и т.д.

WP_20150427_18_39_55_Pro

При таком подключении общение Arduino и Raspberry происходит по последовательному порту. Предварительно (до подключения) на Arduino необходимо залить требуемый скетч – в нашем случае это простая программа, считывающая значение давления и температуры с датчика и печатающая их в виде текста в последовательный канал (температура предваряется символом Т, а давление – P):

#include <Wire.h>
#include <BMP180.h>

BMP180 barometer;

void setup()
{
Serial.begin(9600);
Wire.begin();
barometer = BMP180();
if(barometer.EnsureConnected())
{
barometer.SoftReset();
barometer.Initialize();
}
else
{
Serial.println("E");
}
}

void loop()
{
if(barometer.IsConnected)
{
long pres = barometer.GetPressure();
float temp = barometer.GetTemperature();
Serial.print("P"); Serial.println(pres);
Serial.print("T"); Serial.println(temp);
delay(1000);
}
}

Проверим работоспособность скетча в Arduino IDE, открыв монитор последовательного порта – мы должны увидеть появляющиеся значения температуры и давления. Обратите внимание на скорость – в программе задана скорость в 9600 бод, такие же установки должны быть и у монитора последовательного порта.

Теперь загрузим Raspberry Pi – в моем примере я использую Pidora в качестве базовой операционной системы и классическую модель Rapsberry Pi, хотя с таким же успехом можно использовать Raspberry Pi 2 и Windows 10.

Первым делом нужно определить, какой последовательный порт будет отвечать за общение с Arduino-контроллером. Проще всего это сделать следующим образом: при выключенной плате Arduino смотрим все доступные последовательные терминалы (ls /dev/tty*), после чего включаем плату в USB-порт, и через некоторое время снова смотрим список терминалов. То устройство, которое появилось в списке, и будет требуемым портом. В моём случае это был /dev/ttyUSB0, но в зависимости от номера порта, используемого дистрибутива системы и других факторов это имя может сильно отличаться.

2015-04-27-190009_1920x1200_scrot

Теперь мы можем использовать любые средства общения с последовательным портом для того, чтобы принять значения от датчика, передаваемые Arduino. Чаще всего удобным оказывается использовать Python и библиотеку serial. Например, следующий простой скрипт, набранный прямо в REPL, будет отображать на экране все данные, приходящие в последовательный порт:

import serial
ser = serial.Serial("/dev/ttyUSB0",9600)
while 1:
ser.readline()

Ниже показано, как этот скрипт выполняется в окне терминала на Raspberry Pi:

2015-04-27-185823_1920x1200_scrot

После этого получения данных в требуемом виде с последующей отправкой их в облако или сохранением в локальной базе данных является делом техники. Об этом я поговорю в следующих выпусках своей колонки про интернет вещей.

Comments (6)

  1. Артур says:

    Когда выйдет статья, как отправлять в облако полученные результаты?

  2. AN says:

    Как быть в случае если на Raspberry Pi установлена Windows 10? У нее есть API для работы с портами?

  3. Не понятный says:

    Может для тупых расскажешь как perl запустил

  4. askark says:

    А Вы не пробовали прочитать данные на языке golang? Пример – https://github.com/tarm/serial

  5. Darkowl says:

    Raspberry Pi работает на напряжении 3.3В, в то время как Arduino использует 5 вольт
    ???
    А не 5 и 9 вольт соответственно?

Skip to main content