第13/31課:使用XY搖桿配合Arduino,並通過搖桿動作控制蜂鳴器 | Robojax
喺呢一課入面,我哋會探討XY搖桿模組,以及點樣將佢同Arduino連接,嚟偵測方向移動同按鈕撳壓。呢個多功能輸入裝置包含兩個電位器(一個用於X軸,一個用於Y軸)同一個按鈕,令你可以捕捉到完整360度嘅移動範圍,仲有一下撳擊動作。除咗單純讀取原始數值之外,我哋仲會示範點樣觸發動作——好似開著蜂鳴器——當搖桿移到特定位置嘅時候。呢個原理係無數互動項目嘅基礎。
呢個指南好適合用嚟整:
- 一個雙軸遙控器,用嚟控制機械車或者雲台相機支架。
- 一個自訂遊戲手掣,用喺PC或者流動裝置度。
- 一個用於LCD或者OLED顯示屏嘅選單導航系統。
- 一個精確嘅摩打速度同方向控制器,適用於工業或者業餘愛好者項目。
- 一個互動警報系統,當搖桿移到特定位置就會啟動警號或者警報。
硬件同零件
要跟住呢個項目做,你需要以下零件。影片入面用嘅特定套件係SunFounder 3合1 Arduino套件,但係呢啲零件都好容易單獨買到。
- Arduino Uno(或者任何兼容板)
- XY搖桿模組
- 無源蜂鳴器
- 杜邦線
- USB線,用嚟編程同供電
了解XY搖桿模組
XY搖桿係一個獨立嘅輸入裝置。正如影片入面所講(影片01:20位置),佢結合咗兩個10k歐姆電位器,以垂直方式排列。將搖桿沿X軸移動會轉動一個電位器,而沿Y軸移動就會轉動另一個。咁樣令Arduino可以讀取每個軸嘅模擬電壓,代表搖桿嘅精確位置。呢個模組仲包含一個瞬時按鈕,當搖桿直接向下撳嘅時候就會啟動。
以下係佢嘅引腳詳細說明:
- GND:連接到Arduino嘅接地(0V)。
- VCC:連接到Arduino嘅5V電源。
- VRX:X軸位置嘅模擬輸出。
- VRY:Y軸位置嘅模擬輸出。
- SW:按鈕嘅數碼輸出(低電平有效)。
影片仲示範咗,內部兩個電位器係並聯接喺VCC同GND之間,所以總電阻大約係5k歐姆,呢個係呢個模組嘅正常讀數(影片04:30位置)。
接線指南
呢個項目嘅接線好直接。影片顯示咗SunFounder文檔入面嘅接線圖,但係我哋會按照描述將搖桿直接連接到Arduino引腳。蜂鳴器係為咗項目嘅動作部分而加入嘅。
以下係影片入面建立嘅連接(影片06:24位置):
- 搖桿GND → Arduino GND(黑色線)
- 搖桿VCC → Arduino 5V(紅色線)
- 搖桿VRX → Arduino A0(黃色線)
- 搖桿VRY → Arduino A1(綠色線)
- 搖桿SW → Arduino Pin 8(藍色線)
- 蜂鳴器正極(長腳) → Arduino Pin 2
- 蜂鳴器負極(短腳) → Arduino GND
程式碼解釋
提供嘅程式碼係用嚟讀取搖桿嘅位置,並且當特定條件符合嘅時候啟動蜂鳴器。你可以設定嘅關鍵部分喺草稿碼嘅頂部。
首先,設定引腳定義。你可以更改呢啲設定嚟配合你嘅實際接線:
const int xPin = A0; //VRX連接到呢度
const int yPin = A1; //VRY連接到呢度
const int swPin = 8; //SW連接到呢度
const int alarmPin=2;//連接到蜂鳴器
跟住,宣告全域變數嚟儲存搖桿嘅狀態。每次呼叫readJoystick()函數嘅時候,呢啲變數都會更新。
int xValue;//用嚟儲存xValue
int yValue;//用嚟儲存yValue
int swValue;//用嚟儲存開關嘅數值
喺setup()函數入面,開關引腳設定為使用內部上拉電阻。呢個係好關鍵嘅步驟,因為佢消除咗對外部電阻嘅需要。透過將佢設定為INPUT_PULLUP,引腳預設會讀取HIGH,而當按鈕被撳嘅時候就會變LOW。
pinMode(swPin, INPUT_PULLUP); //將SW引腳設定為INPUT核心邏輯喺loop()入面。佢會呼叫自訂嘅readJoystick()函數嚟攞最新數據。然後,佢檢查一個條件:如果X軸數值大過600同Y軸數值細過300,蜂鳴器就會開啟。你可以修改呢啲閾值嚟定義搖桿嘅另一個「啟動區域」。alarmPin會被設為HIGH嚟啟動蜂鳴器,同時會喺序列監視器度印出一條訊息。
if(xValue >600 && yValue <300)
{
digitalWrite(alarmPin, HIGH);
Serial.print("Alarm X:");
Serial.print(xValue);
Serial.print(" Y:");
Serial.println(yValue);
}else{
digitalWrite(alarmPin, LOW);
// ... 當警報關閉時印出數值嘅代碼
}
最後,自訂函數readJoystick()會被定義。呢個函數會讀取X同Y引腳嘅模擬數值,以及開關嘅數碼狀態,並將佢哋儲存喺全域變數度。呢種模組化嘅做法令主迴圈保持乾淨同有條理。
void readJoystick()
{
xValue =analogRead(xPin);//讀取xPin數值
yValue =analogRead(yPin);//讀取yPin
swValue =digitalRead(swPin);//讀取開關
}
實際項目同示範
一旦代碼上傳咗,就可以開啟序列監視器嚟觀察原始數值。最初,搖桿置中嘅時候,X同Y數值會大約喺512左右,即係0-1023範圍嘅中點。撳低搖桿會令開關數值由1變做0(喺影片10:15位置)。
將搖桿移到極端位置會顯示完整範圍:將佢完全移向右邊會顯示X數值係1023,完全移向左邊會顯示0。同樣,將佢移上移落會令Y數值喺0到1023之間變化(喺影片10:37位置)。
示範跟住會展示項目嘅動作部分。當搖桿移到右上角(即X > 600同Y < 300嘅位置),蜂鳴器就會響,同時序列監視器會印出「Alarm」訊息。將佢移離嗰個區域就會關閉蜂鳴器。呢個證明咗你可以用搖桿嘅位置嚟控制輸出裝置,而呢個可以擴展去控制繼電器、LED或者摩打,用喺唔同嘅應用度。
章節
- [00:00] XY搖桿項目簡介
- [01:20] 了解硬件同內部組件
- [03:33] 模組電路圖同電阻測量
- [05:51] 將搖桿接線到Arduino
- [07:00] 設定代碼同啟用上拉電阻
- [09:23] 上傳代碼同測試原始數值
- [12:21] 採取行動:用搖桿位置控制蜂鳴器
- [16:02] 警報系統嘅現場示範
/*
This sketch reads the x-y joystick and push button
Download and resource page https://robojax.com/RJT596
watch video https://www.youtube.com/watch?v=-3diSIK_iAU
*/
const int xPin = A0; //the VRX attach to
const int yPin = A1; //the VRY attach to
const int swPin = 8; //the SW attach to
const int alarmPin=2;//to buzzer
int xValue;//to store xValue
int yValue;//to store yValue
int swValue;//to store value of the switch
void setup()
{
pinMode(swPin, INPUT_PULLUP); //set the SW pin to INPUT
pinMode(alarmPin, OUTPUT);//define alarm pin
Serial.begin(9600);
}
void loop()
{
readJoystick();//call our function to read the avlues
if(xValue >600 && yValue <300)
{
digitalWrite(alarmPin, HIGH);
Serial.print("Alarm X:");
Serial.print(xValue);
Serial.print(" Y:");
Serial.println(yValue);
}else{
digitalWrite(alarmPin, LOW);
Serial.print("X: ");
Serial.print(xValue, DEC); // print the value of VRX in DEC
Serial.print("|Y: ");
Serial.print(yValue, DEC); // print the value of VRX in DEC
Serial.print("|SW: ");
Serial.println(swValue); // print the value of SW
}
delay(50);
}
/*
* @brief reads joystick x, y and sw
* @param none
* @return returns nothing
* Written by Ahmad Shamshiri on Dec 11, 2022
* for Robojax Tutorial Robojax.com
*/
void readJoystick()
{
xValue =analogRead(xPin);//read xPin value
yValue =analogRead(yPin);//read yPin
swValue =digitalRead(swPin);//read switch
}
Common Course Links
Common Course Files
你可能需要嘅嘢
-
亞馬遜SunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
亞馬遜
-
亞馬遜
-
亞馬遜
資源與參考資料
-
文件记录Documentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
外部Purchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
文件📁
Arduino 函式庫 (zip)
-
SunFounder 3合1智能車學習套件原始碼
3in1-kit-main-v2.zip12.80 MB
用户手册
-
SunFounder 3合1 Arduino 智能車組裝手冊呢份文件逐步展示 SunFounder 3合1 Arduino 智能車嘅組裝過程
SunFounder_car_assembly_manual.pdf1.20 MB