Arduino的优点主要是具有丰富的外围硬件及类库支持,同时具备模拟引脚和数字引脚(MEGA、Due具有更多的引脚),缺点主要是作为一款单片机,其运算能力不太足(8位字长16MHz时钟频率的配置跟C51、STM32、ESP系列甚至micro:bit相比整体都有一定差距)。树莓派作为一台嵌入式Linux系统计算机,其算力毋庸置疑,不过其虽然有40个引脚,但是可用的GPIO引脚只有17个,且不含模拟输入引脚。其GPIO口的输入电压不能超过3.3v,而多数传感器、执行器的工作电压是5v,这将导致无法直接使用它们。再者树莓派硬件编程没有丰富的类库支持,这就需要自己不断造轮子,很烦人。个人认为比较理想的方式是将树莓派和Arduino结合起来,树莓派作为上位机承担图形图像处理、服务器程序运行、指令发布等任务,Arduino作为下位机负责从传感器获取数据,驱动执行器、显示器等任务,二者高低搭配,协作解决问题。如此一来二者的通信就是一个需要亟待解决的问题,基本的通信方式有基于IIC协议、SPI协议、UART串口等。从便捷性上考虑,USB串口通信仅需要将USB转Type-B线连接至树莓派和Arduino两端,就跟Arduino和Windows通信一样,从通信距离里上考虑,树莓派4b板载蓝牙5.0,Arduino连接HC蓝牙模块,二者之间进行无线通信,不受线长限制,也是理想选择。下面就分别介绍这两种通信方式。
使用USB转Type-B线连接树莓派和Arduino(使用USB转TTL线连接至ArduinoTX0 RX0也是同样效果),打开树莓派LX终端输入:
ls /dev/tty*
查看串口列表里面是否出现
(插入的USB接口不同看到的的序号可能也会有所不同)该串口就是我们要使用的通信串口
接下来安装pyserial库,而且不要安装serial库,但是在编程时要导入serial库
sudo apt-get install python-serial
树莓派代码:
import serial
import time
com0="/dev/ttyUSB0"
com1="/dev/ttyUSB1"
ser=serial.Serial(com0,9600,timeout=1)#设置串口、波特率、超时时间
#打印相应信息用于查看
print("Serial name:",ser.name)
print("Serial baudrate:",ser.baudrate)
print("Serial state:",ser.is_open)
try:
while 1:
#读取数据并打印
res=ser.readline()
print(res)
#串口发送数据
#time.sleep(1)
#ser.write("Hello! I am Raspberry!".encode("utf-8"))
except:
ser.close()
树莓派里面没有安装arduino的话先安装一下
sudo apt-get install arduino
然后就像在windows下给Arduino编程一样,编写并下载程序
Arduino代码:
int count=0;
void setup(){
Serial.begin(115200);
}
void loop(){
//接受数据
String str="";
while(Serial.available()){
char ch=Serial.read();
str+=ch;
delay(10);
}
if(str.length()>0)
Serial.println(str);
// 发送数据
// count++;
// Serial.print("Hello ,I am Arduino!");
// Serial.print(count);
// delay(1000);
}
运行结果:
这里采用的是HC-02蓝牙模块(HC-05、HC-06包括BLE蓝牙都可以),首先将蓝牙模块接到Arduino上面(以连接至Serial3),其次在树莓派的图形界面上点击蓝牙按钮,完成蓝牙配对。然后进入LX 终端输入:
bluetoothctl
扫描可用蓝牙:
scan on
找到我们的蓝牙设备:
在dev目录下建立相应的蓝牙配置文件,则以后可以自动连接到该蓝牙设备
sudo rfcomm bind XXX刚才的蓝牙MAC地址XXX
查看是否建立完成:
一切就绪后开始编程,与上面的代码类似:
树莓派代码:
import serial
import time
com0="/dev/ttyUSB0"
com1="/dev/ttyUSB1"
com2="/dev/rfcomm0"
ser=serial.Serial(com2,9600,timeout=1)#设置串口、波特率、超时时间
#打印相应信息用于查看
print("Serial name:",ser.name)
print("Serial baudrate:",ser.baudrate)
print("Serial state:",ser.is_open)
try:
while 1:
#读取数据并打印
res=ser.readline()
print(res)
#串口发送数据
#time.sleep(1)
#ser.write("Hello! I am Raspberry!".encode("utf-8"))
except:
ser.close()
为了更好的演示,同时避免干扰,此时在windows上面对Arduino进行编程
Arduino代码:
int count=0;
void setup(){
Serial.begin(115200);
Serial3.begin(9600);//HC-02默认波特率9600
}
void loop(){
//接受数据
String str="";
while(Serial3.available()){
char ch=Serial3.read();
str+=ch;
delay(10);
}
if(str.length()>0)
Serial.println(str);
// 发送数据
// count++;
// Serial3.print("Hello ,I am Arduino!");
// Serial3.print(count);
// delay(1000);
}
运行结果: