# 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) |
交流群:暂无




#### 介绍
用Python在鲁班猫1平台制作的一个遥控小车。


#### 开发环境
**系统:** 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)
等