Arduinos thường xuất hiện dưới dạng thiết bị nối tiếp USB. Các bo mạch hiện tại sử dụng trình điều khiển nối tiếp USB được tích hợp trong bộ vi xử lý chính, nhưng Arduinos (và bản sao) cũ hơn đã sử dụng các chip nối tiếp USB của bên thứ ba riêng biệt.
Để đơn giản nhận Serial.print
dữ liệu trên Raspberry Pi từ Arduino, tôi sử dụng chương trình GNU Screen làm thiết bị đầu cuối cơ bản: screen [serial-port] [baud-rate]
(ví dụ screen /dev/ttyACM0 9600
).
Tôi đã thử nghiệm ba Arduinos khác nhau và một bản sao khá khác nhau. Các biến thể mới hơn đều xuất hiện dưới dạng /dev/ttyACM0
cổng và phiên bản cũ hơn /dev/ttyUSB0
. Đây là những gì tôi tìm thấy, dưới Raspbian:
Raspberry Pi có thể không cung cấp đủ năng lượng để lái Arduino, vì vậy bạn có thể cần nguồn điện bên ngoài. Để hoàn thiện, tôi cũng đã thử nghiệm Prolific PL2303 , mặc dù nó không có trên bất kỳ Arduino nào tôi biết. Nó xuất hiện khá vui vẻ như /dev/ttyUSB0
.
Đối với giao tiếp phức tạp hơn với các cảm biến, bạn có thể xem xét Firmata , "một giao thức chung để giao tiếp với các bộ vi điều khiển từ phần mềm trên máy tính chủ". Nó có các triển khai cho Arduino và các thư viện Python để chạy bên phía Raspberry Pi.
Đây là một ví dụ nhỏ sử dụng pyFirmata để đọc LM35 và thay đổi độ sáng của đèn 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()
Có một số lưu ý khi sử dụng pyFirmata:
- Đọc tương tự và ghi PWM được chuẩn hóa thành phạm vi 0 .. 1, và không phải là Arduino 0 .. 255 và 0 .. 1023 tiêu chuẩn.
- Bạn thực sự cần phải bắt đầu một luồng lặp riêng biệt để dừng các bài đọc cũ tràn bộ đệm nối tiếp
- Vì Arduino được đọc không đồng bộ, hãy đảm bảo rằng kết nối pyFirmata được khởi tạo hoàn toàn trước khi đọc từ các cổng. Mặt khác,
None
giá trị xảy ra sau đó.