【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为灭,标记=0digitalWrite(13, LOW);flag = 0;
}void loop() {// 处理按钮的输入,点一下按钮,程序开始运作;再点一下按钮,程序停止运作if (digitalRead(2) == 1 && !flag) {digitalWrite(13, HIGH); // 点亮LEDflag = 1;}else if (digitalRead(2) == 1 && flag){digitalWrite(13, LOW); // 熄灭LEDanalogWrite(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') # 打开LEDtime.sleep(5)write_command('0') # 关闭LEDtime.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.mzph.cn/bicheng/42724.shtml

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

相关文章

景联文科技打造高质量图文推理问答数据集,赋能大语言模型提升推理能力

大语言模型在处理推理任务时,不同于人类能够反思错误并修正思维路径,当它遇到自身知识盲区时,缺乏自我校正机制,往往导致输出结果不仅无法改善,反而可能变得更不准确。 需要依赖外部的知识库和推理能力来克服其在理解和…

蚓链实践告诉你“企业确保达成数字化营销效果的方法”

在如今这个数字化盛行的时代,企业想在激烈的市场竞争里崭露头角,确保数字营销效果那可是至关重要!今天就来给大家聊聊实现这一目标的基本条件,来自蚓链数字化营销系统的广大用户体验总结。 一、精准的目标定位 企业一定要清楚地知…

uniapp 表格,动态表头表格封装渲染

1.接口表格数据: {"headers": [{"label": "实例名","name": "v1","order": 1,"hide": false,"dateTypeValue": null},{"label": "所属科室","name&quo…

CentOS 安装 annie/lux,以及 annie/lux 的使用

annie 介绍 如果第一次听到 annie 想必都会觉得陌生,annie 被大家称为视频下载神器,annie 作者介绍说可以下载抖音、哔哩哔哩、优酷、爱奇艺、芒果TV、YouTube、Tumblr、Vimeo 等平台的视频。 githup:https://github.com/pingf/annie 支持…

51单片机嵌入式开发:1、STC89C52环境配置到点亮LED

STC89C52环境配置到点亮LED 1 环境配置1.1 硬件环境1.2 编译环境1.3 烧录环境 2 工程配置2.1 工程框架2.2 工程创建2.3 参数配置 3 点亮一个LED3.1 原理图解读3.2 代码配置3.3 演示 4 总结 1 环境配置 1.1 硬件环境 硬件环境采用“华晴电子”的MINIEL-89C开发板,这…

elasticSearch快速了解

elasticSearch:经常用于搜索引擎,我们用的百度搜索和github上的搜索都是用的搜索引擎,它是对输入内容进行分析,然后查询,不像数据库模糊搜索的like一样必须含用你输入的全部内容。 elasticSearch优势:支持…

一文解决:你与该网站的连接不是私密连接,存在安全隐患

访问网页时,是不是会经常遇到网站不是私密连接的提示?当浏览器提示某个网页不安全时,这通常是因为网页使用的是非加密的HTTP协议,或者其HTTPS协议的SSL/TLS证书存在问题。 通常遇到这类网站时要注意,一来是网站未与证书…

`THREE.Line` 是 Three.js 中用于创建线段的类。

demo案例 THREE.Line 是 Three.js 中用于创建线段的类。以下是 THREE.Line 的详细说明,包括构造函数参数、输出、方法和属性。 构造函数 new THREE.Line(geometry, material, mode) geometry (THREE.BufferGeometry 或 THREE.Geometry): 定义线段的几何体。mater…

[图解]SysML和EA建模住宅安全系统-12-内部块图

1 00:00:00,580 --> 00:00:02,770 接下来我们来画流了 2 00:00:03,100 --> 00:00:05,050 首先第一个是站点状态 3 00:00:05,140 --> 00:00:08,130 从这里到这里,我们画一个过来 4 00:00:10,290 --> 00:00:11,890 这里流到这里 5 00:00:11,900 -->…

汉中茗茶小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,茶叶管理,论坛管理,公告管理,茗茶历史管理 微信端账号功能包括:系统首页,茗茶信息&#xf…

mac怎么压缩pdf文件大小,mac压缩pdf文件大小不改变清晰度

在数字化时代,pdf格式因其良好的兼容性和稳定性,成为了文档分享和传输的首选。然而,随着文件内容的丰富,pdf文件的体积也越来越大,给存储和传输带来了不小的困扰。本文将揭秘几种简单有效的pdf文件压缩方法&#xff0c…

如何优化 PostgreSQL 中对于自关联表的查询?

文章目录 一、理解自关联表查询二、分析性能问题的可能原因(一)缺少合适的索引(二)大量数据的笛卡尔积(三)复杂的查询逻辑 三、优化策略及解决方案(一)创建合适的索引(二…

OpenGL笔记七之顶点数据绘制命令和绘制模式

OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点…

第二周:李宏毅机器学习笔记

第二周学习周报 摘要Abstract一、深度学习1.Backpropagation(反向传播)1.1 链式法则1.2 Forward pass(前向传播)1.3 Backward pass(向后传播)1.4 总结 2. Regression(神奇宝贝案例)2…

Redis常用命令——Set、Zset篇

文章目录 一、Set相关命令操作 SADD SMEMBERS SISMEMBER SCARD SPOP SMOVE SREM SINTER 与 SINTERSTORE SUNION 与 SUNIONSTORE SDIFF 与 SDIFFSTORE Set命令小结 二、Zset 相关命令操作 ZADD ZCARD ZCOUNT ZRANGE ZREVRANGE ZPOPMAX BZPOPMAX ZPOPMIN 与 BZPOPMIN ZRANK 与 …

MySQL事务隔离

MySQL事务隔离 前言锁共享锁(Shared Lock)排他锁(Exclusive Lock)行级锁(Row-Level Lock)表级锁(Table-Level Lock)快照读和当前读查看锁 事务事务的四个特性事务的并发问题事务的隔…

《Windows API每日一练》8.5 listbox控件

列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程,程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时,列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…

J024_打印电影的全部信息

一、需求描述 展示多部电影的信息。 电影信息包括:电影名称、电影得分、电影票价格。 二、代码实现 2.1 Movie类 package com.itheima.collection;public class Movie {//电影名称private String name;//电影得分private int score;//电影票价格private double…

【Unity 3D角色移动】

【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤,包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码: 步骤1:设置角色的物理属性 角色通常使用Character Co…

OpenCV杂记(4):OpenCV之色彩映射(伪彩applyColorMap)

1. 简述 我们在开发基于热成像(红外)或者做深度估计应用时,为了便于直观的观察,常常将检测结果进行色彩上的映射,这样便可以很直观的看出哪里温度高,哪里温度低,或者哪里深度更深或更浅。 我们将…