Difference between revisions of "快速上手 香蕉派 Triode-Car"

From Banana Pi Wiki
Jump to: navigation, search
(用另一块micro:bit通过无线电控制电机)
(电压比较器)
 
(35 intermediate revisions by the same user not shown)
Line 9: Line 9:
 
[[香蕉派_Triode-Car]]
 
[[香蕉派_Triode-Car]]
  
=使用LM393控制小车=
+
=硬件的浅析与调试=
  
==硬件介绍==
+
==驱动电路==
  
在Triode-Car中,有两种模式,其中一个是利用自带的LM393控制小车,另一个则是利用BPI:Bit/Mirco:bit控制小车,可以通过小车上面的SW2按键(如图)切换控制方式。
+
这是一个最基础的电路:
  
在LM393控制小车的模式中,只有一个功能,即巡线,它由几大部分组成,包括了:巡线检测电路,电压比较电路,驱动电路。
+
[[File:Triode-Car-Sch1.png|250px]]
  
===巡线检测电路===
+
电池,二极管,电感,手动开关四者串联,两个负载并联接入,一个负载是电机,一个负载是发光二极管,作为对发光二极管的保护又给其串联了一个用于分压的电阻。
  
在Triode-Car的底部,有两个巡线的检测电路,每一路包含了一个光敏电阻和一个LED。当LED的光照到黑色和白色的材料上面时,由于反光率的不同,光敏的阻值会发生明显的变化。
+
在这样的电路中唯一能控制两个负载的只有一个手动开关。
  
在Triode-Car中,光敏电阻使用的是GL5506,这个型号的电阻会随着光照的加强而减小,亮电阻(10Lux)是2-5KΩ,暗电阻是0.2MΩ。(亮电阻:用400-600Lux光照射2小时后,在标准光源(色温2854K)10Lux光下的测试值。暗电阻:关闭10Lux光照后第10秒的阻值。)
+
这是PNP型三极管:
  
===电压比较电路===
+
[[File:Triode-S8550.png|600px]]
[[File:LM393_sch.jpg|300px]]
 
  
电压比较电路主要由LM393和一些电阻组成,LM393是双路电压比较器集成电路,有两个独立的电压比较器构成。它的作用是,比较两个输入电压,并根据两路电压的高低改变输出电压的高低。当比较器的正向(正极)大于反向(负极)电压时,输出高电平,当比较器的正向(正极)小于反向(负极)电压时,输出低电平。由于LM393使用的是集电极开路输出,所以需要在输出端加上上拉电阻。
+
1脚 Emitter发射极
  
===驱动电路===
+
2脚 Base基极
 
电机驱动电路的主角则是三极管,Triode-Car使用的是S8550,它是一种低电压,大电流,小信号的PNP型硅三极管。最大集电极电流为1.5 A。它可以被用来当成一个低电平触发的开关使用。
 
  
==控制原理==
+
3脚 Collector集电极
  
[[File:Triode_line_l.jpg|500px]]
+
一般在原理图中三极管的E、B、C指的就是此三脚。
  
如图所示,当小车偏离轨道向左时,右边的光敏电阻会来到黑色跑道的上方,光敏电阻阻值变高,而左边的光敏电阻处于白色地面,此时,LL点的电压会比LR点的电压低,此时,比较器U1A的正向电压高于反向电压,1号引脚输出高电平。同理,U1B的正向电压低于反向电压,7号引脚输出低电平。从而控制左边电机正转,小车右拐,R6和D2离开黑色跑道,直到左边的传感器探测到黑跑道,原理与前面类似。小车在前进过程中不断重复以上动作,从而达到前进的目的。
+
'''双极性结型晶体管'''(bipolar junction transistor, BJT),俗称'''三极管''',是一种具有三个终端的电子器件。双极性晶体管是电子学历史上具有革命意义的一项发明,其发明者威廉·肖克利、约翰·巴丁和沃尔特·布喇顿被授予1956年的诺贝尔物理学奖。
 +
 
 +
双极性晶体管的一种类型即为PNP型,由两层P型掺杂区域和介于二者之间的一层N型掺杂半导体组成。流经 Base基极 的微小电流可以在 Emitter发射极 端得到放大。也就是说,当PNP型晶体管的 Base基极 电压低于 Emitter发射极 时,Collector集电极 电压低于 Base基极 ,晶体管处于正向放大区。
 +
 
 +
在双极性晶体管电学符号中, Base基极 和 Emitter发射极 之间的箭头指向电流的方向,这里的电流为电子流动的反方向。PNP型晶体管的箭头从 Emitter发射极 指向 Base基极 ,而NPN型与之相反。
 +
 
 +
