一、小车器件购买选型
教程里是购买的淘宝上集成好的小车器件。另外自己也买了一些散件配置了一辆自己的小车。
https://detail.tmall.com/item.htm?id=608554421638&spm=a1z09.2.0.0.7e012e8d3NEMy0&_u=12kf16b6b4b

组件包括:
1、小车底板(2个)、电机(4个)、车轮(4个)、杜邦线、铜柱、螺丝若干
2、超声波传感器(1个) + 舵机(1个)
3、循迹传感器(3个)
4、避障传感器(2个,左右)
5、USB摄像头(1个) + 舵机(2个)
6、树莓派4B主控板(2G版本)(1个)
7、树莓派扩展板(1个)
8、电池(1个)
9、电压显示模块(1个)
我最终购买一套花了620元,如果按照散件购买,价格估算如下:
1、小车底板一套:35元
2、超声波+1个舵机+小部件:30元
3、循迹传感器:15元
4、避障传感器:5元
5、USB摄像头+2个舵机:50元
6、树莓派4B(2G版本):320元
7、电池:20元
8、电压显示模块:5元
9、树莓派扩展板:120元
10、16G的SD卡:20元
10、电子教程一套:0元
共计:620元。
也就是说这家店铺等于赚了一个卖散件和自家工厂做的扩展板的利润,没赚取集成费用。对了,手柄是我自己单独购买的,约50元。
建议最经济的做法买套餐B,树莓派不是什么USB摄像头都能兼容的,所以需要买个B套餐摄像头,对于C和D,完全没必要,其它的传感器完全可以以后买。另外如果还想省钱,可以买不带树莓派4B的主控板,买一块树莓派ZeroWH的主控板,可以省200元,用于小车实现性能足够了。
另外我自己还组装了一个全散件的简易小车,呵呵,成本200元,关键这个主控板高级啊,比arduino和esp8266之类的单片机强多了。不要和网上那种100多元的单片机小车比。
1、小车底板(1个)、电机(2个)、车轮(2个)、杜邦线、铜柱、螺丝若干:15元
2、电池+电池盒:10元
3、电源模块:5元
4、电机驱动板:5元
5、树莓派Zero WH:110元(现在涨价了)
6、2.4G无线手柄:35元(可以买便宜点的,我是利旧以前买过的)
7、16G的SD卡:20元。



二、功能点代码
2.1、四轮电机驱动模块(主程序会调用)
2.1.1 原理
树莓派集成扩展板其实内部集成了两块L298N的电机驱动芯片,参考散件其工作原理如下:

简单点就是ENA和ENB是控制车轮速度,IN1、IN2是控制车轮状态(正转、反转、停止)。上图输出A和输出B是分别给车轮电机供电。

