【树莓派4B】二自由度舵机云台、PC端遥控小车(丝滑遥控无卡顿)
很久之前(大约一年多)的课设内容,很多细节遗忘了
一、硬件
1.树莓派4B
2.二自由度舵机云台、树莓派配套摄像头
(图中摄像头换为下图)
3.L298N(驱动模块)
4.18650 4000mAh 锂电池两节 + 电池盒
5.充电模块
从尸体车上锯下来的,不放图了,可用电池充电盒代替
6.车体+电机
(实验室的垃圾堆捡的)
7.外观
其中充电宝参数为5V 3A标准树莓派供电要求
二、连接
树莓派4B io口如下图
需要完成的连接有电源(电池盒)与电机、驱动(L298N)、摄像头、树莓派以及充电模块的连接;电机与驱动(L298N)的连接;驱动(L298N)与树莓派连接;摄像头与树莓派连接;舵机云台与树莓派连接。
这里只介绍重点的连接:驱动与树莓派和电机的连接,云台与树莓派连接
L298N的输出端连上四个电机,电源线对应相连,输入端IN1~4连接如下:
IN1——GPIO 16
IN2——GPIO 18
IN3——GPIO 36
IN4——GPIO 38
panpin——GPIO 11 // 摄像头左右
fanpin—— GPIO 12 // 摄像头上下
千万别把红黑线接反!千万别把红黑线接反!千万别把红黑线接反!
不要连AB口的使能端!不要连AB口的使能端!不要连AB口的使能端!
据实践,AB口的使能端地和电源地不是同一个地
可以先尝试将驱动和电机连起来,给IN1加高电平IN2加低电平,观察左轮是否转动,再测试右轮,全部测试好之后再连其他线。注意接线的时侯不要短路,特别是软线线芯。
三、软件
目标:PC端键盘遥控,摄像头实时图传 WASD控制小车行走,IJKL控制摄像头角度移动
首先考虑cv库,有现成代码:
ret, frame = camera.read
k = cv2.waitKey(1) //获取按键
cv2.imshow('camera', frame) //显示图像(视频由一帧一帧图像构成)
可判断k的值为WASD/IJKL则实现车体/摄像头的运动
完整代码(python):
import RPi.GPIO as GPIO
import cv2
import timepygame.init()IN1 = 16
IN2 = 18
IN3 = 36
IN4 = 38GPIO.setmode(GPIO.BOARD)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)p1 = GPIO.PWM(IN1,50)
p2 = GPIO.PWM(IN2,50)
p3 = GPIO.PWM(IN3,50)
p4 = GPIO.PWM(IN4,50)
p1.start(0)
p2.start(0)
p3.start(0)
p4.start(0)panPin = 11
fanPin = 12
GPIO.setup(panPin,GPIO.OUT)
GPIO.setup(fanPin,GPIO.OUT)
pan = GPIO.PWM(panPin,100)
fan = GPIO.PWM(fanPin,100)
pan.start(0)
fan.start(0)
pan.ChangeDutyCycle(2)
fan.ChangeDutyCycle(2)def forward(freq):p2.ChangeDutyCycle(0)p3.ChangeDutyCycle(0)p1.ChangeDutyCycle(freq)GPIO.output(IN2,GPIO.LOW)p4.ChangeDutyCycle(freq)GPIO.output(IN3,GPIO.LOW)def back(freq):p1.ChangeDutyCycle(0)p4.ChangeDutyCycle(0)p2.ChangeDutyCycle(freq)GPIO.output(IN1,GPIO.LOW)p3.ChangeDutyCycle(freq)GPIO.output(IN4,GPIO.LOW)def run(left,right):p1.ChangeDutyCycle(0)p2.ChangeDutyCycle(0)p3.ChangeDutyCycle(0)p4.ChangeDutyCycle(0)if left>=0:p1.ChangeDutyCycle(left)else:p2.ChangeDutyCycle(-left)if right>=0:p4.ChangeDutyCycle(right)else:p3.ChangeDutyCycle(-right)camera = cv2.VideoCapture(0)
p = 0.0
f = 0.0while camera.isOpened():ret, frame = camera.read()cv2.imshow('camera', frame)if p>10:p=10if p<2:p=2if f>10:f=10if f<3:f=3pan.ChangeDutyCycle(0)fan.ChangeDutyCycle(0)k = cv2.waitKey(1)if k==27:camera.release()cv2.destroyAllWindows()breakif k == ord('i'):f+=0.3fan.ChangeDutyCycle(f)if k == ord('k'):f-=0.3fan.ChangeDutyCycle(f)if k == ord('j'):p+=0.3pan.ChangeDutyCycle(p)if k == ord('l'):p-=0.3pan.ChangeDutyCycle(p)if k == ord('w'):forward(50)elif k == ord('s'):back(50)elif k == ord('a'):run(20,100)elif k == ord('d'):run(100,20) else:run(0,0)GPIO.cleanup()
然而实际效果差强人意,只要按键一直按着,树莓派连续响应按键,视频画面就会卡住不动
根本原因在于k = cv2.waitKey(1)
这一句,打开底层代码发现
我认为是delay和sleep搞的鬼,还有按下按键不放手是连续检测按键,这使得树莓派几乎将所有时间都用来检测按键-执行操作
另寻他法
查阅了很多资料后找到一个神奇的库:pygame
pygame.KEYDOWN表示按键按下事件,pygame.KEYUP表示按键松开事件
于是我想到用列表的方法使控制按键WASD/IJKL的按下顺序形成一个序列,按下某个按键之后即将此按键添加至待处理按键列表,松开按键则将按键从列表中删除,视频刷新穿插于按键检测之中,根据序列中的顺序对车体控制,若按键没松开,那么就不会触发按按键检测的事件,小车即专心的完成动作,比如一直按着W,小车只在按下一瞬间接收到前进的命令,其他时间全部用来刷新图传视频。
这种方法比cv库连续检测按键好的非常多
另外运动模型做了大幅度修整
设置变量cha表示左右轮速度差值,检测到A键cha+=4,检测到D键cha-=4,前进时车轮左右速度为(50+cha,50-cha),后退时(-50-cha,-50+cha)
相较于上一版的简单前进后退左右转,这一模型比较合理适用。
完整代码(python):
import pygame.camera
import RPi.GPIO as GPIO
import cv2
import time
import picamera
import sysIN1 = 16
IN2 = 18
IN3 = 36
IN4 = 38GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)p1 = GPIO.PWM(IN1,50)
p2 = GPIO.PWM(IN2,50)
p3 = GPIO.PWM(IN3,50)
p4 = GPIO.PWM(IN4,50)
p1.start(0)
p2.start(0)
p3.start(0)
p4.start(0)panPin = 11
fanPin = 12
GPIO.setup(panPin,GPIO.OUT)
GPIO.setup(fanPin,GPIO.OUT)
pan = GPIO.PWM(panPin,50)
fan = GPIO.PWM(fanPin,50)
pan.start(0)
fan.start(0)def forward(freq):p2.ChangeDutyCycle(0)p3.ChangeDutyCycle(0)p1.ChangeDutyCycle(freq)GPIO.output(IN2,GPIO.LOW)p4.ChangeDutyCycle(freq)GPIO.output(IN3,GPIO.LOW)def back(freq):p1.ChangeDutyCycle(0)p4.ChangeDutyCycle(0)p2.ChangeDutyCycle(freq)GPIO.output(IN1,GPIO.LOW)p3.ChangeDutyCycle(freq)GPIO.output(IN4,GPIO.LOW)def run(left,right):p1.ChangeDutyCycle(0)p2.ChangeDutyCycle(0)p3.ChangeDutyCycle(0)p4.ChangeDutyCycle(0)if left>=0:p1.ChangeDutyCycle(left)else:p2.ChangeDutyCycle(-left)if right>=0:p4.ChangeDutyCycle(right)else:p3.ChangeDutyCycle(-right)key_list=[]
cha = 0
p = 0.0
f = 0.0pygame.camera.init()
cameras = pygame.camera.list_cameras()
cam = pygame.camera.Camera(cameras[0])
cam.start()img = cam.get_image()WIDTH = img.get_width()
HEIGHT = img.get_height()screen = pygame.display.set_mode( ( WIDTH, HEIGHT ) )
pygame.display.set_caption("xuxian's smartcar")while True :if p>10:p=10if p<2:p=2if f>10:f=10if f<3:f=3for event in pygame.event.get():if event.type == pygame.QUIT :sys.exit()if event.type == pygame.KEYDOWN: # 将按下的按键添加至列表if event.key == pygame.K_d:key_list.append('d')if event.key == pygame.K_a:key_list.append('a')if event.key == pygame.K_w:key_list.append('w')if event.key == pygame.K_s:key_list.append('s')if event.key == pygame.K_l:key_list.append('l')if event.key == pygame.K_j:key_list.append('j')if event.key == pygame.K_i:key_list.append('i')if event.key == pygame.K_k:key_list.append('k')if event.type == pygame.KEYUP: # 将松开的按键从列表删去if event.key == pygame.K_d:key_list.remove('d')cha = 0if event.key == pygame.K_a:key_list.remove('a')cha = 0if event.key == pygame.K_w:key_list.remove('w')if event.key == pygame.K_s:key_list.remove('s')if event.key == pygame.K_i:key_list.remove('i')if event.key == pygame.K_k:key_list.remove('k')if event.key == pygame.K_j:key_list.remove('j')if event.key == pygame.K_l:key_list.remove('l')#print(key_list)for i in key_list:if i == 'd':cha += 4if i == 'a':cha -= 4if cha>50:cha=50if cha<-50:cha=-50if i == 'w':run(50+cha,50-cha)if i == 's':run(-50-cha,-50+cha)if i == 'i':f += 0.3fan.ChangeDutyCycle(f)if i == 'k':f -= 0.3fan.ChangeDutyCycle(f)if i == 'j':p += 0.3pan.ChangeDutyCycle(p)if i == 'l':p -= 0.3pan.ChangeDutyCycle(p)if not key_list:run(0,0)pan.ChangeDutyCycle(0)fan.ChangeDutyCycle(0)# draw framescreen.blit(img, (0,0))pygame.display.flip()# grab next frame img = cam.get_image()
完结,想起细节再更新
【树莓派4B】二自由度舵机云台、PC端遥控小车(丝滑遥控无卡顿)相关推荐
- 基于PID的树莓派控制二自由度舵机人脸追踪云台设计
人脸追踪云台的设计 一.舵机控制概述 脉冲宽度与舵机转角: 在脉冲信号频率50Hz的条件下输入的脉冲信号宽度和舵机转角的对应关系图以如图1.所示,该转角的计算公式如下.树莓派端通过占空比信号对舵机进行 ...
- 二自由度云台扫描算法_基于HuskyLens人脸识别的二自由度自动跟踪云台
"看什么看?" "就盯着你看!" --基于HuskyLens人脸识别的二自由度自动跟踪云台 试用群里的老师们先后放出了各色利用二哈人脸识别功能的案例,实验对象从 ...
- 把树莓派4B配成一台小PC(基础入门)
把树莓派4B配成一台小PC(基础入门) 1. 树莓派4B系统安装 2. 树莓派4B系统改建 2.1 用Micro HDMI连接显示屏 2.2 更换软件源 2.3 使用VNC远程连接 2.4 固定IP ...
- 树莓派笔记13:舵机云台(一)
最近买了个小型舵机云台模块来玩,淘宝上卖这个的挺多的,一般三四十块钱,很多还卖配套的摄像头.说是云台,其实就是用两个舵机结合固定板做的支撑模块,两个舵机分别控制左右和上下的转动. 1 关于舵机 首先了 ...
- 树莓派利用socket传图到pc端(Python)
1.PC作为socket的服务器端: import socket import os import sys import structdef socket_service():try:s = sock ...
- vue websocket 公众号扫描二维码登录PC端
首先使用的是websocket进行消息的传递,当我们在pc端请求到二维码图片后,打开微信扫一扫,扫描二维码后,就可以在websocket里接收到扫描消息,然后进行自己的业务逻辑处理,具体代码如下: w ...
- 树莓派云台舵机怎么用_人脸辨识,用树莓派Raspberry Pi实现舵机云台追踪脸孔
影像辨识作为近年最热门的专业技术之一,广泛用于智慧监视器.车电监控.智慧工厂.生物医疗电子等等:其中,人脸辨识是一个很重要的部分,网络上已经有相当多的资源可供下载使用:于是我们使用舵机云台作为镜头旋转 ...
- JS PC端时间日历插件 功能齐全 无依赖
时间日历插件,网上有很多版本,功能强大的,功能简单的数不尽数,那为什么我还要写一个日历插件呢? 很认真的告诉你: 我手痒了,就是闲下来随便敲敲. 开发一个功能齐全的日期选择插件 根据自己的业务需求不断 ...
- PC端浏览器手机模拟器滑屏dome
from selenium import webdriver import time# web = webdriver.Chrome() '''打开PC浏览器,开发者模式下手机模式''' mobile ...
- 二自由度云台扫描算法_智能盒子oj
简介 二自由度舵机云台是一款大扭矩.高性价比的小型云台,底部舵机的平面结构,增强了这个云台的负重能力.它可以在水平和垂直方向做二自由度运动,方便安装摄像头,可以实现图像监控.图像识别定位追踪:加装红外 ...
最新文章
- Silverlight Tips(1)
- iOS开发(10)UISegmentedControl
- MySQL 复制夯住排查以及原理探讨
- 如何在 Github 工作流文件里引用自定义实现的 action
- 在单个try-with-resources语句中仔细指定多个资源
- 无法对视图创建索引,因为该视图未绑定到架构
- 工作132:页面布局
- opencv光流例程_OpenCV 4.4 发布!新增YOLOv4 和 EfficientDet 推断支持
- Java案例:静态内部类
- java web获取请求体内容
- PuTTY免输密码自动登录Linux,让 Putty 保存密码,自动登陆的三种方法
- Nutch数据集的目录具体内容
- 做Meta分析要用哪些软件?Meta分析软件盘点,含软件安装包!
- 51单片机学习7-最小系统protel原理图的绘制
- CMakeLists.txt 语法介绍与实例演练
- 9V降压5V低功耗恒压稳压芯片,大电流3A方案和LDO
- 计算机60分分值分配,计算机二级分值分配 多少分及格
- IOS个人开发者账号和wp公司开发者帐号申请注意点
- Orz是什么意思……
- npm 版本更新指令
热门文章
- 环境搭建,8种基本类型,Static,package和import,log4j
- Strongswan app 使用IKEv2 EAP 通过 Freeradius EAP认证 连接 Strongswan
- 借助 NetApp 的技术,DreamWorks 快速高效地管理那些让动画电影栩栩如生的海量数据
- RandomAccessFile的使用
- Java第三天上课笔记
- 在网页中输入中文进行搜索,如何获取搜索后页面的URL(python urliib中quote的使用)
- hibernate逆向工程
- CodeForces - 2B The least round way【dp】
- 俄罗斯自研 Elbrus CPU 参数曝光,CEO 年近九旬仍未退休
- 注塑机数据采集(海天、住友、发那科、力劲、伊之密、恩格尔、泰瑞、佳明、双马、宁波通讯塑机、申达、海雄、海达、丰铁、大禹)直采串口通讯网络通讯方案