电影里,时不时地可以看到一些这样的场景,一辆小车,上面装有摄像头,这辆小车可以通过电脑或都是手机进行远程遥控,车上摄像头拍到的画面,可以实时地显示在电脑或手机上,就像下图这样。
没有接触过这方面的朋友或许会觉得这是一门很高大上的技术活,其实,并不然,这种小车做起来其实很简单。那么,这样子的小车,需要怎么去做呢?
其实,我们只需要准备一块控制小车的电路板(开发板),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)