Search Code

第92課:用電位器控制多個舵機|Arduino逐步教學課程

第92課:用電位器控制多個舵機|Arduino逐步教學課程

喺呢個項目入面,你會學到點樣用Arduino Uno同兩個電位器嚟整一個獨立、多通道嘅伺服摩打控制器。唔係用一個旋鈕控制一個伺服摩打,呢個指南會教你點樣畀每個伺服摩打一個專屬嘅模擬輸入,令你可以獨立同同時控制兩個——甚至最多六個——伺服摩打。呢個係任何需要精確、手動控制多個活動部件嘅項目嘅基礎組件。

sg90_servo

呢個設定非常靈活。以下係幾個實際嘅用法:

  • 機械人技術:控制相機雲台嘅上下左右轉動,或者小型機械人嘅底座同手臂關節。
  • 電子動畫:透過獨立控制木偶或電子動畫角色嘅頭同眼睛,做出逼真嘅動作。
  • 模型控制:為遙控車或模型飛機整一個自訂控制器,精確調整襟翼同副翼。
  • 自動化:為太陽追蹤器或多軸定位治具整一個手動控制站。

所需硬件

  • Arduino Uno(或任何兼容板)
  • 2個伺服摩打(呢度用標準180度伺服摩打)
  • 2個電位器(10kΩ係常見選擇)
  • 麵包板同跳線
  • 外部5V電源(多個伺服摩打建議使用)

 

接線指南

呢個項目需要比單一伺服摩打設定更多接線,主要係因為你需要將電源同接地分配畀多個組件。關鍵係用麵包板嘅電源軌整一個共用嘅5V同GND匯流排。接線圖對呢個製作嚟講好重要。

Two_or_more_Servo_pot_bb

等我哋拆解吓啲連接,正如影片入面(影片02:23)所講。首先,設定你嘅電源軌:將Arduino嘅5V針腳連接到麵包板嘅正極軌,將GND針腳連接到負極軌。咁樣你就可以方便噉為所有組件供電。

電位器:每個電位器都係一個分壓器。將每個電位器嘅右邊針腳連接到5V軌,左邊針腳連接到GND軌。中間針腳就係「滑臂」,提供一個可變電壓。將第一個電位器嘅中間針腳連接到模擬輸入A0,第二個嘅中間針腳連接到A1(影片03:22)。

伺服摩打:每個伺服摩打有三條線。將深色線(通常係黑色或啡色)連接到GND軌。將中間線(通常係紅色)連接到5V軌。最後,將信號線(通常係橙色或黃色)連接到Arduino上一個支援PWM嘅針腳。第一個伺服摩打嘅信號線連接到針腳3,第二個伺服摩打嘅信號線連接到針腳5(影片04:01)。記住,你一定要用支援PWM嘅針腳(Uno上面有「~」標記嗰啲)嚟控制伺服摩打。

程式碼解釋

呢段程式碼係基於Arduino IDE入面標準嘅「Knob」範例,但係改咗嚟處理兩個伺服摩打。邏輯好簡單:讀取電位器嘅模擬值,將佢映射做一個角度,然後命令伺服摩打移動到嗰個角度。程式碼最頂部嘅設定部分就係你要做所有調整嘅地方。

以下係用戶可設定嘅部分,定義咗針腳同建立伺服摩打物件:


#include <Servo.h>

//**** 伺服摩打1設定
Servo servo1; 
const int servo1PotPin = A0;
const int servo1Pin = 3;// 必須用支援PWM嘅針腳
int servo1Value;
//**** 伺服摩打1設定結束

//**** 伺服摩打2設定
Servo servo2; 
const int servo2PotPin = A1;
const int servo2Pin = 5;// 必須用支援PWM嘅針腳
int servo2Value;
//**** 伺服摩打1設定結束

