天天看點

arduino舵機代碼_第十二享,舵機控制

準備:arduino闆,舵機,面包闆和杜邦線等。

    就是這個東西

arduino舵機代碼_第十二享,舵機控制

 原理與控制方式:

    舵機有三條控制線,分别是電源、地、信号線。電源和地用于提供内部的直流馬達及控制線所需的能量,電壓通常介于4V-6V,由于舵機内部的馬達會産生噪聲,是以該電源應該盡可能與處理系統的電源隔離,即舵機最好單獨供電。信号線控制為一PWM信号,高電平時間通常在1ms-2ms,低電平時間應在5ms-20ms,舵機每20ms必須收到高電平信号,否則舵機将斷電,并且不能維持原來的位置。下圖展示了一個典型PWM信号與舵機位置的關系。

arduino舵機代碼_第十二享,舵機控制

  當然這是一個大概的對應關系,可根據實際情況調節,其他角度按以上關系控制。

    電路連接配接圖如圖

arduino舵機代碼_第十二享,舵機控制

    不用多解釋,5V、GND、信号線接6号引腳。(哪個引腳都行)

上代碼

1,我們根據上面的對應關系,寫個最簡單的代碼,使舵機轉動到固定角度。比如比如135°-2ms-2000us。

void setup()

{

  pinMode(6,OUTPUT);

}

void loop()

  delay(15);

  digitalWrite(6,HIGH);

  delayMicroseconds(2000);

  digitalWrite(6,LOW);

  delay(15);

}

2,我們讓它在0°和180°之間搖擺

int n;

void setup(){

  pinMode(6,OUTPUT);

}

void loop(){ 

  for(int i=0;i<=50;i++){ //産生PWM個數,等效延時以保證能轉到響應角度

    servogo(1);

  }

  for(int i=0;i<=50;i++){ //産生PWM個數,等效延時以保證能轉到響應角度

    servogo(18);

  }

}

void servogo(int angle){//angle=1~18 .對應20°~180°

  n=(angle*110)+500;//将角度轉化為500-2480 的脈寬值

  digitalWrite(6,HIGH);

  delayMicroseconds(n);

  digitalWrite(6,LOW);

  delay(20-n/1000);//延時周期内剩餘時間

}

效果看一下

3,序列槽控制,輸入角度值,轉動到指定角度

int n;

int val;//val=0~9 .對應0°~180°

void setup(){

  pinMode(6,OUTPUT);

  Serial.begin(9600);

}

void loop(){ 

  if(Serial.available()){

    val=Serial.read();

    val=val-'0';//将ASCII碼轉換成數值,例'9'-'0'=0x39-0x30=9

    val=val*2;

  }

  servogo(val);

}

void servogo(int angle){//angle=1~18 .對應20°~180°

  n=(angle*110)+500;//将角度轉化為500-2480 的脈寬值

  digitalWrite(6,HIGH);

  delayMicroseconds(n);

  digitalWrite(6,LOW);

  delay(20-n/1000);//延時周期内剩餘時間

}

看一下效果

4,序列槽控制,‘W’、‘S’鍵盤控制角度增減

int n;

int val;//val=0~18 .對應0°~180°

int a=0;

void setup(){

  pinMode(6,OUTPUT);

  Serial.begin(9600);

}

void loop(){ 

  if(Serial.available()){

    val=Serial.read();

    switch(val){

      case 'W':

        a+=2;

        if(a>18){

          a=18;

        }

        break;

      case 'S':

       a-=2;

       if(a<0){

         a=0;

       }

       break;

       default:

       break;

    }

  }

  servogo(a);

}

void servogo(int angle){//angle=1~18 .對應20°~180°

  n=(angle*110)+500;//将角度轉化為500-2480 的脈寬值

  digitalWrite(6,HIGH);

  delayMicroseconds(n);

  digitalWrite(6,LOW);

  delay(20-n/1000);//延時周期内剩餘時間

}

看一下效果

代碼為什麼這樣寫?for循環有點兒莫名其妙?

我的舵機為什麼喜歡抖動?抽搐?

還請聽下回分解!