こんにちは、「メカのりまき」です。

この記事では、「ジョイスティック」の使用方法について、説明したいと思います。

本記事で使用するもの

本記事で私が使用した物は以下の通りです。

  • 「Arduino IDE2.1.0」をインストールしたPC(Windows11)
  • USBケーブル
  • Arduino Uno R3(ELEGOO UNO R3でも可)
  • ジョイスティック
  • LED
  • 抵抗器
  • ブレッドボード
  • ジャンパーワイヤー

「Arduino Uno R3」の互換ボードであれば、「ELEGOO UNO R3」以外のボードでも、本記事と同様な手順で動作可能だと思われますが、動作検証はしていないので、その点はご了承ください。

以下のリンクのスターターキットを購入した場合、上記で述べた使用するものは、PC以外すべて入手することができます。

Arduinoをまだ購入していないという方やArduinoで動かすことができるたくさんのパーツが欲しいという方は、購入を検討してみてください。

ジョイスティックの説明

ジョイスティックは、スティックを傾けることで、方向の入力が可能な部品です。

また、スティックを押し込むことで、スイッチの役割も果たすジョイスティックもあります。

上記で紹介したスターターキットの中には以下の写真のようなジョイスティックが入っています。

ジョイスティックの写真

上記のジョイスティックは、x軸とy軸の動きを検知するために、二つのポテンショメータを利用しています。

ジョイスティックのポテンショメータ

この2つのポテンショメータは、「GND」、「+5V」と書かれた線に繋がっており、さらに、それぞれのポテンショメータの真ん中の線が「VRx」、「VRy」という線に繋がっています。

ジョイスティックの接続

よって、「GND」、「+5V」を、Arduinoの「GNDピン」、「5Vピン」に繋いだ状態にし、「VRx」、「VRy」の電圧をアナログ入力で読み取ることで、各方向にどれだけスティックが傾いているかを読み取ることができます。

ここで、ポテンショメータやアナログ入力について、良く分からないという方は、以下のリンク先の記事で説明していますので、是非、ご覧になってください。

また、上記のジョイスティックは、スイッチも備わっており、スティックを押し込むことにより、スイッチの「ON」、「OFF」を切り替えることができます。

ジョイスティックのスイッチ

スイッチは「GND」と「SW」という線に繋がっているため、「GND」をArduinoの「GNDピン」に繋ぎ、「SW」の電圧をプルアップ付きのデジタル入力で読み取ることにより、スイッチの状態を読み取ることができます。

ここで、スイッチやプルアップ付きデジタル入力について、良く分からないという方は、以下のリンク先の記事で説明していますので、是非、ご覧になってください。

ジョイスティックを試す

では、初めに以下の画像のように、スティックの状態をシリアルモニタへ出力させる方法について、説明したいと思います。

スティックの状態を出力

空のスケッチを書き込む

回路を作成する前に、空のスケッチ(「ファイル」タブの「New Sketch」をクリックしたときに出てくる何の処理も書かれていないスケッチ)を書き込みます。

空のスケッチを書き込む

そうすることにより、前に書き込んだスケッチが、新しく作成しようとしている回路に影響を及ぼすことを防げます。

新しい回路を作成するときは、いつもこの作業をやっておくと、安全に回路を作成することができます。

回路を作成する

以下のような回路を作成してください。

ジョイスティックの状態をシリアルモニタに表示させる回路

アナログスティックの接続は、操作をしやすくするため、以下のように「オス-メス」のジャンパーワイヤーを使って接続しています。

ジョイスティックとオス-メスジャンパーワイヤー

(上記で紹介したスターターキットでは「オス-メス」のジャンパーワイヤーが10本くっついた状態で入っていますが、手で簡単に1本ずつに分けることができます。)

スケッチを書き込む

回路の作成が終わりましたら、以下のようなスケッチを書き込んでください。

スケッチの書き込みが終わりましたら、シリアルモニタを開き、入力部分の右に表示されている設定が「9600baud」、自動スクロールが「ON」になっているのを確認して、スティックを倒したり、押し込んだりしてみてください。

シリアルモニタの確認

スケッチと回路が正しければ、シリアルモニタに表示されている値が、スティックの動きに応じて変化していくのが確認できます。

スケッチの解説

このスケッチは、各ポテンショメータの電圧をアナログ入力で、スイッチの状態をプルアップ付きのデジタル入力で測定し、測定した値をシリアルモニタで表示させているものとなります。

スイッチの状態については、プルアップ付きのデジタル入力で測定しているので、スイッチが押し込まれていないとき「1」、押し込まれていないとき、「0」が表示されます。

アナログ入力は、電圧を0~1023(1024パターン)に変換して読み取ることができます。

アナログ入力ピンに接続した「VRx」、「VRy」は、スティックの位置に応じて、電圧が変化するので、スティックを動かすとアナログ入力で読み取った値が変化するという仕組みとなっています。

スティックの傾きと読み取れる値

ここで、スティックから手を離した際の位置(中央の位置)の場合、1024パターンの半分の位置である「511」もしくは「512」となることが予想されますが、以下のように実際には少しずれた値が表示されます。

スティックが中央のときの値

よって、中央を基準にどれだけスティックを傾けているのかを、検知したい場合は、測定した値が上記の中央の値からどれだけ離れているかを計算する必要があります。

次に節で説明するジョイスティックで複数のLEDを制御する方法では、中央を基準にどれだけスティックを傾けているのかを検知して、それに応じてLEDの点灯を制御するものとなっているので、上記の中央の値を利用します。

