1. 背景
最近想研究一下用 Python 控制 Arduino 的技术,通过上网查询,发现可以用 Python 中的 serial 库来实现和 Arduino 主板的串口通信,从而控制 Arduino。
特此记录一下这个小项目的过程及出现的问题。
2. 基础准备
主板:Arduino AVR 开发板
配件:LED 灯、按钮、电机
Python版本:Python 3.8.1
所需类库:Python - serial(安装:命令行输入 pip install serial
)
3. 项目概述
- 开始,电机不动,LED 灯熄灭。等待按钮按下。
- 按下按钮后,LED 灯亮,电机开始以正转 5 秒、反转 5 秒的状态循环。
- 再次按下按钮,LED 灯灭,电机停止转动。
- 重复 1->2->3 的循环过程,直到程序停止。
4. 代码实现
如有不明白的地方请看注释。
serial 函数使用请移步 用 Python 玩转串口(基于 pySerial)- 码农老王(JN) 的博客
1.c
int flag = 0; // flag=1: 当前电机转动;flag=0: 当前电机不转
void setup() {
// 初始化串行通信,设置波特率
Serial.begin(9600);
// 初始化电机引脚
pinMode(5, OUTPUT);
pinMode(7, OUTPUT);
// 初始化LED、按钮引脚
pinMode(13, OUTPUT);
pinMode(2, INPUT);
// 初始化LED为灭,标记=0
digitalWrite(13, LOW);
flag = 0;
}
void loop() {
// 处理按钮的输入,点一下按钮,程序开始运作;再点一下按钮,程序停止运作
if (digitalRead(2) == 1 && !flag) {
digitalWrite(13, HIGH); // 点亮LED
flag = 1;
}
else if (digitalRead(2) == 1 && flag){
digitalWrite(13, LOW); // 熄灭LED
analogWrite(5, 0); // 停止电机
flag = 0;
}
// 此时可以运行电机(flag == 1) and 检查串行端口是否有数据传入
if (flag && Serial.available() > 0) {
// 读取数据
int data = Serial.read();
// 0表示停止
if (data == '0') {
digitalWrite(7, HIGH);
analogWrite(5, 200);
}
// 1表示运动
else if (data == '1') {
digitalWrite(7, LOW);
analogWrite(5, 200);
}
}
}
2.py
import serial
import time
# 初始化串口
arduino = serial.Serial('COM3', 9600, bytesize=8, parity='N', stopbits=1, timeout=1)
# 向Arduino发送指令
def write_command(cmd):
arduino.write(bytes(cmd, 'utf-8'))
data = arduino.readline()
return data
# 主程序
while True:
# arduino.open() # 经过实践发现无需open()和close()函数,初始化串口和关闭程序的操作就可以实现这两个过程
write_command('1') # 打开LED
time.sleep(5)
write_command('0') # 关闭LED
time.sleep(5)
# arduino.close()
5. 运行效果
视频还没过审,过了就放。
还是有一些不足之处,比如按钮按下为 1,松开为 0。要是按得太快或太慢都会导致识别的问题。所以按按钮要干脆利落,有一种一发入魂的感觉,这样才能完美完成展示。
(本人也还在修炼中,如果有好的解决办法欢迎大家教我)
6. 项目出现的问题
主要的硬件问题就是 serial 串口无法访问的问题:
-
这个问题,大概率是因为有其他的程序(例如 Arduino IDE 或 Mixly 等代码编辑器)在占用串口,建议将 Arduino 的代码编辑器关掉再运行 Python 程序。
这样原本烧录到 Arduino 中的代码依然会继续执行,同时 Python 也不会显示串口占用的问题。运行正常。 -
可能是串口的配置与函数的传参不一致。桌面右键“我的电脑”(win11 右键底部任务栏的 windows 徽标)-> 点击“计算机管理” -> 再点击“设备管理器” -> 找到对应的 Arduino 设备右键打开“属性”(我的电脑是 win11,在“端口 COM和LPT”一栏中)-> 点击上方“端口设置” -> 查看端口波特率等数据,看看自己在 Python 代码中传的参数一不一致。
-
在我下载的 Python 库的源码中自带 open() 和 close() 这两个函数,如果没有的话可能导致串口出现问题,可以分别加在程序的开头和结尾试试。(要是报错再删掉 嘿嘿~)
-
可能是后台有串口监视设备在运行,尝试关闭后,再运行程序试试。
-
不行的话,把报错粘贴到百度上,搜索解决方案。
6. 结语
感谢您的观看,希望我的经验能对您有帮助!
拜拜ヾ(•ω•`)o