Arduino 入門
Lesson 13
【ジョイスティック編】(1)
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本日はLesson 13 ジョイスティック編です。
※ゲーム機などのコントローラに使われているものです。
Arduino UNOでジョイスティックの使い方がわかれば色々なことができそうですね。
本Lesson解説で使用しているのはArduino互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
はじめに
今回は基本を理解したいと考えています。
Lessonを2回に分けて学習していきます。
ジョイスティックは基板がついたものを使用します。
「2軸 ジョイスティック モジュール」として売られています。
ジョイスティックとは何か?
wikipediaによると下記となっています。
ジョイスティック(Joystick)は、コンピュータへの入力機器のうち、レバーによる方向入力が行えるものの総称。やや大型の本体を机上に置くか吸盤などで固定し、レバー部分だけを手で握って操作するものが多い。
Lesson 13目標
ジョイスティックで色々と遊ぶために、「2軸ジョイスティックの基本動作を理解」します。
また、ジョイスティックを動かし「2軸ジョイスティックから得られるデータを確認」しましょう。
最後に、本Lessonも、遊ぶというところが一番大事なところです。
準備
ではLessonの準備に取り掛かりましょう。
今回も部品は多くないので、すぐに実践に移ることができます。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- 2軸 ジョイスティックモジュール
- F-M Jumper wire
今回下記は使用しません。
Jumper wireは今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
使用部品説明
2軸 ジョイスティック モジュールについて説明していきます。
2軸ジョイスティックは、「XとYの方向読み取り」を行うことができます。
また、センタークリック機能がありジョイスティックを押し込むことでGNDに接続されます。
では、さっそく実物を見ていきましょう。
2軸 ジョイスティック モジュール 仕様
下の写真が、2軸 ジ ョイスティック モジュールです。
今回購入したELEGOO UNO キットに合わせて梱包されています。
端子は全部で5つあります。
上から、GND、5V、VRx、VRy、SWとなります。
項目 | 内容 |
---|---|
GND | GNDに接続 |
5V | 5Vに接続 |
VRx | X軸方向の読み取り※1※2 |
VRy | Y軸方向の読み取り※1※2 |
SW | センタークリック プッシュ時GNDに接続、非プッシュ時はオープン |
※1 可変抵抗:10kΩ×2(X-Y軸は並列接続されています)
※2 出力(VRx/VRy):センターポジションで電源電圧の2分の1の電圧
手持ちがない方は以下からどうぞ。
Arduino用として販売されていますので問題なく使用できます。
2軸ジョイスティック モジュール 原理
ジョイスティックモジュール自体の原理は単純で、可変抵抗器を利用しています。
可変抵抗器といえば、ポテンショメータですよね。
Lesson12ポテンショメータ編で「可変抵抗器ですよ!」と説明しました。
その可変抵抗器が、縦(Y軸)と横(X軸)についているイメージです。
※可変抵抗:10kΩ×2(X-Y軸は並列接続されています)
内蔵されている抵抗に電圧をかけた状態でジョイスティックを動かします。
その動作によって抵抗値の比率が変わります。
そのため、端子から取り出せる電圧が変わります。
※出力(VRx/VRy):センターポジションで電源電圧の2分の1の電圧
取り出した電圧はアナログ入力端子でデジタル値に変換することで信号として利用することができます。
ジョイススティックの場合、その可変抵抗器がX軸とY軸に入っているとイメージしてもらえれば良いです。
2軸ジョイスティック X軸、Y軸の使い方
2軸ジョイスティックのVRx、VRyをアナログ端子に接続します。
つないだ端子の情報をanalogRead(pin)関数で読み取ります。
analogRead(pin)は読み取った電圧値を0~1023の整数値を戻り値として返します。
ようするに、読み取った0V~5Vの電圧値を0~1023のデジタル値に変換することができるわけです。
その変化をanalogRead(pin)関数によってデジタル値に変換するということです。
AD変換するということですね。
※analog to digital converter
ポテンショメータと原理はまったく同じです。
異なるのは、扱うデータがX軸とY軸の2つになるだけです。
下記にanalogRead()によって2軸ジョイスティックから取得できる座標軸を示します。
アナログ入力に関しては下記で詳しく説明しています。
2軸ジョイスティック センタークリックの使い方
今回使用する2軸ジョイスティックにはセンタークリック機能があります。
ジョイスティックを押し込むことでGNDに接続されます。
ジョイスティックを「押した」、「押していない」の判断をすることが可能です。
この情報は、SWピンから読み取ることが可能です。
読み取りに使う関数はdigitalRead()です。
2軸ジョイスティックのSWピンの状態を読み取るということです。
押し込むと「GND」、通常は「OPEN」となっています。
pinMode()でプルアップ指定する。
または、digitalWrite()でHighにする。
いずれかの命令をスケッチすることで2値の値として判断することが可能です。
※2値で判断できるのでdigitalRead()を利用するわけです。
センタークリック機能を表にまとめると以下となります。
ジョイスティックの状態 | digitalRead()で読む値 |
通常(押し込んでいない状態) | 5V ※digitalWrite()で最初にHighにしておく |
押し込む | GND ※押し込むことでSWピンがGNDと接続される |
実践 回路作成とコード作成
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、ジョイスティックを動かしていきましょう。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
回路図がこちら。
こちらがブレッドボード図。
※F-M jumper wireのみで結線できます。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品はジョイスティック モジュールのみです。
ブレッドボードに挿すとジョイスティックが動かしずらいため、F-M Wireのみで接続しています。
■拡大
使用するポートは、アナログ入力ピンの「A0」,「A1」、デジタル入出力ピン「7」。
電源の「5V」、「GND」です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
本記事のコードを参考に書いてみてください。
実際書いてみた方が慣れるのに良いです。
コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。
コマンド説明
何度も書くことで覚えることができます。
今回は、復習を兼ねて説明済みのコマンドも説明します。
コマンド | 説明 |
---|---|
const | 変数を読み取り専用にします。 これを設定した変数は値を変更することはできません。 例:const int sw_pin = 7; sw_pin変数を7で固定。 |
int | -32768から32767の値の範囲を取る整数型を意味します。 例:int val; valを上記値の範囲での整数型と定義するということです。 |
float | 浮動小数点を持つ数値のためのデータ型。 ※小数が扱えます。 整数よりも分解能が高いアナログ的な値が必要なときに使用。 使用可能な値の範囲:3.4028235E+38~-3.4028235E+38 ※32ビット(4バイト)のサイズ 例:float val; val変数を不動小数点のデータ型にする。 |
Serial.begin(speed) | シリアル通信のデータ転送レートをbpsで指定。 ※bpsはビット/秒 speed:転送レート(int) |
pinMode(pin,mode) | 指定したピンが入力なのか出力なのかを指定します。 mode:INPUT指定で入力、内部プルアップ無効 mode:INPUT_PULLUP指定で入力、内部プルアップ有効 mode:OUTPUT指定で出力 |
digitalWrite(pin,value) | HighまたはLowを指定したピンに出力します。 電源が5Vの場合 value:High指定で5V出力 value:Low指定で0V(GND)出力 ※指定したピンがINPUT指定されている場合 High指定で内部プルアップが有効 Low指定で内部プルアップが無効 |
digitalRead(pin) | 指定したピンの値を読み取ります。 その結果はHIGHまたはLOWとなります。 例:val = deitalRead(pin) 変数valに入力ピンの状態が入ります。 |
analogRead(pin) | アナログ値を読み取るアナログ入力ピンを指定。 pin:0,1,2,3,4,5のいずれかを指定 ※A0,A1,A2,A3,A4,A5と指定してもOK 例:analogRead(3) アナログ入力ピンに3番を指定する。 |
サンプルコード
サンプルコードを下記に示します。
下記pinMode設定のところは、好みかと思います。
ちなみに、プルアップ指定をした方が命令コマンドが少なくて済みます。
//Lesson 13 2軸ジョイスティック編 //X軸,Y軸,電圧の読み取り //https://omoroya.com/ const int sw_pin = 7; //SWピンをデジタルIOの7へ接続 const int x_pin = A0; //X軸の出力をアナログA0へ接続。0でもOK const int y_pin = A1; //Y軸の出力をアナログA1へ接続。1でもOK int sw_state = 0; //初期状態設定。 int x_pos = 0; //初期状態設定。 int y_pos = 0;//初期状態設定。 float x_convert = 0.0f; //計算値の変数設定、オーバーフローしないようにflaot設定 float y_convert = 0.0f; //計算値の変数設定、オーバーフローしないようにflaot設定 void setup() { pinMode(sw_pin, INPUT_PULLUP); //デジタルIOの7をinput指定とプルアップ //上記の1行は下記2行でも置き換え可能です。 //pinMode(sw_pin, INPUT); //デジタルIOの7をinput指定 //digitalWrite(sw_pin, HIGH);デジタルIOの7からHighを出力、プルアップが機能します。 Serial.begin(9600); //シリアル通信のデータ転送レートを9600bpsで指定。bpsはビット/秒。 } void loop() { sw_state = digitalRead(sw_pin); //ジョイスティックのセンタークリックの状態の読み出し x_pos = analogRead(x_pin); //X軸の読み出し y_pos = analogRead(y_pin); //Y軸の読み出し x_convert = (float)x_pos / 1023.0f * 5.0f; //読み取った値を電圧に変換、floatで計算 y_convert = (float)y_pos / 1023.0f * 5.0f; //読み取った値を電圧に変換、floatで計算 // 以下シリアルモニタに表示 Serial.print("Switch: "); Serial.print(sw_state); Serial.println(); Serial.print("X / Voltage: "); Serial.print(x_pos); Serial.print(" / "); Serial.print(x_convert); Serial.println(); Serial.print("Y / Voltage: "); Serial.print(y_pos); Serial.print(" / "); Serial.print(y_convert); Serial.println(); delay(500); //0.5秒の遅延 }
遅延は、実際に利用する用途に合わせて指定してください。
動作確認
では、さっそく動作を確認していきます。
2軸ジョイスティックを動かしてX軸、Y軸の値および電圧値を確認します。
結果はこちら。
※IDEの「ツール」⇒「シリアルモニタ」を開いて確認してください。
ジョイ スティック (X軸,Y軸) Switch状態 |
測定値 |
---|---|
センター (511,511) Switch = 1 |
|
← (0,511) Switch = 1 |
|
↑ (511,0) Switch = 1 |
|
→ (1023,511) Switch = 1 |
|
↓ (511,1023) Switch = 1 |
|
センター クリック 押す Switch = 0 |
センターにいる場合、(X軸,Y軸):(511,511)あたりにいるはずです。
私の持っている2軸ジョイスティックはY軸が少しずれています・・・。
遊びに使う分には許容範囲でしょう。
ジョイスティックの動きでX軸、Y軸が読み取れているのがわかります。
出力電圧も一緒に表示させたので、可変抵抗器のイメージがつくのではないでしょうか。
Lesson12のポテンショメータと同じですね。
ジョイスティックを使えば、何か楽しそうなことができそうですよね。
「何をしようか?」と考えるのも楽しみの一つです!
まとめ
今回は以下の内容について理解してもらいました。
今回も項目3の遊ぶことが一番の目標でした。
2.「2軸ジョイスティック」から得られるデータを確認する。
3.楽しんで遊ぶ。
いかがだったでしょうか。
Lesson 13 ジョイスティック編はここまで。
ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。
2軸ジョイスティックの基本は理解できました。
「ジョイスティック」これから何に使おうか?
考えるだけで楽しいですよね!
次回Lesson 14は2軸ジョイスティック+αのスケッチを作ってみたいと考えています。
疑問点、質問などありましたら気軽にコメントください。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント