Arduino biasanya muncul sebagai perangkat serial USB. Papan saat ini menggunakan driver serial USB yang dibangun ke dalam mikroprosesor utama, tetapi Arduino lama (dan klon) menggunakan chip serial-USB pihak ketiga yang terpisah.
Untuk sekadar menerima Serial.print
data pada Raspberry Pi dari Arduino, saya menggunakan program Layar GNU sebagai terminal dasar: screen [serial-port] [baud-rate]
(misalnya screen /dev/ttyACM0 9600
).
Saya menguji tiga Arduino yang berbeda, dan satu klon yang agak berbeda. Semua varian yang lebih baru muncul sebagai /dev/ttyACM0
port, dan yang lebih lama /dev/ttyUSB0
. Ini yang saya temukan, di bawah Raspbian:
Raspberry Pi mungkin tidak menyediakan daya yang cukup untuk menggerakkan Arduino, jadi Anda mungkin memerlukan daya eksternal. Untuk kelengkapan, saya juga menguji Prolific PL2303 , meskipun tidak ada pada Arduino yang saya kenal. Tampaknya cukup bahagia sebagai /dev/ttyUSB0
.
Untuk komunikasi yang lebih kompleks dengan sensor, Anda dapat mempertimbangkan Firmata , "protokol umum untuk berkomunikasi dengan mikrokontroler dari perangkat lunak pada komputer host". Ini memiliki implementasi untuk Arduino, dan pustaka Python untuk dijalankan di sisi Raspberry Pi.
Berikut adalah contoh kecil menggunakan pyFirmata untuk membaca LM35 dan mengubah kecerahan LED:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# simple test of pyfirmata and Arduino; read from an LM35 on A0,
# brighten an LED on D3 using PWM
# scruss, 2012-08-14 - tested on Arduino Uno & Raspberry Pi (Raspbian)
import pyfirmata
# Create a new board, specifying serial port
board = pyfirmata.Arduino('/dev/ttyACM0')
# start an iterator thread so that serial buffer doesn't overflow
it = pyfirmata.util.Iterator(board)
it.start()
# set up pins
pin0=board.get_pin('a:0:i') # A0 Input (LM35)
pin3=board.get_pin('d:3:p') # D3 PWM Output (LED)
# IMPORTANT! discard first reads until A0 gets something valid
while pin0.read() is None:
pass
for i in range(10):
pin3.write(i/10.0) # set D3 to 0, 10%, 20%, ... brightness
print "PWM: %d %% Temperature %.1f °C" % (i * 10, pin0.read() * 5 * 100)
board.pass_time(1) # pause 1 second
pin3.write(0) # turn LED back off
board.exit()
Ada beberapa peringatan ketika menggunakan pyFirmata:
- Bacaan analog dan penulisan PWM dinormalisasi ke rentang 0 .. 1, dan bukan standar Arduino 0 .. 255 dan 0 .. 1023.
- Anda benar-benar perlu memulai utas iterator terpisah untuk menghentikan pembacaan lama yang meluap ke buffer serial
- Karena Arduino dibaca secara tidak sinkron, pastikan bahwa koneksi pyFirmata sepenuhnya diinisialisasi sebelum membaca dari port. Jika tidak,
None
nilai akan terjadi.