【2024最新】Arduino通过Python进行串口通信控制电机

1. 背景

最近想研究一下用 Python 控制 Arduino 的技术,通过上网查询,发现可以用 Python 中的 serial 库来实现和 Arduino 主板的串口通信,从而控制 Arduino。

特此记录一下这个小项目的过程及出现的问题。

2. 基础准备

主板:Arduino AVR 开发板
配件:LED 灯、按钮、电机
Python版本:Python 3.8.1
所需类库:Python - serial(安装:命令行输入 pip install serial

3. 项目概述

  1. 开始,电机不动,LED 灯熄灭。等待按钮按下。
  2. 按下按钮后,LED 灯亮,电机开始以正转 5 秒、反转 5 秒的状态循环。
  3. 再次按下按钮,LED 灯灭,电机停止转动。
  4. 重复 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. 运行效果

Arduino通过Python进行串口通信控制电机

还是有一些不足之处,比如按钮按下为 1,松开为 0。要是按得太快或太慢都会导致识别的问题。所以按按钮要干脆利落,有一种一发入魂的感觉,这样才能完美完成展示。
(本人也还在修炼中,如果有好的解决办法欢迎大家教我)

6. 项目出现的问题

主要的硬件问题就是 serial 串口无法访问的问题:
串口拒绝访问

  1. 这个问题,大概率是因为有其他的程序(例如 Arduino IDE 或 Mixly 等代码编辑器)在占用串口,建议将 Arduino 的代码编辑器关掉再运行 Python 程序
    这样原本烧录到 Arduino 中的代码依然会继续执行,同时 Python 也不会显示串口占用的问题。运行正常。

  2. 可能是串口的配置与函数的传参不一致。桌面右键“我的电脑”(win11 右键底部任务栏的 windows 徽标)-> 点击“计算机管理” -> 再点击“设备管理器” -> 找到对应的 Arduino 设备右键打开“属性”(我的电脑是 win11,在“端口 COM和LPT”一栏中)-> 点击上方“端口设置” -> 查看端口波特率等数据,看看自己在 Python 代码中传的参数一不一致。

  3. 在我下载的 Python 库的源码中自带 open() 和 close() 这两个函数,如果没有的话可能导致串口出现问题,可以分别加在程序的开头和结尾试试。(要是报错再删掉 嘿嘿~)

  4. 可能是后台有串口监视设备在运行,尝试关闭后,再运行程序试试。

  5. 不行的话,把报错粘贴到百度上,搜索解决方案。

6. 结语

感谢您的观看,希望我的经验能对您有帮助!

拜拜ヾ(•ω•`)o

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python可以通过串口模块pyserial来读取Arduino串口数据。首先需要安装pyserial模块,可以使用pip命令进行安装。安装完成后,可以使用以下代码来读取Arduino串口数据: ```python import serial ser = serial.Serial('COM3', 960) # 串口号和波特率需要根据实际情况进行修改 while True: data = ser.readline().decode().strip() # 读取一行数据并解码 print(data) # 输出数据 ``` 其中,`serial.Serial()`函数用于打开串口,第一个参数为串口号,第二个参数为波特率。`ser.readline()`函数用于读取一行数据,返回的是字节类型,需要使用`decode()`函数进行解码。`strip()`函数用于去除字符串两端的空格和换行符。最后将读取到的数据输出即可。 ### 回答2: Python可以通过串口读取Arduino的数据,这就需要使用到串口通信库pySerial。首先需要安装pySerial库,可以使用pip安装。安装好了之后,就可以在Python程序中引用该库来进行串口通信。 在Python程序中使用pySerial库时,首先需要创建一个serial.Serial对象,指定串口的端口号、波特率、数据位、停止位等参数。之后可以通过该对象的read()方法来读取串口传来的数据。可以使用不同的读取方式,比如read()方法会一直等待串口传来数据,直到读取到指定长度的数据或者设定的时间到了才返回;而readline()方法会读取到换行符(\n)为止。 例子代码: ``` import serial ser = serial.Serial('COM3', 9600, timeout=1) while True: data = ser.readline().decode().strip() print(data) ``` 这段代码打开COM3号串口进行数据读取,每次读取一行数据。读取到的数据是bytes类型,需要使用decode()方法将其转换为字符串类型,使用strip()方法去除空格和换行符。最后打印出读取到的数据。由于这里的数据读取操作是一个死循环,所以可以将其封装成一个线程,以便在主程序中使用。 需要注意的是,在使用pySerial进行串口通信时,需要先关闭Arduino IDE的串口监视器,否则会干扰Python程序的读取。另外,在Arduino程序中也需要正确地使用Serial.println()或Serial.write()等方法输出数据,以便在Python中正确地解析读取到的数据。 总之,通过使用pySerial库,Python可以轻松地读取Arduino串口数据,并进行数据处理和转换。 ### 回答3: Python读取Arduino串口数据,可以使用PySerial库实现。PySerial库是Python中读写串口数据的标准库。 1. 安装PySerial库 使用pip安装PySerial库,可以在终端或命令行中输入以下命令: ```python pip install pyserial ``` 如果提示找不到pip,可以先安装pip: ```python sudo apt-get install python-pip ``` 2. 连接串口 将Arduino与电脑通过USB线连接,打开Arduino IDE,选择正确的板子和端口,然后上传以下代码: ```arduino void setup() { Serial.begin(9600); // 串行通信速率设置为9600 } void loop() { int sensorValue = analogRead(A0); // 读取模拟口A0的值 Serial.println(sensorValue); // 将值通过串口发送给电脑 delay(100); // 延时100毫秒 } ``` 代码的作用是将模拟口A0的值读取并通过串口发送给电脑,每隔100毫秒发送一次。 3. Python读取串口数据 在Python中打开串口,读取数据,在终端或命令行中输入以下代码: ```python import serial ser = serial.Serial('/dev/ttyACM0', 9600) # 端口号和通信速率要和Arduino设置相同 while True: data = ser.readline() # 读取一行数据 print(data) ``` 代码的作用是打开/dev/ttyACM0端口(这是Arduino连接到电脑的默认端口,如果是其他端口,可以更改),并等待接收数据。使用readline()方法读取数据,读取到的数据为字节(bytes)类型,使用print()方法输出到终端。 4. 其他方法 除了使用readline()方法,还可以使用read()方法或iter()方法读取数据。使用read()方法需要指定读取数据的长度,而使用iter()方法可以返回一个可迭代对象,可以使用for循环读取数据。 ```python # 使用read()方法读取数据 data = ser.read(10) # 读取10个字节的数据 # 使用iter()方法读取数据 for line in iter(ser.readline, b''): # 读取所有数据 print(line) ``` 5. 注意事项 在Python读取串口数据时,需要注意以下几点: - 确定端口号和通信速率要和Arduino设置相同。 - 读取到的数据为字节类型,需要使用decode()方法将其转换为字符串类型。 - 如果读取数据时出现异常,可以尝试关闭和打开串口再读取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值