この中央の値は、スティックの種類が同じであっても、個体差により変わってくるので、引き続き説明をご覧になる方は、ご自分のスティックの中央の値「X:~」、「Y:~」をメモしておいてください。

ジョイスティックで複数のLEDを制御する

続いて、以下の動画のように、ジョイスティックを使って、複数のLEDを制御する方法について、説明をしたいと思います。

回路を作成する

以下のような回路を作成してください。

ジョイスティックで複数のLEDの点灯を制御する回路

配線が多いため、回路図がごちゃごちゃしていますが、各LEDのアノード(+)側を、Arduinoのデジタル入出力ピンやアナログ入力ピンに、LEDのカソード(-)側を、抵抗器を介してGNDに繋げています。

線が密集していますので、隣り合うLEDや抵抗器の線が、接触してしまわないように注意してください。

ここで、抵抗器の電気抵抗の高さは、LEDの順電圧と順電流から計算で求めます。

以下に、直列に繋げる抵抗器の電気抵抗の高さを計算するツールを用意しましたので、ご活用ください。

順電圧VF

[V]

順電流IF

[mA]

直列に繋げる抵抗器の電気抵抗

R = [Ω]

回路で使用する抵抗器は、上記のツールで求めた電気抵抗よりも少し高い電気抵抗のものを使用します。

上記のツールが行っている電気抵抗の計算方法については、以下のリンク先の記事で説明していますので、気になる方はご覧になってください。

ここで、電気抵抗の計算が行えない場合は、電気抵抗が高いもの(大体1[kΩ])から順番に接続していき、ちょうど良い明るさになるものを探していきます。

その際、電気抵抗を低いものにすれば、その分点灯が明るくなるのですが、電気抵抗が低すぎるもの(大体100[Ω]を下回るくらい)の場合、LEDの寿命を縮めてしまったり、破壊してしまったりすることがあるので注意してください。

今回、私はすべて220[Ω]の抵抗器を使用しています。

(真上からLEDを見ると結構眩しいです。眩しすぎると感じた場合は、電気抵抗の大きな抵抗器に変更するなどして明るさを調整してみてください。)

スケッチを書き込む

以下のようなスケッチを書き込んでください。

ここで、11行目、12行目の値は、先程のスケッチで確認したスティックが中央のときの値に変更してください。

スケッチと回路が正しければ、先程の動画のように、スティックの状態に応じて、LEDの点灯が変化することが確認できます。

点灯しないLEDがある場合は、LEDの向きが間違っていたり、ピンや抵抗器を差す位置がずれていたりしている可能性が高いので、まずは、接続を確認してみてください。

スケッチの解説

今回のスケッチでは、スティックの状態を検知するためのピンに加えて、「デジタル入出力ピン」を9本、「アナログ入力ピン」を3本、出力ピンとして設定し、LEDを制御しています。

「アナログ入力ピン」は名前のせいで、入力しかできないピンだと思われることがありますが、出力も行うことができます。

LEDに接続しているピンの番号は、15~18行目のように配列を使って各色ごとにまとめています。

各LEDに対してのピン番号

アナログ入力ピンの番号を指定する「A~」って、文字なのに、整数を入れる「int型」で良いのかと思われる方もいらっしゃると思いますが、実はこの「A~」というのは、「uint8_t型」の変数で、コンパイルの初めに、ボードの種類に合わせた整数が入れられています。

この「A~」の変数宣言は裏で行われていることなので、普段目にすることはできませんが、スケッチ内で、新しく「A~」という名前の変数を宣言しようとすると、「その変数の名前はすでに使われていますよ」というエラーが表示されます。

話は逸れましたが、続いて「void loop()」内の処理について、説明していきたいと思います。

「void loop()」内の処理では、まず、全てのLEDを消灯させ、その後、スイッチの状態に合わせて処理を分岐させています。

ここで、スイッチが押されているとき、真ん中付近のLEDから広がるようにLEDの点灯、消灯を行い、スイッチが押されていないときは、スティックの傾きに応じてLEDを点灯、消灯させています。

スイッチの状態による分岐

処理の分岐を行っている「if文」について、良く分からないという方は、以下のリンク先の記事で説明していますので、是非、ご覧になってください。

スイッチが押されていない場合、スティックの傾きに応じてLEDの点灯、消灯を行うために、また別のif文で処理を分岐させています。

if文の条件式は、読み取ったアナログ入力の値が、中央の値からどれだけずれているかを見ており、これにより、どのLEDを点灯させるかを決めています。

スティックの傾きとLEDの点灯

スティックを同じ位置で固定した場合、「void loop()」の初めでLEDを消灯しているので、LEDは素早く点滅している状態になりますが、その点滅は人間の目で確認できるようなものではありません。

しかし、点灯している時間と消灯している時間が同じくらいの場合、LEDの明るさは少し暗く見えてしまうので、「delay(5)」により点灯している時間を延ばし、明るく見せているということをしています。

LEDの明るさ調整

ジョイスティックを使って、複数のLEDを制御する方法についての説明は以上となります。

終わりに

ジョイスティックの使い方について、ご理解いただけたでしょうか。

今回説明したジョイスティックは、ポテンショメータ2つとスイッチ1つという、割と単純な部品の組み合わせでしたが、それだけでも色々なものを操作することができるすごく面白い部品だと思います。

ジョイスティックで何を操作するのかというのも、自由なので、色々な組み合わせを楽しんでみてください。

次回の記事では、光の強さを測定するときなどに利用する「フォトレジスタ」というものの使い方について説明したいと思います。

本記事はここまでです。ご清覧ありがとうございました。

広告

楽天モーションウィジェットとGoogleアドセンス広告です。

気になる商品がございましたら、チェックをしてみてください。