ESP32(MicroPython)四轮差速底盘遥控

本项目主控改为ESP32-C3,沿用之前的L298N电机驱动、12.6v 18650电池组、LM7805降压模块的方案。电机改用1:19减速比的,使用130mm车轮,主要考虑越野用途。

8744305d6e83489f84814e38048fe24b.jpg

 

遥控方面,本项目使用HC-14模块,实测连接到电脑可以通过串口接收遥控器数据,遥控器有线连接底盘上的主控也能正常使用,但通过HC-14模块接收数据时没有响应,需要更换其它方案,但本质上都是通过串口透传来控制。

ff4f193239fe40febd69ac69c170c8f2.jpg

 

两边车轮的转速由遥控器计算得到。遥控器程序有两种模式,第一种模式通过测量两个摇杆y轴电压分别控制两边电机pwm占空比,第二种模式通过左摇杆y轴控制速度,通过右摇杆x轴控制转向。通过左摇杆x轴控制模式切换(连续3次检测到电压达到目标值再切换)。数据换算为两侧电机pwm占空比,遥控器发出的两边占空比增加了1023以避免取负值,在底盘上的主控进行切换。另外,遥控器连接OLED屏幕,可以显示当前控制小车的两个摇杆轴的位置以辅助操作。

遥控器程序

#导入Pin模块

from machine import Pin

from machine import ADC

from machine import Timer

from machine import SoftI2C

from ssd1306 import SSD1306_I2C #I2C的oled选该方法

 

#定义ADC控制对象

adc1=ADC(Pin(1))

adc1.atten(ADC.ATTN_11DB) #开启衰减,量程增大到3.3V

adc2=ADC(Pin(2))

adc2.atten(ADC.ATTN_11DB) #开启衰减,量程增大到3.3V

adc3=ADC(Pin(3))

adc3.atten(ADC.ATTN_11DB) #开启衰减,量程增大到3.3V

adc4=ADC(Pin(4))

adc4.atten(ADC.ATTN_11DB) #开启衰减,量程增大到3.3V

#创建软件I2C对象

i2c = SoftI2C(sda=Pin(12), scl=Pin(13))

#创建OLED对象,OLED分辨率、I2C接口

oled = SSD1306_I2C(128, 64, i2c)

 

mode=1

flag=0

#定时器0中断函数