呢個就係設定嘅核心。要加第三個伺服摩打,你可以複製「伺服摩打2設定」嘅區塊,將所有「2」改成「3」,分配一個新嘅模擬針腳(例如A2)同一個新嘅PWM針腳(例如9)。Servo類別係Arduino IDE內置嘅,所以唔需要額外嘅函式庫。

setup()函數入面,servo.attach(pin)指令會話畀Arduino知邊個針腳連接到每個伺服摩打嘅信號線。每個你用嘅伺服摩打都要有一行呢個指令。


void setup() {
  //Robojax.com多個伺服摩打
  servo1.attach(servo1Pin); 
  servo2.attach(servo2Pin);   
}

loop()入面,程式碼會讀取電位器嘅值,將佢映射做0-180度嘅範圍,然後將嗰個角度寫入伺服摩打。最後嘅delay(5)係一個調校參數。正如影片入面示範,將呢個值由15毫秒減到5毫秒會令伺服摩打嘅移動順暢好多,同時消除震動(影片12:00)。

實時項目示範

當你接好電路同upload咗程式碼之後,示範即刻就會見到。當你為Arduino供電,每個伺服摩打會移動到由佢對應電位器當前設定決定嘅位置。當你轉動一個旋鈕,佢嘅伺服摩打會順暢噉跟住郁。影片示範咗兩個伺服摩打完全獨立運作,可以做到複雜嘅同步動作。如果你發現有震動或抖動,調整loop()入面嘅delay()值係第一個要試嘅嘢。

章節

  • [00:00] 簡介同項目概覽
  • [00:56] 了解伺服馬達
  • [02:23] 兩個伺服同電位器嘅接線圖
  • [04:15] 詳細接線說明
  • [06:49] 程式碼說明:配置同設定
  • [09:15] 程式碼說明:控制邏輯同映射
  • [11:15] 現場示範同調校

圖片

Multiple servo, one pot: Main setup
Multiple Servo one pot.: Main setup
Multiple servo, one pot: Main setup, top view
Multiple Servo one pot.: Main setup top view
Multiple servo one-pot: Creating extra 5V from an Arduino on a breadboard
Multiple Servo one pot.: Creating extra 5V from Arduino on breadboard
SG90 Mini Servo Motor
SG90 Mini Servo Motor
Two_or_more_Servo_pot_bb
Two_or_more_Servo_pot_bb
sg90_servo
sg90_servo
888-Lesson 92: Controlling Multiple servo motors
語言: C++
/*
 * Control two or more servo motors 
 * using potentiometers.
 * Modified by Ahmad Shamshiri on Oct 17, 2019 at 20:13
 * in Ajax, Ontario, Canada . www.Robojax.com
 * This code on robojax https://robojax.com/RJT766
 *  
 * Original code from Arduino IDE: File->Examples->Servo->knob
 *  
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob


 * Get this code and other Arduino codes from Robojax.com



 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
#include <Servo.h>

//**** servo 1 settings
Servo servo1; 
const int servo1PotPin =A0;
const int servo1Pin = 3;// Must use PWM enabled pin
int servo1Value;
//**** servo 1 settings END

//**** servo 2 settings
Servo servo2; 
const int servo2PotPin =A1;
const int servo2Pin = 5;// Must use PWM enabled pin
int servo2Value;
//**** servo 1 settings END

void setup() {
  //Robojax.com multiple servo
  servo1.attach(servo1Pin); 
  servo2.attach(servo2Pin);   
}

void loop() {
  //Robojax.com multiple servo
  servo1Value = analogRead(servo1PotPin); 
  servo1Value = map(servo1Value, 0, 1023, 0, 180);
  servo1.write(servo1Value);

  servo2Value = analogRead(servo2PotPin); 
  servo2Value = map(servo2Value, 0, 1023, 0, 180);
  servo2.write(servo2Value);
  
  delay(5);
 //Robojax.com multiple servo  
}// loop end

你可能需要嘅嘢

資源與參考資料

暫時冇資源。

文件📁

其他文件