Sensor Pi Raspberry dan Kontrol Aktuator
Biasanya sebagai programmer Anda akan bekerja dengan data pada disk, dan jika Anda beruntung Anda akan menggambar di layar. Hal ini berbeda dengan komputasi fisik yang memungkinkan Anda sebagai programmer untuk bekerja dengan data yang dirasakan dari dunia nyata dan untuk mengontrol perangkat yang bergerak di dunia nyata.
Sasaran
Gunakan Raspberry Pi untuk membaca nilai akselerometer dan untuk mengontrol motor servo.
Definisi
- Raspberry Pi
- Komputer Linux kecil seharga $35 dengan 2 port USB, HDMI out, Ethernet, dan yang terpenting…
- Pin GPIO
- Pin Input/Output Tujuan Umum
- Ini adalah komponen yang benar-benar memungkinkan "komputasi fisik". Anda sebagai seorang programmer dapat mengatur tegangan tinggi atau rendah pada setiap pin, begitulah cara Anda berbicara dengan aktuator. Anda juga dapat membaca berapa tegangan saat ini pada setiap pin. Ini adalah bagaimana sensor akan berbicara kembali kepada Anda. Penting untuk dicatat bahwa setiap pin mewakili status biner, Anda hanya dapat mengeluarkan 0 atau 1, tidak ada di antaranya.
Pada artikel ini saya akan membahas empat proyek dasar Python untuk mendemonstrasikan kemampuan perangkat keras dari Raspberry Pi. Proyek-proyek tersebut adalah:
- Mengedipkan LED.
- Membaca pot.
- Aliran data.
- Kontrol servo.
Mengedipkan LED.
LED adalah Light Emitting Diode. Dioda adalah elemen rangkaian yang memungkinkan arus mengalir ke satu arah tetapi tidak ke arah lain. Memancarkan cahaya berarti … memancarkan cahaya. LED khas Anda membutuhkan arus dalam kisaran 10-30 mA dan akan turun sekitar 2-3 volt. Jika Anda menghubungkan LED langsung ke GPIO Pi Anda, itu akan menghasilkan lebih dari 30 mA dan mungkin akan menggoreng LED Anda (dan mungkin Pi Anda). Untuk mencegahnya kita harus memasang resistor. Jika Anda ingin mengerjakan matematika, Anda dapat menghitung hambatan yang sesuai menggunakan persamaan berikut:
R =(Vs - Vd) / I
Tetapi jika Anda tidak ingin melakukan matematika maka pilihlah resistor antara 500-1500 ohm. Setelah Anda mengumpulkan semua elemen sirkuit Anda (LED dan resistor)
Kodenya juga cukup sederhana. Tetapi pertama-tama Anda harus menginstal RPi.GPIO. (Ini mungkin sudah diinstal sebelumnya di OS Anda.)
waktu impordari itertools impor siklusimport RPi.GPIO sebagai ioio.setmode(io.BCM)io.setup(12, io.OUT)o =cycle([1, 0])sementara True:io.output(12, o .next()) time.sleep(0.5)
Baris penting pada dasarnya adalah:
io.setup(12, io.OUT)io.output(12, 1)
Baris kode ini mengatur pin 12 sebagai output, dan kemudian mengeluarkan 1 (3,3 volt). Jalankan kode di atas yang terhubung ke sirkuit dan Anda akan melihat LED berkedip dan mati setiap setengah detik.
Membaca pot.
Pot adalah kependekan dari potensiometer, yang merupakan resistor variabel. Ini hanyalah kata yang bagus untuk tombol. Pada dasarnya dengan memutar kenop, Anda memengaruhi resistansi, yang memengaruhi tegangan melintasi pot. (V =IR
, ingat?). Mengubah tegangan relatif terhadap beberapa nilai fisik adalah berapa banyak sensor yang bekerja, dan kelas sensor ini dikenal sebagai sensor analog . Ingat ketika saya mengatakan pin GPIO hanya dapat mewakili keadaan biner? Kita harus memanggil ajudan silikon lagi untuk mengubah nilai tegangan analog itu menjadi aliran biner bit yang dapat ditangani oleh Pi kita.
Potongan silikon itu disebut sebagai Analog-to-Digital Converter (ADC). Yang saya suka namanya MCP3008, memiliki 8 saluran 10-bit, artinya kita bisa membaca 8 nilai sensor dengan resolusi masing-masing 1024 (2^10). Ini akan memetakan tegangan input kita dari 0 – 3,3 volt ke bilangan bulat antara 0 dan 1023.
Saya telah mengubah Pi menjadi label kuning fana untuk menyederhanakan diagram
Untuk berbicara dengan chip, kita memerlukan paket python bernama spidev. Untuk informasi lebih lanjut tentang paket dan cara kerjanya dengan MCP3008, lihat entri blog yang bagus ini
Dengan spidev terinstal dan sirkuit yang dibangun, jalankan program berikut untuk membaca nilai sensor langsung dan mencetaknya ke stdout.
impor spidev import timespi =spidev.SpiDev()spi.open(0,0)def readadc(adcnum):jika tidak 0 <=adcnum <=7:return -1 r =spi.xfer2([1, ( 8+adcnum)<<4, 0]) adcout =((r[1] &3) <<8) + r[2] kembali adcoutwhile True:val =readadc(0) print val time.sleep(0.5)
Bagian terpenting adalah dua baris ini:
r =spi.xfer2([1, (8+adcnum)<<4, 0])adcout =((r[1] &3) <<8) + r[2]
Mereka mengirim perintah baca dan mengekstrak bit kembali yang relevan. Lihat posting blog yang saya tautkan di atas untuk informasi lebih lanjut tentang apa yang terjadi di sini.
Aliran data.
Untuk mengalirkan data melalui kabel, kami akan menggunakan pustaka jaringan MQ dan menerapkan pola REQUEST/REPLY. MQ membuatnya sangat mudah untuk mengatur klien dan server dengan Python. Berikut ini adalah contoh kerja lengkap.
Server
import zmqcontext =zmq.Context()socket =context.socket( zmq.REP)socket.bind('tcp://*:1980') while True:message =socket.recv() cetak pesan socket.send ("Saya di sini")
Klien
import zmqcontext =zmq.Context()socket =context.socket( zmq.REQ)a ='tcp://192.168.1.6:1980'socket.connect(a)untuk permintaan dalam rentang(10):socket. send('You home?') message =socket.recv() print message
Sekarang kita dapat menggunakan traits dan enaml untuk membuat UI yang cantik di sisi klien. Lihat demo acc_plot di repo github untuk melihat contoh data streaming Pi melalui kabel yang akan diplot oleh klien.
Kontrol servo
Servo adalah motor (seringkali kecil) yang dapat Anda kendarai ke posisi tertentu. Misalnya, untuk servo tertentu, Anda mungkin dapat mengatur poros penggerak dari 0 hingga 18 derajat, atau di mana pun di antaranya. Seperti yang dapat Anda bayangkan, ini bisa berguna untuk banyak tugas, tidak terkecuali robotika.
Rotasi poros dikendalikan oleh Pulse Width Modulation (PWM) di mana Anda mengkodekan informasi durasi pulsa tegangan tinggi pada pin GPIO. Kebanyakan servos hobi mengikuti makna lebar pulsa standar. Pulsa 0,5 ms berarti pergi ke posisi min Anda dan pulsa 2,5 ms berarti pergi ke posisi maksimal Anda. Sekarang ulangi pulsa ini setiap 20 md dan Anda sedang mengontrol servo.
Lebar pulsa jauh lebih kritis daripada frekuensi
Pengaturan waktu seperti ini tidak mungkin dilakukan dengan Python. Faktanya, itu tidak mungkin dilakukan dengan sistem operasi modern. Interupsi bisa masuk kapan saja dalam kode kontrol Anda, menyebabkan pulsa lebih lama dari yang diinginkan dan jitter di servo Anda. Untuk memenuhi persyaratan waktu, kita harus memasuki dunia modul kernel yang menyenangkan. ServoBlaster adalah modul kernel yang menggunakan blok kontrol DMA untuk melewati CPU sepenuhnya. Saat dimuat, modul kernel membuka file perangkat di /dev/servoblaster
tempat Anda dapat menulis perintah posisi.
Saya telah menulis lapisan berorientasi objek kecil di sekitar ini yang membuat kontrol servo lebih sederhana. Anda dapat menemukan perpustakaan saya di sini:
https://github.com/jminardi/RobotBrain
Cukup sambungkan servo ke 5v dan arde pada Pi Anda, lalu sambungkan kabel kontrol ke pin 4.
Kode python cukup sederhana:
import timeimport numpy as npfrom robot_brain.servo import Servoservo =Servo(0, min=60, max=200)untuk val di np.arange(0, 1, 0.05):servo.set(val) time.sleep( 0.1)
Yang harus Anda lakukan adalah membuat instance servo dan memanggilnya set()
metode dengan nilai floating point antara 0 dan 1. Lihat demo servo_slider di github untuk melihat kontrol servo diterapkan melalui jaringan.
Untuk detail lebih lanjut:Sensor Raspberry Pi dan Kontrol Aktuator