Arduinoにはボードに接続するだけで機能を拡張できる便利な『Shield(シールド)』と呼ばれる拡張ボードが多数あります。
ブレッドボードなどにわざわざ回路を組まなくても必要な機能を追加することが出来る便利な拡張ボードです。
例えばモーターを動かしたい場合にはモーターを駆動するためのドライバが必要となってきます。
モータードライバICを使い1から回路を組むのは結構大変となりますが、シールドを使えばArduinoボードに乗っけて接続するだけでその付加機能を加えることが出来ます。

用途により非常に便利に使えるシールドですが、Arduinoで使えるシールドは多数販売されています。
今回はArduinoボードで使える『ジョイスティックシールド(Joystick Shield)』をご紹介したいと思います。
Arduinoで動作テストする場合にジョイスティックやタクトスイッチ、無線モジュールを使うことはよくあります。
これらの接続は配線自体は簡単ですが、Arduinoに繋げたブレッドボードに多くのジャンパーワイヤーで接続する必要があったりと結構面倒となってきます。
複数のワイヤー接続では動作テストなどで動かす場合、ワイヤーの脱落等による接触不良もよく起こります。
これらの接続をシンプルにまとめることが出来るのが『ジョイスティックシールド』となります。
1つのアナログジョイスティックに計6個のタクトスイッチ、さらに無線モジュールnRF24L01やNokia LCDディスプレイなどが接続できる端子を備えたものとなります。
ファミコンのコントローラーみたいな感じですね!
ジョイスティックやタクトスイッチ、無線モジュールなどこれだけの数をArduinoに接続しようと思うとそれぞれ単品パーツでの接続では結構なワイヤー数の接続になってしまいます。
そのため、このようなコントローラーを以前3Dプリンタで作り使ってます。
ジョイスティックシールドでは、同様なことがArduinoボードに挿し込むだけで使えるようになります。
テスト動作させる場合などで便利に使えそうですね!
ジョイスティックシールドの内部配線(回路)は単純にArduinoボードのI/Oピンにボード上のスイッチが繋がっているだけなので、シールド用の専用ライブラリなどを使う必要もなく簡単に使えるシンプル構成なのもいいと思います。(無線モジュールを使う場合はnRF24L01用のライブラリを使う必要があります)
これまでArduinoを使った4足歩行ロボットやロボットカー、ロボットアームなどを作ってきましたが、操作する側(送信側)のジョイスティックやスイッチ、無線モジュールの接続が結構面倒だったんですが、これらをシンプルに接続でき動作させることが出来るため便利に使えています。
目次
【Arduino】ジョイスティックシールドを使ってみる!
こちらがジョイスティックシールドとなります。
結構古いシールドのようで、バージョンがいくつかあるようです。
Amazonでたまたま見つけて購入したものですが、商品サイトのものと少し仕様が異なっているものが来ました!
ジョイスティックシールドには、Bluetoothモジュール接続端子やI2C機器接続端子が付いているものもあるようですが、届いたものにはこの2つの出力端子がカット(バージョンが古いのか?)されているものでした。
特にこの2つの出力端子は私の場合使う予定はなかったので問題ないのですが・・・
このシールド自体の内部配線は特別なハードが追加されたものではなく単純にArduinoボードのI/Oピンを各スイッチや出力端子に接続しているだけなので、空いているピンを使えばもちろんそれらの接続が出来るので問題ないと思います。
接続はArduinoボードに接続するだけです。
Arduino Unoに接続するとこんな感じ。
シールドの右側がUnoボードより少し出っ張ります。
Arduino Megaに接続するとちょうどいい感じになります!
簡易的なコントローラーとして使う場合、こちらの方がホールド感はいいようですね!
ボード上のスライドスイッチで供給する電圧を切り替えることが出来ます。(3.3V or 5V)
Arduino UnoやMegaで使う場合は5V設定です。
電源を投入するとボード上のLEDが点灯します。
ボード上のボタン&端子等の配置
まずジョイスティックシールドに搭載されているボタンと接続端子を見ていきます。
[Aボタン][Bボタン][Cボタン][Dボタン]の4つのタクトスイッチに、[Eボタン][Fボタン]の2つの小さなタクトスイッチ、そしてX方向・Y方向の2軸アナログジョイスティックが配置されています。ジョイスティックは押し込みによるON/OFF判定できるタクトスイッチが内蔵されたタイプのものとなります。
その他の接続端子は、無線モジュールnRF24L01接続端子とLCDモジュール(Nokia 5110)接続端子が搭載されています。
また、上記物理ボタンにパラで接続されそれらの状態を確認するためのテスト端子も搭載されています。
私の手元にあるジョイスティックシールドには付いていませんが、I2C端子とBluetooth接続端子が付いたものもあるようです。(バージョン違いかな?)
ちなみに、Buetooth端子の4ピンは3.3V/GND/RX/TXに接続され、I2C端子の4ピンは5V/GND/SCL/SDAに接続されているようです。
これら端子がないバージョンでもRX/TXはD0/D1、SCL/SDAはA4/A5ピンは空いているのでそれら端子を使って接続すれば同様に使うことが出来ます。
ジョイスティック&タクトスイッチの接続ピン
物理ボタンが接続されているピンを確認しておきます。
まず大きなタクトスイッチA~Dボタンです。
[ボタンA]はデジタルピンD2に接続され、[ボタンB]はD3、[ボタンC]はD4、[ボタンD]はD5に接続されています。
そして2つの小さなタクトスイッチ、[ボタンE]はD6、[ボタンF]はD7に接続されています。
次にジョイスティックです。
ジョイスティックの[X軸ポテンショメータ]はアナログピンA0に接続され、[Y軸ポテンショメータ]はA1に接続されています。
[ジョイスティック押しボタン]はD8に接続されています。
物理ボタンの接続ピンをまとめるとこのような接続になっています。
ボード上のボタン | Arduino接続ピン |
ボタンA(上) | D2 |
ボタンB(右) | D3 |
ボタンC(下) | D4 |
ボタンD(右) | D5 |
ボタンE | D6 |
ボタンF | D7 |
ジョイスティック押しボタン | D8 |
ジョイスティックX軸 | A0 |
ジョイスティックY軸 | A1 |
動作確認
シリアルモニタにそれぞれ接続ピンの状態を表示させ動作確認してみたいと思います。
シリアルモニタの接続はこちらの記事を参考にして下さい。

