很久之前(大约一年多)的课设内容,很多细节遗忘了

一、硬件

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端遥控小车(丝滑遥控无卡顿)相关推荐

  1. 基于PID的树莓派控制二自由度舵机人脸追踪云台设计

    人脸追踪云台的设计 一.舵机控制概述 脉冲宽度与舵机转角: 在脉冲信号频率50Hz的条件下输入的脉冲信号宽度和舵机转角的对应关系图以如图1.所示,该转角的计算公式如下.树莓派端通过占空比信号对舵机进行 ...

  2. 二自由度云台扫描算法_基于HuskyLens人脸识别的二自由度自动跟踪云台

    "看什么看?" "就盯着你看!" --基于HuskyLens人脸识别的二自由度自动跟踪云台 试用群里的老师们先后放出了各色利用二哈人脸识别功能的案例,实验对象从 ...

  3. 把树莓派4B配成一台小PC(基础入门)

    把树莓派4B配成一台小PC(基础入门) 1. 树莓派4B系统安装 2. 树莓派4B系统改建 2.1 用Micro HDMI连接显示屏 2.2 更换软件源 2.3 使用VNC远程连接 2.4 固定IP ...

  4. 树莓派笔记13:舵机云台(一)

    最近买了个小型舵机云台模块来玩,淘宝上卖这个的挺多的,一般三四十块钱,很多还卖配套的摄像头.说是云台,其实就是用两个舵机结合固定板做的支撑模块,两个舵机分别控制左右和上下的转动. 1 关于舵机 首先了 ...

  5. 树莓派利用socket传图到pc端(Python)

    1.PC作为socket的服务器端: import socket import os import sys import structdef socket_service():try:s = sock ...

  6. vue websocket 公众号扫描二维码登录PC端

    首先使用的是websocket进行消息的传递,当我们在pc端请求到二维码图片后,打开微信扫一扫,扫描二维码后,就可以在websocket里接收到扫描消息,然后进行自己的业务逻辑处理,具体代码如下: w ...

  7. 树莓派云台舵机怎么用_人脸辨识,用树莓派Raspberry Pi实现舵机云台追踪脸孔

    影像辨识作为近年最热门的专业技术之一,广泛用于智慧监视器.车电监控.智慧工厂.生物医疗电子等等:其中,人脸辨识是一个很重要的部分,网络上已经有相当多的资源可供下载使用:于是我们使用舵机云台作为镜头旋转 ...

  8. JS PC端时间日历插件 功能齐全 无依赖

    时间日历插件,网上有很多版本,功能强大的,功能简单的数不尽数,那为什么我还要写一个日历插件呢? 很认真的告诉你: 我手痒了,就是闲下来随便敲敲. 开发一个功能齐全的日期选择插件 根据自己的业务需求不断 ...

  9. PC端浏览器手机模拟器滑屏dome

    from selenium import webdriver import time# web = webdriver.Chrome() '''打开PC浏览器,开发者模式下手机模式''' mobile ...

  10. 二自由度云台扫描算法_智能盒子oj

    简介 二自由度舵机云台是一款大扭矩.高性价比的小型云台,底部舵机的平面结构,增强了这个云台的负重能力.它可以在水平和垂直方向做二自由度运动,方便安装摄像头,可以实现图像监控.图像识别定位追踪:加装红外 ...

最新文章

  1. Silverlight Tips(1)
  2. iOS开发(10)UISegmentedControl
  3. MySQL 复制夯住排查以及原理探讨
  4. 如何在 Github 工作流文件里引用自定义实现的 action
  5. 在单个try-with-resources语句中仔细指定多个资源
  6. 无法对视图创建索引,因为该视图未绑定到架构
  7. 工作132:页面布局
  8. opencv光流例程_OpenCV 4.4 发布!新增YOLOv4 和 EfficientDet 推断支持
  9. Java案例:静态内部类
  10. java web获取请求体内容
  11. PuTTY免输密码自动登录Linux,让 Putty 保存密码,自动登陆的三种方法
  12. Nutch数据集的目录具体内容
  13. 做Meta分析要用哪些软件?Meta分析软件盘点,含软件安装包!
  14. 51单片机学习7-最小系统protel原理图的绘制
  15. CMakeLists.txt 语法介绍与实例演练
  16. 9V降压5V低功耗恒压稳压芯片,大电流3A方案和LDO
  17. 计算机60分分值分配,计算机二级分值分配 多少分及格
  18. IOS个人开发者账号和wp公司开发者帐号申请注意点
  19. Orz是什么意思……
  20. npm 版本更新指令

热门文章

  1. 环境搭建,8种基本类型,Static,package和import,log4j
  2. Strongswan app 使用IKEv2 EAP 通过 Freeradius EAP认证 连接 Strongswan
  3. 借助 NetApp 的技术,DreamWorks 快速高效地管理那些让动画电影栩栩如生的海量数据
  4. RandomAccessFile的使用
  5. Java第三天上课笔记
  6. 在网页中输入中文进行搜索,如何获取搜索后页面的URL(python urliib中quote的使用)
  7. hibernate逆向工程
  8. CodeForces - 2B The least round way【dp】
  9. 俄罗斯自研 Elbrus CPU 参数曝光,CEO 年近九旬仍未退休
  10. 注塑机数据采集(海天、住友、发那科、力劲、伊之密、恩格尔、泰瑞、佳明、双马、宁波通讯塑机、申达、海雄、海达、丰铁、大禹)直采串口通讯网络通讯方案