樹莓派和Arduino之間的通信主要有三種方式,即USB對接,GPIO對接和I2C總線對接。本文主要學習一下使用USB進行對接。(以及GPIO的準備工作)。
硬件準備:
硬件 | 數量 |
---|---|
Arduino UNO | 一塊 |
Arduino UNO的USB接口線 | 一條 |
樹莓派3B+ | 一塊 |
顯示器(視情況而定) | 一塊 |
鼠標、鍵盤等(視情況而定) | 各一個 |
樹莓派3B+的充電線 | 一條 |
環境搭配:
Arduino的IDE(我的版本是1.8.5的),樹莓派裏的系統(任何一個Linux均可,一般樹莓派有自己的),還有樹莓派中的Python環境(我的是2.7.13,建議是2.7以上的版本)。
以上的安裝我假定你們都完成了
那麼接下來就是這兩個硬件之間的通信需要的環境。
首先是安裝Python的兩個庫RPi.GPIO和serial,前一個是可控制LED、電機什麼的,後一個是串口通信,用於發送消息的。
#在普通用戶下進行操作(也可以是root,這樣下面的sudo就不用輸入了)
#下載GPIO庫
wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.6.2.tar.gz
#解壓
tar -xvzf RPi.GPIO-0.6.2.tar.gz
#進入解壓後的目錄(文件夾)
cd RPi.GPIO-0.6.2
#安裝GPIO庫文件(權限不夠加sudo)
python setup.py install
OK,接下來是serial庫
#一般現在的系統裏面都有這個庫
sudo apt-get install python-serial
接下來我們驗證一下是否裝好了這兩個庫
#新建一個test.py的測試文件
touch test.py
#使用vim進行編輯(vim可能要自己裝,sudo apt-get install vim)
vim test.py
輸入的內容如下:
vim的使用相信在座的各位都會。
接下來運行這個文件
#使用Python運行
python test.py
如果沒有報錯證明安裝成功了,如下:
那麼我們需要的環境配置就完成了,前戲結束,接下來就是正餐,即連接這兩大硬件了。
USB對接:
首先我們檢查一下端口:
#輸入如下命令
ls /dev/tty*
接下來我們把Arduino和樹莓派連接起來:
接着輸入上述的命令,我們會發現:
因此多了個這個/dev/ttyACM0(此ACM非彼ACM)端口。有這個說明可以通信了,接下來先給Arduino燒錄如下代碼:
void setup(){
Serial.begin(9600); // 9600波特率
}
void loop() {
if ( Serial.available())//判斷串口緩存區有沒有數據
{
if('s' == Serial.read())//有數據就用read來讀取並判斷是不是s
Serial.println("Hello Raspberry,I am jiayu's Arduino.");//是的話就向串口打印這串字符
}
}
(可以在樹莓派中下載Arduino的IDE進行燒錄,也可以在Windows上的IDE進行燒錄,在Linux裏的話需要下載Arduino的IDE命令也很簡單:sudo apt-get install arduino)。
在樹莓派中新建一個文件用來寫Python的程序:
#新建.py文件
touch communication.py
#使用vim進行編輯,和上面一樣
vim communication.py
輸入以下的代碼:
#-*-coding:UTF-8-*-
import serial #導入serial庫
ser = serial.Serial('/dev/ttyACM1', 9600,timeout=1); #打開端口,每一秒返回一個消息
#try模塊用來結束循環(靠拋出異常)
try:
while 1:
ser.write('s');#寫s字符
response = ser.readall();#用response讀取端口的返回值
print response;#進行打印
except:
ser.close();#拋出異常後關閉端口
保存退出即可(相信你已經會熟練使用vim了 )。
輸入命令運行程序就行了:
#如果權限不夠前面就加上sudo
python communication.py
運行結果如下:(Ctrl+z結束,也就是代碼中的異常)
如此一來我們就完成了樹莓派和Arduino的第一個通信,本文也就接近尾聲了。
以上是我的總結至於Arduino的使用,樹莓派的安裝,樹莓派上Python的安裝,以及vim的一般使用,我都假定你們已經完成或者有基礎了。本文主要講解如何連接兩個硬件。由於本人能力有限,難免有疏漏錯誤之處,歡迎大家指正以及留言探討。