本帖最后由 雨-p3755A 于 2023-12-15 20:49 编辑
大家好!现在给大家分享一下参加野火鲁班猫氛围赛的遥控小车——RCCar。
以野火鲁班猫1(Lubancat 1)作为主控,纯python语言开发,运行的系统是ubuntu(Debian 10也行,完全兼容)。
可实现的功能如下:
控制直流减速电机转向、转速。
读取usb手柄数据。
电路预留OLED,LCD(IIC SPI)通信扩展接口。
实现驱动供电一体设计。
按键输入。
串口通信。
Led指示。
(PS:由于作者准备考研,事务繁杂,目前只能使小车实现遥控,一些交互手段只实现硬件设计,没有进行程序编写。后续可能通过ROS接入建图等,可继续关注野火论坛对应帖子或者b站视频)
项目展示
知乎:野火【鲁班猫】卡片电脑创意氛围赛(第二期)+遥控小车RCCar - 超级评论家的文章 - 知乎 https://zhuanlan.zhihu.com/p/659263366
硬件设计
总原理图:
以上是根据实际调试后调整的第三版原理图。 PCB图: 第一版: 特点:通过XT60接口供电,采用国产AT8870驱动,适配IIC四脚OLED屏幕,引出串口用于交互,SPI接入无线模块用于远程通信,鲁班猫IO都加了200欧姆的阻抗,保护核心(这里说明一下,最好的处理办法是用双向隔离芯片,但是成本太大,就使用电阻勉强替代了),稳压稳定出的电压被引出,可以用来调试,没有按键,没有led灯
第二版:
特点:新增了io按键,新增了led灯,引出了XH2.54接口的IIC通信接口用于扩展,引出SPI接口用于扩展。控制板和鲁班猫供电板需要两路供电,按键没有加上拉
第三版:
特点:驱动电路和控制电路一体,只需一路供电,彻底摆脱充电宝,按键加了上拉,理论上更改驱动可以实现在TFTLCD界面上显示。 电路部分详细介绍: 暂略,待补充 软件部分
- #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)
不过本项目程序使用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
复制代码
万事俱备之后,我们就可以重启系统啦
更新:如果在设置自启动服务时出错,请使用sudo 命令,另外在/etc/systemd/system/ 目录下创建文件,仍然需要sudo命令
重启服务命令sudo systemctl restart systemd_test.service
附录:
|