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

Arduino-lesson14-00.jpg 学習
スポンサーリンク
「子供と一緒に始める マイコンプログラム Arduino 入門 ジョイスティック編(2) Lesson14」

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

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

本日はLesson 14 ジョイスティック編2です。
※Lesson 13 ジョイスティック編の続編です。

Lesson 13でジョイスティックの基本を学習しました。

Lesson 14では、ジョイスティックから得られる値を利用することを学習します。

 

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

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

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

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

 

スポンサーリンク

はじめに

今回はジョイスティックから得られる値を利用します。

Lesson13に続いての第2弾となります。

 

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

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

 

Lesson 14目標

Lesson 13では「2軸ジョイスティックの基本動作」を学習しました。

Lesson 14では、「ジョイスティックから得られる値を利用する」ことを理解します。

 

また、「得られる値を利用して、4色のLEDを制御する」ことを理解します。

Lesson 14で学習したことを応用すれば、何かをジョイスティックで動かすといったことができるようになります!

 

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

 

準備

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

今回も多少部品が多いですが、ぜひ挑戦してみてください!

今回も楽しめるはずです。

 

必要なもの

 

LED、抵抗、Jumper wire、は今後も頻繁に利用します。

色々な種類が入ったセットのものがおすすめです。

 

抵抗のセット

 

LEDのセット

 

Jumper wireセット

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

 

使用部品説明

2軸 ジョイスティック モジュールの詳細はLesson 13を確認してください。

子供と一緒に始める マイコンプログラム Arduino 入門 ジョイスティック編 Lesson13
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 13 ジョイスティック編です。2軸ジョイスティックを利用してX軸、Y軸、電圧値を読み取ることで2軸ジョイスティックの動作を理解します。ジョイスティックの基本を理解して応用につなげていきましょう!

 

2軸ジョイスティック 復習

復習を兼ねて、写真のみ載せておきます。
※詳細はLesson 13にて説明しています。

Arduino-lesson13-01

 

こちらも復習として端子表を記載しておきます。

上から、GND5VVRxVRySWとなります。

項目内容
GNDGNDに接続
5V5Vに接続
VRxX軸方向の読み取り※1※2
VRyY軸方向の読み取り※1※2
SWセンタークリック
プッシュ時GNDに接続、非プッシュ時はオープン

※1 可変抵抗:10kΩ×2(X-Y軸は並列接続されています)
※2 出力(VRx/VRy):センターポジションで電源電圧の2分の1の電圧

 

こちらも復習。

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

Arduino-lesson13-02

 

手持ちがない方は以下からどうぞ。

Arduino用として販売されていますので問題なく使用できます。

 

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

 

次に、LEDと抵抗についても復習しておきましょう。

LED、抵抗についてはLesson 03で詳しく解説しています。

子供と一緒に始める マイコンプログラム Arduino 入門 ダイオードの輝度変更編 Lesson 03
本Lessonでは、抵抗とLEDを使いLEDの輝度を変更する。作業を通してUNOの5V電源ポートの存在と、ブレッドボードの使い方を覚える。子供には、抵抗の大きさが変わることにより回路に流れる電流の大きさが変わるということを、LEDの輝度の変化によって体験してもらいたいと思います。

 

LED 復習

本Lessonでは、4色のLEDをジョイススティックで制御する目的で使用します。

LEDは長い方が「+」、短い方が「-」となります。

向きを間違えて接続すると点灯しません。

 

LEDに大電流を流すと、焼き切れてしまいます。
直接電源に接続することはしないようにしましょう。
必ず、抵抗などで電流を制限して使いましょう。

 

抵抗 復習

LEDに流す電流を制限するために抵抗を使います。

LEDが焼き切れないようにするためです。

抵抗にはLEDと違って向きはありません。

抵抗には色がついたストライプがついています。

そのストライプの色によって抵抗値を知ることができます。

Arduino-color-code

 

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

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

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

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

 

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

 

回路図

下に回路図を示します。

LEDの「-」端子と「GND」の間に220Ωの抵抗があることに注目してください。

この抵抗でLEDが焼き切れないように電流を制限しています。

電流値は最大でも「5V÷220Ω=約23mA」となります。

また、UNOの端子は最大電流の規格が決まっています。

番外編02」で確認してみてください。

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

Arduino-lesson14-01

 

こちらがブレッドボード図。

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

Arduino-lesson14-02

 

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

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

 

接続

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

部品は「2軸ジョイスティック」、「LED」、「抵抗」です。
※右端にある抵抗を忘れないでください!!

Arduino-lesson14-03

 

接続部分を拡大

Arduino-lesson14-04

Arduino-lesson14-05

 

 

使用するポートは、アナログ入力ピンの「A0」,「A1」。