def time0_irq(time0):

    global mode

    global flag

    a=adc1.read()*2046//4095

    b=adc2.read()*2046//4095

    c=adc3.read()*2046//4095

    d=adc4.read()*2046//4095

    if mode==0: #直接通过两边摇杆y轴控制底盘两边电机转速

        l=b

        r=d

        print("%04d%04d"%(l,r))

        oled.fill(0)

        oled.fill_rect(20,-b//32+63,16,5,1) #画填充矩形

        oled.fill_rect(90,-d//32+63,16,5,1) #画填充矩形

        oled.show()

        if a<46: #通过左摇杆x轴控制模式切换

            flag+=1

            if flag>2:

                mode=1

                flag=0

        if a>46:

            flag=0

    if mode==1:

        l=int(b-c*0.25+290) #左摇杆y轴控制速度,右摇杆x轴控制转向。考虑实际调试时发现的偏差,增减的值不是256

        r=int(b+c*0.25-290)

        if l<0: #防止超出取值范围

            l=0

        if l>2046:

            l=2046

        if r<0:

            r=0

        if r>2046:

            r=2046    

        print("%d%04d"%(l,r))

        oled.fill(0)

        oled.fill_rect(10,-b//32+63,16,5,1) #画填充矩形

        oled.fill_rect(-c//32+110,25,5,16,1) #画填充矩形

        oled.show()

        if a>2000: #通过左摇杆x轴控制模式切换

            flag+=1

            if flag>2:

                mode=0

                flag=0

        if a<2000:

            flag=0

        

    

#程序入口

if __name__=="__main__":

    time0=Timer(0) #创建time0定时器对象

    time0.init(period=100,mode=Timer.PERIODIC,callback=time0_irq)

    while True:

        pass

底盘程序(由于目前ESP32-C3的MicroPython固件最多支持6个pwm通道,同侧车轮同方向引脚相连,只用到4路pwm)

#导入Pin模块

from machine import Pin

from machine import PWM

import time

 

#定义motor1控制对象

motor1=PWM(Pin(9),freq=1000,duty=0)

motor2=PWM(Pin(8),freq=1000,duty=0)

motor3=PWM(Pin(4),freq=1000,duty=0)

motor4=PWM(Pin(5),freq=1000,duty=0)

 

duty_mix=10231023

#程序入口

if __name__=="__main__":

   while True:

       try:

           duty_mix=int(input('input'))

       except:

           pass

       duty_l=duty_mix//10000-1023 #前四位为左侧pwm占空比

       duty_r=duty_mix%10000-1023 #后四位为右侧pwm占空比

       if duty_l>0:

           motor1.duty(duty_l)

           motor2.duty(0)

       if duty_l<0:

           motor1.duty(0)

           motor2.duty(-duty_l)

       if duty_l==0:

           motor1.duty(0)

           motor2.duty(0)

       if duty_r>0:

           motor3.duty(duty_r)

           motor4.duty(0)

       if duty_r<0:

           motor3.duty(0)

           motor4.duty(-duty_r)

       if duty_r==0:

           motor3.duty(0)

           motor4.duty(0)

       time.sleep_ms(50)

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java课题笔记~ 关联映射

一、MyBatis关联查询 在关系型数据库中&#xff0c;表与表之间存在着3种关联映射关系&#xff0c;分别为一对一、一对多、多对多。 一对一&#xff1a;一个数据表中的一条记录最多可以与另一个数据表中的一条记录相关。列如学生与学号就属于一对一关系。 一对多&#xff1a;主…

Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

本篇文章聊聊 Stable Diffusion WebUI 中的核心组件&#xff0c;强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情。 写在前面 本篇文章的主角是开源项目 TencentARC/GFPGAN&#xff0c;和上一篇文章《Stable Diffusion 硬核生存指南&#xff1a;WebUI 中的 CodeFormer》提…

流程图如何制作?5步快速画出好看的流程图!

流程图是一种图形化工具&#xff0c;描述某个过程或者操作的步骤&#xff0c;以及某种业务系统的具体流程。流程图通常由各种图形符号、形状、箭头组成&#xff0c;可以清晰的表示出流程或系统中各种步骤、每个环节之间的关系、条件判断、数据的流动和处理过程等。 在线流程图软…

C语言强制类型转换

无符号与有符号数&#xff1a;不改变数据内容&#xff0c;改变解释方式 长整数变为短整数&#xff1a;高位阶段&#xff0c;保留低位 短整数变长整数&#xff1a;符号扩展

SAS-数据集SQL垂直(纵向)合并

一、SQL垂直合并的基本语法 一个selectt对应一个表&#xff0c;select之间用set-operator连接&#xff0c;set-operator包括&#xff1a;except&#xff08;期望&#xff09;、intersect&#xff08;相交&#xff09;、union&#xff08;合并&#xff09;&#xff0c;outer un…

[K8S:命令执行:权限异常:解决篇]:通过更新kubeconfig配置相关信息

文章目录 一&#xff1a;场景复现&#xff1a;1.1&#xff1a;关键信息&#xff1a;1.2&#xff1a;全异常日志输出&#xff1a; 二&#xff1a;解决流程&#xff1a;2.1&#xff1a;更新 kubeconfig&#xff1a;2.1.1&#xff1a;执行命令&#xff1a; 2.2&#xff1a;再次执行…

【react】react中BrowserRouter和HashRouter的区别:

文章目录 1.底层原理不一样:2.path衣现形式不一样3.刷新后对路山state参数的影响4.备注: HashRouter可以用于解决一些路径错误相关的问题 1.底层原理不一样: BrowserRouter使用的是H5的history API&#xff0c;不兼容IE9及以下版不。 HashRouter使用的是URL的哈希值。 2.path衣…

DHCP协议及其实验(eNSP)

目录 一&#xff0c;DHCP 1.1&#xff0c;DHCP作用 1.2&#xff0c;DHCP地址池 1.3&#xff0c;DHCP报文类型 1.4&#xff0c;DHCP工作原理 对DHCP工作原理的思考&#xff1a; 1.5&#xff0c;DHCP租期更新 1.6&#xff0c;DHCP重绑定 1.7&#xff0c;IP地址释放 二&am…

笔记本WIFI连接无网络【实测有效解决方案,不用重启电脑】

笔记本Wifi连接无网络实测有效解决方案 问题描述&#xff1a; 笔记本买来一段时间后&#xff0c;WIFI网络连接开机一段时间还正常连接&#xff0c;但是过一段时间显示网络连接不上解决方案&#xff1a; 1.编写网络重启bat脚本&#xff0c;将以下内容写到文本文件&#xff0c;把…

华夏ERP信息泄露

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 文章作者拥有对此文章的修改和解释权。如欲转载或传播此文章&#xff0c…

用 Gaussian Process 建模 state-action 空间相关性,加速 Multi-Fidelity RL

1 intro 利用相邻 state-action 的空间相关性来加速学习&#xff1a;通过 Gaussian Process&#xff08;GP&#xff09;作为函数逼近器。主要贡献&#xff1a;两个算法。 model-based MFRL 算法 GP-VI-MFRL&#xff0c;估计转换函数&#xff0c;然后使用 value iteration 计算…

EVE-NG MPLS L2VPN LDP lsp

目录 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 2.2 配置MPLS LDP 2.3 配置L2VPN PW(LDP) 2.4 验证L2VPN 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 PE1 interface LoopBack 0ip address 1.1.1.9 32 quitinterface GigabitEthernet1/0ip address 10.1.1.1 25…

【ONE·Linux || 基础IO(二)】

总言 文件系统与动静态库相关介绍。 文章目录 总言2、文件系统2.1、背景知识2.2、磁盘管理2.2.1、磁盘文件系统图2.2.2、inode与文件名 2.3、软硬链接 3、动静态库3.1、站在编写库的人的角度&#xff1a;如何写一个库&#xff1f;3.1.1、静态库制作3.1.3、动态库制作 3.2、站在…

机器学习深度学习——序列模型(NLP启动!)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——卷积神经网络&#xff08;LeNet&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&&深度…

VS2022程序集说明汉化

下载本地化的 .NET IntelliSense 文件 https://dotnet.microsoft.com/zh-cn/download/intellisense 目前本地化的 IntelliSense 文件不再可用。 可用的最新版本是 .NET 5。 建议使用英语 IntelliSense 文件。 .NET6的汉化需要自己动手&#xff1a; 教程可以参照下方&#xff1a…

Spring Cloud Alibaba (一)

1 微服务介绍 1.1 系统架构演变 随着互联网的发展&#xff0c;网站应用的规模也在不断的扩大&#xff0c;进而导致系统架构也在不断的进行变化。 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->S…

【数据结构OJ题】合并两个有序数组

原题链接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 看到这道题&#xff0c;我们注意到nums1[ ]和nums2[ ]两个数组都是非递减的。所以我们很容易想到额外开一个数组tmp[ ]&#x…

vue整合脑图编辑管理系统-kitymind百度脑图

前言 项目为前端vue项目&#xff0c;把kitymind百度脑图整合到前端vue项目中&#xff0c;显示了脑图的绘制&#xff0c;编辑&#xff0c;到处为json&#xff0c;png&#xff0c;text等格式的功能 文章末尾有相关的代码链接&#xff0c;代码只包含前端项目&#xff0c;在原始的…

MySQL-NoSQL整体笔记---持续输出中

MySQL部分 一、搭建 MySQL 数据库服务器 1、下载并上传glibc版本的Mysql 2、新建用户以安全方式运行进程 [roottemplate ~]# groupadd -r -g 306 mysql [roottemplate ~]# useradd -g 306 -r -u 306 mysql3、安装并初始化mysql [roottemplate ~]# tar xf mysql-5.7.36-linu…

STM32 DMA学习

DMA简称 DMA&#xff0c;Direct Memory Access&#xff0c;即直接存储器访问。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为RAM与I/O设备开辟一条直接传送数据的通路&#xff0c;能使CPU的效率大为提高。…