Menguasai Kontrol Sensor dan Aktuator Raspberry Pi: Akselerometer, Servo, dan Streaming Data
Sementara sebagian besar pengembang bekerja dengan file statis atau grafis sederhana, komputasi fisik membuka pintu untuk interaksi dengan dunia nyata. Dengan membaca data dari sensor dan menggerakkan aktuator, Anda dapat membuat sistem yang merasakan, membuat keputusan, dan bertindak di dunia fisik.
Tujuan
Menggunakan Raspberry Pi untuk membaca nilai akselerometer dan mengkomando servo motor, menunjukkan konsep utama komputasi fisik.
Konsep Utama
- Raspberry Pi – Komputer Linux seharga $35 dengan HDMI, Ethernet, dua port USB, dan yang terpenting, pin GPIO yang memungkinkan Anda mengirim dan menerima sinyal.
- Pin GPIO – Pin Input/Output Umum yang berfungsi sebagai saklar biner. Anda dapat mengatur pin menjadi HIGH (3,3 V) atau LOW (0 V) untuk menggerakkan aktuator, atau membaca statusnya untuk mengumpulkan data sensor.
Artikel ini membahas empat proyek Python praktis yang menggambarkan kemampuan hardware Pi:
- Membuat LED berkedip.
- Membaca potensiometer.
- Mengirim data melalui jaringan.
- Mengontrol servo motor.
Membuat LED Berkedip
LED (Dioda Pemancar Cahaya) memancarkan cahaya ketika arus mengalir ke satu arah. Untuk melindungi Pi dan LED, gunakan resistor antara 500 Ω dan 1,5 kΩ. Nilai resistor dapat dihitung dengan R = (V_s - V_d) / I tetapi rentang di atas bekerja untuk sebagian besar kit hobi.
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)
Kode mengatur pin 12 sebagai output dan menggantinya setiap setengah detik, sehingga LED berkedip.
Membaca Potensiometer
Potensiometer adalah resistor variabel yang mengubah posisi knob menjadi tegangan. Karena pin GPIO bersifat digital, kita memerlukan Konverter Analog-ke-Digital (ADC). MCP3008 menawarkan delapan saluran 10-bit, memetakan 0–3,3 V ke nilai integer 0–1023.
Instal spidev untuk berkomunikasi dengan MCP3008 melalui SPI:
pip install spidev
Jalankan skrip berikut untuk membaca nilai dari saluran 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)
Stream Data dengan ØMQ
ØMQ menyederhanakan jaringan dengan menyediakan pustaka pesan berkinerja tinggi. Menggunakan pola REQUEST/REPLY, Anda dapat membangun server dan klien ringan dalam Python.
Server
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")
Klien
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)
Dengan traits dan enaml, Anda dapat membuat UI responsif yang memvisualisasikan data stream. Lihat demo acc_plot untuk contoh lengkap.
Mengontrol Servo Motor
Servo bergerak ke posisi presisi menggunakan Modulasi Lebar Pulsa (PWM). Servo hobi standar menterjakan pulsa 0,5 ms sebagai sudut minimum dan 2,5 ms sebagai sudut maksimum, berulang setiap 20 ms.
Waktu yang presisi sulit dicapai dalam OS umum. ServoBlaster adalah modul kernel yang melepaskan pembuatan PWM ke pengontrol DMA, mengekspos antarmuka sederhana /dev/servoblaster.
Saya membungkus fungsionalitas ini dalam pustaka kecil berorientasi objek: RobotBrain. Contoh di bawah menunjukkan penggerakan servo dari 0 % ke 100 % siklus kerja.
import time import numpy as np from robot_brain.servo import Servo servo = Servo(0, min=60, max=200) for val in np.arange(0, 1, 0.05): servo.set(val) time.sleep(0.1)
Gunakan demo servo_slider di GitHub untuk melihat bagaimana servo dapat dikontrol melalui jaringan.
Untuk penjelasan lebih mendalam tentang kontrol sensor dan aktuator dengan Raspberry Pi, lihat dokumentasi asli atau tutorial komunitas.