1 简介
Hi,大家好,学长今天向大家介绍一个单片机项目
** 基于树莓派的智能小车**
大家可用于 课程设计 或 毕业设计
2 实现功能
- 超声波测距
- 四路红外避障
- 检测周围环境的湿度
- 检测周围环境的温度
- 监控及拍照
- 与人的交互,语音控制
主控开发板:树莓派
开发板有很多种,比如51单片机、树莓派、STM32、Arduino、micro:bit等等,都可以做为小车的控制板,我使用的是树莓派开发板,然后,可持树莓派有很多版本、型号,最便宜的树莓派zero 68元就可以买到,不过不建议买这种,没有网卡,需要另外买网线模块,我使用的是树莓派3B,价格220元,带有无线和有线网卡,还带有蓝牙。
树莓派配置:
- Micro-USB Power–电源插槽
- CPU
- 四个USB接口
- 一个HDMI接口
- 一个耳机插孔,也可以输出视频
- 40个GPIO引脚
- 一个SD卡插槽,没有硬盘
- 一个网线插口,自带无线网卡
- 树莓派相机插槽
电机和控制器
这里选择使用,L298N双H桥直流电机驱动器
- 马达A输出----------控制小车左后轮电机的旋转;
- 马达B输出----------控制小车右后轮电机的旋转;
- 12V输入-------------链接外部电源"+"极;
- 电源地----------------链接外部电源"-"极;
- 单片机I/O控制输入–链接树莓派GPIO引脚;
- A通道使能----------默认跳线帽(可拔掉)链接上面5V引脚;
- B通道使能----------默认跳线帽(可拔掉)链接上面5V引脚;
- 板载5V输出使能----默认跳线帽(可拔掉)链接两个引脚;
- 5V输入----------------该接口功能与板载5V输出使能有关;
避障功能
四路红外避障
3 实现效果
5 部分实现代码
部分控制代码:
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
class Car():
def __init__(self, left_in1, left_in2, left_ena, right_in3, right_in4, right_enb, low_electrical_level, hight_electrical_level):
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
self.left_in1 = left_in1
self.left_in2 = left_in2
self.left_ena = left_ena
if self.left_ena > 0:
GPIO.setup(self.left_ena, GPIO.OUT)
GPIO.setup(self.left_in1, GPIO.OUT)
GPIO.setup(self.left_in2, GPIO.OUT)
self.right_in3 = right_in3
self.right_in4 = right_in4
self.right_enb = right_enb
GPIO.setup(self.right_in3, GPIO.OUT)
GPIO.setup(self.right_in4, GPIO.OUT)
if self.right_enb > 0:
GPIO.setup(self.right_enb, GPIO.OUT)
self.hight_electrical_level = hight_electrical_level
self.low_electrical_level = low_electrical_level
'''
右边轮子前进
'''
def rFoward(self):
GPIO.output(self.right_in3, self.hight_electrical_level)
GPIO.output(self.right_in4, self.low_electrical_level)
if self.right_enb > 0:
GPIO.output(self.right_enb, self.hight_electrical_level)
'''
左边轮子前进
'''
def lFoward(self):
GPIO.output(self.left_in1, self.hight_electrical_level)
GPIO.output(self.left_in2, self.low_electrical_level)
if self.left_ena > 0:
GPIO.output(self.left_ena, self.hight_electrical_level)
'''
右边轮子后退
'''
def rBackward(self):
GPIO.output(self.right_in3, self.low_electrical_level)
GPIO.output(self.right_in4, self.hight_electrical_level)
if self.right_enb > 0:
GPIO.output(self.right_enb, self.hight_electrical_level)
'''
左边边轮子后退
'''
def lBackward(self):
GPIO.output(self.left_in1, self.low_electrical_level)
GPIO.output(self.left_in2, self.hight_electrical_level)
if self.left_ena > 0:
GPIO.output(self.left_ena, self.hight_electrical_level)
'''
左边轮子停止
'''
def lStop(self):
if self.left_ena > 0:
GPIO.output(self.left_ena, self.low_electrical_level)
else:
GPIO.output(self.left_in2, self.low_electrical_level)
GPIO.output(self.left_in1, self.low_electrical_level)
'''
右边轮子停止
'''
def rStop(self):
if self.right_enb > 0:
GPIO.output(self.right_enb, self.low_electrical_level)
else:
GPIO.output(self.right_in3, self.low_electrical_level)
GPIO.output(self.right_in4, self.low_electrical_level)
'''
小车前进
'''
def moveForward(self):
self.lFoward()
self.rFoward()
'''小车后退
'''
def moveBackground(self):
self.lBackward()
self.rBackward()
'''小车右转
'''
def spinRight(self):
self.rFoward()
self.lBackward()
'''小车左转
'''
def spinLeft(self):
self.rBackward()
self.lFoward()
'''
小车停止--左边及右边轮子都停止
'''
def stop(self):
self.lStop()
self.rStop()
def cleanup(self):
GPIO.cleanup()
def instanceCar():
return Car(11, 13, 15, 38, 40, 36, 0, 1)