2016年5月21日 星期六

伺服馬達控制

一般伺服馬達有三條線,電源(紅色)、接地(黑或棕色)、訊號線(白橘)。透過訊號線傳送PWM脈波來控制旋轉角度,而一個週期中(20ms)其中高電位持續時間長短便代表了馬達將轉到什麼角度,範圍從1.0ms2.0ms(毫秒);若1.0ms當做角度0度,那麼1.5ms會是90度,2.0ms則是轉到底180度。




市面上買到的伺服馬達可能會有兩種顏色配對的接線:
(
紅、黑、白)-- 對應 Vcc GNDPWM
(紅、棕、橘)-- 對應 Vcc GNDPWM

本實驗是Tower Pro(輝盛)的小型伺服馬達SG90作為零件,三條線的顏色分別為(紅、棕、橘)電路接線方法如下:


1. 直接輸入角度讓伺服馬達依序從0-> 30->60->…..->180->150->…->30->0度循迴運轉
#include <Servo.h>

Servo myservo; // 建立Servo物件

void setup()
{
  myservo.attach(9); // PIN9當成伺服馬達的訊號線
}

void loop()
{
    myservo.write(0); // 轉到0
    delay(100);
    myservo.write(30); // 轉到30
    delay(100);
    myservo.write(60); // 轉到60
    delay(100);
    myservo.write(90); // 轉到90
    delay(100);
    myservo.write(120); // 轉到120
    delay(100);
    myservo.write(150); // 轉到150
    delay(100);
    myservo.write(180); // 轉到180
    delay(100);
    myservo.write(150); // 轉到150
    delay(100);
    myservo.write(120); // 轉到120
    delay(100);
    myservo.write(90); // 轉到90
    delay(100);
    myservo.write(60); // 轉到60
    delay(100);
    myservo.write(30); // 轉到0
    delay(100);   
}


若轉動角度變化更小,例如每次移動一度則可以用for-loop的語法減化程式設計的複雜度:
#include <Servo.h>

Servo myservo; // 建立Servo物件

void setup()
{
  myservo.attach(9); // PIN9當成伺服馬達的控制訊號線
}        

void loop()
{
  for(int i = 0; i <= 180; i=i+1)
{
    myservo.write(i); // 傳入0度轉到180度的累增數值
    delay(10);
  }
  for(int i = 180; i >= 0; i=i-1)
{
    myservo.write(i);// 傳入180度轉到0度的遞減數值
    delay(10);
  }
}

影片展示:    https://youtu.be/KpKE82GKDTs


2. 直接利用脈波來控制角度
#include <Servo.h>

Servo myservo; // 建立Servo物件

void setup()
{
  myservo.attach(9); // PIN9當成伺服馬達的訊號線
}

void loop()
{
    myservo.writeMicroseconds(1000); // 指定脈波寬度為1.00ms
    delay(500);
    myservo.write(1500); // 指定脈波寬度為1.50ms
    delay(500);
    myservo.write(2000); // 指定脈波寬度為2.00ms
    delay(500);
    myservo.write(1500); // 指定脈波寬度為1.50ms
    delay(500);   
}



#include <Servo.h>

Servo myservo; // 建立Servo物件

void setup()
{
  myservo.attach(9); // PIN9當成伺服馬達的訊號線
}

void loop()
{
    myservo.writeMicroseconds(544); // 指定脈波寬度為0.54ms
    delay(500);
    myservo.write(1472); // 指定脈波寬度為1.472ms
    delay(500);
    myservo.write(2450); // 指定脈波寬度為2.45ms
    delay(500);
    myservo.write(1472); // 指定脈波寬度為1.472ms
    delay(500);
      
}



沒有留言:

張貼留言

NUMPY的Array介紹與Matplotlib的繪圖功能

NumPy 的 Array 介紹與 Matplotlib 的繪圖功能   1. A rray 的基本運算 :   適用於科學和數學運算的 NumPy 套件中,有一個 Array 的資料結構。 Array 是一個非常類似 list 的序列型態。 但是 Arr...