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

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

舵机介绍

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



舵机工作原理简介

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



高电平时间对应位置
0.5ms0度
1.0ms45度
1.5ms90度
2.0ms135度
2.5ms180度

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

  因此我们需要在将舵机安装在固定架上之前,需要先将舵机初始化好,舵机一般为三根线:棕色——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
  • 9
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值