【N32G457 】基于RT-Thread和N32G457的Python智能小车
【应用的背景】
智能小车在编程和嵌入式教育中是一个经典的案例,Python 是一种高级语言,有着易学,易用,抽象能力强,跨平台能力强的特点。
本项目中,使用 NG32G457 开发板,基于 PikaScript 超轻量级 Python 引擎,搭建了一个 Python 智能小车,这个项目在编程教育方面,有一定的参考价值。
【实现功能】
Python 交互式控制小车的各个轮子的转速。
Python 交互式读取红外传感器的返回值。
使用 Python 编程,实现了小车的智能避障功能。
【开发板和RT-Thread使用情况概述】
开发板使用的是 RT-Thread 开发者大赛提供的 N32G457 评估板。
使用了开发板的 PWM, GPIO 功能。
使用了 RT-Thread 的 PikaScript 软件包,提供 Python 引擎。
使用了 PikaScript 的 pikaRTDevice 模块,驱动开发板的 PWM, GPIO。
使用了 PikaScript 的 pikaRTThread 模块,实现了延时和线程的挂起。
【硬件框架】
硬件包含以下几个部分:
小车机械框架:小车底盘,电机,轮胎。
电源电路和电池:3.7V 锂电池,锂电池充电电路。
红外传感器。
电机驱动电路。
NG32G457 主控制器。
【软件框架说明】
软件包含以下几个部分:
NG32G457 的 BSP。
PikaScript 软件包。
PikaScript 模块管理文件 reqeustment.txt。
控制小车的 Python 代码 main.py。
【软件模块说明】
NG32G457 的 BSP:
由 RT-Thread Studio 生成的模板工程。
PikaScript 软件包。
参考 PikaScript 开发文档,使用 RT-Thread Studio 安装 PikaScript 软件包。
在工程中的 packages/pikascript-latest/requestment.txt 中写入 PikaScript 需要安装的内核,模块及相应版本。
pikascript-core==v1.4.1
PikaStdLib==v1.4.1
PikaStdDevice==v1.4.4
pikaRTThread==v1.1.1
pikaRTDevice==v1.0.0
在 packages/pikascript-latest/main.py 中编写 Python 代码,实现小车的避障功能。
(1) 导入模块:
import PikaStdLib
import pikaRTThread
import pikaRTDevice
import PikaDebug
(2) 创建常用的工具对象:
thread = pikaRTThread.Thread() #线程管理对象
mem = PikaStdLib.MemChecker() #内存监控对象
pdb = PikaDebug.Debuger() #调试器对象
print('mem use max:')
mem.max() #打印当前的内存占用
编写硬件初始化代码:
# A2
Ain1 = pikaRTDevice.GPIO()
Ain1.setId(16)
Ain1.setMode('out')
Ain1.enable()
# A4
Ain2 = pikaRTDevice.GPIO()
Ain2.setId(20)
Ain2.setMode('out')
Ain2.enable()
# A6
Apwm = pikaRTDevice.PWM()
Apwm.setName('tim3pwm1')
Apwm.setChannel(1)
Apwm.setFreq(1000)
Apwm.setDuty(0)
Apwm.enable()
# A3
Bin1 = pikaRTDevice.GPIO()
Bin1.setId(17)
Bin1.setMode('out')
Bin1.enable()
# A5
Bin2 = pikaRTDevice.GPIO()
Bin2.setId(21)
Bin2.setMode('out')
Bin2.enable()
# A7
Bpwm = pikaRTDevice.PWM()
Bpwm.setName('tim3pwm2')
Bpwm.setChannel(2)
Bpwm.setFreq(1000)
Bpwm.setDuty(0)
Bpwm.enable()
#PC4
sensor1 = pikaRTDevice.GPIO()
sensor1.setId(24)
sensor1.setMode('in')
sensor1.setPull('up')
sensor1.enable()
#PC5
sensor2 = pikaRTDevice.GPIO()
sensor2.setId(25)
sensor2.setMode('in')
sensor2.setPull('up')
sensor2.enable()
(3) 编写电机控制代码:
def motor1(speed: float):
if speed > 0:
Ain1.high()
Ain2.low()
Apwm.setDuty(speed)
else:
Ain1.low()
Ain2.high()
Apwm.setDuty(-speed)
def motor2(speed: float):
if speed > 0:
Bin1.high()
Bin2.low()
Bpwm.setDuty(speed)
else:
Bin1.low()
Bin2.high()
Bpwm.setDuty(-speed)
(4) 编写小车的避障功能:
def go():
while True:
if not sensor2.read():
print('turn right...')
motor1(0.6)
motor2(-0.6)
elif not sensor1.read():
print('turn left...')
motor1(-0.6)
motor2(0.6)
else:
print('forword...')
motor1(0.6)
motor2(0.6)
(5) 启动小车:
go()
【作品完整图片】
【视频演示效果】
https://www.bilibili.com/video/BV1DY411n7eD/
【代码地址】
Python 小车项目仓库:https://gitee.com/Lyon1998/n32g45
PikaScript 项目主仓库:https://gitee.com/lyon1998/pikascript
离线