树莓派利用Python3与Arduino实现串口通信


前言

因为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代码

通过ArduinoIDE上传如下代码

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()

结尾

测试成功并成功亮灯

参考来源

树莓派与Arduino串口通信:https://www.cnblogs.com/JamieHecanfly/p/8877426.html
基于Arduino和python的串口通信和上位机控制:https://www.cnblogs.com/lanceyu/p/10201236.html
树莓派和Arduino之间通过串口进行通信:http://www.manongjc.com/detail/13-ofvgonalgfswuxv.html

声明:Asnull|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 树莓派利用Python3与Arduino实现串口通信


要变得更好