動作確認用の簡単なスケッチを作ってみました。
シリアルモニタにジョイスティックやボタンの状態を表示させるものとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | // [Arduino]ジョイスティックシールドを使ってみる! // https://burariweb.info const int button_A = 2; const int button_B = 3; const int button_C = 4; const int button_D = 5; const int button_E = 6; const int button_F = 7; const int button_joystick = 8; const int analog_X = A0; const int analog_Y = A1; void setup() { Serial.begin(9600); pinMode(button_A, INPUT_PULLUP); pinMode(button_B, INPUT_PULLUP); pinMode(button_C, INPUT_PULLUP); pinMode(button_D, INPUT_PULLUP); pinMode(button_E, INPUT_PULLUP); pinMode(button_F, INPUT_PULLUP); pinMode(button_joystick, INPUT_PULLUP); } void loop() { Serial.print(" A: "); Serial.print(digitalRead(button_A)); Serial.print(" B: "); Serial.print(digitalRead(button_B)); Serial.print(" C: "); Serial.print(digitalRead(button_C)); Serial.print(" D: "); Serial.print(digitalRead(button_D)); Serial.print(" E: "); Serial.print(digitalRead(button_E)); Serial.print(" F: "); Serial.print(digitalRead(button_F)); Serial.print(" Joy: "); Serial.print(digitalRead(button_joystick)); Serial.print(" "); Serial.print("X: "); Serial.print(analogRead(analog_X)); Serial.print(" Y: "); Serial.println(analogRead(analog_Y)); } |
各ボタンはデジタルピンに接続されているだけなのでプルアップして使っています。
プルアップしているので押されていない時は「1(HIGH)」となり、スイッチが押されると「0(LOW)」となります。
プルアップやデジタル入出力ピンのON/OFF判定に関してはこちらの記事を参考にして下さい。

またジョイスティックの値はアナログ値の取得となります。
Arduinoでは10ビットの分解能を持っているので0~1023の数値として取得されます。
ジョイスティックのアナログ値の取得方法などはこちらの記事を参考にして下さい。

