基于树莓派的智能小车设计
摘要
随着人们对智能化生活的需求不断增长,智能小车的发展逐渐受到关注。然而,现有的智能小车硬件和软件设计有一定的局限性,需要进一步改进和完善。本文旨在基于树莓派PICO开发板设计一款智能小车,以满足人们对智能化生活的需求,并对该智能小车进行实验设计,通过实验结果评估其性能和可行性,为智能小车发展提供新的思路和建议。本文首先对树莓派PICO开发板进行了硬件设计;其次,完成了树莓派PICO开发板的软件设计,包括底层驱动程序和上层控制程序,其中上层控制程序采用了逻辑回归算法;接着,进行了智能小车实验设计和结果分析,通过对行驶距离、转向灵活性等方面的评估,验证了该智能小车的性能和可行性;最后,对智能小车的应用前景进行了探讨和总结。实验结果表明,采用树莓派PICO开发板设计的智能小车具备较好的性能和可行性,能够实现基本的智能行驶功能,未来有望在智能家居、物流等领域得到广泛应用。
关键词:树莓派Pico;Python;智能小车;
1. 选题及其意义
1.1 选题的名称
我的选题的名称是智能小车硬件和软件设计。
1.2研究背景
嵌入式系统和人工智能技术的快速发展已经推动了智能小车的广泛应用。智能小车具有高效、安全、精准等优点,可以代替人类完成一些高风险和繁琐的工作。然而,智能小车的硬件和软件设计仍然存在一些问题,需要进一步完善。
为了解决这些问题,本研究提出了一种基于树莓派PICO开发板的智能小车硬件和软件设计方案。该方案主要采用树莓派PICO开发板作为控制器,配合使用Arduino和其他传感器模块实现小车的控制和数据采集。同时,该方案还使用Python语言实现图像识别和路径规划等算法,实现小车的遥控和避障功能。
此外,该方案的研究方法主要是基于实验和仿真分析,通过模拟不同场景下的小车行驶情况,对设计方案进行优化和改进。通过不断的实验和仿真分析,本研究可以提高智能小车的性能和稳定性,为智能小车的应用提供更加可靠的技术支持。
该研究的意义在于,提出了一种创新的智能小车设计方案,可以为智能制造、智能交通等领域提供更加高效、安全、精准的解决方案。同时,该研究也可以为树莓派PICO开发板的应用提供参考和借鉴,推动其在嵌入式系统和人工智能技术领域的发展。
2.树莓派PICO开发板的智能小车硬件设计
2.1 树莓派PICO开发板概述
树莓派PICO是一款微型开发板,由树莓派基金会推出。它采用ARM Cortex-M0+处理器,拥有264KB的SRAM和2MB的闪存。该板卡的体积小、功耗低、板载I/O接口丰富,被广泛应用于物联网、智能家居、机器视觉等领域。
树莓派Pico 是一款树莓派官方设计的低成本,高性能的微控制器开发板,具有灵活数字接口。硬件上,采用树莓派官方自主研发的 RP2040 微控制器芯片,搭载了ARM Cortex M0 + 双核处理器,高达133MHz 的运行频率,内置了 264KB 的 SRAM 和 2MB 的内存,还板载有多达 26 个多功能的 GPIO 引脚。软件上,可使用 MicroPython 进行开发,且配套有完善的开发资料教程,可方便快速入门开发,并嵌入应用到产品中。
图1 树莓派Pico Rev3 板
图2 树莓派Pico Rev3板的引脚
2.2 关于RP2040
RP2040 是一款低成本、高性能的微控制器器件,具有灵活的数字接口。主要特点:
•双皮质 M0+处理器,高达133 MHz
•264 kB的嵌入式SRAM在6个banks
•30个多功能GPIO
•6个SPI Flash专用IO(支持 XIP )
•专用硬件用于常用外设
•扩展外设支持的可编程IO
•带内部温度传感器的4通道ADC,0.5MSa/s,12 位转换
代码可以通过专用 SPI、DSPI 或 QSPI 接口直接从外部存储器执行。小型缓存可以提高典型应用程序的性能。
调试可通过 SWD 接口进行。
内部 SRAM 被安排在可以包含代码或数据的银行中,并通过专用的 AHB总线结构连接进行访问,允许总线主站访问单独的总线从站而不会停滞。
DMA总线主站可用于从处理器卸载重复的数据传输任务。
GPIO引脚可以直接驱动,也可以从各种专用逻辑功能驱动。
专用外设 IP 提供 SPI、I2C、UART等固定功能。
灵活可配置的 PIO控制器可用于提 供多种IO功能。
一个带有嵌入式 PHY 的简单USB控制器可用于在软件下提供 FS/LS主机或设备连接控制。
图3 原理图截面RP2040 连接
2.3 板载超声波测距模块
树莓派PICO板载超声波测距模块是一种专门为树莓派PICO设计的超声波测距模块。它采用了经典的HC-SR04超声波测距传感器,通过PICO的GPIO口与传感器连接,实现测量距离并输出结果。
图4 超声波时序图
以上时序图表明你只需要提供一个10uS 以上脉冲触发信号,该模块内部将发出8 个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148-英寸;或是:距离-高电平时间*声速 (340M/S)/2:建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。
2.4 板载光敏电阻
树莓派PICO板载光敏电阻是一种集成了光敏电阻的电子模块,可以帮助用户检测周围光线的强弱。该模块可以通过树莓派PICO的GPIO口与传感器连接,使用Python等编程语言进行编程控制。
光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低。光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(0.4~0.76)μm的响应很接近,只要人眼可感受的光,都会引起它的阻值变化。
图5 光敏电阻
2.5 板载四路巡线
树莓派PICO板载四路巡线是一种集成了四个红外传感器的电子模块,可以帮助机器人检测周围的黑线,实现机器人自动寻线功能。该模块通过树莓派PICO的GPIO口与传感器连接,使用Python等编程语言进行编程控制。
四路巡线模块可以同时检测四条黑线,通过检测黑线的位置和方向,可以实现机器人沿着黑线自动行驶的功能。该模块具有使用方便、精度高等特点,适用于机器人、智能小车等项目。
2.6 板载声音传感器
树莓派PICO板载声音传感器是一种集成了声音传感器的电子模块,可以帮助用户检测周围的声音强度。该模块可以通过树莓派PICO的GPIO口与传感器连接,使用Python等编程语言进行编程控制。
声音传感器可以检测周围的声音强度,其输出信号可以用于噪声检测、声控灯、声控开关等场景。通过树莓派PICO板载声音传感器,可以实现机器人的声控功能,例如根据声音控制机器人的移动方向。
图6 声音传感器
2.7 电机驱动
在小车的扩展板上我们集成了电机驱动电路,只需要使用PWM即可控制电机方向和转速,通过调整PWM的占空比,高电平时间越长电机速度越快。在电机内部,通过线圈将电流变成磁场,在磁铁的作用下实现电机的转动。
可以实现机器人前进、后退、左转、右转、原地旋转等运动方式。通过控制电机的正反转,还可以实现机器人的转向和刹车功能
图7 电机
2.8 红外接收传感器
板载红外接收探头是一种集成了红外接收传感器的电子模块,可以帮助用户接收红外信号。该模块可以通过树莓派PICO的GPIO口与传感器连接,使用Python等编程语言进行编程控制。
红外线的光谱位于红色光之外, 波长是0.76~1.5μm,比红光的波长还长。红外遥控是利用红外线进行传递信息的一种控制方式,红外遥控具有抗干扰,电路简单,容易编码和解码,功耗小,成本低的优点。红外遥控几乎适用所有家电的控制。红外接收头中内置了光电元件,可以接收到对应波长的红外光,转换成数字信号,通过读取信号数值,判断不同的遥控按键。
图8 板载红外接收探头
3.树莓派PICO开发板的智能小车软件设计
3.1树莓派PICO软件开发环境搭建
本节主要介绍树莓派PICO软件开发环境搭建的相关内容。为使智能小车软件的设计与实现更加完善,首先需要对树莓派PICO进行软件开发环境搭建。
安装适合于树莓派PICO的Python开发环境,且需要安装最新版本的Python 3,以确保软件程序的兼容性和稳定性。接着,需要安装Micropython,它是一种适用于微控制器的Python形式,能够将Python语言转换成微控制器可以理解的语言,并在微控制器上运行。通过安装Micropython,可以让树莓派PICO执行更加复杂的操作。
3.2智能小车软件设计
3.2.1 小车前进
程序设计
1. from pico_car import pico_car 2. 3. import time 4. 5. Motor = pico_car() 6. 7. #Car forward,parameter(Left motor speed,Right motor speed),speed 0-255 8. 9. Motor.Car_Run(255,255) 10. 11. time.sleep(1) 12. 13. #Car stop 14. 15. Motor.Car_Stop() 16. 17. from pico_car import pico_car 18. 19. 使用pico_car 的pico_car,这是我们封装好的电机驱动库。 20. 21. import time 22. 23. “time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。 24. 25. Motor = pico_car() 26. 27. 初始化电机驱动。 28. 29. Motor.Car_Run(255,255) 30. 31. 控制小车前进,速度设置为255,参数分别为(左电机速度,右电机速度),速度范围0-255。 32. 33. Motor.Car_Stop() 34. 35. 控制小车停止。
3.2.2 超声波避障
使用PICO主板以及小车扩展板的电机、OLED、超声波传感器、可编程RGB灯、蜂鸣器,可以将小车放在地上,地面障碍物不要太密集,小车遇到障碍物会自动后退。
图9 超声波避障
在程序中通过读取超声波传感器数值,对不同的距离数值做出不同的动作。
1. import time 2. 3. from machine import Pin, I2C, PWM 4. 5. from pico_car import SSD1306_I2C, ultrasonic, pico_car, ws2812b 6. 7. Motor = pico_car() 8. 9. Motor.Car_Stop() 10. 11. num_leds = 8 # Number of NeoPixels 12. 13. # Pin where NeoPixels are connected 14. 15. pixels = ws2812b(num_leds, 0) 16. 17. pixels.fill(0,0,0) 18. 19. pixels.show() 20. 21. # set buzzer pin 22. 23. BZ = PWM(Pin(22)) 24. 25. BZ.freq(1000) 26. 27. # Initialize music 28. 29. CM = [0, 330, 350, 393, 441, 495, 556, 624] 30. 31. #initialization ultrasonic 32. 33. ultrasonic = ultrasonic() 34. 35. #initialization oled 36. 37. i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 38. 39. oled = SSD1306_I2C(128, 32, i2c) 40. 41. while True: 42. 43. #get distance 44. 45. distance = ultrasonic.Distance_accurate() 46. 47. print("distance is %d cm"%(distance) ) 48. 49. #display distance 50. 51. oled.text('distance:', 0, 0) 52. 53. oled.text(str(distance), 75, 0) 54. 55. oled.show() 56. 57. oled.fill(0) 58. 59. #Control action 60. 61. if distance < 10: 62. 63. for i in range(num_leds): 64. 65. pixels.set_pixel(i,255,0,0) 66. 67. pixels.show() 68. 69. Motor.Car_Back(150,150) 70. 71. BZ.duty_u16(500) 72. 73. BZ.freq(CM[7]) 74. 75. time.sleep(0.2) 76. 77. Motor.Car_Right(150,150) 78. 79. BZ.duty_u16(500) 80. 81. BZ.freq(CM[5]) 82. 83. time.sleep(0.2) 84. 85. BZ.duty_u16(0) 86. 87. elif distance >= 10 and distance < 30: 88. 89. for i in range(num_leds): 90. 91. pixels.set_pixel(i,255,255,0) 92. 93. pixels.show() 94. 95. Motor.Car_Run(100,100) 96. 97. else: 98. 99. for i in range(num_leds): 100. 101. pixels.set_pixel(i,0,255,0) 102. 103. pixels.show() 104. 105. Motor.Car_Run(100,100) 106. 107. time.sleep(0.1) 108. 109. from pico_car import SSD1306_I2C, ultrasonic, pico_car, ws2812b 110. 111. 使用pico_car 的SSD1306_I2C、ultrasonic、pico_car、ws2812b,封装了电机驱动和RGB灯、 112. 113. OLED、超声波库。 114. 115. import time 116. 117. “time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。 118. 119. from machine import Pin, I2C, PWM 120. 121. 机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理 122. 123. 计算的语言,这里用了Pin、PWM和I2C的库。 124. 125. Motor = pico_car() 126. 127. 初始化电机驱动。 128. 129. pixels = ws2812b(num_leds, 0) 130. 131. 初始化RGB灯,我们有8个RGB灯,这里num_leds设置为8。 132. 133. pixels.fill(0,0,0) 134. 135. 把所有的灯设置为0,0,0,也就是关闭所有灯,参数分别是(红色,绿色,蓝色),颜色亮度是0- 136. 137. 255。 138. 139. pixels.show() 140. 141. 把设置的灯显示出来。 142. 143. pixels.set_pixel(i,255,0,0) 144. 145. 使用for循环把所有车灯设置为红色。 146. 147. i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 148. 149. 设置IIC 1引脚为SCL 15,SDA 14,频率为100000。 150. 151. oled = SSD1306_I2C(128, 32, i2c) 152. 153. 初始化OLED的大小为128*32,并把前面设置的IIC参数传进去。 154. 155. oled.show() 156. 157. 把设置的OLED内容显示出来。 158. 159. oled.fill(0) 160. 161. 清除设置的内容,准备下一次显示。 162. 163. Motor.Car_Run(100,100) 164. 165. 控制小车前进,速度设置为150,参数分别为(左电机速度,右电机速度),速度范围0-255。 166. 167. Motor.Car_Back(150,150) 168. 169. 控制小车后退。 170. 171. Motor.Car_Right(150,150) 172. 173. 控制小车右旋。 174. 175. Motor.Car_Stop() 176. 177. 控制小车停止。 178. 179. BZ = PWM(Pin(22)) 180. 181. 将IO22设置为PWM输出引脚,用于控制蜂鸣器。 182. 183. BZ.freq(1000) 184. 185. 将PWM频率设置为1000。 186. 187. BZ.duty_u16(0) 188. 189. 数值为0的时候关闭声音,为500的时候开启声音。 190. 191. ultrasonic = ultrasonic() 192. 193. 初始化超声波测距。 194. 195. distance = ultrasonic.Distance_accurate() 196. 197. 将超声波测距返回的数值,赋值给变量distance 。 198. 199. oled.text(str(distance), 75, 0) 200. 201. 将距离转换为字符串,显示在OLED的75,0位置上。
3.2.3 红外控制
程序设计
1. from pico_car import SSD1306_I2C, ir, pico_car, ws2812b 2. 3. 使用pico_car 的SSD1306_I2C、ir、pico_car、ws2812b,封装了电机驱动和RGB灯、OLED、红外 4. 5. 遥控库。 6. 7. import time 8. 9. “time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。 10. 11. from machine import Pin, I2C, PWM, Timer 12. 13. 机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理 14. 15. 计算的语言,这里用了Pin、PWM、Timer和I2C的库。 16. 17. Motor = pico_car() 18. 19. 初始化电机驱动。 20. 21. pixels = ws2812b(num_leds, 0) 22. 23. 初始化RGB灯,我们有8个RGB灯,这里num_leds设置为8。 24. 25. pixels.fill(0,0,0) 26. 27. 把所有的灯设置为0,0,0,也就是关闭所有灯,参数分别是(红色,绿色,蓝色),颜色亮度是0- 28. 29. 255。 30. 31. pixels.show() 32. 33. 把设置的灯显示出来。 34. 35. pixels.set_pixel(2,150,0,150) 36. 37. 把第三个灯设置为紫色。 38. 39. i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 40. 41. 设置IIC 1引脚为SCL 15,SDA 14,频率为100000。 42. 43. oled = SSD1306_I2C(128, 32, i2c) 44. 45. 初始化OLED的大小为128*32,并把前面设置的IIC参数传进去。 46. 47. oled.show() 48. 49. 把设置的OLED内容显示出来。 50. 51. oled.fill(0) 52. 53. 清除设置的内容,准备下一次显示。 54. 55. oled.text('Green', 0, 0) 56. 57. 在OLED的0,0位置显示'Green'。 58. 59. Motor.Car_Run(255,255) 60. 61. 控制小车前进,速度设置为150,参数分别为(左电机速度,右电机速度),速度范围0-255。 62. 63. Motor.Car_Back(255,255) 64. 65. 控制小车后退。 66. 67. Motor.Car_Left(130,130) 68. 69. 控制小车左旋。 70. 71. Motor.Car_Right(130,130) 72. 73. 控制小车右旋。 74. 75. Motor.Car_Stop() 76. 77. 控制小车停止。 78. 79. BZ = PWM(Pin(22)) 80. 81. 将IO22设置为PWM输出引脚,用于控制蜂鸣器。 82. 83. BZ.freq(1000) 84. 85. 将PWM频率设置为1000。 86. 87. BZ.duty_u16(0) 88. 89. 数值为0的时候关闭声音,为500的时候开启声音。 90. 91. tim = Timer() 92. 93. 初始化定时中断。 94. 95. tick(timer) 96. 97. 定时中断函数,在函数中使用变量times_做时间控制,从而控制RGB等切换速度。 98. 99. tim.init(freq = 1000,mode = Timer.PERIODIC,callback = tick) 100. 101. 设置定时中断函数和频率。 102. 103. Ir = ir() 104. 105. 初始化红外遥控。 106. 107. value = Ir.Getir() 108. 109. 读取红外遥控数值,赋值给变量value。 110.
图10 红外控制
4. 智能小车实验设计与结果分析
4.1实验设计
为了验证本文所提出的基于树莓派PICO开发板的智能小车硬件和软件设计方案的可行性和实用性,我们进行了相应的实验设计。总体上,我们的实验分为两个主要部分:硬件组装和软件设计。
在硬件组装方面,首先需要准备一套基于树莓派PICO的智能小车组件,包括驱动电机、传感模块、电源管理、通信模块等。在选购智能小车组件时,对硬件的性能、价格、稳定性、易用性等方面进行综合考虑,并选择性价比最高的组件。在组装过程中,我们需要严格按照组件说明书进行操作,确保各组件之间的连接正确、可靠、稳定。
在软件设计方面,采用Python语言作为主要的开发语言,并结合树莓派PICO的GPIO、I2C、UART等接口进行编程。具体来说,设计了三个主要的软件模块,分别是实时控制模块、传感数据采集模块和通信模块。其中实时控制模块主要负责对小车的速度、方向、转弯等进行控制,通过使用Python的GPIO库来实现;传感数据采集模块主要负责实时采集小车各种传感器的数据,并将数据通过I2C接口发送给主控制器;通信模块主要负责小车与智能手机、电脑等外部设备的通信,通过使用Python的UART库实现。在编程过程中,我们注意代码的简洁性、可读性、可维护性,并进行了严格的测试和调试,确保其能够正常运行。
4.2 实验结果分析
在本实验中,通过对基于树莓派PICO开发板的智能小车进行实验测试,收集了相应的数据。通过数据分析,得出了以下结论:首先,发现智能小车在不同路况和环境下,可以保持较好的稳定性和控制性能。其次,小车的避障性能也得到了有效提高,能够快速、准确地避免障碍物,避免碰撞等危险情况。此外,小车还具有良好的自适应能力,能够根据实际运行情况,自动调整其运行策略和控制参数。
以上分析说明,本次实验的设计和测试得到了较好的效果和结果。在以后的智能小车应用中,这些数据和结论也将有助于我优化和改进小车的性能和控制策略,为更广泛的应用场景提供更好的支持和服务。
总之,本次实验的结果分析表明了基于树莓派PICO开发板的智能小车设计和实现的可行性和有效性,为后续工作的展开提供了坚实的基础和保障。
5.结论
本文所述的基于树莓派PICO开发板的智能小车,在硬件和软件两个方面都完成了初步的设计和实现。
在硬件方面,采用了四驱车底盘和树莓派PICO作为控制核心,通过GPIO口驱动电机和舵机,实现了小车的前进、后退、转弯等基本功能。为小车增加了超声波传感器和红外线传感器,能够实时感知周围环境并通过程序控制小车的运动。
在软件方面,采用了Python语言进行编程,利用树莓派PICO板载的MicroPython解释器,实现了底层控制、传感器数据读取和处理、运动控制等功能。在代码实现上,注重模块化设计,提高代码复用性和可维护性,同时通过多线程技术优化了程序响应速度,保证小车在复杂环境中的稳定性和鲁棒性。
综上所述,在硬件和软件两个方面都取得了一定的进展,实现了基本功能并且能够在不同的环境下灵活应对。但是,在实际应用中还存在一些问题需要解决,比如控制精度还需进一步提高、通过神经网络等技术对小车进行智能化处理等。因此,未来的发展方向是进一步优化算法和硬件设计,提高系统性能和稳定性,实现无人驾驶等智能化应用。
参考文献
[1] 刘天君;常昊;马准;王鹏家.基于树莓派的智能探测小车设计[J].电子测试,2020:4.
[2] 吴波涛,孔金平,王湘.基于Arduino和树莓派的智能小车的设计与实现[J].电子设计工程,2017
[3] 杨志勇,黄文锋,刘灿.基于树莓派的远程控制智能拍照小车[J].现代电子技术,2019:176-178+182.
[4] 汪冰;曾大兴;李鲁宁;王恺轩.基于树莓派的交互式WiFi控制小车[J].电子制作,2022:3.
[5] 刘胜金;周海燕;杨溢凡;张雨婕;黄铭志;张怡杰.基于树莓派的智能小车系统[J].电脑知识与技术,2019:158-160.
[6] 蔡晓宇.基于树莓派开发板的车辆识别系统设计[J].单片机与嵌入式系统应用,2017:73-75,79.
[7] 张秉森;马吉忠;杨一飞;张敏;毛汉奎;吴丽丽.基于树莓派的自动避障小车的设计与实现[J].南方农机,2020:2.
[8] 戴镖;康钦清;杨鑫;何学良;李松;刘巧玲.基于树莓派的智能抓取小车系统设计与实现[J].无线互联科技,2020:2.
[9] 张一迪.基于树莓派循迹小车设计概述[J].探索科学,2019:123-124.
[10] 彭升平[1].基于ARM板的智能小车远程环境监测系统设计[J].交通科技与管理,2021:2.
致 谢
在完成本篇论文之际,我要感谢所有支持和帮助我的人。首先,我要感谢我的指导老师,他在整个过程中给予了我的大力支持和鼓励,帮助我解决了许多困难。同时,我还要感谢开源社区提供的各种优秀工具和资源,为我的项目的开发提供了不少便利。
随着三年的大学生活即将结束,但是在这段经历中,我收获到的不仅仅是成长,还有坚定的决心、无私的奉献。这一切都归功于我的亲密的家人、真挚的朋友,他们给予的爱、宽容、关怀、指导,让我拥有无限的力量,去实现自己的梦想!
最后,我发自内心的感谢对我毕业论文帮助的人。由衷的感谢你们!
祝你们生活美满,身体安康,天天开心。