天天看點

Arduino與SG90舵機握手

Arduino教程傳送門🧭🏔🌋🛤🏞🏜

Arduino與SG90舵機握手

    • 1.0 簡介
    • 2.0 實驗材料
    • 3.0 實驗步驟
        • 3.1 根據原理圖搭建電路
        • 3.2 建立sketch,拷貝如下代碼并進行儲存編譯上傳
        • 3.3 實驗現象
    • 4.0 總結

1.0 簡介

  • 舵機:是一種位置(角度)伺服的驅動器,适用于那些需要角度不斷變化并可以保持的伺服控制系統。在高檔遙控玩具,如飛機、潛艇模型,遙控機器人中已經得到了普遍應用。本篇通過官方驅動庫和自定義函數來實作舵機控制。
  • 外形結構:主要是由外殼、無核心馬達、四級減速齒輪、電路闆和位置檢測器所構成。
    Arduino與SG90舵機握手
    Arduino與SG90舵機握手
  • 工作原理:

    其工作原理是由接收機或者單片機發出信号給舵機,其内部有一個基準電路,産生周期為20ms,寬度為1.5ms 的基準信号,将獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。經由電路闆上的IC 判斷轉動方向,再驅動無核心馬達開始轉動,透過減速齒輪将動力傳至擺臂,同時由位置檢測器送回信号,判斷是否已經到達定位。

    舵機轉動的角度是通過調節PWM「脈沖寬度調制」信号的占空比來實作的。标準的PWM信号的周期固定為20ms,理論上脈寬分布應該在1ms到2ms之間,實際上可由0.5ms到2.5ms之間,脈寬與轉角0°—180°相對應。不同廠家不同型号的舵機也會有所差異。

    Arduino與SG90舵機握手
Arduino與SG90舵機握手
  • SG90舵機(180°)相關參數見下表:
    Arduino與SG90舵機握手

2.0 實驗材料

  • Arduino Uno R3開發闆
  • USB資料線
  • 三根公母線
  • SG90舵機
  • 一台安裝Arduino開發環境的電腦

3.0 實驗步驟

3.1 根據原理圖搭建電路

舵機紅色線接開發闆5V,棕色線接開發闆GND,橙色信号線接開發闆數字引腳10。

實驗原理圖:

Arduino與SG90舵機握手

實驗接線圖:

Arduino與SG90舵機握手

3.2 建立sketch,拷貝如下代碼并進行儲存編譯上傳

代碼1:

#include <Servo.h>						// 調用Servo庫

Servo servo_10;							// 定義Servo對象來控制
		
void setup(){
  servo_10.attach(10);					// 控制線連接配接數字10
}

void loop(){
  for (pos = 0; pos <= 180; pos ++) { 	// 0°到180°
    // in steps of 1 degree
    myservo.write(pos);             	// 舵機角度寫入
    delay(5);                       	// 控制移動速度
  }
  for (pos = 180; pos >= 0; pos --) { 	// 從180°到0°
    myservo.write(pos);              	// 舵機角度寫入
    delay(5);                       	// 控制移動速度
  }
}
           

代碼2:

int servopin = 10; //設定舵機驅動腳到數字口10
int myangle;//定義角度變量
int pulsewidth;//定義脈寬變量
int val;
void servopulse(int servopin, int myangle) /*定義一個脈沖函數,用來模拟方式産生PWM值*/
{
  pulsewidth = (myangle * 11) + 500; //将角度轉化為500-2480 的脈寬值
  digitalWrite(servopin, HIGH); //将舵機接口電平置高
  delayMicroseconds(pulsewidth);//延時脈寬值的微秒數
  digitalWrite(servopin, LOW); //将舵機接口電平置低
  delay(20 - pulsewidth / 1000); //延時周期内剩餘時間
}
void setup()
{
  pinMode(servopin, OUTPUT); //設定舵機接口為輸出接口
  Serial.begin(9600);//設定波特率為9600
  Serial.println("servo=o_seral_simple ready" ) ;
}
void loop()//将0 到9 的數轉化為0 到180 角度,并讓LED 閃爍相應數的次數
{
  val = Serial.read(); //讀取序列槽收到的資料
  if (val >= '0' && val <= '9') //判斷收到資料值是否符合範圍
  {
    val = val - '0'; //将ASCII碼轉換成數值,例'9'-'0'=0x39-0x30=9
    val = val * (180 / 9); //将數字轉化為角度,例9*(180/9)=180
    Serial.print("moving servo to ");
    Serial.print(val, DEC);
    Serial.println();
    for (int i = 0; i <= 50; i++) //給予舵機足夠的時間讓它轉到指定角度
    {
      servopulse(servopin, val); //引用脈沖函數
    }
  }
}


           

3.3 實驗現象

代碼1:

Arduino與SG90舵機握手

代碼2:

Arduino與SG90舵機握手

4.0 總結

  • 用Arduino 控制舵機的方法有兩種,代碼1是直接利用Arduino 自帶的Servo 函數進行舵機的控制,這種控制方法的優點在于程式編寫,缺點是隻能控制2 路舵機,因為Arduino 自帶函數隻能利用數字9、10 接口。代碼2是通過Arduino 的普通數字傳感器接口産生占空比不同的方波,模拟産生PWM 信号進行舵機定位,控制原理更加清晰。
  • Arduino 的驅動能力有限,是以當需要控制1 個以上的舵機時需要外接電源。
  • 在以後的博文中我們将學會用arduino常用傳感器和執行器,進而實作對外部世界進行感覺,充分認識這個有機與無機的環境,科學地合理地進行創作和發揮效益,然後為人類社會發展貢獻一點微薄之力。

繼續閱讀