基于无线远程遥控智能小车,利用智能小车的控制系统、视频传输系统,选择正确的路线,实现对数据(影像,声音,温湿度)的收集及探测。
控制系统:
我用Java写了一个图形软件(虽然比较丑QAQ),使用TCP/UDP通信方式向树莓派小车发送指令。
控制系统主要是控制小车的行进,实际上就是控制轮胎电机的转动以及摄像头和超声波传感器舵机的转动。
控制电机转动步骤:
- 设置GPIO口为BCM编码方式
- 电机引脚初始化为输出模式
- 编写转向函数
#设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)
#电机引脚初始化为输出模式
def init():
global pwm_ENA
global pwm_ENB
GPIO.setup(ENA,GPIO.OUT,initial=GPIO.HIGH)
GPIO.setup(IN1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(ENB,GPIO.OUT,initial=GPIO.HIGH)
GPIO.setup(IN3,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN4,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(EchoPin,GPIO.IN)
GPIO.setup(TrigPin,GPIO.OUT)
#设置pwm引脚和频率为2000hz
pwm_ENA = GPIO.PWM(ENA, 2000)
pwm_ENB = GPIO.PWM(ENB, 2000)
pwm_ENA.start(0)
pwm_ENB.start(0)
#小车前进
def run(leftspeed, rightspeed):
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
pwm_ENA.ChangeDutyCycle(leftspeed)
pwm_ENB.ChangeDutyCycle(rightspeed)
#小车后退
def back(leftspeed, rightspeed):
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)
pwm_ENA.ChangeDutyCycle(leftspeed)
pwm_ENB.ChangeDutyCycle(rightspeed)
#小车左转
def left(leftspeed, rightspeed):
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
pwm_ENA.ChangeDutyCycle(leftspeed)
pwm_ENB.ChangeDutyCycle(rightspeed)
#小车右转
def right(leftspeed, rightspeed):
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
pwm_ENA.ChangeDutyCycle(leftspeed)
pwm_ENB.ChangeDutyCycle(rightspeed)
#小车原地左转
def spin_left(leftspeed, rightspeed):
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
pwm_ENA.ChangeDutyCycle(leftspeed)
pwm_ENB.ChangeDutyCycle(rightspeed)
#小车原地右转
def spin_right(leftspeed, rightspeed):
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)
pwm_ENA.ChangeDutyCycle(leftspeed)
pwm_ENB.ChangeDutyCycle(rightspeed)
#小车停止
def brake():
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
为了凸显智能化,我添加了超声波传感器使小车能够自动避障行驶,根据超声波模块判断小车与前方障碍物的距离,
当障碍物与小车的距离低于某个值时自动转向。
#超声波函数
def Distance_test():
GPIO.output(TrigPin,GPIO.HIGH)
time.sleep(0.000015)
GPIO.output(TrigPin,GPIO.LOW)
while not GPIO.input(EchoPin):
pass
t1 = time.time()
while GPIO.input(EchoPin):
pass
t2 = time.time()
#print("distance is %d " % (((t2 - t1)* 340 / 2) * 100))#输出与障碍物当前的距离
time.sleep(0.01)
return ((t2 - t1)* 340 / 2) * 100
控制舵机转动
本人使用的舵机是SG90,但**
舵机使用的通信方式都一样,换成其他舵机也可以直接使用。
舵机的控制是通过PWM信号,舵机的频率为50HZ,占空比为2.5%-12.5%,线性对应舵机转动角度的0-180度。
舵机的控制比较简单,就直接上代码了:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) #设置引脚编号模式
GPIO.setup(9, GPIO.OUT) #设置9号口为输出模式
p9 = GPIO.PWM(9, 50) #设置9号口为PWM信号,标定频率为50HZ
def turn(num):#舵机转动函数
if num<0 or num>180:
p9.stop() #停止端口占用(很重要)
exit() #如果输入不正确则退出
fm=10.0/180.0
num=num*fm+2.5
num=int(num*10)/10.0
p9.ChangeDutyCycle(num) #改变P9口的占空比为对应占空比
p9.start(0) #初始化舵机度数为0
num=int(input("num:")) #请求用户输入转到多少度
turn(num)
time.sleep(0.5)
p9.stop()#停止端口占用
需要提一句的是,
“停止端口”占用不能漏掉(漏掉后舵机始终被控制,会不时地抖动)
好了,小车的控制系统差不多就是这样了,下一个帖子我会写出
在Linux下使用usb摄像头拍摄视频和图像,并保存在服务器上观看或下载到本地
有兴趣的可以关注一下(⊙o⊙)?嘿嘿。
PS:第一次写博客,记下来希望能帮到别人。如果有相关的问题需要讨论,欢迎留言哦,我会尽快回复?