树莓派3B+ Sg90舵机控制摄像头旋转

做这个实验的初衷是因为在外面的时候想要远程看家里的情况,但是树莓派摄像头固定的话就只能看到一个视角,我想让摄像头左右转动,方便我观察屋子里的情况。

硬件准备:

树莓派3B+,SG90舵机(7.5元),杜邦线三根,500W像素CSI接口摄像头(20元左右),及透明塑料支架(4.5元),坏掉的门锁,扎带一根。

实验环境:

32位raspbian系统,已经安装好CSI摄像头并且可以拍照。

1 硬件连接

先把摄像头模块安装好,接着用luvcview 命令测试,如果显示正常,就成功了。

接着就是把摄像头模块固定到坏掉的门锁上,其实是门锁的锁芯,这东西是纯金属,很重,体积也不大。如下图

门锁锁芯_眸目压缩.jpg

由于摄像头支架底部是自带胶水的,可以直接粘在舵机顶部,舵机的操纵杆就选择哪个十字的就好了接触面积最大,比较稳固。这个门锁的锁芯把两颗螺丝拧上去,然后把舵机放在中间,用轧带捆住,固定好就OK了。如下图

舵机有三根线,黄色是信号控制线,红色跟灰色是VCC+和GND,对应接到树莓派5V和GND就好了,黄色线接到12号引脚(BCM)。

2 代码控制

网上借鉴人家的python代码都是转180度然后复位,循环着转

#!/usr/bin/env python  
# coding: utf-8  
  
import RPi.GPIO as GPIO  
import time  
import signal  
import atexit  
  
atexit.register(GPIO.cleanup)    
  
servopin = 12
GPIO.setmode(GPIO.BCM)  
GPIO.setup(servopin, GPIO.OUT, initial=False)  
p = GPIO.PWM(servopin,50) #50HZ  
p.start(0)  
time.sleep(2)  
  
while(True):
  for i in range(0,181,10):
    p.ChangeDutyCycle(2.5 + 10 * i / 180) #设置转动角度
    time.sleep(0.02)                      #等该20ms周期结束
    p.ChangeDutyCycle(0)                  #归零信号
    time.sleep(0.5)

这显然不符合我的要求,加以改进,实现转动60度然后复位的效果,如下


#!/usr/bin/env python  
# coding: utf-8  
  
import RPi.GPIO as GPIO  
import time  
pin = 12
GPIO.setmode(GPIO.BCM)  
GPIO.setup(pin, GPIO.OUT)
pwm = GPIO.PWM(pin,50) #50HZ  
pwm.start(0)  
pwm.ChangeDutyCycle(2.5)
time.sleep(1)
  
i = 60
duty = 2.5 + 10.*i/180. 
pwm.ChangeDutyCycle(duty)
print(duty)
print('jiaodu',(i))
print
time.sleep(0.3)
pwm.ChangeDutyCycle(2.5)
time.sleep(1)
GPIO.cleanup()

接着实现旋转135度,并且不要复位的效果。废话,复位了我要他干嘛,我不是白转了

#!/usr/bin/env python  
# coding: utf-8  
  
  
import RPi.GPIO as GPIO  
import time  
pin = 12  #舵机的黄色的控制线接到GPIO 12号引脚
GPIO.setmode(GPIO.BCM)  #GPIO采用BCM编号 
GPIO.setup(pin, GPIO.OUT)       #设置12号引脚为输出模式
pwm = GPIO.PWM(pin,50) #pwm为50HZ,pwm是树莓派的模拟信号,具体参考百度  
pwm.start(0)    #开始
pwm.ChangeDutyCycle(2.5)        #改变工作周期为2.5,意思就是复位到舵机的默认0度
time.sleep(1)           #暂停程序执行1秒钟
  
i = 135         #设置角度
duty = 2.5 + 10.*i/180.  #个人理解是由于改变工作周期不能输小数点,就用这个代替
pwm.ChangeDutyCycle(duty) #执行上一行改变工作周期计算出来的值
print(duty)             #把这个值输出到屏幕上方便我们观察
print('jiaodu',(i))     #把角度输出到屏幕上
print                   #打印一个空行,让输出的结果不要混在一起
time.sleep(0.3)         #暂停0.3秒,数值越大转动的越慢
#pwm.ChangeDutyCycle(2.5)  #这个是让舵机复位的,被我注释掉了
#time.sleep(1)             #这个时间不知道干嘛的,懒得管
GPIO.cleanup()          #这个很重要,必须要有,程序跑完了释放引脚,保护树莓派

QQ截图20190120213313.png

还不是很完美,后面有空继续探索,附上小视频

最后编辑于:2019/01/20作者: admin

发表评论