一起玩儿物联网人工智能小车(ESP32)——37. 利用超声波传感器和舵机实现自动避障小车(MicroPython)

摘要:本文介绍如何使用MicroPython语言控制超声波传感器和舵机实现小车的自动避障功能

在介绍Python版的自动避障小车之前,先介绍一下用Python如何控制OLED显示屏,所使用的显示屏模块还是SSD1306芯片驱动的0.96寸OLED-IIC显示屏模块。

首先打开Mixly软件,然后选择“Python ESP32”开发板。对于0.96寸OLED显示屏的功能位于“外接显示”、“OLED显示屏”功能组中。首先需要创建一个IIC对象,这里需要配置的是SCL和SDA引脚,频率使用默认值100000就可以了。接下来初始化一个128x64的OLED对象,如下图所示:

然后就是利用“OLED显示屏”功能模块中的各种输出功能来布置屏幕显示的内容了。我这里还是只显示文字“欢迎来到一起玩儿科技!”和一个内置的心形。配置页面输出的内容如下所示:

好了,接下来看一下运行的效果吧。如下图所示。

下面就来看一下Mixly为我们生成的代码。

import machine

import oled128x64

from expression_picture import Heart

i2c_extend = machine.SoftI2C(scl = machine.Pin(22), sda = machine.Pin(21), freq = 100000)

oled = oled128x64.OLED(i2c_extend,address=0x3c,font_address=0x3A0000)

oled.image(Heart,x = 63,y = 0,size = 1)

oled.shows('欢迎来到',x = 0,y = 0,size = 1,space = 0,center = False)

oled.shows('一起玩儿',x = 0,y = 14,size = 1,space = 0,center = False)

oled.shows('科技!',x = 0,y = 28,size = 1,space = 0,center = False)

可以看到,这个程序的工作过程。首先是根据配置的参数生成了IIC对象,然后是创建了OLED对象的实例,最后是利用oled的内置方法显示了图形和文字信息。oled还可以画各种图形,有兴趣的可以自己尝试一下。

前边已经用C语言在Arduino IDE中实现了自动避障小车。本文介绍一下用Python如何实现自动避障小车。小车的接线方法和之前保持一致,不清楚的可以参考之前的文章。

因为程序较之前只使用单独模块的复杂一些,因此这次使用的是Thonny开发工具来编写Python代码。在开发之前,先来确认一下开发环境。Thonny的安装在前边已经讲解过了,首先打开Thonny,然后连接ESP32开发板。这时就可以看到ESP32处理器内保存的文件,首先要确保servo.py和sonar.py文件是存在的。如下图所示:

因为这两个文件是支持舵机的Servo类和超声波传感器的Sonar类。有这两个类,我们就不需要再去自己实现底层通信协议了。只要直接使用这两个类就可以控制舵机的运动和超声波传感器的测量了。如果没有这两个文件,那么就参考之前的文章,在Mixly中测试一下你的舵机和激光测距模块,Mixly会把这两个文件传到你的EXP32处理器中。

这次的开发,首先是定义一个Car对象,这个Car对象包含了对小车运动的基本功能。例如:前进、后退、停止、转弯等。具体每一个方法的实现方法与C语言基本相同,只是控制ESP32输出PWM控制信号的方法不同而已。在C语言中定义的常量,在Python类中,可以转换为类的私有变量,也是集中放置在类的开始位置,这样有利于将来的维护工作。实现后的Car类如下所示:

"""

Car

MicroPython library for the Car

===========================================

一起玩儿科技  2024-01-07

"""

import machine

import time

#Car,智能小车控制对象

class Car:

    

    #控制车轮的GPIO

    __WHEEL_LEFT_1=32

    __WHEEL_LEFT_2=33

    __WHEEL_RIGHT_1=18

    __WHEEL_RIGHT_2=23

    

    #PWM的频率

    __MOTO_PWM_FREQ=10000

    #两个轮子的PWM占空比分辨率

    __SPEED_L=32768

    __SPEED_R=32768

    

    __TURN_TIME=1000

    #初始化方法

    def __init__(self):

        self.__wheel_l1=machine.PWM(machine.Pin(self.__WHEEL_LEFT_1))

        self.__wheel_l2=machine.PWM(machine.Pin(self.__WHEEL_LEFT_2))

        self.__wheel_r1=machine.PWM(machine.Pin(self.__WHEEL_RIGHT_1))

        self.__wheel_r2=machine.PWM(machine.Pin(self.__WHEEL_RIGHT_2))

        self.__wheel_l1.freq(self.__MOTO_PWM_FREQ)

        self.__wheel_l2.freq(self.__MOTO_PWM_FREQ)

        self.__wheel_r1.freq(self.__MOTO_PWM_FREQ)

        self.__wheel_r2.freq(self.__MOTO_PWM_FREQ)

    #改变运行状态方法

    def __change_status(self,wl1,wl2,wr1,wr2):

        self.__wheel_l1.duty_u16(wl1)

        self.__wheel_l2.duty_u16(wl2)

        self.__wheel_r1.duty_u16(wr1)

        self.__wheel_r2.duty_u16(wr2)

    #停止运行方法

    def stop(self):

        self.__change_status(0,0,0,0)

    #向前行进方法

    def run(self):

        self.__change_status(self.__SPEED_L,0,self.__SPEED_R,0)

    #向后倒退方法

    def back(self,period):

        self.__change_status(0,self.__SPEED_L,0,self.__SPEED_R)

        time.sleep_ms(period)

        self.stop()

    #转向方法

    def turn(self,direction):

        if direction==0:

            self.__change_status(self.__SPEED_L,0,0,self.__SPEED_R)

            time.sleep_ms(self.__TURN_TIME)

        elif direction==180:

            self.__change_status(0,self.__SPEED_L,self.__SPEED_R,0)

            time.sleep_ms(self.__TURN_TIME)

        else :

            self.__change_status(0,self.__SPEED_L,self.__SPEED_R,0)

            time.sleep_ms(self.__TURN_TIME*2)

        self.stop()

这里的方法与前面C语言中是一一对应的,除了语法和编码习惯有了一些简单的修改外,每个方法实现的逻辑都是完全一样的,所以在这里就不逐句的一一解释了。不理解的地方可以参考之前的解释。

主程序的实现与C语言依然差别不大,可以说代码都是一一对应的,具体如下所示:

import machine

import servo

import sonar

import time

import car

#超声波传感器引脚定义

ULTRASONIC_TRIG=25

ULTRASONIC_ECHO=26

#停车距离

DISTANCE_LIMIT=20

#舵机的控制引脚

STEERING_ENGINE=19

#上一次舵机的位置

lastDir=90

#控制舵机旋转到某个角度并测量距离障碍物的距离

def turnCheckDistance(direction):

    global lastDir

    if(lastDir!=direction):

        servo.servo180_angle(STEERING_ENGINE,direction)

        time.sleep_ms(500)

        lastDir=direction

    return sonar.Sonar(ULTRASONIC_TRIG,ULTRASONIC_ECHO).checkdist()

#判断左右哪边距离远

def findDirection():

    d0=turnCheckDistance(0)

    d180=turnCheckDistance(180)

    if(d0<DISTANCE_LIMIT and d180<DISTANCE_LIMIT):

        return 270

    else:

        return (0 if d0>d180 else 180)

    

#避障运行

def carAvoidRun(c):

    dist=turnCheckDistance(90)

    if(dist<=DISTANCE_LIMIT):

        c.stop()

        time.sleep_ms(100)

        dist=turnCheckDistance(90);

        if(dist<15):

            c.back(200)

        d=findDirection()

        c.turn(d)

    c.run()  

#舵机初始化到90度的位置

servo.servo180_angle(STEERING_ENGINE,90)

#得到Car对象的实例

c = car.Car()

#循环避障运行

while True:

    carAvoidRun(c)

    time.sleep_ms(100)

好了,这就是Python板的自动避障小车的全部代码。有兴趣的可以试一下了,看看避障的效果咋样。

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  
舵机超声波测距模块是STM32蓝牙控制循迹避障小车中常用的两个重要组件。 首先,舵机用于控制小车的转向。舵机通过PWM信号控制电机的转动角度,通过改变PWM信号的占空比,可以实现不同的转向角度。通常情况下,舵机的控制信号需要与STM32的定时器模块相连,通过调整定时器的周期和占空比,可以控制舵机的转向角度。在源代码中,通常会包括一些函数用于控制舵机的转向,如设置舵机转动角度等。 其次,超声波测距模块用于检测小车前方的障碍物距离。超声波测距模块通过发射超声波脉冲,然后检测超声波脉冲的回波时间,从而计算出前方障碍物的距离。在源代码中,通常会包括一些函数用于控制超声波测距模块的工作方式,如初始化超声波模块、发送超声波脉冲、接收回波信号等。 舵机超声波测距模块是实现循迹避障功能的关键组件之一。在源代码中,我们需要同时处理舵机超声波测距模块的数据,并根据测距结果调整舵机的转向角度。通过不断的测距和调整转向角度,小车可以根据前方障碍物的距离来做出合适的转向动作,从而实现循迹和避障的功能。 在实际应用中,舵机超声波测距模块的代码通常需要与其他组件的代码进行协调和集成,以实现整个小车的控制逻辑。通过合理的编程和调试,我们可以使得小车根据测距结果和算法判断,实现自动避障和循迹控制的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起玩儿科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值