子供と一緒に始める マイコンプログラム Arduino 入門 ジョイスティック編 Lesson13

Arduino-lesson13-00 学習
「子供と一緒に始める マイコンプログラム Arduino 入門 ジョイスティック編 Lesson13」

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

本日はLesson 13 ジョイスティック編です。
※ゲーム機などのコントローラに使われているものです。

Arduino UNOでジョイスティックの使い方がわかれば色々なことができそうですね。

 

本Lesson解説で使用しているのはArduino互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

はじめに

今回は基本を理解したいと考えています。

Lessonを2回に分けて学習していきます。

 

ジョイスティックは基板がついたものを使用します。

2軸 ジョイスティック モジュール」として売られています。

 

ジョイスティックとは何か?

wikipediaによると下記となっています。

wikipedia ジョイスティック

ジョイスティックJoystick)は、コンピュータへの入力機器のうち、レバーによる方向入力が行えるものの総称。やや大型の本体を机上に置くか吸盤などで固定し、レバー部分だけを手で握って操作するものが多い。

 

Lesson 13目標

ジョイスティックで色々と遊ぶために、「2軸ジョイスティックの基本動作を理解」します。

また、ジョイスティックを動かし「2軸ジョイスティックから得られるデータを確認」しましょう。

最後に、本Lessonも、遊ぶというところが一番大事なところです。

 

準備

ではLessonの準備に取り掛かりましょう。

今回も部品は多くないので、すぐに実践に移ることができます。

 

必要なもの

 

今回下記は使用しません。

 

Jumper wireは今後も頻繁に利用します。

できれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

 

使用部品説明

2軸 ジョイスティック モジュールについて説明していきます。

2軸ジョイスティックは、「XとYの方向読み取り」を行うことができます。

また、センタークリック機能がありジョイスティックを押し込むことでGNDに接続されます。

では、さっそく実物を見ていきましょう。

 

2軸 ジョイスティック モジュール 仕様

下の写真が、2軸 ジ ョイスティック モジュールです。

今回購入したELEGOO UNO キットに合わせて梱包されています。

Arduino-lesson13-01

 

端子は全部で5つあります。

上から、GND5VVRxVRySWとなります。

項目内容
GNDGNDに接続
5V5Vに接続
VRxX軸方向の読み取り※1※2
VRyY軸方向の読み取り※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軸ジョイスティックのVRxVRyアナログ端子に接続します。

つないだ端子の情報をanalogRead(pin)関数で読み取ります。

analogRead(pin)は読み取った電圧値を0~1023の整数値を戻り値として返します。

ようするに、読み取った0V~5Vの電圧値を0~1023のデジタル値に変換することができるわけです。

ジョイスティックを動かすことによって、電圧は変化します。
その変化をanalogRead(pin)関数によってデジタル値に変換するということです。

AD変換するということですね。
※analog to digital converter

 

ポテンショメータと原理はまったく同じです。

異なるのは、扱うデータがX軸とY軸の2つになるだけです。

下記にanalogRead()によって2軸ジョイスティックから取得できる座標軸を示します。

Arduino-lesson13-02

 

アナログ入力に関しては下記で詳しく説明しています。

 

2軸ジョイスティック センタークリックの使い方

今回使用する2軸ジョイスティックにはセンタークリック機能があります。

ジョイスティックを押し込むことでGNDに接続されます。

ジョイスティックを「押した」、「押していない」の判断をすることが可能です。

 

この情報は、SWピンから読み取ることが可能です。

読み取りに使う関数はdigitalRead()です。

2軸ジョイスティックのSWピンの状態を読み取るということです。

押し込むと「GND」、通常は「OPEN」となっています。

pinMode()でプルアップ指定する。

または、digitalWrite()でHighにする。

いずれかの命令をスケッチすることで2値の値として判断することが可能です。
※2値で判断できるのでdigitalRead()を利用するわけです。

 

センタークリック機能を表にまとめると以下となります。

ジョイスティックの状態digitalRead()で読む値
通常(押し込んでいない状態)5V
※digitalWrite()で最初にHighにしておく
押し込むGND
※押し込むことでSWピンがGNDと接続される

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、ジョイスティックを動かしていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

回路図がこちら。

HORZ:VRx、VERT:VRyと読み替えてください。

Arduino-lesson13-03

 

こちらがブレッドボード図。
※F-M jumper wireのみで結線できます。

HORZ:VRx、VERT:VRyと読み替えてください。

Arduino-lesson13-04

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品はジョイスティック モジュールのみです。

ブレッドボードに挿すとジョイスティックが動かしずらいため、F-M Wireのみで接続しています。

Arduino-lesson13-11

 

拡大

Arduino-lesson13-12

 

使用するポートは、アナログ入力ピンの「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軸,電圧の読み取り
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秒の遅延
}

遅延は、実際に利用する用途に合わせて指定してください。

アナログ入力の読み取りには100マイクロ秒(0.0001秒)要します。
最大の読み取りレートは,1秒間に10000回(1万回)可能です。

 

動作確認

では、さっそく動作を確認していきます。

2軸ジョイスティックを動かしてX軸、Y軸の値および電圧値を確認します。

結果はこちら。
※IDEの「ツール」⇒「シリアルモニタ」を開いて確認してください。

ジョイ
スティック
(X軸,Y軸)
Switch状態
測定値
センター
(511,511)
Switch = 1
Arduino-lesson13-05

(0,511)
Switch = 1
Arduino-lesson13-06

(511,0)
Switch = 1
Arduino-lesson13-07

(1023,511)
Switch = 1
Arduino-lesson13-08

(511,1023)
Switch = 1
Arduino-lesson13-09
センター
クリック
押す
Switch = 0
Arduino-lesson13-10

センターにいる場合、(X軸,Y軸):(511,511)あたりにいるはずです。

私の持っている2軸ジョイスティックはY軸が少しずれています・・・。

遊びに使う分には許容範囲でしょう。

 

ジョイスティックの動きでX軸、Y軸が読み取れているのがわかります。

出力電圧も一緒に表示させたので、可変抵抗器のイメージがつくのではないでしょうか。

Lesson12のポテンショメータと同じですね。

 

ジョイスティックを「↖」、「↗」、「↘」、「↙」としたらどうなるでしょうか?
ぜひ、確かめてみてください!

 

ジョイスティックを使えば、何か楽しそうなことができそうですよね。

「何をしようか?」と考えるのも楽しみの一つです!

 

まとめ

今回は以下の内容について理解してもらいました。

今回も項目3の遊ぶことが一番の目標でした。

1.「2軸 ジョイスティック」の基本動作を理解する。
2.「2軸ジョイスティック」から得られるデータを確認する。
3.楽しんで遊ぶ。

 

いかがだったでしょうか。

Lesson 13 ジョイスティック編はここまで。

ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。

 

2軸ジョイスティックの基本は理解できました。

「ジョイスティック」これから何に使おうか?

考えるだけで楽しいですよね!

 

次回Lesson 14は2軸ジョイスティック+αのスケッチを作ってみたいと考えています。

疑問点、質問などありましたら気軽にコメントください。

 

本Lessonで使用しているUNOはAmazonにて購入可能です。

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

ELEGOO Arduino用UNO R3 最終版スタータキット UNOチュートリアル付 (63 Items)

コメント