您尚未登录。

楼主 # 2022-03-21 11:11:37

lyon1998
Moderator
注册时间: 2021-12-01
已发帖子: 108
积分: 55

基于 RTThread 和 PikaScript 的 Python 智能小车

【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()

【作品完整图片】

_20220319154920.jpg

_20220319154932.jpg

【视频演示效果】
https://www.bilibili.com/video/BV1DY411n7eD/

【代码地址】

Python 小车项目仓库:https://gitee.com/Lyon1998/n32g45
PikaScript 项目主仓库:https://gitee.com/lyon1998/pikascript

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn