1. 程式人生 > >樹莓派 基於 wiringPi庫 舵機控制

樹莓派 基於 wiringPi庫 舵機控制

                               樹莓派 基於 wiringPi庫 舵機控制 

 

原文地址:https://www.e-learn.cn/content/qita/814233

  舵機是伺服電機的一種,在日常的開發中經常會用到。在此呼叫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檔案

寫入下列程式碼:

#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

然後看實驗現象。

 

希望對你有幫助。