搜尋程式碼

第13/31課:使用XY搖桿配合Arduino,並通過搖桿動作控制蜂鳴器 | Robojax

第13/31課:使用XY搖桿配合Arduino,並通過搖桿動作控制蜂鳴器 | Robojax

喺呢一課入面,我哋會探討XY搖桿模組,以及點樣將佢同Arduino連接,嚟偵測方向移動同按鈕撳壓。呢個多功能輸入裝置包含兩個電位器(一個用於X軸,一個用於Y軸)同一個按鈕,令你可以捕捉到完整360度嘅移動範圍,仲有一下撳擊動作。除咗單純讀取原始數值之外,我哋仲會示範點樣觸發動作——好似開著蜂鳴器——當搖桿移到特定位置嘅時候。呢個原理係無數互動項目嘅基礎。

sunfounder-13-JoyStick-2

呢個指南好適合用嚟整:

  • 一個雙軸遙控器,用嚟控制機械車或者雲台相機支架。
  • 一個自訂遊戲手掣,用喺PC或者流動裝置度。
  • 一個用於LCD或者OLED顯示屏嘅選單導航系統。
  • 一個精確嘅摩打速度同方向控制器,適用於工業或者業餘愛好者項目。
  • 一個互動警報系統,當搖桿移到特定位置就會啟動警號或者警報。

硬件同零件

要跟住呢個項目做,你需要以下零件。影片入面用嘅特定套件係SunFounder 3合1 Arduino套件,但係呢啲零件都好容易單獨買到。

  • Arduino Uno(或者任何兼容板)
  • XY搖桿模組
  • 無源蜂鳴器
  • 杜邦線
  • USB線,用嚟編程同供電
LB-LR0001_Dual-axis_XY_Joystick_Module

了解XY搖桿模組

XY搖桿係一個獨立嘅輸入裝置。正如影片入面所講(影片01:20位置),佢結合咗兩個10k歐姆電位器,以垂直方式排列。將搖桿沿X軸移動會轉動一個電位器,而沿Y軸移動就會轉動另一個。咁樣令Arduino可以讀取每個軸嘅模擬電壓,代表搖桿嘅精確位置。呢個模組仲包含一個瞬時按鈕,當搖桿直接向下撳嘅時候就會啟動。

Joystick-Module-Internal-Structure

以下係佢嘅引腳詳細說明:

  • GND:連接到Arduino嘅接地(0V)。
  • VCC:連接到Arduino嘅5V電源。
  • VRX:X軸位置嘅模擬輸出。
  • VRY:Y軸位置嘅模擬輸出。
  • SW:按鈕嘅數碼輸出(低電平有效)。

影片仲示範咗,內部兩個電位器係並聯接喺VCC同GND之間,所以總電阻大約係5k歐姆,呢個係呢個模組嘅正常讀數(影片04:30位置)。

接線指南

sunfounder-13_xy_joystick_wiring_bb

呢個項目嘅接線好直接。影片顯示咗SunFounder文檔入面嘅接線圖,但係我哋會按照描述將搖桿直接連接到Arduino引腳。蜂鳴器係為咗項目嘅動作部分而加入嘅。

以下係影片入面建立嘅連接(影片06:24位置):

  • 搖桿GNDArduino GND(黑色線)
  • 搖桿VCCArduino 5V(紅色線)
  • 搖桿VRXArduino A0(黃色線)
  • 搖桿VRYArduino A1(綠色線)
  • 搖桿SWArduino 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] 警報系統嘅現場示範

圖片

Sunfounder car assembled
Sunfounder car assembled
LB-LR0001_Dual-axis_XY_Joystick_Module
LB-LR0001_Dual-axis_XY_Joystick_Module
sunfounder-13-JoyStick-1
sunfounder-13-JoyStick-1
sunfounder-13-JoyStick-2
sunfounder-13-JoyStick-2
Joystick-Module-Internal-Structure
Joystick-Module-Internal-Structure
sunfounder-13_xy_joystick_wiring_bb
sunfounder-13_xy_joystick_wiring_bb
922-Lesson 13/31: How to read position and values of X-Y Joystick
語言: C++
/*
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 
}

資源與參考資料

文件📁

Arduino 函式庫 (zip)

用户手册