. Arduino入門編⑦】ジョイスティックの制御方法!デジタル・アナログ入力の解説です! | ぶらり@web走り書き
Arduino入門編⑦】ジョイスティックの制御方法!デジタル・アナログ入力の解説です! | ぶらり@web走り書き
Arduino入門編⑦】ジョイスティックの制御方法!デジタル・アナログ入力の解説です! | ぶらり@web走り書き

【Arduino入門編⑦】ジョイスティックの制御方法!デジタル・アナログ入力の解説です!

そしてセンタークリック機能は単純なON/OFFのプッシュスイッチと同じで、その判定にはdigitalRead関数が使われます。 その際にスイッチが押されていない状態(宙に浮いた状態)ではデジタル入力の場合動作が不安定となるため、押されていない状態では常にHIGHが入力されるようにプルアップさせる必要があり、押した状態でLOWとなるようにGNDに接続する形となります。 プルアップさせるのでON/OFFが反転している点がポイントですね。

スティック状態(digitalRead関数で読み取った値)押されていない状態HIGHを検出押した状態LOWを検出 ジョイスティックから取得した入力値をシリアルモニタで確認

プッシュスイッチが押されていない状態(浮いた状態)を防ぐため、 pinMode関数でD2ピンをプルアップ して常にHIGH状態、そして押された状態ではGNDに繋がるようになっています。

【Arduino入門編⑤】プルアップ・プルダウンって何?デジタル入力の解説です!

接続はこのようになります。 簡単ですね! 今回使ったジョイスティックとは下記回路図とピン配列が少し違いますが対応した箇所に接続して下さい!

VRx(ジョイスティック) → A0(Arduino) VRy(ジョイスティック) → A1(Arduino) SW(ジョイスティック) → D2(Arduino)

【Arduino入門編⑥】可変抵抗を使いアナログ値を読み取る。アナログ値から実際に入力されている電圧を計算。アナログ入力端子の解説です! ジョイスティックからの入力値を読み取る // Arduino入門編⑦ ジョイスティックからの入力値を読み取る // https://burariweb.info const int X_PIN = A0 ; // X軸方向の入力をアナログピンA0に const int Y_PIN = A1 ; // Y軸方向の入力をアナログピンA1に const int SW_PIN = 2 ; // センタースイッチの入力をデジタルピンD2に int X _ POS ; // X軸方向の読み取り値の変数を整数型に int Y _ POS ; // Y軸方向の読み取り値の変数を整数型に int SW _ POS ; // センタースイッチの読み取り値の変数を整数型に void setup ( ) < pinMode ( X_PIN , INPUT ) ; // A0ピンを入力に(省略可) pinMode ( Y_PIN , INPUT ) ; // A1ピンを入力に(省略可) pinMode ( SW_PIN , INPUT_PULLUP ) ; // D2ピンをプルアップして入力に Serial . begin ( 9600 ) ; // シリアル通信の開始 X_POS = analogRead ( X_PIN ) ; // X軸方向のアナログ値を読み取る Y_POS = analogRead ( Y_PIN ) ; // Y軸方向のアナログ値を読み取る SW_POS = digitalRead ( SW_PIN ) ; // センタースイッチの状態を読み取る Serial . print ( "X: " ) ; // シリアルモニタにそれぞれの値を出力 Serial . print ( X_POS ) ; Serial . print ( " Y: " ) ; Serial . print ( Y_POS ) ; Serial . print ( " SW: " ) ; Serial . println ( SW_POS ) ; delay ( 100 ) ; それでは上記スケッチを動かしシリアルモニタを立ち上げジョイスティックから取得した値を確認してみましょう。 ジョイスティックを使いLEDの点灯強度を制御する Arduino入門編⑦ ジョイスティックでLEDの点灯強度を制御 // Arduino入門編⑦ ジョイスティックでLEDの点灯強度を制御 // https://burariweb.info const int X_PIN = A0 ; // X軸方向の入力をアナログピンA0に const int Y_PIN = A1 ; // Y軸方向の入力をアナログピンA1に const int SW_PIN = 2 ; // センタースイッチの入力をデジタルピンD2に const int Xmin_LED = 3 ; // 左LEDをデジタルピン3に const int Xmax_LED = 5 ; // 右LEDをデジタルピン5に const int Ymin_LED = 9 ; // 下LEDをデジタルピン9に const int Ymax_LED = 10 ; // 上LEDをデジタルピン10に const int SW_LED = 12 ; // スイッチ判定LEDをデジタルピン12に int X _ POS ; // X軸方向の読み取り値の変数を整数型に int Y _ POS ; // Y軸方向の読み取り値の変数を整数型に int SW _ POS ; // センタースイッチの読み取り値の変数を整数型に float OFFSET = 0.05 ; // センター付近のオフセット値を5%に設定 int DUTY ; // ディーティ比用変数 void setup ( ) < pinMode ( X_PIN , INPUT ) ; // A0ピンを入力に(省略可) pinMode ( Y_PIN , INPUT ) ; // A1ピンを入力に(省略可) pinMode ( SW_PIN , INPUT_PULLUP ) ; // D2ピンをプルアップして入力に pinMode ( Xmin_LED , OUTPUT ) ; // pinMode ( Xmax_LED , OUTPUT ) ; // それぞれのピンを出力に設定 pinMode ( Ymin_LED , OUTPUT ) ; // pinMode ( Ymin_LED , OUTPUT ) ; // pinMode ( SW_LED , OUTPUT ) ; // D12ピンを出力に Serial . begin ( 9600 ) ; // シリアル通信の開始 X_POS = analogRead ( X_PIN ) ; // X軸方向のアナログ値を読み取る Y_POS = analogRead ( Y_PIN ) ; // Y軸方向のアナログ値を読み取る SW_POS = digitalRead ( SW_PIN ) ; // センタースイッチの状態を読み取る if ( SW_POS == 0 ) < digitalWrite ( SW_LED , HIGH ) ; // スイッチが押されるとLEDを点灯 > else < // 押されていない場合は消灯させる digitalWrite ( SW_LED , LOW ) ;

