Мастерство управления датчиками и исполнительными механизмами на Raspberry Pi: акселерометр, сервопривод и потоковая передача данных
Пока большинство разработчиков работают со статическими файлами или простой графикой, физические вычисления открывают дверь к взаимодействию с реальным миром. Считывая данные с датчиков и управляя исполнительными механизмами, можно создавать системы, которые чувствуют, принимают решения и действуют в физической среде.
Цель
Использовать Raspberry Pi для считывания значений акселерометра и управления сервоприводом, демонстрируя ключевые концепции физических вычислений.
Ключевые концепции
- Raspberry Pi — одноплатный компьютер за $35 с HDMI, Ethernet, двумя USB-портами и, главное, GPIO-выводами для отправки и приема сигналов.
- GPIO-выводы — универсальные входы/выходы, работающие как цифровые переключатели. Можно установить HIGH (3,3 В) или LOW (0 В) для управления актуатором или считать состояние для получения данных с датчика.
Статья рассматривает четыре практичных проекта на Python, иллюстрирующих аппаратные возможности Pi:
- Мигающий светодиод.
- Считывание потенциометра.
- Потоковая передача данных по сети.
- Управление сервоприводом.
Мигающий светодиод
Светодиод излучает свет при прохождении тока в одном направлении. Для защиты Pi и светодиода используйте резистор 500 Ом – 1,5 кОм. Значение можно рассчитать по формуле R = (V_s - V_d) / I, но указанный диапазон подходит для большинства наборов.
import time
from itertools import cycle
import RPi.GPIO as io
io.setmode(io.BCM)
io.setup(12, io.OUT)
for state in cycle([1, 0]):
io.output(12, state)
time.sleep(0.5)
Код настраивает вывод 12 как выход и переключает его каждые 0,5 секунды, заставляя светодиод мигать.
Считывание потенциометра
Потенциометр — переменный резистор, преобразующий положение ручки в напряжение. Поскольку GPIO цифровые, нужен АЦП. MCP3008 предоставляет восемь 10-битных каналов, отображающих 0–3,3 В в целые числа 0–1023.
Установите spidev для связи с MCP3008 по SPI:
pip install spidev
Скрипт для чтения значений с канала 0:
import spidev
import time
spi = spidev.SpiDev()
spi.open(0, 0)
def readadc(adcnum):
if not 0 <= adcnum <= 7:
return -1
r = spi.xfer2([1, (8 + adcnum) << 4, 0])
adcout = ((r[1] & 3) << 8) + r[2]
return adcout
while True:
val = readadc(0)
print(val)
time.sleep(0.5)
Потоковая передача данных с ØMQ
ØMQ упрощает сетевое взаимодействие, предоставляя высокопроизводительную библиотеку обмена сообщениями. Используя паттерн REQUEST/REPLY, можно построить легковесный сервер и клиент на Python.
Сервер
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind('tcp://*:1980')
while True:
message = socket.recv()
print(message)
socket.send(b"I'm here")
Клиент
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect('tcp://192.168.1.6:1980')
for _ in range(10):
socket.send(b'You home?')
message = socket.recv()
print(message)
С библиотеками traits и enaml можно создать отзывчивый интерфейс для визуализации потоковых данных. Пример acc_plot demo на GitHub.
Управление сервоприводом
Сервоприводы перемещаются в точные позиции с помощью широтно-импульсной модуляции (PWM). Типичный хоббийный серво интерпретирует импульс 0,5 мс как минимальный угол, 2,5 мс — как максимальный, с периодом 20 мс.
Точное тайминг сложно в ОБНО. ServoBlaster — модуль ядра, выносящий генерацию PWM на DMA-контроллер, предоставляя простой интерфейс /dev/servoblaster.
Я обернул эту функциональность в небольшую объектно-ориентированную библиотеку: RobotBrain. Пример ниже демонстрирует перемещение сервы от 0% до 100% коэффициента заполнения.
import time
import numpy as np
from robot_brain.servo import Servo
# Инициализация сервы на выводе 4 с пользовательскими мин/макс импульсами (мкс)
servo = Servo(0, min=60, max=200)
for val in np.arange(0, 1, 0.05):
servo.set(val)
time.sleep(0.1)
Используйте демо servo_slider на GitHub, чтобы увидеть сетевое управление сервой.
Для глубокого погружения в управление датчиками и актуаторами на Raspberry Pi обратитесь к оригинальной документации или сообществу.
Производственный процесс
- Бесшовная MQTT интеграция: NodeMCU DHT22 сенсоры с Raspberry Pi 3 B+ как брокер
- Сборка логгера температуры на Raspberry Pi с $5 I2C датчиком
- Подключение нескольких DS18B20 1-Wire датчиков к Raspberry Pi для точного мониторинга температуры
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
- Подключение ультразвукового датчика HC‑SR04 к Raspberry Pi 3 — полное руководство
- Управление светодиодом с PIR-датчиком движения на Raspberry Pi
- Построение низкобюджетного датчика влажности почвы на Raspberry Pi для умного полива
- Чтение линейного Холловского датчика с Raspberry Pi: руководство по Java и особенности ADC0832
- Создание многодатчиковой системы мониторинга температуры и света с Raspberry Pi и DS18B20