野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1373|回复: 2

[经验\资料] 野火【鲁班猫】卡片电脑创意氛围赛(第二期)+遥控小车RCcar

[复制链接]
发表于 2023-10-2 15:47:35 | 显示全部楼层 |阅读模式
本帖最后由 雨-p3755A 于 2023-12-15 20:49 编辑


大家好!现在给大家分享一下参加野火鲁班猫氛围赛的遥控小车——RCCar。
以野火鲁班猫1(Lubancat 1)作为主控,纯python语言开发,运行的系统是ubuntu(Debian 10也行,完全兼容)。

可实现的功能如下:
控制直流减速电机转向、转速。
读取usb手柄数据。
电路预留OLED,LCD(IIC SPI)通信扩展接口。
实现驱动供电一体设计。
按键输入。
串口通信。
Led指示。

(PS:由于作者准备考研,事务繁杂,目前只能使小车实现遥控,一些交互手段只实现硬件设计,没有进行程序编写。后续可能通过ROS接入建图等,可继续关注野火论坛对应帖子或者b站视频)
项目展示
B站:【野火【鲁班猫】卡片电脑创意氛围赛(第二期)+遥控小车RCCar】 https://www.bilibili.com/video/B ... c4cdd38744cf2f76cff
知乎:野火【鲁班猫】卡片电脑创意氛围赛(第二期)+遥控小车RCCar - 超级评论家的文章 - 知乎
https://zhuanlan.zhihu.com/p/659263366

硬件设计
总原理图:



野火论坛202310021555191707..png
以上是根据实际调试后调整的第三版原理图。
PCB图:
第一版:
野火论坛202310021559451528..png
点:通过XT60接口供电,采用国产AT8870驱动,适配IIC四脚OLED屏幕,引出串口用于交互,SPI接入无线模块用于远程通信,鲁班猫IO都加了200欧姆的阻抗,保护核心(这里说明一下,最好的处理办法是用双向隔离芯片,但是成本太大,就使用电阻勉强替代了),稳压稳定出的电压被引出,可以用来调试,没有按键,没有led灯

第二版:
野火论坛202310021601497213..png
特点:新增了io按键,新增了led灯,引出了XH2.54接口的IIC通信接口用于扩展,引出SPI接口用于扩展。控制板和鲁班猫供电板需要两路供电,按键没有加上拉



第三版:
野火论坛202310021603126272..png
特点:驱动电路和控制电路一体,只需一路供电,彻底摆脱充电宝,按键加了上拉,理论上更改驱动可以实现在TFTLCD界面上显示。
电路部分详细介绍:
暂略,待补充
软件部分
(1)控制电机转速
控制转速需要控制AT8870的PWM引脚的电平,野火教程文档里面有详细使用PWM的说明和例程,如下:
https://doc.embedfire.com/linux/rk356x/Python/zh/latest/circuit/pwm_output.html
本项目程序使用python-periphery库控制PWM。
野火论坛202310021605234816..png

(2)遥控数据读取
遥控数据需要通过pygame包去读取,这是我写的一个读取数据的例程,如下:
本项目程序使用pygame的 joystick模块读取,运行环境使用python3.7(应该python3都能用),pygame模块下载使用pip3 install命令即可,可能会因为超时而下载失败,需要科学上网的话可以参考这篇博客更改默认软件源pip3 或 pip更换源为国内源(提高python包下载安装速度)_pip3换源-CSDN博客
  1. #coding:utf-8
  2. import pygame
  3. from time import sleep
  4. # 模块初始化
  5. pygame.init()
  6. pygame.joystick.init()
  7. # 若只连接了一个手柄,此处带入的参数一般都是0
  8. joystick = pygame.joystick.Joystick(0)
  9. # 手柄对象初始化
  10. joystick.init()
  11. clock = pygame.time.Clock()
  12. if __name__=='__main__':
  13.    try:
  14.       while True:
  15.          for event_ in pygame.event.get():
  16.             # 按键按下或弹起事件
  17.             if event_.type==pygame.JOYBUTTONDOWN or event_.type == pygame.JOYBUTTONUP:
  18.                buttons = joystick.get_numbuttons()
  19.                # 获取所有按键状态信息
  20.                for i in range(buttons):
  21.                   button = joystick.get_button(i)
  22.                   print("button " + str(i) +": " + str(button))
  23.                   
  24.             # 轴转动事件
  25.             elif event_.type == pygame.JOYAXISMOTION:
  26.                axes = joystick.get_numaxes()
  27.                # 获取所有轴状态信息
  28.                for i in range(axes):
  29.                   axis = joystick.get_axis(i)
  30.                   print("axis" +str(i) +":" + str(round(axis,2)))
  31.             # 方向键改变事件
  32.             elif event_.type == pygame.JOYHATMOTION:
  33.                hats = joystick.get_numhats()
  34.                # 获取所有方向键状态信息
  35.                for i in range(hats):
  36.                   hat = joystick.get_hat(i)
  37.                   print("hat " + str(i) +": " + str(hat))
  38.          joystick_count = pygame.joystick.get_count()
  39.    except:
  40.       print("\b\b  error")
  41.    finally:
  42.       pygame.quit()
