Dominando Controle de Sensores e Atuadores no Raspberry Pi: Acelerômetro, Servo e Streaming de Dados
Enquanto a maioria dos desenvolvedores trabalha com arquivos estáticos ou gráficos simples, a computação física abre as portas para interação com o mundo real. Ao ler dados de sensores e acionar atuadores, você pode criar sistemas que sentem, decidem e agem no mundo físico.
Objetivo
Usar um Raspberry Pi para ler valores de um acelerômetro e comandar um motor servo, demonstrando conceitos-chave de computação física.
Conceitos Fundamentais
- Raspberry Pi — Um computador Linux de $35 com HDMI, Ethernet, duas portas USB e, o mais importante, pinos GPIO que permitem enviar e receber sinais.
- Pinos GPIO — Pinos de Entrada/Saída de Propósito Geral que funcionam como interruptores binários. Você pode definir um pino como HIGH (3,3 V) ou LOW (0 V) para acionar um atuador, ou ler seu estado para coletar dados de sensores.
Este artigo percorre quatro projetos práticos em Python que ilustram as capacidades de hardware do Pi:
- Piscar um LED.
- Ler um potenciômetro.
- Fazer streaming de dados pela rede.
- Controlar um motor servo.
Piscar um LED
Um LED (Diodo Emissor de Luz) emite luz quando a corrente flui em uma direção. Para proteger o Pi e o LED, use um resistor entre 500 Ω e 1,5 kΩ. O valor do resistor pode ser calculado com R = (V_s - V_d) / I, mas a faixa acima funciona para a maioria de kits hobby.
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)
O código define o pino 12 como saída e o alterna a cada meio segundo, fazendo o LED piscar.
Ler um Potenciômetro
Um potenciômetro (pot) é um resistor variável que converte a posição de um botão em tensão. Como os pinos GPIO são digitais, precisamos de um Conversor Analógico-Digital (ADC). O MCP3008 oferece oito canais de 10 bits, mapeando 0–3,3 V para valores inteiros 0–1023.
Instale spidev para comunicar com o MCP3008 via SPI:
pip install spidev
Execute o script abaixo para ler valores do canal 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)
Streaming de Dados com ØMQ
O ØMQ simplifica a rede fornecendo uma biblioteca de mensagens de alto desempenho. Usando o padrão REQUEST/REPLY, você pode construir um servidor e cliente leves em Python.
Servidor
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")
Cliente
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)
Com traits e enaml, você pode criar uma UI responsiva que visualiza os dados transmitidos. Veja o demo acc_plot para um exemplo completo.
Controlar um Motor Servo
Servos movem-se para posições precisas usando Modulação por Largura de Pulso (PWM). Um servo hobby típico interpreta um pulso de 0,5 ms como ângulo mínimo e 2,5 ms como máximo, repetindo a cada 20 ms.
Temporização precisa é difícil em um SO de propósito geral. O ServoBlaster é um módulo de kernel que descarrega a geração PWM para o controlador DMA, expondo uma interface simples /dev/servoblaster.
Encapsulei essa funcionalidade em uma pequena biblioteca orientada a objetos: RobotBrain. O exemplo abaixo demonstra mover um servo de 0% a 100% de ciclo de trabalho.
import time
import numpy as np
from robot_brain.servo import Servo
# Inicializa servo no pino 4 com larguras de pulso min/max personalizadas (em µs)
servo = Servo(0, min=60, max=200)
for val in np.arange(0, 1, 0.05):
servo.set(val)
time.sleep(0.1)
Use o demo servo_slider no GitHub para ver como o servo pode ser controlado pela rede.
Para um mergulho mais profundo no controle de sensores e atuadores com Raspberry Pi, consulte a documentação original ou tutoriais da comunidade.
Processo de manufatura
- Integração MQTT Perfeita: Sensores NodeMCU DHT22 com Raspberry Pi 3 B+ como Broker
- Construa um Registrador de Temperatura com Raspberry Pi e Sensor I2C de $5
- Conecte Múltiplos Sensores DS18B20 1-Wire ao Raspberry Pi para Monitoramento Preciso de Temperatura
- Construa um Sensor de Temperatura Remoto com Raspberry Pi e Python – Guia Passo a Passo
- Construa Estação Meteorológica Raspberry Pi que Envia Dados Diários por Email
- Conectando Sensor Ultrassônico HC‑SR04 ao Raspberry Pi 3 – Guia Completo
- Controle um LED com Sensor de Movimento PIR no Raspberry Pi
- Construa um Sensor de Umidade do Solo de Baixo Custo para Irrigação Inteligente com Raspberry Pi
- Leitura de Sensor Hall Linear com Raspberry Pi: Guia Java e Insights ADC0832
- Construa um Sistema de Monitoramento de Temperatura e Luz Multi-Sensor com Raspberry Pi e DS18B20