1. 程式人生 > >樹莓派3b+控制舵機、伺服電機的驅動程式碼。

樹莓派3b+控制舵機、伺服電機的驅動程式碼。

舵機的控制一般需要一個20ms的時基脈衝,該脈衝的高電平部分一般為0.5ms~2.5ms範圍內的角度控制脈衝部分。以180度角度舵機為例,那麼對應的控制關係是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
請看下形象描述吧:


  舵機的工作電壓和電流:

每一款舵機都有自己的引數,如TR213舵機的工作電壓是4.8-7.2V,TR205舵機的工作電壓是4.8-6V,電壓不能超過這個範圍,否則會很容易燒壞舵機,在不清楚舵機工作電壓範圍的情況下,建議使用5V給舵機供電。

舵機的工作電流是根據舵機的實際情況而定的,如TR213舵機,在空載的時候電流幾乎為0,而在正常負載的情況下,電流在0.5A左右,視實際情況而定。六足機器人需要18個TR213金屬舵機,需要提高的電流大概在8A左右,如果電源功率不夠會影響舵機的效能,最常見的現象是,當一個舵機負載的時候,其他舵機會出現混亂,無規律的亂擺。

    舵機的接線如下圖:

市場上90%的舵機中間那根線都是正級。

 

基礎知識介紹的差不多了,具體可以去百度看看舵機手冊。

 

下面我們來說說在樹莓派中,如何用wiringPi庫去驅動舵機隨心所欲的轉。為什麼要用wiringPi庫呢,因為博主不怎麼喜歡寫Python,博主喜歡寫c/c++程式碼。廢話不多說,開始。

    第一:首先,我已經知道了舵機的pwm週期為20ms,然後是這樣的

0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

也就是說給它1.5ms的高電平,19.5ms的低電平轉向0度位置。這裡需要注意,是0度位置,不是舵機轉0度,當然如果舵機怎麼正好處於0度位置,當然也不轉。這裡可能就有人要問了,那啥位置算是0度位置呢?根據我對舵機的理解(180度的舵機),就是你向一個方向用手轉動舵機,到一個你無法轉動的地方,這個位置不是0度位置,就是180度位置。然後你用下面的程式碼執行一下就知道了。

        while(1)//turn to 0

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(500);

                digitalWrite(15,LOW);

                delayMicroseconds(19500);

        }

我這裡就這樣來模仿pwm的。這個程式碼一執行,舵機就自動到了0度位置。

    同理,想轉到45度位置,90度位置,135度位置,180度位置的程式碼如下:

 while(1) //turn to 45

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(1000);

                digitalWrite(15,LOW);

                delayMicroseconds(19000);

        }

 while(1) //turn to 90

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(1500);

                digitalWrite(15,LOW);

                delayMicroseconds(18500);

        }

 while(1) //turn to 135

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(2000);

                digitalWrite(15,LOW);

                delayMicroseconds(18000);

        }

 while(1) //turn to 180

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(2500);

                digitalWrite(15,LOW);

                delayMicroseconds(17500);

        }

 

 

這裡可能有人要說為啥不用delay()函式呢,因為delay函式精確到毫秒,當我傳1.5給它的時候,和傳1給它的時候,你會發現舵機都是轉向45度位置,因為delay(int x),當1.5傳過去的時候精度丟失了。(我一開始就犯了這個錯誤,尷尬啊)

 

    到這裡我想你應該已經知道怎麼旋轉45度,90度,等等了吧。然後你可能發現舵機旋轉的太快,可能不受自己的控制了。這裡我就要給你提供一種思路,怎麼去解決這個問題。

當然,本人能力有限,寫的難免有錯誤,希望指正。

下面我給一個很不錯的連結,想深入研究的可以去看看(他用的是微控制器)

http://www.njliaohua.com/lhd_5xtsq7jr1e0088t3wpu3_1.html

    我是這樣認為的。0.5ms轉向0度,1ms轉向45度,那個這其中是不是經歷了0.5ms,而且轉了45度,所以我就用0.5=500us,500us/45度。然後得出約為11.11us/度。

接下來我的程式碼是這樣寫的。

       intangle=0;

       scanf(“%d”,&angle);//從鍵盤輸入要轉的角度。

while(1)

        {

               x=11.11*i;

                digitalWrite(15,HIGH);

                delayMicroseconds(500+x);

                digitalWrite(15,LOW);

                delayMicroseconds(19500-x);

              if(i==angle)

                        break;

                i++;

        }

 

這樣一來速度確實是降了下來,但是每次舵機都要先轉向0度位置,然後才能轉向我們輸入的個角度位置,這其中道理我想你們應該懂吧。

    到這裡你應該可以降低舵機的速度了吧,我就給你這麼多思路,下面的路,讓你自己走吧。

這裡我給個demo吧。

#include<stdio.h>
#include<wiringPi.h>

void init();
int main()
{
        init();
        int angle=0;
        scanf("%d",&angle);

        int i=0;
        float x=0;

        int k=180;//180次迴圈的時間夠了
        while(k--)
        {
                x=11.11*i;
                digitalWrite(15,HIGH);
                delayMicroseconds(500+x);
                digitalWrite(15,LOW);
                delayMicroseconds(19500-x);
                if(i==angle)
                    break;

                i++;
         }
        
        return0;
}


void init()
{
        wiringPiSetup();
        pinMode(15,OUTPUT);
}


下面是我們的公眾號,歡迎喜歡樹莓派的你加入: