樹莓派 基於 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
然後看實驗現象。
希望對你有幫助。