# LBC1Car **Repository Path**: open-zynq/lbc1-car ## Basic Information - **Project Name**: LBC1Car - **Description**: 野火鲁班猫系列套件开发 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-15 - **Last Updated**: 2023-10-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: 鲁班猫氛围赛, RK3566 ## README # 遥控小车-RCCar

[文档(国内)](https://gitee.com/open-zynq/pyqt5_-learn/blob/master/README.md) | [GUI程序](https://aisuda.github.io/amis-editor-demo/) | [源码](https://gitee.com/open-zynq/pyqt5_-learn.git) |
交流群:暂无
![build](https://img.shields.io/badge/build-passing-{徽标颜色}.svg) ![license](https://img.shields.io/badge/license-C-{徽标颜色}.svg) ![version](https://img.shields.io/badge/version-1.1-red.svg) ![language](https://img.shields.io/badge/Python-100-blue.svg)
#### 介绍 用Python在鲁班猫1平台制作的一个遥控小车。 ![2](README.assets/2.png) ![3](README.assets/3.png) #### 开发环境 **系统:** debian10 **开发软件:** Pycharm 2021.3.3 **Python版本:** python3.7 #### 使用说明 大家好!现在给大家分享一下参加野火鲁班猫氛围赛的遥控小车——RCCar。自平衡小车以野火鲁班猫1(Lubancat 1)作为主控,纯python语言开发,运行的系统是ubuntu(Debian 10也行,完全兼容)。 **可实现的功能如下:** 控制直流减速电机转向、转速。 读取usb手柄数据。 电路预留OLED,LCD(IIC SPI)通信扩展接口。 实现驱动供电一体设计。 按键输入。 串口通信。 Led指示。 (PS:由于作者准备考研,事务繁杂,目前只能使小车实现遥控,一些交互手段只实现硬件设计,没有进行程序编写。后续可能通过ROS接入建图等,可继续关注野火论坛对应帖子或者b站视频) **项目展示** **B站:** **知乎:** **硬件设计** **总原理图:** 以上是根据实际调试后调整的第三版原理图。 **PCB图:** **第一版:** **特点:通过XT60接口供电,采用国产AT8870驱动,适配IIC四脚OLED屏幕,引出串口用于交互,SPI接入无线模块用于远程通信,鲁班猫IO都加了200欧姆的阻抗,保护核心(这里说明一下,最好的处理办法是用双向隔离芯片,但是成本太大,就使用电阻勉强替代了),稳压稳定出的电压被引出,可以用来调试,没有按键,没有led灯** **第二版:** **特点:新增了io按键,新增了led灯,引出了XH2.54接口的IIC通信接口用于扩展,引出SPI接口用于扩展。控制板和鲁班猫供电板需要两路供电,按键没有加上拉** **第三版:** **特点:驱动电路和控制电路一体,只需一路供电,彻底摆脱充电宝,按键加了上拉,理论上更改驱动可以实现在TFT LCD界面上显示** **电路部分详细介绍:** 1. 按键部分: 在按键上对每个按键都使用10K电阻进行了上拉,同时有加入电容减少按键的抖动影响。 2. USB供电 由于本项目需求5V供电即可,因此没有选择带有PD协议的电源芯片,同时使用的模块比较便宜(甚至比买芯片还便宜),因此就直接使用稳压模块 3. 逻辑信号和各种模块的电源设计 主要方案是12V—5V—3.3V,同时通过杜邦线引出,方便功能扩展。 4. 电机驱动设计 采用国产电机芯片AT8870,通过XH-6接口引出。 **软件部分** (1)控制电机转速 控制转速需要控制AT8870的PWM引脚的电平,野火教程文档里面有详细使用PWM的说明和例程,如下: 本项目程序使用python-periphery库控制PWM。 (2)遥控数据读取 遥控数据需要通过pygame包去读取,这是我写的一个读取数据的例程,如下: 本项目程序使用pygame的?joystick 模块读取,运行环境使用python3.7(应该python3都能用),pygame模块下载使用pip3 install命令即可,可能会因为超时而下载失败,需要科学上网的话可以参考这篇博客更改默认软件源[pip3 或 pip更换源为国内源(提高python包下载安装速度)_pip3换源-CSDN博客](https://blog.csdn.net/Boys_Wu/article/details/106622195)。 ```python3 #!/usr/bin/env python3 #coding:utf-8 import pygame from time import sleep # 模块初始化 pygame.init() pygame.joystick.init() # 若只连接了一个手柄,此处带入的参数一般都是0 joystick = pygame.joystick.Joystick(0) # 手柄对象初始化 joystick.init() clock = pygame.time.Clock() if __name__=='__main__': try: while True: for event\_ in pygame.event.get(): # 按键按下或弹起事件 if event\_.type==pygame.JOYBUTTONDOWN or event\_.type == pygame.JOYBUTTONUP: buttons = joystick.get\_numbuttons() # 获取所有按键状态信息 for i in range(buttons): button = joystick.get\_button(i) print("button " + str(i) +": " + str(button)) # 轴转动事件 elif event\_.type == pygame.JOYAXISMOTION: axes = joystick.get\_numaxes() # 获取所有轴状态信息 for i in range(axes): axis = joystick.get\_axis(i) print("axis" +str(i) +":" + str(round(axis,2))) # 方向键改变事件 elif event\_.type == pygame.JOYHATMOTION: hats = joystick.get\_numhats() # 获取所有方向键状态信息 for i in range(hats): hat = joystick.get\_hat(i) print("hat " + str(i) +": " + str(hat)) joystick\_count = pygame.joystick.get\_count() except: print("\b\b error") finally: pygame.quit()* ``` (3)OLED显示 OLED显示需要控制IIC引脚的电平,野火教程文档里面有详细使用IIC的说明和例程,如下: [4. I2C通讯 — \[野火\]Python应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com)](https://doc.embedfire.com/linux/rk356x/Python/zh/latest/circuit/i2c_demo.html#id7) 不过本项目程序使用adafruit\_ssd1306库控制IIC,该库拥有比较丰富的控制方式。 我实现了IIC方式驱动OLED,文件在附件中,由于电路可以使用跳线更换SPI,所以兼容4脚OLED,7脚OLED,8脚TFT LCD,理论上可以更改驱动实现在LCD显示终端或者其他页面。 但是在使用LCD时我遇到了一个问题: 在运行st7735\_spi.py时遇到了一个TypeError,它来自于displayio/\_shape.py中的一行代码。这个错误表明我正在尝试对一个'type'对象进行下标操作,这是不允许的。这个问题通常出现在尝试使用Python 3.9或更高版本的功能,但是在Python 3.8或更低版本上运行时。 在我的情况下,看起来displayio库使用了Python 3.9的类型注解功能,但是你正在使用的Python版本是3.7。类型注解的列表形式(例如list[Area])在Python 3.9中是合法的,但在3.8和更低版本中会导致这个错误。目前好像Lbcat不支持高版本的Python,只能先挖一个坑,等以后解决了 在此OLED显示基础上,我实现了滚动显示, 同时加入了开机自启动设置,在OLED上显示IP地址,CPU温度,CPU频率等,能够更加方便的实现调试。在这里我使用的是 systemd 服务,使用这种方法可以不断重启脚本,以解决各种软件或者硬件干扰。 为了实现目的,我们需要创建一个 systemd 启动服务,并把它放置在?/etc/systemd/system/?目录下 可以看到我创建了一个名为systemd\_test.service的文件 文件内容为 ``` *[Unit] Description=my oled service [Service] ExecStart=python3 /home/cat/demo/python/oled/ssd1306\_stats.py Restart=always Type=idle [Install] WantedBy=multi-user.target* 其中ExecStart后面的是需要执行的程序 然后在终端执行下面两个命令即可 systemctl daemon-reload systemctl enable systemd\_test.service 万事俱备之后,我们就可以重启系统啦 ``` (4)mpu6050数据读取 mpu6050数据需要通过的adafruit\_mpu6050包读取,示例如下: [Python adafruit-circuitpython-mpu6050包_程序模块 - PyPI - Python中文网 (cnpython.com)](https://www.cnpython.com/pypi/adafruit-circuitpython-mpu6050) 本项目程序使用adafruit\_mpu6050库读取,在使用这个库的过程中,我遇到了一些问题,故分享出来供大家参考,使用pip3 install安装包后,使用pip3 list能够看到包确实存在,但是使用import 引用包却找不到,笔者发现是安装路径没有在import的目录中。因此采用如下图方法,成功实现读取 (5)uart串行通信 uart串行通信需要使用UART模块,野火教程文档里面有详细使用UART的说明和例程,如下: [3. UART通讯 — \[野火\]Python应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com)](https://doc.embedfire.com/linux/rk356x/Python/zh/latest/circuit/uart_demo.html#id10) 本项目程序使用python-periphery库进行通信, (6)按键读取和LED指示 按键读取和LED指示需要使用**periphery的**GPIO模块,野火教程文档里面有详细使用GPIO的说明和例程,如下: [1. 控制GPIO — \[野火\]Python应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com)](https://doc.embedfire.com/linux/rk356x/Python/zh/latest/circuit/digital_io.html#id8) 本项目程序使用python-periphery库进行控制。 (9)python多线程 使用threading模块实现多线程 **附录:** #### 友情链接 本项目其他代码地址:暂无 设计时参考的代码地址: [ST7735驱动代码](https://github.com/adafruit/Adafruit_CircuitPython_ST7735) [\[野火\]Python应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com)](https://doc.embedfire.com/linux/rk356x/Python/zh/latest/circuit/digital_io.html) [SSD1306驱动代码](https://github.com/adafruit/Adafruit_CircuitPython_SSD1306) [【鲁班猫创意大赛】——Lubancar自平衡小车 (出处: 野火电子论坛)](https://www.firebbs.cn/forum.php?mod=viewthread&tid=34960&fromuid=128647) [pip3 或 pip更换源为国内源(提高python包下载安装速度)_pip3换源-CSDN博客](https://blog.csdn.net/Boys_Wu/article/details/106622195) 等