搭載されているボタンがArduinoのI/Oピンに接続されているだけのシールドなので動作は非常に簡単ですね!
接続されているピンさえ把握していれば、専用のライブラリを使う必要もないのでテスト環境などでサクッと簡単に接続でき便利に使えます。
接続例
物理ボタンの状態をシリアルモニタで確認することが出来ました。
簡単な接続例を見ておきます。
先述のようにジョイスティックシールドはボード上の物理ボタンがArduinoのI/Oピンに接続されているだけの簡単な構成のものとなっています。
物理スイッチで使っているデジタルピンD2~D8およびアナログピンA0~A1以外のピンは全て空いています。
空いているデジタルピンにLEDを接続し簡単な動作テストをしてみます。
デジタルピンD9~D13とアナログピンA2~A3の合計8本にLEDを接続しボタンのON/OFFでそれぞれのLEDを点灯させてみました。
非常に簡単ですね!
無線モジュールnRF24L01の接続
このシールドが便利なのは、無線モジュールnRF24L01を接続するための専用端子が用意されているところです。
難しい接続ではないのですが、直接Arduinoボードに接続しようと思うとこれが結構面倒なんですよね!
nRF24L01用の接続端子が付いているのでそのまま挿し込むだけで使えます。
nRF24L01はSPIにより接続して使うモジュールとなります。
SPIで使われる接続ピンはボードによって決まっていますが、Arduino UnoではデジタルピンD9~D13を使います。(CE/CSN端子はこのシールドではD9/D10に接続されています)
無線モジュールnRF24L01について詳しくはこちらの記事を参考にして下さい。

