教程 | 您所在的位置:网站首页 › 相机云台安装图解 › 教程 |
主要材料 1、树莓派3 X12、摄像头模块 X13、9G 180°微型舵机 X24、迷你平移/倾斜照相机平台 防振照相机支架(2个舵机)5、电阻1K欧姆 X2(可选)6、金属部件7、固定带等(用于构建云台平台)你可以购买一个成品的云台平台舵机或自己制作。 PWM如何工作树莓派不能直接输出模拟电信号,但我们可以使用PWM(脉宽调制)方法来模拟这一点。我们制作一个固定频率的数字信号,在那里我们将改变脉冲宽度,将“转换”改为“平均”输出电压的电平,如下图所示:
GPIO 17 ==>仰角舵机 GPIO 27 ==>平移舵机不要忘记将GND连接在一起 ==> 树莓派 - 舵机 - 外部电源 你可以在树莓派的GPIO和服务器数据输入引脚之间串联一个1K欧姆的电阻。 如果发生舵机故障,这将保护你的树莓派。 舵机的校准
范围:180° 电源:4.8V(外部可使用USB 5VDC电源) 工作频率:50Hz(周期:20 ms) 脉冲宽度:从1ms到2ms 2、理论上,舵机运转的位置 初始位置(0°):1ms脉冲到数据终端。 中间位置(90°):1.5ms脉冲到数据终端。 最终位置(180°):2 ms脉冲到数据终端。 3、使用Python编写舵机位置,了解上述位置相应的“占空比”非常重要,我们来做一些计算: 初始位置==>(0°)脉冲宽度==> 1ms ==>占空比= 1ms / 20ms ==> 2.0% 中间位置(90°)==> 1.5 ms的脉冲宽度==>占空比= 1.5ms / 20ms ==> 7.5% 最终位置(180°)==> 2 ms的脉冲宽度==>占空比= 2ms / 20ms ==> 10% 所以占空比应该在2%到10%的范围内变化。4、单独测试舵机打开树莓派终端并以“sudo”启动你的 Python 3 shell 编辑器(你可能是“超级用户”来处理GPIO): sudo python3在Python Shell上导入RPI.GPIO模块并作为GPIO: import RPi.GPIO as GPIO定义你自己想要使用引脚编号方案(BCM或BOARD)。我用BOARD做了这个测试,所以我使用的引脚为物理引脚(GPIO 17 =引脚11和GPIO 27引脚13)。对我来说,很容易识别它们,并且在测试过程中不会犯错误(在最终的程序中,我将使用BCM)。按照自己的喜好来选择: GPIO.setmode(GPIO.BOARD)定义你要使用的舵机引脚: tiltPin=11如果你已经使用了BCM方案,相反的,将最后2个命令应该替换为: GPIO.setmode(GPIO.BCM) tiltPin=17现在,我们必须指定这个引脚将为“输出” GPIO.setup(tiltPin, GPIO.OUT)而且,这个引脚上产生的频率,对于我们的舵机来说应该是50Hz: tilt = GPIO.PWM(tiltPin, 50)现在,让我们开始在引脚上设置一个初始占空比(我们将它保持为“0”)的PWM信号: tilt = start(0)现在,你可以输入不同的占空比值,观察舵机的运动。让我们从2%开始,看看会发生什么(我们观察舵机从“零位”开始): tilt.ChangeDutyCycle(2)我项目的情况是,当我将占空比改为3%时,舵机进入零位。我观察到舵机停留在同一位置,开始以大于3%的占空比移动。所以,3%是我的初始位置(o°)。同样的情况发生在10%,我的舵机超过这个数值,最终达到13%。所以对于这个舵机,最终结果是:0°==>占空比3%90°==>占空比8%180°==>占空比13%完成测试后,你必须停止PWM并清理GPIO: tilt= stop() GPIO.cleanup()上面终端将打印出屏幕显示的数据,我两个舵机的结果非常的相似。你的范围可以不同。 创建 Python 脚本
我们来创建一个Python脚本来进行测试。 基本上,我们将重复我们之前在Python Shell上做的事情: from time import sleep import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) def setServoAngle(servo, angle): pwm = GPIO.PWM(servo, 50) pwm.start(8) dutyCycle = angle / 18. + 3. pwm.ChangeDutyCycle(dutyCycle) sleep(0.3) pwm.stop() if __name__ == '__main__': import sys servo = int(sys.argv[1]) GPIO.setup(servo, GPIO.OUT) setServoAngle(servo, int(sys.argv[2])) GPIO.cleanup()上述代码的核心是设置舵机和角度的函数。 该函数接收参数、舵机、 GPIO编号和舵机必须定位的角度值。 一旦这个函数的输入是“角度”,我们必须使用之前开发的公式将其转换为百分比的占空比。脚本执行时,必须输入参数,舵机GPIO和角度。例如:sudo python3 angleServoCtrl.py 17 45上述命令会将舵机连接到GPIO 17并且以“仰角”45度定位。 一个类似的命令可以用于平移伺服控制(在“方位角”中位置为45度):sudo python angleServoCtrl.py 27 45文件 angleServoCtrl.py 可以在我的 GitHub 下载。 平台移动机制
让我们创建一个Python脚本来同时控制两个舵机: from time import sleep import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) pan = 27 tilt = 17 GPIO.setup(tilt, GPIO.OUT) # white => TILT GPIO.setup(pan, GPIO.OUT) # gray ==> PAN def setServoAngle(servo, angle): assert angle >=30 and angle 90 (middle point) ==> 150 setServoAngle(tilt, int(sys.argv[2])) # 30 ==> 90 (middle point) ==> 150 GPIO.cleanup()脚本执行时,必须输入参数,平移角度和倾斜角度。 例如: sudo python3 servoCtrl.py 45 120上述命令将使“水平/倾斜”平台在“方位角”(水平角)和120度“仰角”(倾斜角)方向上定位为45°。 请注意,如果未输入任何参数,则默认平移和倾斜角度均为90°。在下面你可以看到一些测试: 现在让我们创建一个Python脚本来自动测试所有的舵机: from time import sleep import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) pan = 27 tilt = 17 GPIO.setup(tilt, GPIO.OUT) # white => TILT GPIO.setup(pan, GPIO.OUT) # gray ==> PAN def setServoAngle(servo, angle): assert angle >=30 and angle |
CopyRight 2018-2019 实验室设备网 版权所有 |