デジタル入出力ピン「2」、「3」、「4」、「5」、「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番を指定する。
if(判定式){
動作A;
}else{
動作B;
}
判定式
a==b:aとbは等しい
a!=b:aとbは等しくない
a<b:aはbより小さい
a>b:aはbより大きい
a<=b:aはb以下
a>=b:aはb以上動作A:判定式が真なら実行
動作B:判定式が偽なら実行
A && BAとBが両方が真の場合にTrue(真)を戻り値として返す。
AとBのいずれかでも偽の場合はfalse(偽)を戻り値として返す。

 

サンプルコード

サンプルコードを下記に示します。

今までより、少し長いです。

なるべく、簡略化せずわかりやすく書いたつもりです。
※もっと短く書くことも可能です。

コードの説明を読んで理解してみましょう!

//Lesson 14 2軸ジョイスティック編(2) X軸,Y軸,電圧の読み取り+LED点灯
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

const int led_R = 2; //右側LEDをデジタルIOピン2に割りあてる変数
const int led_U = 3; //上側LEDをデジタルIOピン3に割りあてる変数
const int led_L = 4; //左側LEDをデジタルIOピン4に割りあてる変数
const int led_D = 5; //下側LEDをデジタルIOピン5に割りあてる変数

int sw_state = 0; //初期状態設定。
int x_pos = 511; //初期状態設定。
int y_pos = 511;//初期状態設定。

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を出力、プルアップが機能します。

pinMode(led_R, OUTPUT); //デジタルIOピン2をOUTPUT設定
pinMode(led_U, OUTPUT); //デジタルIOピン3をOUTPUT設定
pinMode(led_L, OUTPUT); //デジタルIOピン4をOUTPUT設定
pinMode(led_D, OUTPUT); //デジタルIOピン5をOUTPUT設定

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で計算

//センタークリックを押さないでジョイスティックを倒すことに限定
//ジョイスティックを右に倒すと点灯
if ( sw_state == 1 && x_pos >= 766 ) {
digitalWrite(led_R, HIGH);
} else {
digitalWrite(led_R, LOW);
}

//ジョイスティックを上に倒すと点灯
if ( sw_state == 1 && y_pos <= 255) {
digitalWrite(led_U, HIGH);
} else {
digitalWrite(led_U, LOW);
}

//ジョイスティックを左に倒すと点灯
if ( sw_state == 1 && x_pos <= 255 ) {
digitalWrite(led_L, HIGH);
} else {
digitalWrite(led_L, LOW);
}

//ジョイスティックを下に倒すと点灯 
if ( sw_state == 1 && y_pos >= 766) {
digitalWrite(led_D, HIGH);
} else {
digitalWrite(led_D, LOW);
}

// 以下シリアルモニタ表示
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(100); //0.1秒の遅延,ジョイスティックの反応時間調整
}

遅延は、ジョイスティックの反応を感じながら調整してみてください。

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

 

動作確認

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

2軸ジョイスティックを動かしてLEDの点灯を確認します。

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

ジョイ
スティック
(X軸,Y軸)
Switch状態
測定値LED点灯位置
スジョイスティック位置
センター
(511,511)
Switch = 1
Arduino-lesson14-06Arduino-lesson14-13

(0,511)
Switch = 1
Arduino-lesson14-07Arduino-lesson14-14

(511,0)
Switch = 1
Arduino-lesson14-08Arduino-lesson14-15

(1023,511)
Switch = 1
Arduino-lesson14-09Arduino-lesson14-16

(511,1023)
Switch = 1
Arduino-lesson14-11Arduino-lesson14-17
センター
クリック
押す
Switch = 0
Arduino-lesson14-12LEDは消灯したままです。

 

ジョイスティックでLEDの点灯を制御できているのがわかりましたでしょうか?

ジョイスティックの動きで、LEDが点灯しています。

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

LEDの点灯によって、斜めを認識しているのがわかるはずです。

 

ここが案外「きも」というかコードの書き方によって変わる所です!
こんな簡単なコードでも実現可能なわけです。
if文のところを、よく見てみてください。

 

ジョイスティックで制御することができれば、色んなことができそうですね。

LED以外のものをつなげば・・・。

今度は「何をしようか?」、ますます楽しくなってきましたね。

 

まとめ

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

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

1.「ジョイスティックから得られる値を利用する」ことを理解する。
2.「得られる値を利用して4色のLEDを制御する」ことを理解する。
3.「楽しんで遊ぶ。」

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

 

Lesson 14 ジョイスティック編(2)はここまで。

本Lessonで学習したことを応用して色んなことを試してみてください。

「何かをジョイスティックで動かす」といったことができるようになります!

 

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

色々とできるようになると、想像力が膨らんで楽しみが増えます!

 

次回Lesson 15は赤外線受信モジュールで遊んでみたいと考えています。

子供と一緒に始める マイコンプログラム Arduino 入門 赤外線受信センサモジュール編 Lesson15
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 15 赤外線受信センサモジュール編です。家電製品のリモコンの信号を受信するための電子部品です。普段何気なく使っているリモコンから出ている信号を目で見える形にしてみましょう!

 

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

 

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

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

 

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

コメント

タイトルとURLをコピーしました