复制代码

(3)OLED显示
OLED显示需要控制IIC引脚的电平,野火教程文档里面有详细使用IIC的说明和例程,如下:
4.I2C通讯 — [野火]Python应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com)
不过本项目程序使用adafruit_ssd1306库控制IIC,该库拥有比较丰富的控制方式。
野火论坛202310021607078211..png
我实现了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,只能先挖一个坑,等以后解决了
野火论坛202310021607409555..png
在此OLED显示基础上,我实现了滚动显示,
野火论坛202310021608062727..png
同时加入了开机自启动设置,在OLED上显示IP地址,CPU温度,CPU频率等,能够更加方便的实现调试。在这里我使用的是 systemd 服务,使用这种方法可以不断重启脚本,以解决各种软件或者硬件干扰。
为了实现目的,我们需要创建一个 systemd 启动服务,并把它放置在 /etc/systemd/system/ 目录下
野火论坛202310021608369789..png
可以看到我创建了一个名为systemd_test.service的文件
文件内容为

  1. [Unit]
  2. Description=my oled service
  3. [Service]
  4. ExecStart=python3 /home/cat/demo/python/oled/ssd1306_stats.py
  5. Restart=always
  6. Type=idle
  7. [Install]
  8. WantedBy=multi-user.target
复制代码
          其中ExecStart后面的是需要执行的程序
然后在终端执行下面两个命令即可
  1. systemctl daemon-reload
  2. systemctl enable systemd_test.service
复制代码

万事俱备之后,我们就可以重启系统啦
野火论坛202310021610263752..png
更新:如果在设置自启动服务时出错,请使用sudo 命令,另外在/etc/systemd/system/ 目录下创建文件,仍然需要sudo命令
重启服务命令sudo systemctl restart systemd_test.service
(4)mpu6050数据读取
mpu6050数据需要通过的adafruit_mpu6050包读取,示例如下:
Pythonadafruit-circuitpython-mpu6050包_程序模块 - PyPI - Python中文网 (cnpython.com)
本项目程序使用adafruit_mpu6050库读取,在使用这个库的过程中,我遇到了一些问题,故分享出来供大家参考,使用pip3 install安装包后,使用pip3 list能够看到包确实存在,但是使用import 引用包却找不到,笔者发现是安装路径没有在import的目录中。因此采用如下图方法,成功实现读取
野火论坛202310021611269609..png
野火论坛202310021611363385..png



(5)uart串行通信
uart串行通信需要使用UART模块,野火教程文档里面有详细使用UART的说明和例程,如下:
3.UART通讯 — [野火]Python应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com)
本项目仅引出引脚,做扩展使用。

(6)按键读取和LED指示
按键读取和LED指示需要使用peripheryGPIO模块,野火教程文档里面有详细使用GPIO的说明和例程,如下:
1. 控制GPIO — [野火]Python应用开发实战指南—基于LubanCat-RK系列板卡 文档(embedfire.com)
本项目程序使用python-periphery库进行控制,通过LED来显示遥控的指示命令。

附录:
野火论坛202310021613005211..png


野火论坛202312140007421868..png

python.rar

27.24 KB, 下载次数: 9

项目源码

回复

使用道具 举报

 楼主| 发表于 2023-10-16 18:31:35 | 显示全部楼层
本帖最后由 雨-p3755A 于 2023-10-16 18:42 编辑

更新:如果在设置自启动服务时出错,请使用sudo 命令,另外在/etc/systemd/system/ 目录下创建文件,仍然需要sudo命令
重启服务命令sudo systemctl restart systemd_test.service


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 15:30 , Processed in 0.112344 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表