レッスン13/31:ArduinoでXYジョイスティックを使用し、ジョイスティックの動きでブザーを鳴らす | Robojax
このレッスンでは、XYジョイスティックモジュールと、それをArduinoに接続して方向の動きとボタン押下を検出する方法について探求します。この多用途な入力デバイスには、2つのポテンショメータ(X軸用とY軸用)とプッシュボタンが含まれており、360度全方向の動きとクリック動作を捉えることができます。単に生の値を読み取るだけでなく、ジョイスティックが特定の位置に動かされたときにブザーを鳴らすなどのアクションをトリガーする方法もデモンストレーションします。この原理は、数え切れないほどのインタラクティブプロジェクトの基盤を形成します。
このガイドは、以下のようなプロジェクトの構築に最適です:
- ロボットカーやパン・チルトカメラマウント用の2軸リモコン。
- PCやモバイルデバイス用のカスタムゲームコントローラー。
- LCDやOLEDディスプレイ用のメニューナビゲーションシステム。
- 産業用またはホビー用アプリケーション向けの精密なモーター速度・方向コントローラー。
- 特定のジョイスティック位置がサイレンやアラートを作動させるインタラクティブな警報システム。
ハードウェアとコンポーネント
このプロジェクトに沿って進めるには、以下のコンポーネントが必要です。ビデオで使用されている特定のキットはSunFounder 3-in-1 Arduinoキットですが、これらの部品は個別に広く入手可能です。
- Arduino Uno(または互換性のある任意のボード)
- XYジョイスティックモジュール
- パッシブブザー
- ジャンパーワイヤー
- プログラミングと電源用のUSBケーブル
XYジョイスティックモジュールの理解
XYジョイスティックは自己完結型の入力デバイスです。ビデオ(01:20時点)で説明されているように、2つの10kオームのポテンショメータが垂直に配置されて組み合わされています。スティックをX軸に沿って動かすと一方のポテンショメータが回転し、Y軸に沿って動かすともう一方が回転します。これにより、Arduinoは各軸のアナログ電圧を読み取り、スティックの正確な位置を表すことができます。このモジュールには、スティックを真下に押すと作動するモーメンタリプッシュボタンも含まれています。
ピンの内訳は以下の通りです:
- GND:Arduinoのグランド(0V)に接続します。
- VCC:Arduinoの5V電源に接続します。
- VRX:X軸位置のアナログ出力。
- VRY:Y軸位置のアナログ出力。
- SW:プッシュボタンのデジタル出力(アクティブロー)。
ビデオでは、2つの内部ポテンショメータが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
-
アマゾン
-
アマゾン
-
アマゾン
リソースと参考文献
-
ドキュメンテーションSunFounder 3 in 1 IoT/スマートカー/学習キットのドキュメントdocs.sunfounder.com
-
外部SunFounderの3-in-1スマートカー学習キットを購入するsunfounder.com
ファイル📁
Arduinoライブラリ(zip)
-
SunFounderの3-in-1スマートカー学習キットソースコード
3in1-kit-main-v2.zip12.80 MB
ユーザーマニュアル
-
SunFounder 3-in-1 Arduinoスマートカー組み立てマニュアルこのドキュメントはSunFounder 3-in-1 Arduinoスマートカーのステップバイステップの組み立てを示しています。
SunFounder_car_assembly_manual.pdf1.20 MB