想了解其更详尽的信息,可以继续参考[https://zh.wikipedia.org/wiki/%E5%8F%8C%E6%9E%81%E6%80%A7%E6%99%B6%E4%BD%93%E7%AE%A1 维基百科:双极性晶体管],或者检索其他相关的文献资料,需要具备相应的 数理化 前置知识才能更好的理解。
 +
 
 +
将一个PNP型三极管加入电路:
 +
 
 +
[[File:Triode-Car-Sch2.png|600px]]
 +
 
 +
在Triode-Car上,光敏电阻使用的是GL5506,这个型号的电阻会随着光照的加强而减小,亮电阻(10Lux)是2-5KΩ,暗电阻是0.2MΩ。(亮电阻:用400-600Lux光照射2小时后,在标准光源(色温2854K)10Lux光下的测试值。暗电阻:关闭10Lux光照后第10秒的阻值。)
 +
 
 +
设计这样的电路可以控制PNP型三极管的2脚 Base基极 电压,给予2脚 Base基极 电平信号,这个PNP型三极管即可作为一个开关使用, 1脚 Emitter发射极 与 3脚 Collector集电极'''导通'''条件为2脚 Base基极 低电平,而当2脚 Base基极 为高电平时则'''关断''',两个负载即可被2脚 Base基极 所接收到的电平信号所控制,而此电平信号则由 电压比较器 的输出端提供,通过另一个开关还可切换至由 micro:bit 或 web:bit 开发板来提供。
 +
 
 +
有关“高低电平”、“电平信号”更详尽的信息可以参考[https://baike.baidu.com/item/%E9%80%BB%E8%BE%91%E7%94%B5%E5%B9%B3 百度百科:逻辑电平],或者检索其他相关的文献资料。
 +
 
 +
==巡线检测电路==
 +
 
 +
在Triode-Car的底部,有两个巡线检测电路,每一路包含了一个光敏电阻和一个LED。当LED的光照到黑色和白色的材料上面时,由于反射率的不同,光敏电阻的阻值会发生明显的变化。
 +
 
 +
[[File:Photoresistor-GL5506.png|600px]]
 +
 
 +
在Triode-Car上,光敏电阻使用的是GL5506,这个型号的电阻会随着光照的加强而减小,亮电阻(10Lux)是2-5KΩ,暗电阻是0.2MΩ。(亮电阻:用400-600Lux光照射2小时后,在标准光源(色温2854K)10Lux光下的测试值。暗电阻:关闭10Lux光照后第10秒的阻值。)
 +
 
 +
设计这样的电路:
 +
 
 +
[[File:Triode-Car-Sch3.png|600px]]
 +
 
 +
除了用于保护作用的电容和电阻,在两个光敏电阻所在的线路上又各串联了一个可调电阻,根据串联分压的原理,通过调节可调电阻的阻值,可用于校准 LL 与 LR 两个节点的电压值,以便后续 电压比较器 的应用。
 +
 
 +
==电压比较器==
 +
 
 +
这是LM393电压比较器的原理图:
 +
 
 +
[[File:LM393_sch.jpg|260px]]
 +
 
 +
[[File:LM393-1.png]]
 +
 
 +
其内部集成了两个电压比较器,当电压比较器的同相输入端(+)大于反相输入端(-)电压时,输出高电平,当电压比较器的正相输入端(+)小于反相输入端(-)电压时,输出低电平。
 +
 
 +
而其电压比较器的内部原理图则是这样:
 +
 
 +
[[File:LM393-2.png|600px]]
 +
 
 +
由此可见,实现 **“比较两个输入端的电压大小”** 这样相对复杂的功能,也是基于二极管、三极管等基础元件来设计并封装而成的。
 +
 
 +
此处不对其做更深入的原理分析,感兴趣的可以参考[https://zh.wikipedia.org/wiki/%E6%AF%94%E8%BE%83%E5%99%A8 维基百科:比较器],或者检索其他相关的文献资料。
 +
 
 +
将LM393电压比较器加入电路中,并补全驱动电路和巡线检测电路:
 +
 
 +
[[File:Triode-Car-sys.png|600px]]
 +
 
 +
[[File:Triode-Car-Sch4.png|600px]]
 +
 
 +
U1A是LM393中第一个电压比较器,而U1B则是其第二个电压比较器。
 +
 
 +
将巡线检测电路的 LL节点 与U1A的正相输入端3脚连接,LR节点 与U1A的反相输入端2脚连接,再使 LL节点 与U1B的反相输入端6脚连接,LR节点 与U1B的正相输入端5脚连接,这样设计,即可使 LL节点电压 > LR节点电压 时 U1A 1脚 输出高电平,U1B 7脚 输出低电平,而当 LL节点电压 < LR节点电压 时 U1A 1脚 输出低电平,U1B 7脚 输出高电平。
 +
 
 +
由于LM393电压比较器使用的是集电极开路输出,所以需要在输出端U1A 1脚 和 U1B 7脚 加上上拉电阻 R8 与 R7 。
 +
 
 +
U1A 1脚 连接到了 Q2 2脚 Base基极,其控制的M2电机为右轮电机。
 +
 
 +
U1B 7脚 连接到了 Q1 2脚 Base基极,其控制的M1电机为左轮电机。
 +
 
 +
至此,我们就基本构建出一个自动控制系统,在其较为理想的工作状况下,它可以在一定范围内经由光敏电阻采集左右两侧道路明暗的信息,电压比较器在信息变化中不断的分别控制着两个轮子启停,以修正行驶方向,达成自动沿着线路行驶的目的。
 +
 
 +
==各元件的信号与工作状态关系表==
 +
 
 +
{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black;text-align: center" colspan="14"| '''各元件的信号与工作状态关系表'''
 +
|-
 +
| style="background: #ffffcc; color:#e76700 " colspan="14"|''注释:条件为黑色线路与白色路面''
 +
|-
 +
!车头相较线路偏向!!(左)R5 LDR光感!!(右)R6 LDR光感!!LL 电位!!LR 电位!!P3输入!!P2输入!!P1输出!!P5输入!!P6输入!!P7输出!!M1左电机!!M2右电机!!小车行进方向
 +
|-style="text-align: center"
 +
| 左||明||暗||0||1||1||0||1||0||1||0||1||0||右
 +
|-style="text-align: center"
 +
| 右||暗||明||1||0||0||1||0||1||0||1||0||1||左
 +
|}
 +
 
 +
当小车偏离线路向左时,右边的光敏电阻会来到黑色线路的上方,光敏电阻阻值变高,而左边的光敏电阻处于白色地面,此时,LL点的电压会比LR点的电压低,比较器U1A的正向电压高于反向电压,1号引脚输出高电平。同理,U1B的正向电压低于反向电压,7号引脚输出低电平。从而控制左边电机正转,小车右拐,R6和D2离开黑色线路,直到左边的传感器探测到黑线路,原理与前面类似。小车在前进过程中不断重复以上动作,从而达到沿着黑色的线路前进的目的。
 +
 
 +
 
 +
==巡线检测电路的校准==
 +
 
 +
为了使巡线检测电路在单独使用LM393芯片控制的状态下有着对明暗变化更高的灵敏度,以及减少相同光照亮度下的电势差,需要通过手动调整可调电阻来进行校准。
 +
 
 +
校准步骤如下:
 +
 
 +
# 将小车用小物件微微将轮子抬起以防接触表面,将小车的光敏电阻对准一个稳定光源(台灯或手电筒)。
 +
# 随意调整任一边可调电组,直到两侧马达同时运转。
 +
# 调整完成后,放置在跑道上测试结果。
 +
# 若小车还是有概率冲出跑道,将小车放置于白纸上,重复2~3步骤进行微调,尝试使巡线检测电路对明暗变化有更高的灵敏度。
 +
 
 +
[[File:Triodecar_calibration_1.jpg|500px]]
 +
 
 +
[[File:Triodecar_calibration_2.jpg|500px]]
  
 
=Triode-Car 配合Micro:Bit 使用MakeCode环境编程=
 
=Triode-Car 配合Micro:Bit 使用MakeCode环境编程=
Line 54: Line 150:
 
启动或复位时停车,同时按下AB按钮直行,按下A按钮右转,按下B按钮左转。
 
启动或复位时停车,同时按下AB按钮直行,按下A按钮右转,按下B按钮左转。
  
'''例程项目文件:'''https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_motor_control_1.hex
+
[https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_motor_control_1.hex '''在Github上的例程项目文件''']
  
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中直接运行。
+
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。
  
 
----
 
----
Line 74: Line 170:
 
加入了一个"if"判断积木,若变量"speed"值小于0或大于10时,将变量"speed"值设为0,这样可以将值限定在0到10范围内不会溢出而报错。
 
加入了一个"if"判断积木,若变量"speed"值小于0或大于10时,将变量"speed"值设为0,这样可以将值限定在0到10范围内不会溢出而报错。
  
'''例程项目文件:'''https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_motor_control_2.hex
+
[https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_motor_control_2.hex '''在Github上的例程项目文件''']
  
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中直接运行。
+
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。
  
 
----
 
----
Line 94: Line 190:
 
在程序中,每间隔100ms通过USB串口将读取到的左右两个传感器的电压模拟值发送给电脑,在MakeCode中打开控制台即可查看实时接收到的信息。
 
在程序中,每间隔100ms通过USB串口将读取到的左右两个传感器的电压模拟值发送给电脑,在MakeCode中打开控制台即可查看实时接收到的信息。
  
'''例程项目文件:'''https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_read_LDR.hex
+
[https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_read_LDR.hex '''在Github上的例程项目文件''']
  
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中直接运行。
+
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。
  
 
----
 
----
  
===用另一块micro:bit通过无线电控制电机===
+
===使用两块micro:bit通过无线电通讯控制电机===
  
 
micro:bit支持无线电通讯,在MakeCode中应用无线电扩展积木进行编程,并将程序下载进两块micro:bit后,即可在二者之间建立无线通讯,并可相互控制对方的硬件。
 
micro:bit支持无线电通讯,在MakeCode中应用无线电扩展积木进行编程,并将程序下载进两块micro:bit后,即可在二者之间建立无线通讯,并可相互控制对方的硬件。
Line 107: Line 203:
  
 
[[File:Triode-Car_radio_control_1.png|480px]]
 
[[File:Triode-Car_radio_control_1.png|480px]]
 +
 +
将例程下载进两块micro:bit,一块插在Triode-Car上,一块拿在手上,两块都接通电源,即可通过手上的micro:bit的按钮AB控制Triode-Car的电机启停。
 +
 +
按A左转,按B右转,同时按下AB直行,松开即停车。
 +
 +
其中加入的四个变量并非多余的存在,虽然也可以在积木中填上我们所需要的数值,但使用变量名来代替这些指定的数值有利于我们在认知上建立更清晰的逻辑,在越复杂的程序中越能体现其价值。
 +
 +
[https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-Car_radio_control_1.hex '''在Github上的例程项目文件''']
 +
 +
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。
  
 
----
 
----
Line 138: Line 244:
 
其中on event from()with value()积木在Control选项栏中。
 
其中on event from()with value()积木在Control选项栏中。
  
'''例程项目文件:'''https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_bluetooth_control_1.hex
+
[https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_bluetooth_control_1.hex '''在Github上的例程项目文件''']
  
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中直接运行。
+
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。
  
 
==高阶教程==
 
==高阶教程==
Line 178: Line 284:
 
# 第二个"while"循环积木中的程序用于校准右侧光敏电阻,其中"if"判断条件为,左右两侧光敏电阻输出的电压模拟量相减,其差值的绝对值小于等于25。
 
# 第二个"while"循环积木中的程序用于校准右侧光敏电阻,其中"if"判断条件为,左右两侧光敏电阻输出的电压模拟量相减,其差值的绝对值小于等于25。
  
'''例程项目文件:'''https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_LDR_calibration_2.hex
+
[https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_LDR_calibration_2.hex '''在Github上的例程项目文件''']
  
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中直接运行。
+
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。
  
 
----
 
----
Line 203: Line 309:
 
# 第三个"forever"积木略有巧思,其内部的循环仅在用于控制电机的变量发生变化时才会执行一次,对应改变LED当前应当显示的内容。
 
# 第三个"forever"积木略有巧思,其内部的循环仅在用于控制电机的变量发生变化时才会执行一次,对应改变LED当前应当显示的内容。
  
'''例程项目文件:'''https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_Line_Follower.hex
+
[https://github.com/Wind-stormger/Makecode/blob/master/microbit-Triode-car_Line_Follower.hex '''在Github上的例程项目文件''']
 +
 
 +
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。
 +
 
 +
=Triode-Car 配合Micro:Bit 使用MicroPython环境编程=
 +
 
 +
==基础教程==
 +
 
 +
===在线编程===
 +
 
 +
[https://python.microbit.org/v/2 '''Micro:Bit的MicroPython在线编辑器''']
 +
 
 +
[[File:Python.microbit.org_screenshot.png]]
 +
 
 +
在浏览器里在线编程,可通过USB连接将程序下载进Micro:Bit,且有串口工具可以实时查看串口信息。
 +
 
 +
[https://microbit-micropython.readthedocs.io/en/v2-docs/index.html '''Micro:Bit MicroPython 官方文档''']&[http://www.qingchuangzhiyi.com/doc/index.html '''中文翻译文档''']
 +
 
 +
建议通过查阅Micro:Bit MicroPython官方文档来了解microbit函数库及其使用方法。
 +
 
 +
===用按钮控制电机===
 +
 
 +
[[File:Triode-Car_motor_control_3.png]]
 +
 
 +
代码中出现的 '''display.show()''' 等函数可以在[https://microbit-micropython.readthedocs.io/en/v2-docs/index.html '''Micro:Bit MicroPython 官方文档''']或[http://www.qingchuangzhiyi.com/doc/index.html '''中文翻译文档''']中的microbit函数库里找到相应的代码解释与使用方法。
 +
 
 +
[https://github.com/Wind-stormger/Micropython/blob/main/Triode-Car/microbit(only)/1.1%20Control%20motor%20with%20button/main.py '''在Github中查看例程代码''']
 +
 
 +
===调整电机转速===
 +
 
 +
[[File:Triode-Car_motor_control_4.png]]
 +
 
 +
[https://github.com/Wind-stormger/Micropython/blob/main/Triode-Car/microbit(only)/2.1%20Control%20motor%20speed%20with%20button/main.py'''在Github中查看例程代码''']
 +
 
 +
==高阶教程==
 +
 
 +
===搭建开发环境===
  
项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中直接运行。
+
# 从[https://www.python.org/ '''python官网''']下载并安装python,切记要勾选'''Add Python  to PATH'''。
 +
# 安装一个Python IDE,此处推荐使用[https://thonny.org/ '''Thonny'''],可以直接去官网下载安装,或是在系统中打开CMD窗口或PowerShell窗口,输入 '''pip install thonny''' 来安装。
  
 
=Triode-Car 配合BPI:Bit 使用Arduino环境编程=
 
=Triode-Car 配合BPI:Bit 使用Arduino环境编程=

Latest revision as of 00:10, 30 August 2021

BPI Triode-Car 配合 micro:bit 使用
BPI Triode-Car 配合BPI-Bit STEAM 教育开发板 使用
Triode-Car 配合 BPI:AI AI开发板使用

产品信息

香蕉派_Triode-Car

硬件的浅析与调试

驱动电路

这是一个最基础的电路:

Triode-Car-Sch1.png

电池,二极管,电感,手动开关四者串联,两个负载并联接入,一个负载是电机,一个负载是发光二极管,作为对发光二极管的保护又给其串联了一个用于分压的电阻。

在这样的电路中唯一能控制两个负载的只有一个手动开关。

这是PNP型三极管:

Triode-S8550.png

1脚 Emitter发射极

2脚 Base基极

3脚 Collector集电极

一般在原理图中三极管的E、B、C指的就是此三脚。

双极性结型晶体管(bipolar junction transistor, BJT),俗称三极管,是一种具有三个终端的电子器件。双极性晶体管是电子学历史上具有革命意义的一项发明,其发明者威廉·肖克利、约翰·巴丁和沃尔特·布喇顿被授予1956年的诺贝尔物理学奖。

双极性晶体管的一种类型即为PNP型,由两层P型掺杂区域和介于二者之间的一层N型掺杂半导体组成。流经 Base基极 的微小电流可以在 Emitter发射极 端得到放大。也就是说,当PNP型晶体管的 Base基极 电压低于 Emitter发射极 时,Collector集电极 电压低于 Base基极 ,晶体管处于正向放大区。

在双极性晶体管电学符号中, Base基极 和 Emitter发射极 之间的箭头指向电流的方向,这里的电流为电子流动的反方向。PNP型晶体管的箭头从 Emitter发射极 指向 Base基极 ,而NPN型与之相反。

想了解其更详尽的信息,可以继续参考维基百科:双极性晶体管,或者检索其他相关的文献资料,需要具备相应的 数理化 前置知识才能更好的理解。

将一个PNP型三极管加入电路:

Triode-Car-Sch2.png

在Triode-Car上,光敏电阻使用的是GL5506,这个型号的电阻会随着光照的加强而减小,亮电阻(10Lux)是2-5KΩ,暗电阻是0.2MΩ。(亮电阻:用400-600Lux光照射2小时后,在标准光源(色温2854K)10Lux光下的测试值。暗电阻:关闭10Lux光照后第10秒的阻值。)

设计这样的电路可以控制PNP型三极管的2脚 Base基极 电压,给予2脚 Base基极 电平信号,这个PNP型三极管即可作为一个开关使用, 1脚 Emitter发射极 与 3脚 Collector集电极导通条件为2脚 Base基极 低电平,而当2脚 Base基极 为高电平时则关断,两个负载即可被2脚 Base基极 所接收到的电平信号所控制,而此电平信号则由 电压比较器 的输出端提供,通过另一个开关还可切换至由 micro:bit 或 web:bit 开发板来提供。

有关“高低电平”、“电平信号”更详尽的信息可以参考百度百科:逻辑电平,或者检索其他相关的文献资料。

巡线检测电路

在Triode-Car的底部,有两个巡线检测电路,每一路包含了一个光敏电阻和一个LED。当LED的光照到黑色和白色的材料上面时,由于反射率的不同,光敏电阻的阻值会发生明显的变化。

Photoresistor-GL5506.png

在Triode-Car上,光敏电阻使用的是GL5506,这个型号的电阻会随着光照的加强而减小,亮电阻(10Lux)是2-5KΩ,暗电阻是0.2MΩ。(亮电阻:用400-600Lux光照射2小时后,在标准光源(色温2854K)10Lux光下的测试值。暗电阻:关闭10Lux光照后第10秒的阻值。)

设计这样的电路:

Triode-Car-Sch3.png

除了用于保护作用的电容和电阻,在两个光敏电阻所在的线路上又各串联了一个可调电阻,根据串联分压的原理,通过调节可调电阻的阻值,可用于校准 LL 与 LR 两个节点的电压值,以便后续 电压比较器 的应用。

电压比较器

这是LM393电压比较器的原理图:

LM393 sch.jpg

LM393-1.png

其内部集成了两个电压比较器,当电压比较器的同相输入端(+)大于反相输入端(-)电压时,输出高电平,当电压比较器的正相输入端(+)小于反相输入端(-)电压时,输出低电平。

而其电压比较器的内部原理图则是这样:

LM393-2.png

由此可见,实现 **“比较两个输入端的电压大小”** 这样相对复杂的功能,也是基于二极管、三极管等基础元件来设计并封装而成的。

此处不对其做更深入的原理分析,感兴趣的可以参考维基百科:比较器,或者检索其他相关的文献资料。

将LM393电压比较器加入电路中,并补全驱动电路和巡线检测电路:

Triode-Car-sys.png

Triode-Car-Sch4.png

U1A是LM393中第一个电压比较器,而U1B则是其第二个电压比较器。

将巡线检测电路的 LL节点 与U1A的正相输入端3脚连接,LR节点 与U1A的反相输入端2脚连接,再使 LL节点 与U1B的反相输入端6脚连接,LR节点 与U1B的正相输入端5脚连接,这样设计,即可使 LL节点电压 > LR节点电压 时 U1A 1脚 输出高电平,U1B 7脚 输出低电平,而当 LL节点电压 < LR节点电压 时 U1A 1脚 输出低电平,U1B 7脚 输出高电平。

由于LM393电压比较器使用的是集电极开路输出,所以需要在输出端U1A 1脚 和 U1B 7脚 加上上拉电阻 R8 与 R7 。

U1A 1脚 连接到了 Q2 2脚 Base基极,其控制的M2电机为右轮电机。

U1B 7脚 连接到了 Q1 2脚 Base基极,其控制的M1电机为左轮电机。

至此,我们就基本构建出一个自动控制系统,在其较为理想的工作状况下,它可以在一定范围内经由光敏电阻采集左右两侧道路明暗的信息,电压比较器在信息变化中不断的分别控制着两个轮子启停,以修正行驶方向,达成自动沿着线路行驶的目的。

各元件的信号与工作状态关系表

各元件的信号与工作状态关系表
注释:条件为黑色线路与白色路面
车头相较线路偏向 (左)R5 LDR光感 (右)R6 LDR光感 LL 电位 LR 电位 P3输入 P2输入 P1输出 P5输入 P6输入 P7输出 M1左电机 M2右电机 小车行进方向
0 1 1 0 1 0 1 0 1 0
1 0 0 1 0 1 0 1 0 1

当小车偏离线路向左时,右边的光敏电阻会来到黑色线路的上方,光敏电阻阻值变高,而左边的光敏电阻处于白色地面,此时,LL点的电压会比LR点的电压低,比较器U1A的正向电压高于反向电压,1号引脚输出高电平。同理,U1B的正向电压低于反向电压,7号引脚输出低电平。从而控制左边电机正转,小车右拐,R6和D2离开黑色线路,直到左边的传感器探测到黑线路,原理与前面类似。小车在前进过程中不断重复以上动作,从而达到沿着黑色的线路前进的目的。


巡线检测电路的校准

为了使巡线检测电路在单独使用LM393芯片控制的状态下有着对明暗变化更高的灵敏度,以及减少相同光照亮度下的电势差,需要通过手动调整可调电阻来进行校准。

校准步骤如下:

  1. 将小车用小物件微微将轮子抬起以防接触表面,将小车的光敏电阻对准一个稳定光源(台灯或手电筒)。
  2. 随意调整任一边可调电组,直到两侧马达同时运转。
  3. 调整完成后,放置在跑道上测试结果。
  4. 若小车还是有概率冲出跑道,将小车放置于白纸上,重复2~3步骤进行微调,尝试使巡线检测电路对明暗变化有更高的灵敏度。

Triodecar calibration 1.jpg

Triodecar calibration 2.jpg

Triode-Car 配合Micro:Bit 使用MakeCode环境编程

基础教程

导入扩展积木&用microbit按钮控制电机

打开MakeCode,点击"Advanced",再点击最下面的"Extensions",在上方搜索栏中输入 https://github.com/bpi-steam/pxt-triodecar (右键此连接并复制),点击搜索出来的项目,即可导入Triode-Car专用扩展积木。

扩展积木便于初学者理解程序功能并上手使用。

例程如下图所示:

Triode-Car motor control 1.png

启动或复位时停车,同时按下AB按钮直行,按下A按钮右转,按下B按钮左转。

在Github上的例程项目文件

项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。


调整电机转速

Triode-Car专用扩展积木中有可单独控制左右电机转速的积木,可进行10级调速。

例程如下图所示:

Triode-Car motor control 2.png

按一次A按钮转速加1档,按一次B按钮转速减1档,Micro:Bit显示当前挡位数值。

其中"forever"积木会在"on start"积木执行完后开始无限循环执行其内部的积木,而在每次循环的间隙则可执行其他事件处理程序,如on button A/B pressed。

加入了一个"if"判断积木,若变量"speed"值小于0或大于10时,将变量"speed"值设为0,这样可以将值限定在0到10范围内不会溢出而报错。

在Github上的例程项目文件

项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。


采集巡线检测电路的电压模拟信号

硬件原理参考“巡线检测电路”中的介绍。

Triode-Car专用扩展积木中有可采集巡线检测电路的电压模拟信号的"read left/right line tracking sensor"积木。

Micro:Bit引脚对0至3.3V电压测量精度为10bit即2^10=1024级,所以调用"read left/right line tracking sensor"积木从对应引脚读到的电压模拟值将为0至1023。

例程如下图所示:

Triode-car read LDR.png

在程序中,每间隔100ms通过USB串口将读取到的左右两个传感器的电压模拟值发送给电脑,在MakeCode中打开控制台即可查看实时接收到的信息。

在Github上的例程项目文件

项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。


使用两块micro:bit通过无线电通讯控制电机

micro:bit支持无线电通讯,在MakeCode中应用无线电扩展积木进行编程,并将程序下载进两块micro:bit后,即可在二者之间建立无线通讯,并可相互控制对方的硬件。

例程如下图所示:

Triode-Car radio control 1.png

将例程下载进两块micro:bit,一块插在Triode-Car上,一块拿在手上,两块都接通电源,即可通过手上的micro:bit的按钮AB控制Triode-Car的电机启停。

按A左转,按B右转,同时按下AB直行,松开即停车。

其中加入的四个变量并非多余的存在,虽然也可以在积木中填上我们所需要的数值,但使用变量名来代替这些指定的数值有利于我们在认知上建立更清晰的逻辑,在越复杂的程序中越能体现其价值。

在Github上的例程项目文件

项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。


蓝牙控制

micro:bit支持蓝牙通讯,在MakeCode中应用蓝牙扩展积木进行编程,在支持蓝牙通讯的Apple或Android设备上安装APP即可通过蓝牙无线控制。

注:App Store中的官方APP micro:bit有蓝牙控制功能。Google Play商店有官方APP micro:bit,但没有蓝牙控制功能,所以需要第三方APP来实现蓝牙控制功能。

蓝牙配对流程及注意事项:

  1. 在MakeCode中,点击Extension,在页面中选择Bluetooth,移除Radio功能,即可将micro:bit的无线通讯功能切换为Bluetooth。
    Makecode bluetooth extension.jpg
  2. 当micro:bit蓝牙配对的是Android设备且使用的APP为第三方APP时,应当在MakeCode中"Project Setting"项目设置中勾选"Passkey pairing: Pairing requires 6 digit key to pair."。
  3. micro:bit通电开机后,同时按下按钮AB并保持按下的状态,再点按一次Reset复位键,保持读条进度完成,即可进入蓝牙配对模式。
  4. Android设备应打开GPS和蓝牙功能(需要开启GPS功能才可保持连接稳定)。
  5. 进入Android系统的蓝牙设置内找到micro:bit并与之配对,开始配对时micro:bit会提示按一次按钮A,按下一次后将连续显示6位配对码,将其输入Android设备上显示的蓝牙配对码输入框中,稍等片刻即可配对成功。
  6. 建议配对成功后再按一次Reset复位键将micro:bit复位。
  7. Apple设备如iPhone或iPad则无需进入系统的蓝牙设置,使micro:bit进入蓝牙配对模式后遵照官方APP micro:bit内的操作提示一步步操作即可完成配对。

例程如下图所示:

TriodeCar bluetooth control 1.png

蓝牙连接时显示一个红心图案,蓝牙断开时显示一个错误图案,使用Apple或Android设备上安装的APP的蓝牙控制功能即可无线控制Triode-Car,蓝牙控制端按钮A按下小车前进,按钮C按下小车左转,按钮D按下小车右转,松开即停车。

其中on event from()with value()积木在Control选项栏中。

在Github上的例程项目文件

项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。

高阶教程

校准巡线检测电路

为了能以较高的灵敏度应用巡线检测电路,我们需要手动对两个光敏电阻对应连接的可调电阻进行微调,使其工作在灵敏度较高的区间内,且应该尽量使相同光照强度下输出的电压模拟量保持相等。

我们可以直接应用基础教程中的“采集巡线检测电路的电压模拟信号”教程中所示的例程来在电脑上输出采集到的电压模拟量数值,然后使用螺丝刀对可调电阻进行调节。

在Micro:Bit所能测量的0-1023级电压模拟量范围内,越靠近中间值,光敏电阻对光照强弱变化的响应灵敏度就越高。

所以对巡线检测电路校准时,应在稳定的环境光下,尽量将两个可调电阻调节到靠近中间值512,并尽量使二者在相同光照强度下输出的电压模拟量的差值减小。

以上实行校准步骤都是建立在保持Micro:Bit与PC连接,Micro:Bit与Triode-Car连接的前提下的,但实际应用中,为了提高使用时的灵敏度,最好直接在实际应用的场景下进行校准。

我们不一定总有条件在实际应用的场景下还能保持Micro:Bit与PC连接。在不能连接PC的时候,就需要提前写好一个可以正确的指引我们校准巡线检测电路的程序。

分析校准的步骤:

  1. 选择先对左侧的可调电阻进行手动调整,使其并联的光敏电阻在Micro:Bit对应引脚上输出的电压模拟量接近中间值。
  2. 在上一个条件满足的前提下调整右侧的可调电阻,使其并联的光敏电阻在Micro:Bit对应引脚上输出的电压模拟量接近另一个光敏电阻。

在程序上这显然是可以通过"if"条件判断来完成的,而对于实际进行手动校准的人,则是需要得到对应条件下使Micro:Bit显示不同图形使人也能得到条件满足的反馈。

例程如下图所示:

Triode-car LDR calibration 1.png

由于例程较为复杂,所以给出一些必要的说明:

  1. 将程序整体放入一个"function"自定义函数中,这有利于我们从认知上在大量积木中区分某一部分的功能,方便后续调用或维护。
  2. 整体由两个"while"循环积木组成,加入了循环条件,这样可以在可调电阻校准完成后改变循环条件退出循环。
  3. 在进入"while"循环之前,使Micro:Bit显示对应的方向指示,给人以直观的行动目标,确认当前应该要进行手动调整的可调电阻。
  4. 第一个"while"循环积木中的程序用于校准左侧光敏电阻,其中"if"判断条件为,左侧光敏电阻输出的电压模拟量大于等于450小于等于550。
  5. 当满足第4条中的"if"判断条件后,使Micro:Bit显示一个表示正确的图形,给人以视觉上反馈,此时人应该停止对左侧的可调电阻的调节,随后延时1000ms再一次进行相同的"if"判断条件,用以消除手动调整可能产生的抖动而带来的误差,当再次确认条件满足时,改变控制这个"while"循环的循环条件以退出循环,执行下一步。
  6. 第二个"while"循环积木中的程序用于校准右侧光敏电阻,其中"if"判断条件为,左右两侧光敏电阻输出的电压模拟量相减,其差值的绝对值小于等于25。

在Github上的例程项目文件

项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。


巡线行驶

在“校准巡线检测电路”之后,我们即可开始对巡线检测电路进行有效利用。

根据“巡线检测电路”中所介绍的原理,巡线需要利用“线路”与其两侧路面对光线不同的反射率进行实时的光照强度检测,在程序中读取左右两个光敏电阻的电压模拟值,对数值进行比对,以此判断Triode-Car行进路线是否发生偏移以及偏移方向,进而对左右两个电机的启停进行控制,修正Triode-Car的行驶方向,达成沿着“线路”行驶的目的。

例程如下图所示:

Triode-car Line Follower.png

由于例程较为复杂,所以给出一些必要的说明:

  1. "on button A pressed"积木用于控制循迹程序的启动和停止,每按一次按钮A,其中设置的变量就会改变一次状态。
  2. "forever"积木将重复执行其内部的程序,每次循环结束或在循环中执行到"show"或"pause"积木时会让出线程允许其他的"forever"积木或事件处理程序运行,所以此处三个"forever"积木与一个"on button A pressed"积木可以共同在后台运行,这样使系统具备同时执行多个程序的能力,一般将此称作“多工”。
  3. 第一个"forever"积木内的程序用于循环读取左右两个光敏电阻电压模拟值,然后在多级"if"条件积木中进行判断,满足相应条件时改变变量,该变量用于控制电机。
  4. 第二个"forever"积木内的多级"if"条件积木对第一个"forever"积木内改变的变量值进行判断,直接输出控制信号来控制左右电机的启停和转速。
  5. 第一,二个"forever"积木内的循环条件即为"on button A pressed"积木控制的变量,变量为"true"值时才会循环执行。
  6. 第三个"forever"积木略有巧思,其内部的循环仅在用于控制电机的变量发生变化时才会执行一次,对应改变LED当前应当显示的内容。

在Github上的例程项目文件

项目文件下载到本地后可导入MakeCode中查看和再编辑,也可直接通过USB烧录到Micro:Bit中运行。

Triode-Car 配合Micro:Bit 使用MicroPython环境编程

基础教程

在线编程

Micro:Bit的MicroPython在线编辑器

Python.microbit.org screenshot.png

在浏览器里在线编程,可通过USB连接将程序下载进Micro:Bit,且有串口工具可以实时查看串口信息。

Micro:Bit MicroPython 官方文档&中文翻译文档

建议通过查阅Micro:Bit MicroPython官方文档来了解microbit函数库及其使用方法。

用按钮控制电机

Triode-Car motor control 3.png

代码中出现的 display.show() 等函数可以在Micro:Bit MicroPython 官方文档中文翻译文档中的microbit函数库里找到相应的代码解释与使用方法。

在Github中查看例程代码

调整电机转速

Triode-Car motor control 4.png

在Github中查看例程代码

高阶教程

搭建开发环境

  1. python官网下载并安装python,切记要勾选Add Python to PATH
  2. 安装一个Python IDE,此处推荐使用Thonny,可以直接去官网下载安装,或是在系统中打开CMD窗口或PowerShell窗口,输入 pip install thonny 来安装。

Triode-Car 配合BPI:Bit 使用Arduino环境编程

基础教程

高阶教程

Triode-Car 配合BPI:Bit 使用MicroPython环境编程

基础教程

高阶教程