if ( ( X_POS > 512 - 512 * OFFSET ) && ( X_POS < 512 + 512 * OFFSET ) ) < // X軸方向のセンター(512)の前後OFFSET分はLEDを消灯

analogWrite ( Xmin_LED , 0 ) ; analogWrite ( Xmax_LED , 0 ) ;

if ( ( Y_POS > 512 - 512 * OFFSET ) && ( Y_POS < 512 + 512 * OFFSET ) ) < // Y軸方向のセンター(512)の前後OFFSET分はLEDを消灯

analogWrite ( Ymin_LED , 0 ) ; analogWrite ( Ymax_LED , 0 ) ; if ( X_POS = 512 + 512 * OFFSET ) < // スティックを右に倒したときの動作 DUTY = map ( X_POS , 512 + 512 * OFFSET , 1023 , 0 , 255 ) ; // デューティー比を0~255の範囲に調整 analogWrite ( Xmax_LED , DUTY ) ; analogWrite ( Xmin_LED , 0 ) ; if ( Y_POS = 512 + 512 * OFFSET ) < // スティックを下に倒したときの動作 DUTY = map ( Y_POS , 512 + 512 * OFFSET , 1023 , 0 , 255 ) ; // デューティー比を0~255の範囲に調整 analogWrite ( Ymax_LED , DUTY ) ; analogWrite ( Ymin_LED , 0 ) ; Serial . print ( "X: " ) ; // シリアルモニタにそれぞれの値を出力 Serial . print ( X_POS ) ; Serial . print ( " Y: " ) ; Serial . print ( Y_POS ) ; Serial . print ( " SW: " ) ; Serial . println ( SW_POS ) ; delay ( 100 ) ; 【Arduino入門編③】PWM制御でLEDをゆっくり点灯&消灯させてみる!アナログ出力(PWM)の解説その①

上記スケッチについて少し解説しておきます。 センター付近のバラツキがあるのでこれを少し補正しています。 OFFSETという変数を作りセンター付近の判定をあまくしています。 本来のセンターポジションでのアナログ値は512が理想的ですが少しズレていて値もフラフラと定まらないので前後5%のオフセットを取ってこの範囲は誤差として無視する(LEDが光らないように)ようにしています。

analogWrite関数を使ったデューティー比は0~255の範囲で指定! 今回4本の赤色LED(上下左右)はPWM出力ができる3・5・9・10番ピンを使っています。

ここでこのスケールを合わせるために便利なmap関数を使っています。 このmap関数を使いそれぞれスティックの向きに応じたアナログ値をanalogWrite関数で出力できるPWM(0〜255)の範囲でレンジを調整しています。

if ( X_POS
📎📎📎📎📎📎📎📎📎📎