\ AmazonにてArduino UNO R4 発売中!! /

Arduino 入門 Lesson 14 【ジョイスティック編】(2)

Arduino-lesson14-00.jpg Arduino入門編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 14
【ジョイスティック編】(2)

「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の準備に取り掛かりましょう。

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

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

 

必要なもの

 

ジョイスティックがすぐに欲しい場合はこちら。

 

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

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

短めが使いやすい場合も。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!

という方は、「電子工作基本部品セット」が使い勝手が良い。

 

使用部品説明

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

Arduino 入門 Lesson 13 【ジョイスティック編】(1)
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 13 ジョイスティック編です。2軸ジョイスティックを利用してX軸、Y軸、電圧値を読み取ることで2軸ジョイスティックの動作を理解します。ジョイス…

 

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

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

Arduino-lesson13-01

 

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

上から、GND5VVRxVRySWとなります。

項目 内容
GND GNDに接続
5V 5Vに接続
VRx X軸方向の読み取り※1※2
VRy Y軸方向の読み取り※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」で確認してみてください。

回路図:実体にあったパーツを入手できたので更新

joystick-schematic

 

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

ブレッドボード図:実体にあったパーツを入手できたので更新

joystick-breadboard

 

回路図は「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 && B AとBが両方が真の場合にTrue(真)を戻り値として返す。
AとBのいずれかでも偽の場合はfalse(偽)を戻り値として返す。

 

サンプルコード

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

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

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

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

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

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-06 Arduino-lesson14-06

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

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

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

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

 

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

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

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

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

 

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

 

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

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

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

 

まとめ

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

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

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

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

 

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

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

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

 

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

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

 

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

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

 

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

 

最後に

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

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

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

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

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

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

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分) 一般 プライム会員
5,000円~19,999円 0.5% 1.0%
2,0000円~39,999円 1.0% 1.5%
40,000円~89,999円 1.5% 2.0%
90,000円~ 2.0% 2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. 高橋 より:

    サンプルコードに
    if(sw_state == 0)
    {
    digitalWrite(led_R, HIGH);
    digitalWrite(led_U, HIGH);
    digitalWrite(led_L, HIGH);
    digitalWrite(led_D, HIGH);
    }
    と追記をしてみてプッシュスイッチを押してすべてのLEDの点灯を心がけてみたのですが、なぜかdigitalWrite(led_R, HIGH);の青色LEDのみ点灯しません。
    原因わかりますか?
    よろしくお願い致します。

    • omoroya omoroya より:

      本スケッチの回路図はLEDを4つ点灯させる仕様に対応していません。
      使用しているLEDの順電圧、順電流を確認してください。
      仮にお使いのLEDの順電圧(VF)が2.0Vだとすると、抵抗にかかる電圧は約3V。
      3V/220Ω=13.6mA
      現状この回路は13.6mAの電流しか流すことができません。
      220Ωの抵抗1つに対して並列に4つのLEDを接続した場合、電流供給能力が足りず4つ点灯させることはできません。
      例えばLEDの順電流が20mA必要な場合、20mA×4=80mA必要です。
      単純に4つ点灯させたいなら、LED、1つ1つに抵抗を直列につないでください。
      注意点として以下2つ。
      ・20 [mA] / IOピン を超えないこと。
      ・IOから供給する合計の電流値は100mAを超えないこと。
      上記以上のことをしたいなら、供給する電源は別構成とする。

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