基于智能小车的数据采集系统(笔记1)

基于无线远程遥控智能小车,利用智能小车的控制系统、视频传输系统,选择正确的路线,实现对数据(影像,声音,温湿度)的收集及探测。

控制系统:

在这里插入图片描述
我用Java写了一个图形软件(虽然比较丑QAQ),使用TCP/UDP通信方式向树莓派小车发送指令。
控制系统主要是控制小车的行进,实际上就是控制轮胎电机的转动以及摄像头和超声波传感器舵机的转动。

控制电机转动步骤:

  1. 设置GPIO口为BCM编码方式
  2. 电机引脚初始化为输出模式
  3. 编写转向函数
#设置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:第一次写博客,记下来希望能帮到别人。如果有相关的问题需要讨论,欢迎留言哦,我会尽快回复?

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taiqinnng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值