树莓派智能小车的购买选择、硬件原理、程序编写全套教程

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

一、小车器件购买选型

教程里是购买的淘宝上集成好的小车器件。另外自己也买了一些散件配置了一辆自己的小车。
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<
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值