树莓派 Raspberry Pi 基于 wiringPi库 舵机控制

我会带着你远行 2022-05-22 11:53 438阅读 0赞

  舵机是伺服电机的一种,在日常的开发中经常会用到。在此调用wiringPi库来控制舵机,如果没有安装wiringPi库的朋友可以看另外一篇博客wiringPi安装教程。

舵机介绍

  舵机一般体积比较小,扭矩虽然不是大,但是足够带动运动装置,很方便在小车、航模上使用,大家购买时注意舵机的转动角度,有55度的,180度,360度的等等,大家可以根据需要购买。

SouthEast

舵机工作原理简介

  舵机的控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
  舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

SouthEast 1






























高电平时间 对应位置
0.5ms 0度
1.0ms 45度
1.5ms 90度
2.0ms 135度
2.5ms 180度

  也就是说当对舵机输入相同控制信号时,舵机会运动到固定位置,他的动作不是做圆周运动,而是在运动范围内,每一个位置对应一个控制信号。

  因此我们需要在将舵机安装在固定架上之前,需要先将舵机初始化好,舵机一般为三根线:棕色——GND,红色——VCC,橙色——控制信号。

舵机接线

  在此将舵机棕色线接到GND红色线接到+5V引脚,橙色线接到GPIO.29引脚,如图所示

70

  树莓派如图所示防止==放置,右排第一个为 +5v引脚,右排第三个引脚为 GND引脚,右排最后一个引脚为 GPIO.29,在输入 gpio readall命令后的引脚命名图中对应位置也可以看到。 注意:代码中使用的引脚号是“BCM对应的引脚号”
70 1

C语言代码

创建servo.cpp文件

  1. vim servo.cpp

写入下列代码

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <string.h>
  4. #include <wiringPi.h>
  5. int pwmPin = 18;
  6. int main()
  7. {
  8. // if (wiringPiSetup() == -1)
  9. // {
  10. // fprintf(stdout, "oops: %s\n", strerror(errno));
  11. // return 1;
  12. // }
  13. wiringPiSetupGpio ();
  14. pinMode (pwmPin, PWM_OUTPUT);
  15. pwmSetMode (PWM_MODE_MS);
  16. pwmSetRange (2000);
  17. pwmSetClock (192);
  18. pwmWrite(pwmPin, 150);
  19. delay(1000);
  20. pwmWrite(pwmPin, 200);
  21. return 0;
  22. }

编译servo.cpp,注意要链接wiringPi库

  1. gcc servo.cpp -o servo -lwiringPi

运行编译后的文件

  1. sudo ./servo

注意一定要加sudo权限,否则wiringPi某些版本执行./servo的时候会报错权限不够

python代码

创建servo.py文件

  1. vim servo.py

写入以下代码

  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import RPi.GPIO as GPIO
  4. import time
  5. import signal
  6. import atexit
  7. atexit.register(GPIO.cleanup)
  8. servopin = 21
  9. GPIO.setmode(GPIO.BCM)
  10. GPIO.setup(servopin, GPIO.OUT, initial=False)
  11. p = GPIO.PWM(servopin,50) #50HZ
  12. p.start(0)
  13. time.sleep(2)
  14. while(True):
  15. for i in range(0,181,10):
  16. p.ChangeDutyCycle(2.5 + 10 * i / 180) #设置转动角度
  17. time.sleep(0.02) #等该20ms周期结束
  18. p.ChangeDutyCycle(0) #归零信号
  19. time.sleep(0.2)
  20. for i in range(181,0,-10):
  21. p.ChangeDutyCycle(2.5 + 10 * i / 180)
  22. time.sleep(0.02)
  23. p.ChangeDutyCycle(0)
  24. time.sleep(0.2)

输入命令运行代码

  1. python servo.py

发表评论

表情:
评论列表 (有 0 条评论,438人围观)

还没有评论,来说两句吧...

相关阅读