前言
因为Arduino具有丰富的外部接口,也拥有比较多可以直接使用的传感器,可以比较方便的获取大量环境数据,例如温度、湿度、声、光等。但这就有个问题,我要如何将arduino获取到的数据发送给树莓派进行进一步的处理呢?或是我该如何使用树莓派控制arduino去执行我要它执行的东西呢?如果你也有这几个问题,那么这篇文章应该对你有些帮助。
这个问题也许并不复杂,但对于一个初学者来说往往会碰上许多摸不着头脑的问题。起初,我为了解决这个问题也进行了大量百度,但遗憾的是,目前百度上找到的绝大多数教程都是python2x版本的,但对于凡是都喜欢用最新版本的我来说,python2对我这个强迫症就貌似显得极为不友好了,但在python3上运行一个接近上个世纪的代码往往会出现一些谜之错误。但最后在我大量查找之下,终于东拼西凑的搞出了一个勉强能用的代码。也希望对你有所帮助。
什么是Arduino?
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。由一个欧洲开发团队开发。
Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是通过 Arduino编程语言 (基于 Wiring)和Arduino开发环境(基于 Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信来实现,例如树莓派。
通信方式
Arduino与树莓派通过串口(Serial)通信的方案一般有两种,一是通过树莓派GPIO串口通信,第二种是通过USB串口通信。本篇文章将介绍树莓派如何通过USB串口向arduino读取或发送数据,因为Arduino与树莓派通过USB串口不仅稳定,而且不用连接复杂的线缆。
代码前的准备
1、接线方式
将树莓派与arduino通过如下方式连接(看箭头所示)
2、获取连接端口
在树莓派命令窗口输入如下指令来获取连接到树莓派的端口:
ls /dev/tty*
若两个设备正常连接,则可看到如下端口的信息,一般连接的端口在最后几个当中,如图框住的 它可能还有其他的形式,例:/dev/ttyACM、/dev/ttyUSB0、/dev/ttyUSB1等等情况,因设备而异,然后就是复制你的端口名。
若你无法判断哪个才是连接树莓派的端口,可以通过对比法找不同。就是在连接树莓派和没连接树莓派时分别执行上述指令,通过对比看哪个是多出来的哪个,那么那个便是你的端口。
提醒:端口在重新插拔时可能会发生变化,若出现一些未知错误,那么应该重新查看一下端口是否改变。
3、安装支持库
因为我们是要利用python在树莓派与arduino进行通信,所以就必须安装python对应的串口通信库才能更好的玩耍。
执行以下命令安装:
sudo apt-get install python-serial
若你感觉安装缓慢,则你可能需要更换软件源为国内的,具体请看 《更换软件源》
安装完成后就是检查是否成功安装,依次运行如下指令(默认你已是python3,若不是请参考《树莓派python3安装opencv》):
python3
>>>import serial
若未报错,则说明应该安装成功。
Arduino代码
int incomedate = 0;
void setup() {
Serial.begin(9600); //设置串口波特率9600
}
void loop() {
while (Serial.available() > 0)//串口接收到数据
{
incomedate = Serial.read();//获取串口接收到的数据
if (incomedate == '1')
{
//若接收到1则执行
pinMode(13, OUTPUT);
digitalWrite(13, HIGH); //亮灯
Serial.println("ok"); //向树莓派发送信息
}
delay(5);
}
}
Python 代码
默认你已是python3版本
import serial
Port = "/dev/ttyUSB1" # 串口
baudRate = 9600 # 波特率
ser = serial.Serial(Port, baudRate, timeout=1)
while True:
send = '1' # 发送给arduino的数据
ser.write(send.encode())
str = ser.readline().decode() # 获取arduino发送的数据
if(str != ""):
print(str)
if(str == 'ok\r\n'): # 发送一次便退出
print('收到')
break
ser.close()
结尾
测试成功并成功亮灯
参考来源