2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 使用树莓派制作智能小车

使用树莓派制作智能小车

时间:2021-01-15 00:53:33

相关推荐

使用树莓派制作智能小车

电影里,时不时地可以看到一些这样的场景,一辆小车,上面装有摄像头,这辆小车可以通过电脑或都是手机进行远程遥控,车上摄像头拍到的画面,可以实时地显示在电脑或手机上,就像下图这样。

没有接触过这方面的朋友或许会觉得这是一门很高大上的技术活,其实,并不然,这种小车做起来其实很简单。那么,这样子的小车,需要怎么去做呢?

其实,我们只需要准备一块控制小车的电路板(开发板),2到4个电机(马达)、小车架子一个、摄像头以及摄像头云台一个,以上这些基础配件,然后对开发板进行编程、控制就可以了,整 体硬件成本加起来不到500块钱。

开发板:

开发板有很多种,比如51单片机、树莓派、STM32、Arduino、micro:bit等等,都可以做为小车的控制板,我使用的是树莓派开发板,然后,可持树莓派有很多版本、型号,最便宜的树莓派zero 68元就可以买到,不过不建议买这种,没有网卡,需要另外买网线模块,我使用的是树莓派3B,价格220元,带有无线和有线网卡,还带有蓝牙。

小车架子:某宝上有很多这种车架子,各式各样的,只需要在某宝上搜索“智能小车”就能找到,带上马达一整套,也就五六十块钱。

摄像头+云台:某宝上也是一搜一大堆,比如我下面用的那个,45块钱。

配件准备好了,就是给小车的开发板装系统,然后对小车进行编程控制。

小车的控制最主要有两方面的控制,一个是小车的前后左右的运动控制,一个是摄像头的拍摄、上下左右转运的控制。

小车的前后左右控制:

#-*- coding:UTF-8 -*-import RPi.GPIO as GPIOimport time#小车电机引脚定义LeftIn1 = 20LeftIn2 = 21LeftSpeed = 16RightIn1 = 19RightIn2 = 26RightSpeed = 13#设置GPIO口为BCM编码方式GPIO.setmode(GPIO.BCM)#忽略警告信息GPIO.setwarnings(False)#电机引脚初始化操作def car_init():global pwm_LeftSpeedglobal pwm_RightSpeedglobal delaytimeGPIO.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引脚和频率为2000hzpwm_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 updatesudo apt-get install libjpeg8-devsudo apt-get install imagemagicksudo apt-get install libv4l-devsudo apt-get autoremove cmakesudo apt-get install cmake

必要库安装好后,下载mjpg-streamer到树莓派上,并执行编译即可:

cd mjpg-streamer/mjpg-streamer-experimentalmake allsudo 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 GPIOimport timeimport pygame#舵机引脚定义ServoUpDownPin = 9ServoLeftRightPin = 11#设置GPIO口为BCM编码方式GPIO.setmode(GPIO.BCM)#忽略警告信息GPIO.setwarnings(False)#初始化上下左右角度为90度ServoLeftRightPos = 90ServoUpDownPos = 90def init():global pwm_UpDownServoglobal pwm_LeftRightServoGPIO.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 ServoUpDownPospos = ServoUpDownPosupdownservo_appointed_detection(pos)#time.sleep(0.05)pos +=0.7 ServoUpDownPos = posif ServoUpDownPos >= 180:ServoUpDownPos = 180#摄像头舵机向下运动def servo_down():global ServoUpDownPospos = ServoUpDownPosupdownservo_appointed_detection(pos)#time.sleep(0.05)pos -= 0.7ServoUpDownPos = posif ServoUpDownPos <= 45:ServoUpDownPos = 45#摄像头舵机向左运动def servo_left():print("servo_left")global ServoLeftRightPospos = ServoLeftRightPosleftrightservo_appointed_detection(pos)#time.sleep(0.10)pos += 0.7ServoLeftRightPos = posprint('ServoLeftRightPos:',ServoLeftRightPos)if ServoLeftRightPos >= 180:ServoLeftRightPos = 180#摄像头舵机向右运动def servo_right():global ServoLeftRightPospos = ServoLeftRightPosleftrightservo_appointed_detection(pos)#time.sleep(0.10)pos -= 0.7 ServoLeftRightPos = posif ServoLeftRightPos <= 0:ServoLeftRightPos = 0#所有舵机归位def servo_init():servoflag = 0servoinitpos = 90if 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远程连接小车,发送相关的控制命令,就可以使用电脑或手机远程控制小车了。

完整的教学视频可查看:/frontweb/product400.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。