2.1.2 代码
#CarMotor.py
import RPi.GPIO as GPIO
import asyncio
class SingleMotor:
def __init__(self, IN1, IN2, PWM=None):
self.speed = 35
self.freq = 50
self.run_state = "stop"
self.PWM = PWM
self.IN1 = IN1
self.IN2 = IN2
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
self.Motor = None
if self.PWM != None:
GPIO.setup(PWM, GPIO.OUT)
self.Motor = GPIO.PWM(PWM, self.freq)
self.Motor.start(0)
#设置速度(0-100)
def set_speed(self, speed):
if self.Motor == None:
return
if speed > 100:
self.speed = 100
elif speed < 0:
self.speed = 0
else:
self.speed = speed
self.Motor.ChangeDutyCycle(self.speed)
def get_speed(self):
return self.speed
def inc_speed(self, v):
self.set_speed(self.speed + v)
def dec_speed(self, v):
self.set_speed(self.speed - v)
def get_run_state(self):
return self.run_state
#正转
def up(self):
self.run_state = "up"
GPIO.output(self.IN1, GPIO.HIGH)
GPIO.output(self.IN2, GPIO.LOW)
#反转
def down(self):
self.run_state = "down"
GPIO.output(self.IN1, GPIO.LOW)
GPIO.output(self.IN2, GPIO.HIGH)
#停止
def stop(self):
self.run_state = "stop"
GPIO.output(self.IN1, GPIO.LOW)
GPIO.output(self.IN2, GPIO.LOW)
class CarWheel:
def __init__(self, L_Motor, R_Motor):
self.L_Wheel = L_Motor
self.R_Wheel = R_Motor
self.speed = 35
self.set_speed(self.speed)
self.run_state = "stop"
def set_speed(self, speed):
if speed > 100:
self.speed = 100
elif speed < 0:
self.speed = 0
else:
self.speed = speed
self.L_Wheel.set_speed(self.speed)
self.R_Wheel.set_speed(self.speed)
def get_speed(self):
return self.speed
def inc_speed(self, v):
self.L_Wheel.inc_speed(v)
self.R_Wheel.inc_speed(v)
self.speed = self.L_Wheel.get_speed()
def dec_speed(self, v):
self.L_Wheel.dec_speed(v)
self.R_Wheel.dec_speed(v)
self.speed = self.L_Wheel.get_speed()
def get_run_state(self):
return self.run_state
def up(self):
self.run_state = "up"
self.L_Wheel.up()
self.R_Wheel.up()
def stop(self):
self.run_state = "stop"
self.L_Wheel.stop()
self.R_Wheel.stop()
def down(self):
self.run_state = "down"
self.L_Wheel.down()
self.R_Wheel.down()
#小车左转,控制左轮不动,右轮前进即可
def left(self):
self.run_state = "left"
self.L_Wheel.stop()
self.R_Wheel.up()
#小车右转,控制右轮不动,左轮前进即可
def right(self):
self.run_state = "right"
self.L_Wheel.up()
self.R_Wheel.stop()
async def motor_task():
L_Motor = SingleMotor(
PWM = 18,
IN1 = 22,
IN2 = 27
)
R_Motor = SingleMotor(
PWM = 23,
IN1 = 25,
IN2 = 24
)
cm = CarWheel(
L_Motor = L_Motor,
R_Motor = R_Motor
)
t_time = 2
cm.inc_speed(5)
cm.up()
await asyncio.sleep(t_time)
cm.dec_speed(5)
cm.down()
await asyncio.sleep(t_time)
cm.left()
await asyncio.sleep(t_time)
cm.right()
await asyncio.sleep(t_time)
cm.stop()
await asyncio.sleep(t_time)
async def main():
dltasks = set()
dltasks.add(asyncio.ensure_future(motor_task()))
dones, dltasks = await asyncio.wait(dltasks)
for task in dones:
print("Task ret: ", task.result())
if __name__ == '__main__':
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
try:
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
2.2、超声波例子
#https://gpiozero.readthedocs.io/en/stable/recipes.html#distance-sensor
#DistanceSensor_t.py
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor(21, 20)
while True:
print('Distance to nearest object is', sensor.distance, 'm')
sleep(1)
2.3、2.4G无线手柄控制例子
#joystick_t.py
import asyncio
import pygame
from pygame.locals import *
async def joystick_task(self):
#JOYAXISMOTION joy, axis, value
#JOYBALLMOTION joy, ball, rel
#JOYHATMOTION joy, hat, value
#JOYBUTTONUP joy, button
#JOYBUTTONDOWN joy, button
while True:
for event in pygame.event.get():
# if event.type == pygame.JOYAXISMOTION:
# print("Joystick JOYAXISMOTION.")
# if event.type == pygame.JOYBALLMOTION:
# print("Joystick JOYBALLMOTION.")
if event.type == pygame.JOYHATMOTION:
# print("Joystick JOYHATMOTION.")
if event.value == (-1, 0):
print('left')
elif event.value == (0, 1):
print('up')
elif event.value == (0<

本文介绍如何使用树莓派打造一款具备多种传感器的智能小车,并提供了详细的器件选购指南、代码示例及完整的项目实现过程。
最低0.47元/天 解锁文章
1万+





