Новость из категории: Информация

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

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

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

Подготовка Arduino

Чтобы установить Arduino IDE, перейдите на www.arduino.cc/en/Main/Software и выберите версию для Linux ARM. Загрузите программное обеспечение и извлеките архив в домашний каталог (/home/pi/). Затем откройте окно терминала. Теперь в вашем домашнем каталоге должен быть каталог arduino-1.8.5. В терминале измените каталог, чтобы мы оказались в каталоге Arduino:
$ cd arduino-1.8.5

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

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

Наконец, перезагрузите 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

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

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

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

Затем мы создаем раздел кода, настраивающего Arduino на задачу. Этот код запускается один раз в начале. Здесь мы сообщаем Arduino, что хотим использовать последовательное соединение со скоростью 9600 бод.
void setup ()
{
Serial.begin(9600);
}

Чтобы Arduino непрерывно выполнял следующий код, надо поместить код внутри цикла. На следующем шаге мы создаем еще одну переменную, которая будет считывать необработанные показания с аналогового вывода А, а затем сохранять их как целое число внутри переменной rawdata:
void loop()
{
int rawdata = analogRead(sensorPin);

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

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

В последнем разделе кода мы выводим данные температуры на последовательную консоль, а также выводим единицу измерения. Задержка на секунду помогает сделать код читаемым:
Serial.print(temperatureC); Serial.println(" degrees C");
delay(1000);
}

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

Объединяем Arduino с Raspberry Pi
Этот код можно использовать для чтения последовательных данных с любого устройства, подключенного к Pi

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

Код Python

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

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

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

Наш основной цикл будет постоянно проверять последовательный порт на данные с указанной нами скоростью:
while True:
    s = serial.Serial(port)
    s.baudrate = baud

Гарантируем правильность отправленных данных и отсутствие ошибок, проверяя их четность:
s.parity = serial.PARITY_NONE
    s.databits = serial.EIGHTBITS
    s.stopbits = serial.STOPBITS_ONE

Потом прочитаем последовательные данные и на секунду остановимся:
data = s.readline()
    time.sleep(1)

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

data = str(data)
    data = data[2:7]
    data = float(data)
    print(data)

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

if data > 21:
        print("Тепло")
    else:
        print("Холодно")

Сохраните код и нажмите Run > Run Module (F5), чтобы его запустить. Теперь мы должны увидеть данные температуры, появляющиеся в оболочке Python, и соответствующее сообщение, зависящее от того, насколько тепло или холодно.

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

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх