freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

MicroPython实战:DIY一台会思考的避障车
2018-07-03 09:00:53

一、什么是会思考的避障车?

在日常生活中,大家会经常见到各种各样的遥控车,它需要我们人为的操作,控制它的前进、后退和转弯。今天就带大家认识一个不一样的新朋友——会思考的避障车。

会思考的避障车和我们平时的遥控车最主要的区别就是智能化,它可以不需要我们去操控,自己就能行走。同时它还会实时检测前方是否有障碍物,思考自己是否要前进或者转弯。

听到这里,是不是已经跃跃欲试了呢。话不多说,动起手来吧!

二、 所需器材:

Ø  TurnipBit开发板 一块

Ø  下载数据线 一条

Ø  智能小车套件 一套(底盘、车轮、电机等)

Ø  超声波模块(HC-SR04)一个(用作小车的“眼睛”)

Ø  L298N电机驱动模块 一个

Ø  接入互联网的电脑 一台(推荐使用Google Chome或者Firefox浏览器

三、基础知识

3.1  电机

3.1.1电机的概念

电机(俗称“马达”)是指依据电磁感应定律实现电能转换或传递的一种电磁装置。电机在电路中是用字母M(旧标准用D)表示,它的主要作用是产生驱动转矩,作为用电器或各种机械的动力源,发电机在电路中用字母G表示,它的主要作用是利用电能转化为机械能。

3.1.2 电机的分类

    电机分类有很多种,我们常见的分类方式如下:

1、按工作电源种类划分:可分为直流电机和交流电机。

2、按结构和工作原理划分:可分为直流电动机、异步电动机、同步电动机。

3、按起动与运行方式划分:电容起动式单相异步电动机、电容运转式单相异步电动机、电容起动运转式单相异步电动机和分相式单相异步电动机。

4、按用途可划分:驱动用电动机和控制用电动机。

5、按转子的结构可划分:笼型感应电动机(旧标准称为鼠笼型异步电动机)和绕线转子感应电动机(旧标准称为绕线型异步电动机)。

6、按运转速度可划分:高速电动机、低速电动机、恒速电动机、调速电动机。

3.1.3 直流电机的概念及原理

直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。

Clipboard Image.png

图 直流电机

直流电机的结构应由定子和转子两大部分组成。直流电机运行时静止不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极、换向极、端盖、轴承和电刷装置等组成。运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成。

3.1.4 步进电机的概念及原理

与直流电机不同,步进电机是指能将电脉冲信号转变为角位移或线位移的开环控制电机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

Clipboard Image.png

图  步进电机

步进电机是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转一个角度。每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。

3.1.5 电机驱动模块

当使用单片机控制直流电机时需要增加驱动电路,用来提供足够的电流。H桥驱动电路是直流电机驱动电路中比较常见的一种电路,它主要实现直流电机的正、反两个方向的转动。

 Clipboard Image.png

桥电路

上图是H桥的简单电路,其形状类似于字母“H”,作为负载的直流电机像“桥”一样架在上面,所以称为“ H桥驱动”,4个开关所在的位置就称为“桥臂”。从图中可以看出,假设开关A D接通,电机正向转动,而开关BC 接通时,直流电机将反向转动,从而实现了电机的正反控制。

L298NST公司生产的一种高电压,大电流的电机驱动芯片,是比较典型的H 桥驱动电路的体现,其主要特点是:(1)工作电压高,最高工作电压可达46V;(2 )输出电流大,瞬间峰值可达3A,持续工作电流为2A

它内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电机和步进电机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个用控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用 L298N电机驱动模块可以同时驱动两台直流电机或一台两相步进电机和四相步进电机。

 

Clipboard Image.png

  L298N驱动模块

3.2.2  超声波传感器

超声波传感器是将超声波信号转换成其他能量信号(通常是电信号)的传感器。超声波是振动频率高于20KHz的机械波。它具有频率高、波长短、绕射现象小,特别是方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中。超声波碰到杂质或分界面会产生显著反射形成反射成回波,碰到活动物体能产生多普勒效应。

Clipboard Image.png

图  超声波传感器

超声波传感器主要通过发送超声波并接受超声波来对某些参数或事项进行检测。发送超声波由发送器部分完成,主要利用振子的振动产生并向空中辐射超声波;接收超声波由接收器部分完成,主要接受由发送器辐射出的超声波并将其转换为电能输出。除此之外,发送器与接收器的动作都受控制部分控制,如控制发送器发出超声波的脉冲连频率、占空比、探测距离等等。

本实验使用的超声波模块型号是HC-SR04,简单介绍一下超声波模块(HC-SR04)的工作原理:

l   IO口Trig引脚触发测距,给至少10us的高电平;

l   触发测距后,模块自动发送8个40kHz的方波,自动检测是否有信号返回;

l   当模块接收到引号返回后,通过IO口将Echo引脚置为高电平,高电平持续的时间就是超声波从发射到返回的时间,即测试距离=(高电平持续的时间*声速(340m/s)/2)。

3.3  避障车的组装

3.3.1 硬件器件

避障小车的硬件组成主要包括以下部分:

1、底盘1片

Clipboard Image.png

2、轮子 2个

Clipboard Image.png

3、测速码盘 2片

Clipboard Image.png

4、减速直流电机 2个

Clipboard Image.png

5、4节5号电池盒 1个

Clipboard Image.png

6、万向轮 1只

Clipboard Image.png

7、M3*30螺丝 4支

Clipboard Image.png

8、船形开关 1只

Clipboard Image.png

9、紧固件 4片

Clipboard Image.png

10、M3*6螺丝 8只

Clipboard Image.png

11、M3螺帽 8只

Clipboard Image.png

12、L12铜柱 4支

Clipboard Image.png

3.3.2 硬件安装步骤

第一步,先把小车底板、紧固件、码盘的黄色保护纸撕掉,然后把紧固件插入小车底板。

Clipboard Image.png

第二步,安装码盘,并把电机固定于底板。码盘轴心一面大一面小,大的一面往电机轴插(注意:电机引线铜片朝向内侧,即码盘一端)。

Clipboard Image.png

第三步,插入螺丝,把电机固定到小车底板,并拧上螺帽。

Clipboard Image.png

第四步,插入螺丝,固定电池盒。

Clipboard Image.png

第五步,放入铜柱,拧紧8个螺丝固定万向轮,手捏住电机(保护紧固件),并往里面 插入轮子,组装完成。

Clipboard Image.png

最后,我们来看一下组装完成的效果图。

Clipboard Image.png

3.3.3 电机驱动和超声波的安装

超声波模块共4个引脚,分别是VCC、GND、Trig和Echo。VCC接TurnipBit扩展板的+5V引脚,GND接TurnipBit扩展板的GND引脚,Trig触发引脚接P5,Echo回传引脚接P8。

L298N电机驱动模块左侧OUT3、OUT4接线端子对应接入左轮电机的下侧、上侧侧铜片,右侧也是。L298N的输入端IN1、IN2、IN3、IN4分别接入扩展板的P19、P13、P12、P11。

详细见下表:

TurnipBit扩展板 超声波模块 L298N
+5V VCC +12V、+5V
GND GND GND
P5 Trig  
P8 Echo  
P11   IN4
P12   IN3
P13   IN2
P19   IN1

Clipboard Image.png

Clipboard Image.png

3.4 程序设计

3.4.1 伪代码分析   

让我们先用伪代码来分析一下避障车的程序逻辑。首先,我们通过小车的超声波模块来检测前方是否存在障碍物,计算出与障碍物之间的距离。当与障碍物的距离小于或等于我们预设的安全距离时,控制小车进行转向避开障碍物;当与障碍物的距离大于我们预设的安全距离时,控制小车进行继续前进;逻辑顺序如下:

第一步,触犯超声波模块开始检测;

第二步:计算出与前方障碍物的距离;

第三步:判断与障碍物的距离是否小于设定的安全距离;

第四步:若小于或等于则进行转向,避开障碍物;

第五步:若大于则继续保持前进。

根据伪代码,画成流程图如下:

Clipboard Image.png 

3.4.2 拼插编程

步骤1让避障车开始向前走,如下图。 

Clipboard Image.png

步骤2添加一个死循环,使程序一直运行,如下图。

Clipboard Image.png

步骤3接下来就需要完成检测障碍物的功能,这部分需要超声波模块来实现。我们需要在死循环内添加障碍物检测的内容,让避障车一直不断的检测与前方障碍物的距离。如下图。

Clipboard Image.png

步骤4为了更简单、方便、快捷的实现功能,我们采用计数的方式,测量一个大概的距离,然后进行判定是否进行避障。细心的同学可能会发现我们在程序一开始的时候定义了一个num的变量,我们就用num来计数。当引脚8为高电平时,我们就不断的让num自加1,一直等到引脚8为低电平时再停止计数。大家可以先进行测试,设定一个安全距离观察num的数值。 我设定了大约25cm的距离,num的数值为8。那么,我就在程序中判断如果num的值小于或等于8时,就进行转向避障。如下图。

Clipboard Image.png

步骤5到此,会思考的避障车已经完成了。为了让避障车更加炫酷,我们可以使用LED屏来动态显示当前避障车行驶的方向。最后,整体的拼插代码如下图:

Clipboard Image.png

Clipboard Image.png

步骤6将程序名修改成turnipbit-car,点击【下载hex】按钮将程序保存到电脑里。

Clipboard Image.png

把保存的turnipbit- car.hex文件拖入TurnipBit磁盘中,我们会看到TurnipBit板子上的灯在闪烁,说明正在下载到控制板中。

下载成功后,将TurnipBit正确插入TurnipBit扩展板的金手指卡槽内,开始启动避障车吧。

3.4.3 代码分析

会思考的避障车整体代码,可参考右侧代码显示区,如下。

from microbit import *

display.show(Image.ARROW_N)
                
                
pin11.write_digital(0)
                
                
pin12.write_digital(1)
                
                
pin13.write_digital(0)
                
                
pin19.write_digital(1)
                
                
while True:
                
                
num = 0
                
                
pin5.write_digital(0)
                
                
pin5.write_digital(1)
                
                
sleep(0.01)
                
                
if pin8.read_digital() != True:
                
                
pin5.write_digital(0)
                
                
pin5.write_digital(1)
                
                
sleep(0.01)
                
                
while pin8.read_digital():
                
                
num = num + 1
                
                
if num <= 8:
                
                
display.show(Image.ARROW_W)
                
                
pin11.write_digital(1)
                
                
pin12.write_digital(0)
                
                
pin13.write_digital(0)
                
                
pin19.write_digital(1)
                
                
sleep(1000)
                
                
display.show(Image.ARROW_N)
                
                
pin11.write_digital(0)
                
                
pin12.write_digital(1)
                
                
pin13.write_digital(0)
                
                
                
pin19.write_digital(1)

接下来,我们一起来分析一下代码。

通过上面的代码,不难发现,控制避障车前进的代码部分我们重复编写了两遍,在实际项目中这种写法是不合理的。为了让代码更加简洁,优雅,我们将控制前进的代码部分提取出来建立名称为Go()的函数,在需要执行前进的地方直接调用Go()函数即可。

按照同样的方式,我们将控制转向和检测障碍物的代码分别建立Turn()和Detection()函数。

from microbit import *

def Go():

display.show(Image.ARROW_N)

pin11.write_digital(0)

pin12.write_digital(1)

pin13.write_digital(0)

pin19.write_digital(1)

def Turn():

display.show(Image.ARROW_W)

pin11.write_digital(1)

pin12.write_digital(0)

pin13.write_digital(0)

pin19.write_digital(1)

def Detection():

num=0

pin5.write_digital(0)

pin5.write_digital(1)

sleep(0.01)

if pin8.read_digital() != True:

pin5.write_digital(0)

pin5.write_digital(1)

sleep(0.01)

while pin8.read_digital():

num = num + 1

return num

Go()

while True:

num = Detection()

if num <= 8:

Turn()

sleep(1000)

Go()

* 本文作者:bodasister,转载请注明来自FreeBuf.COM

# micropython
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者