Подключение raspberry pi к arduino через usb

Обновлено: 07.07.2024

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

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

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

    WP_20150427_18_39_55_Pro

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

    Проверим работоспособность скетча в 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, будет отображать на экране все данные, приходящие в последовательный порт:

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

    2015-04-27-185823_1920x1200_scrot

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

    Подключаем микроконтроллеры Raspberry Pi и Ардуино таким образом, чтобы обе платы могли общаться друг с другом.


    Иногда вам может понадобиться подключить Ардуино (англ. - Arduino) к плате Raspberry Pi. Например, если у вас есть датчики, двигатели и исполнительные механизмы, вы можете подключить их к Arduino, а значения передавать и получать от "малины". Таким образом, мы можем отделить вычислительные задачи (выполняемые Raspberry Pi) и управляющие задачи (выполняемые Ардуино).


    Для связи мы будем использовать простую последовательную связь по USB-кабелю. Итак, давайте начнем!

    Подключите светодиод к выводу 11, как показано на рисунке ниже.


    Включите Raspberry Pi и откройте Python 3 в новом окне.

    Напишите следующий код в новом окне и сохраните его (сохраните на рабочем столе, чтобы вы не потеряли его).

    Теперь откройте Arduino IDE и загрузите следующий код в Arduino.


    Убедитесь, что код загружен в Arduino.

    В интерфейсе Raspberry Pi обязательно включите Serial и I2C в PiConfig.



    Затем вам нужно перезапустить Raspberry Pi. Откройте терминал и выполните следующие команды:

    Подключите Ардуино к "Малине".

    Затем найдите строку с /dev/ttyACM0 или что-то вроде /dev/ttyACM1 и т.д. Проверьте ACM с любым числом 0,1,2 и т.д.


    Откройте Python снова и измените ser = serial.Serial ("dev/ttyACM1", 9600) на найденный номер ACM. Итак, если в вашем случае вы получили ACM0, строка должна выглядеть так: ser = serial.Serial ("dev / ttyACM0", 9600).

    Теперь запустите программу, которую вы только что создали в Python3. Вы увидите «Hello From Arduino!» На терминале Python, и ваш светодиод тоже будет мигать!

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

    Подключение Arduino к Raspberry Pi: внешний вид конструкции

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

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

    Внешний вид платы Raspberry Pi 2 Model B
    Внешний вид платы Arduino Uno

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

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

    Работа схемы

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

    Схема подключения Arduino к Raspberry Pi

    На схеме видно, что мы соединили 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 порта.

    После этого мы должны установить параметры последовательной связи (в первую очередь скорость), чтобы мы могли принимать данные от 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.

    Объединяем Arduino с Raspberry Pi

    Arduino и Raspberry Pi — фантастические машины, и здесь мы воспользуемся Arduino для считывания показаний температурного датчика TMP36. Мы отправим данные через последовательное USB-соединение на Raspberry Pi, где запущен код Python, который будет читать и интерпретировать данные, а затем действовать на их основе. Этот проект покажет, что две машины могут сосуществовать и что Arduino пригоден для расширения возможностей Pi.

    В каталоге должен быть файл с именем install.sh, который установит Arduino IDE на Pi. Для запуска файла введите:

    Через несколько секунд установка завершится. Следующим шагом будет выдача Pi доступа к устройству Arduino и отправка ему кода, посредством добавления пользователя Pi в группу dialout с помощью команды usermod:

    Наконец, перезагрузите Raspberry Pi.

    Объединяем Arduino с Raspberry Pi

    Датчик TMP36 имеет только три вывода, и, если смотреть со стороны выводов (плоская сторона), то порядок такой: Vcc,
    Vout и GND [Земля]. TMP36 может работать с напряжением от 2,7 до 5,5 В, поэтому напряжение 5 В с Arduino обеспечит питание TMP36, а контакт GND подключается к GND на Arduino. Наконец, вывод Vout (в центре) соединяется с АО на Arduino. Для получения более подробной информации загрузите схему для этого проекта. Проволочными перемычками папа-папа обеспечьте эти соединения, а затем подключите Arduino к USB-порту Raspberry Pi.

    Чтобы открыть Arduino IDE, перейдите в главное меню, выберите Programming > Arduino, и через несколько секунд приложение загрузится и представит шаблон для нашего кода. Удалите шаблон (нажмите Ctrl+A, а затем клавишу Delete), чтобы начать код заново. На Arduino мы пишем код в приложении, компилируем его и затем записываем код в Arduino. Это называется заливкой.

    Наша первая строка кода создает переменную. Это объект хранения данных, позволяющий нам ссылаться на него по имени и отображать содержимое объекта. В данном случае мы создаем переменную с именем sensorPin, которая на самом деле является соединением Vout TMP36 с контактом АО Arduino. Мы должны указать Arduino, какой тип данных будет содержать переменная.

    В нашем случае это целочисленное значение 0.

    Затем мы создаем раздел кода, настраивающего Arduino на задачу. Этот код запускается один раз в начале. Здесь мы сообщаем Arduino, что хотим использовать последовательное соединение со скоростью 9600 бод.

    Мы всё еще находимся внутри цикла, и теперь надо применить немного математики для преобразования необработанных данных в новую переменную с именем voltage, которая будет содержать значение с плавающей точкой. Voltage — это наши необработанные данные, умноженные на 5,0 (напряжение, которое мы подаем на TMP36; измените это на 3,3 В при использовании 3,3 В Arduino). Затем мы употребляем составной оператор для деления значения, сохраненного в переменной voltage, на 1024 для 10-битного аналога, используемого в Arduino.

    Новая переменная, с именем temperatureC, используется для хранения решения уравнения, в котором сначала вычитается 0,5 из переменной voltage, а результат умножается на 100, что дает нам температуру в градусах Цельсия:

    В последнем разделе кода мы выводим данные температуры на последовательную консоль, а также выводим единицу измерения. Задержка на секунду помогает сделать код читаемым:

    Сохраните код! Затем перейдите в Tools > Board и убедитесь, что ваш Arduino соответствует в данном случае Arduino/Genuino Uno. Затем перейдите в Tools > Port и убедитесь, что выбран ttyUSB0. Теперь нажмите Sketch > Upload для заливки на Arduino. Это займет около минуты. После этого мы можем перейти к коду Python.

    Объединяем Arduino с Raspberry Pi


    Этот код можно использовать для чтения последовательных данных с любого устройства, подключенного к Pi Если вы не видите свой Arduino как подключенное устройство, выясните командой dmesg, что происходит за кулисами на Pi. Команда покажет, где подключены устройства, и все ошибки, которые могут иметь место.

    Откройте редактор Python 3, который находится в меню Programming. Нажмите File > New, а затем сохраните новый файл как Serial-Data.py. Сохраняйте почаще, чтобы избежать потери данных.

    Мы начинаем код с импорта двух библиотек кода. Это serial, используемая для последовательного соединения,и time, используемая для регулирования скорости проекта.

    Затем мы создаем две переменные — port и baud, которые используются для определения последовательного порта и скорости соединения:

    Наш основной цикл будет постоянно проверять последовательный порт на данные с указанной нами скоростью:

    Гарантируем правильность отправленных данных и отсутствие ошибок, проверяя их четность:

    Потом прочитаем последовательные данные и на секунду остановимся:

    Следующие четыре строки преобразуют полученные данные в строку и вырезают из строки нужные нам сведения (отсчитывая с нуля, мы находим начало и конец данных температуры); затем data преобразуется обратно во float и данные выводятся в оболочку.

    В последнем разделе мы создаем тест, который сравнивает значение, хранящееся внутри переменной data, с жестко закодированным значением, в данном случае — 21 °C. Если температура выше 21°C, то выводится «Тепло», а если меньше, то выводится «Холодно».

    Ну вот, мы научились подключать Arduino к Raspberry Pi и извлекать данные из последовательного порта с помощью Python. Отличная работа!

    Читайте также: