Arduino控制舵機詳解 附代碼
Arduino使用C/C++編寫程序,雖然C++兼容C語言,但不是C語言。C語言是Arduino語言的一種。早期的Arduino核心庫使用C語言編寫,后來引進了面向對象的思想,目前最新的Arduino核心庫采用C與C++混合編寫而成。
rduino是一款便捷靈活、方便上手的開源電子原型平臺。包含硬件(各種型號的Arduino板)和軟件(ArduinoIDE)。由一個歐洲開發(fā)團隊于2005年冬季開發(fā)。其成員包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti等。
它構建于開放原始碼simple I/O介面版,并且具有使用類似Java、C語言的Processing/Wiring開發(fā)環(huán)境。主要包含兩個的部分:硬件部分是可以用來做電路連接的Arduino電路板;另外一個則是Arduino IDE,你的計算機中的程序開發(fā)環(huán)境。你只要在IDE中編寫程序代碼,將程序上傳到Arduino電路板后,程序便會告訴Arduino電路板要做些什么了。
Arduino能通過各種各樣的傳感器來感知環(huán)境,通過控制燈光、馬達和其他的裝置來反饋、影響環(huán)境。板子上的微控制器可以通過Arduino的編程語言來編寫程序,編譯成二進制文件,燒錄進微控制器。對Arduino的編程是通過 Arduino編程語言 (基于 Wiring)和Arduino開發(fā)環(huán)境(基于 Processing)來實現(xiàn)的?;贏rduino的項目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上運行的軟件,它們之間進行通信 (比如 Flash, Processing, MaxMSP)來實現(xiàn)。
1. 舵機簡介
舵機是一種位置(角度)伺服的驅動器。舵機只是一種通俗的叫法,其實質是一個伺服馬達。在需要角度不斷變化并可以保持的控制系統(tǒng)中應用廣泛。如遙控機械人、飛機模型等。
舵機的轉動角度為0~180°,其內部結構包括電機,控制電路和機械結構三部分。電機有三根線引出,分別接VCC、GNG和信號線。主要有兩種引出線的格式:
- 棕、紅、橙(棕色連接GND、紅色連接VCC、橙色連接信號);
- 紅、黑、黃(紅色連接VCC、黑色連接GND、黃色連接信號)。

圖1 舵機實物圖
2 硬件電路連線
Arduino
Arduino | 功能 | 舵機 | 功能 |
| VCC | 正極 | 紅色 | 正極 |
| GND | 負極 | 棕色 | 負極 |
| D9(PWM) | 數(shù)字引腳(PWM) | 橙色(信號傳輸) | 信號輸入 |
3 項目:舵機來回轉動
實現(xiàn)功能:舵機0~180°來回轉動。
3.1 控制代碼
#include <Servo.h> //加載文件庫
int pos = 0;
Servo myservo;
void setup()
{
myservo.attach(9, 500, 2500); //修正脈沖寬度
}
void loop()
{
for (pos = 0; pos <= 180; pos += 1) { //pos+=1等價于pos=pos+1
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}3.2 仿真結果

圖2 舵機連線及仿真圖
4 項目2:光控舵機
實現(xiàn)功能:隨著光照強度增加,舵機跟著轉動。A0產生的模擬值大于500時,內置的13引腳的可編程LED發(fā)光。
4.1硬件電路連線
Arduino
Arduino | 功能 | 舵機 | 功能 |
| VCC | 正極 | 紅色 | 正極 |
| GND | 負極 | 棕色 | 負極 |
| D9(PWM) | 數(shù)字引腳(PWM) | 橙色(信號傳輸) | 信號輸入 |
| A0 | 模擬接口(光敏電阻) |
4.2 控制代碼
#include <Servo.h>
const int sensorPin = A0;
int led=13;
int pos = 0;
Servo myservo;//創(chuàng)建舵機對象
void setup(){
myservo.attach(9, 500, 2500);
pinMode(led,OUTPUT);
Serial.begin(9600);
}
void loop(){
int val=analogRead(sensorPin);
if(val>500){
digitalWrite(led,HIGH);
}
else{
digitalWrite(led,LOW);
}
int yp=map(val,0,1023,0,180);
//數(shù)值轉換,將[0,1023]產生的模擬值轉換成[0,180]中的值
Serial.println(yp);
myservo.write(yp);
delay(10);
}4.3 仿真結果

圖4 光控舵機仿真
5項目3:串口控制舵機和內置LED燈
實現(xiàn)功能如下:
串口輸入2,led點亮,同時串口打印“ON”,舵機轉動到90°。
串口輸入4,led熄滅,同時串口打印“OFF”,舵機轉動到180°
#include <Servo.h>
int led4=4;
int led=13;
Servo myservo;//創(chuàng)建舵機對象
void setup(){
myservo.attach(9, 500, 2500);
pinMode(led,OUTPUT);
pinMode(led4,OUTPUT);
Serial.begin(9600);
}
void loop(){
if(Serial.available()>0){
char c=Serial.read();
if(c=='2'){
digitalWrite(led,HIGH);
digitalWrite(led4,HIGH);
myservo.write(90);
Serial.println("ON");
}
else if(c=='4'){
digitalWrite(led,LOW);
digitalWrite(led4,LOW);
myservo.write(180);
Serial.println("OFF");
}
}
}5.1仿真結果

圖4 串口控制舵機仿真
6 用到的函數(shù)解釋
- Serial.begin()是串口初始化函數(shù),設置傳輸速率。
- Serial.println()與Serial.print()的區(qū)別在于前者具備換行功能,后者不具備。
- Servo.h是舵機庫文件,直接在Aruidno IDE中可以加載。
- Servo myservo為創(chuàng)建對象,本質就是一個名稱,myservo可自己命名。
- myservo.attach(9)表示控制舵機的引腳。
- myservo.write(45)表示舵機旋轉到45°的位置,而不是旋轉了45°。
- map()函數(shù)的使用率比較高,將某一區(qū)間的值轉換為另外區(qū)間的值。
語法格式為: val =map(value, fromLow, fromHigh, toLow, toHigh);
val,value為同類型變量,fromHigh與fromLow為變量a的最大與最小值,toHigh與toLow為val變量的最大與最小值。map()函數(shù)根據(jù)范圍比例即可將某一區(qū)間的值縮放至另外區(qū)間的值,并將值賦予val。
到此這篇關于Arduino控制舵機詳解(含代碼)的文章就介紹到這了,更多相關Arduino控制舵機內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用VS2010創(chuàng)建MFC ActiveX工程項目
VS2010開發(fā)ActiveX有兩種方法,分別是MFC和ATL。MFC開過起來比較簡單,但是最終生成的文件比較大,ATL是專門用來開發(fā)ActiveX的,但是相對比較難,必須知道很多原理機制和API。咱先從MFC開發(fā)ActiveX開始吧。2015-06-06
深入理解 C++ 的 std::initializer_list及使用場景分析
本文介紹了C++11引入的std::initializer_list模板類,它作為統(tǒng)一初始化語法的重要橋梁,封裝同類型常量值,常用于容器初始化、函數(shù)參數(shù)傳遞和自定義類支持花括號初始化,感興趣的朋友跟隨小編一起看看吧2025-10-10
C++實現(xiàn)LeetCode(150.計算逆波蘭表達式)
這篇文章主要介紹了C++實現(xiàn)LeetCode(150.計算逆波蘭表達式),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07
Python/Java/JS語言調用C/C++庫的底層原理詳解
開發(fā)過程中很多時候都會遇到調用C++動態(tài)庫dll的需求,下面這篇文章主要介紹了Python/Java/JS語言調用C/C++庫的底層原理,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-01-01

