前言

大学开学也快两个月了,现在这边是运动会。
当然,作为大学生的我当然不会参加任何运动会比赛的啦。

目前就正在整挑战杯的比赛,我也没想到我会去参加硬件这方面。
哈哈哈,就当拓宽路子了

处理

额,当然。我这边树莓派装的是官方的 x64 位系统,需要装PHP那一些,打算还是安装 x64 位系统会方便一些。
因为之前吃过了 x32 的痛苦,怎么装都装不上去。

注意:本篇文章都在 root 用户下执行,如果发现没有权限需要 susudo 进行提权操作

出现的问题

首先,更新一下

1
apt-get update 
1
apt-get upgrade

我这边还是安装了,Python3,最先我试过了Python2.7发现不太行。会出现下面的一个问题 serial 库怎么都装不上。
后面呢就安装了 Python3 来处理,发现 Serial 库安装上了,但是 RPi.GPIO 库安不上了,反正两个必需品就是有一个装不上


对应的 demo.py 文件如下

1
2
import serial
import RPi.GPIO

尝试处理

因为现在还是 python3 开发居多,所以我果断还是选择了 python3
先卸载掉 python2.7

1
2
3
4
# 树莓派自带的 Python
apt remove python -y
# 由于我的 Python 是后面安装的,并不是树莓派自带的 Python 所以卸载是这个
apt remove python-is-python2 -y

安装 Python3

1
apt-get install python3

执行不需要的依赖删除

1
apt-get autoremove

通过 CSDN 一顿查询,发现有 Python3 的 RPi.GPIO 模块
我去,这不是更好。

补充安装 Python3 的 Serial 模块

利用 pip 安装 serial
毕竟我原本就用过下面这条指令,发现这个操作并不可行

1
apt-get install python-serial

他找不到,那有什么办法,只好找其他方法咯。
后面看到可以用 pip 安装,那就用这个吧
(好在不需要我怎么配置)

1
pip install pyserial

最后再一次执行 demo.py 文件,发现不会报错了,OK了。
那么环境和库文件就没问题了。

配置Arduino

ArduinoIDE

在 ArduinoIDE 软件中写入以下代码

1
2
3
4
5
6
7
8
9
10
11
12
void setup() 
{
Serial.begin(9600); // 9600 bps
}
void loop()
{
if ( Serial.available())
{
if('s' == Serial.read())
Serial.println("Hello Raspberry,I am Arduino.");
}
}

然后直接烧录进入 Arduino 开发板中,在串口监视器输入 s 后可以直接返回结果。
证明直接在串口监视器下操作是没有问题的,也就是说这个程序是不存在问题的。

树莓派编辑 Python 页面

首先,我们需要将 Arduino 开发板与树莓派使用USB口进行链接。
随后进行查找接口

1
ls /dev/tty*

查看有没有ttyACM0 这个文件(注只有在两个硬件USB互连的情况下才会有这个。如果两者没有连接是不会有的)最新的系统一般都会自动生成。看到ttyACM0就说明二者可以通讯了

在树莓派中创建一份名字为 demo.py 的文件后输入内容

1
2
3
4
5
6
7
8
9
10
import serial
ser = serial.Serial('/dev/ttyACM0', 9600,timeout=1)
try:
while 1:
ser.write('s')
response = ser.readall()
print(response)
except:
print('No Result')
ser.close()

但是,在这里我发现一个致命的问题。
这个 Python 程序死活读不出来串口数据。

怎么读取都是 No Result 的结果。
后面我就抛开了树莓派的限制,直接查询 Arduino 与 Python 之间 Serial 的通信。
发现别人给的示例代码中,需要给 ser.write('s'.encode())
相当于需要编码

那么最终成型的代码如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python3
from base64
import decode
import serial
ser = serial.Serial('/dev/ttyACM0',9600,timeout=1)
try:
while 1:
ser.write('s'.encode())
res = ser.readall()
print(res.decode())
except:
print('No Result')
ser.close()

就可以成功用 Python3 进行输出了

页脚

说明

一篇记录文章,以前没玩过,都需要自己慢慢琢磨。
后期可能要玩到机械臂,还得先学一下 Python

引用文章

树莓派与Arduino通信
树莓派Raspberry Pi上安装和使用RPi.GPIO模块以及引脚对照表