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舵機握手
- SG90舵機(180°)相關參數見下表:
Arduino與SG90舵機握手
2.0 實驗材料
- Arduino Uno R3開發闆
- USB資料線
- 三根公母線
- SG90舵機
- 一台安裝Arduino開發環境的電腦
3.0 實驗步驟
3.1 根據原理圖搭建電路
舵機紅色線接開發闆5V,棕色線接開發闆GND,橙色信号線接開發闆數字引腳10。
實驗原理圖:
實驗接線圖:
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:
代碼2:
4.0 總結
- 用Arduino 控制舵機的方法有兩種,代碼1是直接利用Arduino 自帶的Servo 函數進行舵機的控制,這種控制方法的優點在于程式編寫,缺點是隻能控制2 路舵機,因為Arduino 自帶函數隻能利用數字9、10 接口。代碼2是通過Arduino 的普通數字傳感器接口産生占空比不同的方波,模拟産生PWM 信号進行舵機定位,控制原理更加清晰。
- Arduino 的驅動能力有限,是以當需要控制1 個以上的舵機時需要外接電源。
- 在以後的博文中我們将學會用arduino常用傳感器和執行器,進而實作對外部世界進行感覺,充分認識這個有機與無機的環境,科學地合理地進行創作和發揮效益,然後為人類社會發展貢獻一點微薄之力。