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

news2024/12/23 19:56:44

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. 运行效果

视频还没过审,过了就放。

还是有一些不足之处,比如按钮按下为 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1906031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中仕公考:“三支一扶”岗位分别做什么工作?

“三支一扶”计划旨在招募应届毕业生或近两年内毕业的毕业生,部分省份还考虑技工院校高级工班、预备技师班毕业生。在湖北省,报考支医岗位不限制毕业年限,安徽和云南等省对支医类岗位取消了开考比例要求。为解决招人留人难题,艰苦…

毛绒玩具音乐芯片:OTP语音芯片WTN6040方案解析

随着科技的不断发展,智能化和互动性已经成为玩具设计中的关键因素。在毛绒玩具市场中,集成音乐播放功能的毛绒玩具因其趣味性和互动性而备受欢迎。本文将详细介绍OTP(One Time Programmable)语音芯片WTN6040在毛绒玩具音乐芯片中的…

网页UI:被客户说不大气!大气能当饭吃?真能,最起码保住你饭碗

大气的网页UI设计可以带来以下几个好处: 提升品牌形象:大气的设计能够给用户留下深刻的印象,增强品牌的认知度和形象。通过精心设计的元素、色彩和排版,可以传达出品牌的专业、高端和可信赖的形象。强化用户体验:大气…

SpringBoot开发实用篇(二)

目录 一:Redis 1:SpringBoot整合Redis 2:SpringBoot读写Redis的客户端 3:SpringBoot操作Redis实现技术切换(jedis) 二:Mongodb 1:Mongodb基础操作 2:SpringBoot整合…

【DataSophon】DataSophon1.2.1 ranger usersync整合

目录 一、简介 二、实现步骤 2.1 ranger-usersync包下载编译 2.2 构建压缩包 2.3 编辑元数据文件 2.4 修改源码 三、重新安装 一、简介 如下是DDP1.2.1默认有的rangerAdmin, 我们需要将rangerusersync整合进来 ,实现将Linux机器上的用户和组信息同步到Ranger…

『粽享端午』交互小程序 小游戏 案例赏析

在这片古老而又年轻的土地上,地域的差异孕育了丰富多彩的饮食文化。粽子,作为端午节的象征,承载着南咸北甜的口味之争,自古便在人们舌尖上演绎着不同的风味传奇。 然而,在快节奏的现代生活洪流中,我们渐渐失…

家谱管理系统

《家谱管理系统》 一个家谱关系由若干家谱记录构成,每个家谱记录由父亲、母亲和子女姓名构成,其中姓名是关 键字。设计并实现一个简单的家谱管理系统。定义一个主菜单,界面友好,演示程序以用户和计算机的对话方式进行&#xff0c…

开关电源——调制模式和工作模式

一、开关电源的调制模式 开关电源作为一种广泛应用于电子设备中,用于将一定电压和电流转换为另一种电压和电流的技术,以下是开关电源三种常见的调制模式: 脉冲宽度调制(Pulse Width Modulation) 脉冲频率调制&#xff…

触发器编程-创建(CREATE TRIGGER)、删除(DROP TRIGGER)

一、定义 1、触发器(Trigger)是用户对某一表中的数据做插入、更新和删除操作时被处罚执行的一段程序,通常我们使用触发器来检查用户对表的操作是否合乎整个应用系统的需求,是否合乎商业规则以维持表内数据的完整性和正确性 2、一…

从nginx返回404来看http1.0和http1.1的区别

序言 什么样的人可以称之为有智慧的人呢?如果下一个定义,你会如何来定义? 所谓智慧,就是能区分自己能改变的部分,自己无法改变的部分,努力去做自己能改变的,而不要天天想着那些无法改变的东西&a…

AI视频教程下载-使用ChatGPT成为全栈JavaScript开发者

学习使用Express JS和React JS进行全栈JavaScript开发 ChatGPT Express JS MongoDB React JS Tailwind 解锁全栈网页开发的世界,我们为初学者和中级学习者设计了全面的课程。在这段沉浸式的旅程中,你将深入前端和后端开发的基本概念,为自…

everything高级搜索-cnblog

everything高级搜索用法 基础4选项验证 总结搜索方式 高级搜索搜指定路径文件名: 文件名 路径不含文件名: !文件名包含单词 路径包含指定内容: 路径 content:内容 大小写 区分大小写搜索搜指定路径文件名: case:文件名 路径全字匹配 全字搜指定路径文件名: wholewo…

【网络安全】实验六(网络安全协议的应用SSL,Ipsec)

一、实验目的 二、搭配环境 打开两台虚拟机,并参照下图,搭建网络拓扑环境,要求两台虚拟机的IP地址要按照图中的标识进行设置,并根据搭建完成情况,勾选对应选项。同时,按照多选题中2-3题的要求完成相关环境…

java核心-泛型

目录 概述什么是泛型分类泛型类泛型接口泛型方法 泛型通配符分类 泛型类型擦除分类无限制类型擦除有限制类型擦除 问题需求第一种第二种 概述 了解泛型有利于学习 jdk 、中间件的源码,提升代码抽象能力,封装通用性更强的组件。 什么是泛型 在定义类、接…

web安全基础名词概念

本节内容根据小迪安全讲解制作 第一天 域名: 1.1什么是域名? 网域名称(英语:Domain Name,简称:Domain),简称域名、网域,是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称&a…

YoloV9改进策略:Block改进|轻量实时的重参数结构|最新改进|即插即用(全网首发)

摘要 本文使用重参数的Block替换YoloV9中的RepNBottleneck,GFLOPs从239降到了227;同时,map50从0.989涨到了0.99(重参数后的结果)。 改进方法简单,只做简单的替换就行,即插即用,非常…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

Cyber Weekly #14:WAIC 2024

赛博新闻 1、WAIC2024开幕:一半机器人,一半大模型 7月4日,AI界春晚——2024世界人工智能大会(WAIC 2024)在上海开幕,大会展示了500家企业的1500项展品,突出了机器人和大模型技术。国产机器人和…

【Excel】 给证件照换底色

1. 双击图片 → 删除背景 2. 标记要保留的区域 → 标记 → 保留更改 3. 重新设置背景色

知识的向量表示

1、one-hot表示,空间太大 2、bag词袋模型,无法表示词的语义 3、词的语义由什么决定?词由他的上下文决定?分布式语义 4、CBow,通过前面几个词和后面几个词,预测中间几个词 5、skip-gram,通过…