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

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

舵机介绍

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



舵机工作原理简介

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



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

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

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

舵机接线

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




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

C语言代码

创建servo.cpp文件

vim servo.cpp

写入下列代码

#include <stdio.h>
#include <errno.h>
#include <string.h>

#include <wiringPi.h>

int pwmPin = 18;

int main()
{

//  if (wiringPiSetup() == -1)
//  {
//      fprintf(stdout, "oops: %s\n", strerror(errno));
//      return 1;   
//  }


    wiringPiSetupGpio ();
    pinMode (pwmPin, PWM_OUTPUT);
    pwmSetMode (PWM_MODE_MS);
    pwmSetRange (2000);

    pwmSetClock (192);
    pwmWrite(pwmPin, 150);
    delay(1000);
    pwmWrite(pwmPin, 200);  

    return 0;
}

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

gcc servo.cpp -o servo -lwiringPi

运行编译后的文件

sudo ./servo

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

python代码

创建servo.py文件

vim servo.py

写入以下代码

# -*- coding: utf-8 -*-
#!/usr/bin/env python    

import RPi.GPIO as GPIO  
import time  
import signal  
import atexit  

atexit.register(GPIO.cleanup)    

servopin = 21  
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.2)  

  for i in range(181,0,-10):  
    p.ChangeDutyCycle(2.5 + 10 * i / 180)  
    time.sleep(0.02)  
    p.ChangeDutyCycle(0)  
    time.sleep(0.2)  

输入命令运行代码

python servo.py

猜你喜欢

转载自blog.csdn.net/qq_16775293/article/details/80785914