这篇文章将为大家详细讲解有关如何使用树莓派制作智能小车,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
电影里,时不时地可以看到一些这样的场景,一辆小车,上面装有摄像头,这辆小车可以通过电脑或都是手机进行远程遥控,车上摄像头拍到的画面,可以实时地显示在电脑或手机上,就像下图这样。
没有接触过这方面的朋友或许会觉得这是一门很高大上的技术活,其实,并不然,这种小车做起来其实很简单。那么,这样子的小车,需要怎么去做呢?
其实,我们只需要准备一块控制小车的电路板(开发板),2到4个电机(马达)、小车架子一个、摄像头以及摄像头云台一个,以上这些基础配件,然后对开发板进行编程、控制就可以了,整 体硬件成本加起来不到500块钱。
** 开发板:**
开发板有很多种,比如51单片机、树莓派、STM32、Arduino、micro:bit等等,都可以做为小车的控制板,我使用的是树莓派开发板,然后,可持树莓派有很多版本、型号,最便宜的树莓派zero 68元就可以买到,不过不建议买这种,没有网卡,需要另外买网线模块,我使用的是树莓派3B,价格220元,带有无线和有线网卡,还带有蓝牙。
**小车架子:**某宝上有很多这种车架子,各式各样的,只需要在某宝上搜索“智能小车”就能找到,带上马达一整套,也就五六十块钱。
**摄像头+云台:**某宝上也是一搜一大堆,比如我下面用的那个,45块钱。
配件准备好了,就是给小车的开发板装系统,然后对小车进行编程控制。
小车的控制最主要有两方面的控制,一个是小车的前后左右的运动控制,一个是摄像头的拍摄、上下左右转运的控制。
小车的前后左右控制:
#-*- coding:UTF-8 -*-
import RPi.GPIO as GPIO
import time
#小车电机引脚定义
LeftIn1 = 20
LeftIn2 = 21
LeftSpeed = 16
RightIn1 = 19
RightIn2 = 26
RightSpeed = 13
#设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)
#忽略警告信息
GPIO.setwarnings(False)
#电机引脚初始化操作
def car_init():
global pwm_LeftSpeed
global pwm_RightSpeed
global delaytime
GPIO.setup(LeftSpeed,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(LeftIn1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(LeftIn2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(RightSpeed,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(RightIn1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(RightIn2,GPIO.OUT,initial=GPIO.LOW)
#设置pwm引脚和频率为2000hz
pwm_LeftSpeed = GPIO.PWM(LeftSpeed, 2000)
pwm_RightSpeed = GPIO.PWM(RightSpeed, 2000)
pwm_LeftSpeed.start(0)
pwm_RightSpeed.start(0)
#小车前进
def run(delaytime):
GPIO.output(LeftIn1, GPIO.HIGH)
GPIO.output(LeftIn2, GPIO.LOW)
GPIO.output(RightIn1, GPIO.HIGH)
GPIO.output(RightIn2, GPIO.LOW)
pwm_LeftSpeed.ChangeDutyCycle(80)
pwm_RightSpeed.ChangeDutyCycle(80)
time.sleep(delaytime)
#小车后退
def back(delaytime):
GPIO.output(LeftIn1, GPIO.LOW)
GPIO.output(LeftIn2, GPIO.HIGH)
GPIO.output(RightIn1, GPIO.LOW)
GPIO.output(RightIn2, GPIO.HIGH)
pwm_LeftSpeed.ChangeDutyCycle(80)
pwm_RightSpeed.ChangeDutyCycle(80)
time.sleep(delaytime)
#小车左转
def left(delaytime):
GPIO.output(LeftIn1, GPIO.LOW)
GPIO.output(LeftIn2, GPIO.LOW)
GPIO.output(RightIn1, GPIO.HIGH)
GPIO.output(RightIn2, GPIO.LOW)
pwm_LeftSpeed.ChangeDutyCycle(80)
pwm_RightSpeed.ChangeDutyCycle(80)
time.sleep(delaytime)
#小车右转
def right(delaytime):
GPIO.output(LeftIn1, GPIO.HIGH)
GPIO.output(LeftIn2, GPIO.LOW)
GPIO.output(RightIn1, GPIO.LOW)
GPIO.output(RightIn2, GPIO.LOW)
pwm_LeftSpeed.ChangeDutyCycle(80)
pwm_RightSpeed.ChangeDutyCycle(80)
time.sleep(delaytime)
#小车原地左转
def spin_left(delaytime):
GPIO.output(LeftIn1, GPIO.LOW)
GPIO.output(LeftIn2, GPIO.HIGH)
GPIO.output(RightIn1, GPIO.HIGH)
GPIO.output(RightIn2, GPIO.LOW)
pwm_LeftSpeed.ChangeDutyCycle(80)
pwm_RightSpeed.ChangeDutyCycle(80)
time.sleep(delaytime)
#小车原地右转
def spin_right(delaytime):
GPIO.output(LeftIn1, GPIO.HIGH)
GPIO.output(LeftIn2, GPIO.LOW)
GPIO.output(RightIn1, GPIO.LOW)
GPIO.output(RightIn2, GPIO.HIGH)
pwm_LeftSpeed.ChangeDutyCycle(80)
pwm_RightSpeed.ChangeDutyCycle(80)
time.sleep(delaytime)
#小车停止
def brake(delaytime):
GPIO.output(LeftIn1, GPIO.LOW)
GPIO.output(LeftIn2, GPIO.LOW)
GPIO.output(RightIn1, GPIO.LOW)
GPIO.output(RightIn2, GPIO.LOW)
pwm_LeftSpeed.ChangeDutyCycle(80)
pwm_RightSpeed.ChangeDutyCycle(80)
time.sleep(delaytime)
摄像头控制有两部分,一是拍摄、二是云台转动。
**摄像头的拍摄:**拍摄部分,我使用的是mjpg-streamer,这个工具可以把小车上的摄像头当作远程摄像头(Web Camera)使用,安装的方式也很简单:
#安装必要的库
sudo apt-get update
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get autoremove cmake
sudo apt-get install cmake
必要库安装好后,下载mjpg-streamer到树莓派上,并执行编译即可:
cd mjpg-streamer/mjpg-streamer-experimental
make all
sudo make install
通过以上操作,就可以启动摄像头了:
#运行mjpg-streamer
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
摄像头启动后,可以在局域网内的任何一台电脑上使用浏览器输入:http://树莓派IP:8080/?action=stream 即可看到摄像头拍到的画面。
**云台控制:**云台的主是对控制上下和左右的两舵机进行编码控制:
import RPi.GPIO as GPIO
import time
import pygame
#舵机引脚定义
ServoUpDownPin = 9
ServoLeftRightPin = 11
#设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)
#忽略警告信息
GPIO.setwarnings(False)
#初始化上下左右角度为90度
ServoLeftRightPos = 90
ServoUpDownPos = 90
def init():
global pwm_UpDownServo
global pwm_LeftRightServo
GPIO.setup(ServoUpDownPin, GPIO.OUT)
GPIO.setup(ServoLeftRightPin, GPIO.OUT)
#设置舵机的频率和起始占空比
pwm_UpDownServo = GPIO.PWM(ServoUpDownPin, 50)
pwm_LeftRightServo = GPIO.PWM(ServoLeftRightPin, 50)
pwm_UpDownServo.start(0)
pwm_LeftRightServo.start(0)
#摄像头舵机左右旋转到指定角度
def leftrightservo_appointed_detection(pos):
for i in range(1):
pwm_LeftRightServo.ChangeDutyCycle(2.5 + 10 * pos/180)
time.sleep(0.02) #等待20ms周期结束
pwm_LeftRightServo.ChangeDutyCycle(0) #归零信号
#摄像头舵机上下旋转到指定角度
def updownservo_appointed_detection(pos):
for i in range(1):
pwm_UpDownServo.ChangeDutyCycle(2.5 + 10 * pos/180)
time.sleep(0.02) #等待20ms周期结束
pwm_UpDownServo.ChangeDutyCycle(0) #归零信号
#摄像头舵机向上运动
def servo_up():
global ServoUpDownPos
pos = ServoUpDownPos
updownservo_appointed_detection(pos)
#time.sleep(0.05)
pos +=0.7
ServoUpDownPos = pos
if ServoUpDownPos >= 180:
ServoUpDownPos = 180
#摄像头舵机向下运动
def servo_down():
global ServoUpDownPos
pos = ServoUpDownPos
updownservo_appointed_detection(pos)
#time.sleep(0.05)
pos -= 0.7
ServoUpDownPos = pos
if ServoUpDownPos <= 45:
ServoUpDownPos = 45
#摄像头舵机向左运动
def servo_left():
print("servo_left")
global ServoLeftRightPos
pos = ServoLeftRightPos
leftrightservo_appointed_detection(pos)
#time.sleep(0.10)
pos += 0.7
ServoLeftRightPos = pos
print('ServoLeftRightPos:',ServoLeftRightPos)
if ServoLeftRightPos >= 180:
ServoLeftRightPos = 180
#摄像头舵机向右运动
def servo_right():
global ServoLeftRightPos
pos = ServoLeftRightPos
leftrightservo_appointed_detection(pos)
#time.sleep(0.10)
pos -= 0.7
ServoLeftRightPos = pos
if ServoLeftRightPos <= 0:
ServoLeftRightPos = 0
#所有舵机归位
def servo_init():
servoflag = 0
servoinitpos = 90
if servoflag != servoinitpos:
updownservo_appointed_detection(servoinitpos)
leftrightservo_appointed_detection(servoinitpos)
time.sleep(0.5)
pwm_LeftRightServo.ChangeDutyCycle(0) #归零信号
pwm_UpDownServo.ChangeDutyCycle(0) #归零信号
#舵机停止
def servo_stop():
pwm_LeftRightServo.ChangeDutyCycle(0) #归零信号
pwm_UpDownServo.ChangeDutyCycle(0) #归零信号
对小车的控制编程完成后,最后我们使用WebSocket远程连接小车,发送相关的控制命令,就可以使用电脑或手机远程控制小车了。
关于“如何使用树莓派制作智能小车”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4604033/blog/4667665