nRF24L01 | Arduino接続ピン |
CE | D9 |
CSN | D10 |
SCK | D13 |
MOSI | D11 |
MISO | D12 |
そのためMegaにジョイスティックシールドを接続して使う場合、nRF24L01モジュールの使用が出来ないようです!
無線モジュールnRF24L01と組み合わせて使えば、ボタンやジョイスティックの状態を受信側に送信し動かすことが出来ます。
簡単に簡易的な無線コントローラーとして使うことが出来るということですね!
上記記事に複数動作の送信はどのようにしたら?といった問い合わせを頂いたので、あまりきれいなスケッチではありませんが残しておきます。
各ボタンの状態を順に送信し、受信側も同様に順番にそれぞれの値を読み取り対応したLEDを点灯させています。(D2~D8)
無線モジュールの接続などは上記記事を参考にして下さい。
【送信側スケッチ】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | // [Arduino]ジョイスティックシールドを使ってみる! // nRF24L01モジュール接続[送信側] // https://burariweb.info #include <SPI.h> #include <RF24.h> RF24 radio(9, 10); const byte address[6] = "00001"; int joystick[9]; const int button_A = 2; const int button_B = 3; const int button_C = 4; const int button_D = 5; const int button_E = 6; const int button_F = 7; const int button_joystick = 8; const int analog_X = A0; const int analog_Y = A1; void setup(){ radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); pinMode(button_A, INPUT_PULLUP); pinMode(button_B, INPUT_PULLUP); pinMode(button_C, INPUT_PULLUP); pinMode(button_D, INPUT_PULLUP); pinMode(button_E, INPUT_PULLUP); pinMode(button_F, INPUT_PULLUP); pinMode(button_joystick, INPUT_PULLUP); Serial.begin(9600); } void loop(){ Getpos(); radio.write(&joystick, sizeof(joystick)); delay(50); } void Getpos() { joystick[0] = digitalRead(button_A); Serial.print(" A: "); Serial.print(joystick[0]); joystick[1] = digitalRead(button_B); Serial.print(" B: "); Serial.print(joystick[1]); joystick[2] = digitalRead(button_C); Serial.print(" C: "); Serial.print(joystick[2]); joystick[3] = digitalRead(button_D); Serial.print(" D: "); Serial.print(joystick[3]); joystick[4] = digitalRead(button_E); Serial.print(" E: "); Serial.print(joystick[4]); joystick[5] = digitalRead(button_F); Serial.print(" F: "); Serial.print(joystick[5]); joystick[6] = digitalRead(button_joystick); Serial.print(" Joy: "); Serial.print(joystick[6]); joystick[7] = analogRead(analog_X); Serial.print(" X: "); Serial.print(joystick[7]); joystick[8] = analogRead(analog_Y); Serial.print(" Y: "); Serial.println(joystick[8]); } |
【受信側スケッチ】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | // [Arduino]ジョイスティックシールドを使ってみる! // nRF24L01モジュール接続[受信側] // https://burariweb.info #include <SPI.h> #include <RF24.h> RF24 radio(9, 10); const byte address[6] = "00001"; int joystick[9]; void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { radio.read(&joystick, sizeof(joystick)); Serial.print(" A: "); Serial.print(joystick[0]); Serial.print(" B: "); Serial.print(joystick[1]); Serial.print(" C: "); Serial.print(joystick[2]); Serial.print(" D: "); Serial.print(joystick[3]); Serial.print(" E: "); Serial.print(joystick[4]); Serial.print(" F: "); Serial.print(joystick[5]); Serial.print(" Joy: "); Serial.print(joystick[6]); Serial.print(" X: "); Serial.print(joystick[7]); Serial.print(" Y: "); Serial.println(joystick[8]); if(joystick[0] == 1){ digitalWrite(2,LOW); } else if(joystick[0] == 0){ digitalWrite(2,HIGH); } if(joystick[1] == 1){ digitalWrite(3,LOW); } else if(joystick[1] == 0){ digitalWrite(3,HIGH); } if(joystick[2] == 1){ digitalWrite(4,LOW); } else if(joystick[2] == 0){ digitalWrite(4,HIGH); } if(joystick[3] == 1){ digitalWrite(5,LOW); } else if(joystick[3] == 0){ digitalWrite(5,HIGH); } if(joystick[3] == 1){ digitalWrite(5,LOW); } else if(joystick[3] == 0){ digitalWrite(5,HIGH); } if(joystick[3] == 1){ digitalWrite(5,LOW); } else if(joystick[3] == 0){ digitalWrite(5,HIGH); } if(joystick[3] == 1){ digitalWrite(5,LOW); } else if(joystick[3] == 0){ digitalWrite(5,HIGH); } if(joystick[4] == 1){ digitalWrite(6,LOW); } else if(joystick[4] == 0){ digitalWrite(6,HIGH); } if(joystick[5] == 1){ digitalWrite(7,LOW); } else if(joystick[5] == 0){ digitalWrite(7,HIGH); } if(joystick[6] == 1){ digitalWrite(8,LOW); } else if(joystick[6] == 0){ digitalWrite(8,HIGH); } } } |
ジョイスティックのアナログ値も使いサーボやモーターを動かしたりとスケッチを追加して使って頂ければと思います。
Nokia 5110 LCDモジュール
こちらは試せていませんが、ジョイスティックシールドにはLCDパネルを取り付ける事もできるようです。
Nokia 5110 LCDモジュールが接続できる専用ピンも搭載されています。
ただ、このLCDモジュールの接続でデジタルピンD9~D13を使用するため、上記nRF24L01無線モジュールでの使用ピンとかぶるのでこの2つの同時使用は出来なくなっています。
LCDモジュールも一緒に繋げたい場合は、nRF24L01をBluetoothアダプタに変更するか、またLCDモジュールをI2C接続のものに変更するかといったところだと思います。
I2C接続端子
次にI2C接続端子です。
今回ご紹介しているボードにはI2C端子が付いていませんでしたが、A4ピンA5ピンは空いているので接続することは出来ます。
I2C端子が付いているボードでは、SCL/SDA/GND/5Vのピンが配置されています。
Arduinoの対応するピンに接続されているだけなのでSDA/SCLはアナログピンA4/A5と接続すれば問題ありません。
通常のI2C接続と同じですね。
I2C通信に関してはこちらの記事を参考にして下さい。

Bluetoothモジュールの接続端子
無線通信をnRF24L01ではなくBluetoothモジュールでの接続も出来るようです。
こちらのボードではこのBluetooth端子が付いていませんでしたが、これも単純に3.3V5V/GND/RX/TXと接続されているだけなので、RX(D0)・TX(D1)の接続で問題ないと思います。
【追記】Bluetoothモジュールを試してみました!
簡単に簡易的なコントローラーとして使うことが出来るので便利なシールドですね!
上記nRF24L01無線モジュール以外に、Bluetoothモジュールも試してみました。
HC-05やHC-06 はBluetoothモジュールなので基本的に1対1でのやり取りとなりますが、通常のシリアルでのやり取りとなるため信号線はTX/RXの接続のみで出来るので比較的簡単に製作物に組み込むことが出来ました。
私の持っているジョイスティックシールドにはBluetooth端子が付いていないタイプのものでしたが、TX/RX/5V/GND端子に接続するだけなので同様に使えます。

テスト用端子
テスト用端子でしょうか?
各ボタン及びジョイスティックにパラ接続されている端子もあります。
基板上にシルクでプリントされている配列で各ボタンに繋がっています。
使用I/Oピン まとめ
ジョイスティックシールドで使用しているI/Oピンをまとめるとこのようになります。
ジョイスティック(押しボタン含め)および6つのタクトスイッチで、デジタルピンD2~8とアナログピンA0~A1が接続されています。
その他のピンは空いている状態なので使うことが出来ます。
そしてnRF24L01無線モジュールやNokia 5110 LCDモジュールを使用する場合、デジタルピンD9~D13が使用されます。
またI2C接続ではA4およびA5が使われ、Bluetooth接続ではD0とD1が使われることになります。
これら全てを接続することはあまりないと思いますが、これだけ接続しようと思うと結構な配線になるためシンプルにまとめることができるので便利なシールドだと思います。
ArduinoのI/Oピンにそれぞれが接続されているだけなので、接続で空いたポートは全て別用途で使用することが出来ということですね。
Arduino使用ピン | 使用用途 |
D0 | RX ※Bluetoothモジュール使用時 |
D1 | TX ※Bluetoothモジュール使用時 |
D2 | ボタンA |
D3 | ボタンB |
D4 | ボタンC |
D5 | ボタンD |
D6 | ボタンE |
D7 | ボタンF |
D8 | ジョイスティック押込みボタン |
D9 | CE(SPI) ※無線モジュール接続時 |
D10 | CSN(SPI) ※無線モジュール接続時 |
D11 | MOSI(SPI) ※無線モジュール接続時 |
D12 | MISO(SPI) ※無線モジュール接続時 |
D13 | SCK(SPI) ※無線モジュール接続時 |
A0 | ジョイスティックX軸 |
A1 | ジョイスティックY軸 |
A2 | [空き] |
A3 | [空き] |
A4 | SDA ※I2C機器接続時 |
A5 | SCL ※I2C機器接続時 |
【追記】nRF24L01を使ったArduino無線コントローラーを製作!
Arduinoのシールドは、接続するだけで機能を拡張する事ができ非常に便利に使えます!
このようなシールドタイプの物理コントローラーが1台あると、Arduinoを使った製作物を動かす際やテスト動作などでも便利に使うことが出来ます。
そして無線で操作する事が出来る物理コントローラーはあると便利なので、さらに機能を拡張したオリジナルのArduinoコントローラーを製作してみました。
この投稿をInstagramで見る

最後に!
専用ライブラリを使用する必要がないため、接続されているピンさえ把握しておけば便利に使える場面が多そうなシールドだと思います。
電子工作で作った製作物を動かす場合、ジョイスティックやタクトスイッチを接続するとなるとそれだけでArduinoに繋げる配線は結構な数になります。
簡単な構成のシールドとなりますが、配線をシンプルにできるので非常に便利となります。
特にnRF24L01無線モジュールを使った接続は便利だと思います。(技適が通っていないモジュールなので注意が必要?ですが!)
3.3V駆動のモジュールなのでそのことも意識しつつArduinoに直接ジャンパーワイヤーを使って接続しようと思うと配線の脱落など結構面倒となるモジュールなんですよねー!
専用端子があるのでしっかりと固定できるので使いやすくなります。
Arduinoのシールドは便利なのでいろいろと使っていますが、保管する時に出っ張ったピンヘッダーが邪魔になる事が多いと思います。
シールド用のピンヘッダーガードを作ったのでこちらもよかったら使って頂ければと思います。
これ結構便利なんですよー!









コメントを残す