Arduinoでアナログジョイスティックを使って仕組みを理解!ビジュアルプログラミングLESSON20
こんにちは、せでぃあ(@cediablog)です。
今回のArduinoプログラミングLESSON20では「アナログジョイスティックを使った、仕組みが分かる接続方法」を紹介します。
アナログジョイスティックと聞いて、ゲームのコントローラーを想像する方が多いと思います。
はい、今回扱うアナログジョイスティックもまさしく「それ」です。
ニンテンドースイッチや、プレイステーションで遊んだことがある方にはおなじみのアナログジョイスティック部分です。
今回はこのアナログジョイスティックをArduinoに接続して、ジョイスティックの仕組みと使い方を理解します。
今回は、液晶ディスプレイLCD1602に「アナログジョイスティックの入力値を表示させる」プログラムの作り方を紹介します。
今回液晶ディスプレイLCD1602の制御はI2Cを使ったシリアル通信を使います。
I2C通信を使ったLECディスプレイ表示方法については、こちらの記事にて詳しく解説しています。
本記事は、プログラミングと電子パーツの知識が習得できるプログラミング初心者にも安心して読んでいただける内容になっています。
小学生、中学生も安心してプログラミングができるように、文字列を使わなビジュアルプログラミング方法についても動画付きで紹介しています。
ビジュアルプログラミングを使えば小学生から抵抗なくプログラミングができますよ!
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらのプログラミング方法も紹介しています。
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
- アナログジョイスティックのArduinoへの接続方法と使い方
- Arduino IDEでのプログラミング方法
- mBlockを使ったビジュアルプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
アナログジョイスティックの仕組み
アナログジョイスティックは、ボタンキャップ(スティック)部とデバイスユニット部の2パーツで作られます。
アナログジョイスティックの機能
- アナログX軸(VRx)
- アナログY軸(VRy)
- 押し込みスイッチ(SW)
アナログジョイスティックには、上記3つの機能を持っています。
アナログX軸・Y軸はスティックの倒した方向と倒した角度に応じて入力値がアナログ変化する機能です。
押し込みスイッチは、スティックを押しボタンのように押し込むとスイッチONーOFF切り替えできる機能です。
アナログX軸、Y軸は可変抵抗器になっており、スティックの角度で抵抗値が変化することを利用しています。
後の配線解説部で詳しく説明しますが、アナログX軸・Y軸は、Arduinoのアナログ入力ピンに接続して使用します。
Arduinoのアナログ入力値は「0V~5V」の入力値を「0~1023」の範囲に内部変換され、X軸は左が0、Y軸は上が0となります。
Arduinoのアナログ入力回路については、こちらの記事にて詳しく説明しています。
アナログジョイスティック入力状態表示動作の解説
今回紹介する「LCDディスプレイへのアナログジョイスティック入力状態表示動作」について説明します。
動作の説明
- ディスプレイに「アナログX軸」「アナログY軸」「押し込みSW」状態が表示される。
- 押し込みSWを押すと、現在のXYアナログ入力値が中央値として登録される。
- アナログジョイスティックを倒した角度に応じて表示値が変化する。
アナログスティックを押し込んで中立時のアナログ入力値を0とし、スティック傾け度合いに応じたLCDディスプレイ表示値の変化を楽しむ動作になっています。
- アナログジョイスティックの仕組みについて
- LCDディスプレイへのアナログ入力値の表示動作
- mBlockを使ったプログラミング方法
まずは動画を見て、今回のLESSONで実行させたい動作内容を確認してください。
また、mBlockを使ったブロックプログラミングや動作確認方法についても解説しています。
アナログジョイスティックの仕組みが理解できるテーマになっています。
アナログジョイスティック入力状態表示動作の作り方
アナログジョイスティック入力値の表示動作を実行させるために必要な作業を解説します。
今回は文字列を使ったプログラム形式と、文字列を使わないブロックプログラミング形式の両方について説明します。
あなたの作りたいプロブラム形式に対応した手順に応じて、対応してください。
プログラム形式に応じた開発環境
- 文字列による命令語形式 ⇒ ArduinoIDE
- スクラッチベースのビジュアル形式 ⇒ mBlock
プログラミング初心者の方は、ビジュアル方式からお試しください。
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です。
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です。
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です。
プログラムが完成したら動作確認を行います。
- LCDディスプレイにアナログXY入力値、押し込みSW状態が表示されるか?
- 押し込みSWを押すとアナログXY値が0リセットされるか?
- アナログジョイスティックを倒した角度に応じてXY値が変化するか?
アナログジョイスティック入力状態表示動作回路で使うもの
今回は、LCDディスプレイをI2C通信で制御する方法を紹介した記事の一部配線変更にて対応可能な内容です。
I2C通信を使ったLCDディスプレイ表示が初めての方は、こちらの記事から読んでいただくことをおすすめします。
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- アナログジョイスティック
- LCD1602モジュール
- I2Cモジュール
- ジャンパー線(オスーメス)×9本
- ジャンパー線(オスーオス)×2本
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
【おすすめ】コスパ最強のArduinoキットの中間グレードです!
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです。
ブレッドボードだけの購入も可能です。
アナログジョイスティック【キット】
2軸タイプのアナログ入力ジョイスティックです。
X・Yそれぞれの方向で、可変抵抗器が使用されていて、Arduinoのアナログ入力ソケットに接続することでスティックの倒れ具合を認識することができます。
また、スティックのデジタル押し込み信号も取り込むことが可能です。
LCD1602モジュール【キット】
液晶ディスプレイ「LCD(Liquid Crystal Display)」モジュールになります。
数字や文字などを表示させることが可能です。
I2Cモジュール
I2Cを使ってLCDを制御するために必要なモジュールです。
電源線2本と通信線2本の合計4本の配線だけで、LCDを制御することが可能になります。
I2Cモジュールはキットに含まれないため、別途購入が必要です。
ジャンパー線(オスーメス)【キット】
オス-メスジャンパー線を9本使用します。
I2Cシリアルインターフェースボード及びアナログジョイスティックとArduino本体を接続させるために使用します。
ジャンパー線(オスーオス)【キット】
ジャンパー線を2本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
ジョイスティック入力状態表示動作回路の配線方法
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
機器が故障するおそれがあるので、接続するプラスマイナス極性には十分注意して配線してください。
アナログジョイスティックのつなぎ先
- GND:GNDに接続
- +5V:5Vに接続
- VRx:A0ソケットに接続
- VRy:A1ソケットに接続
- SW:2番ソケットに接続
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
今回アナログジョイスティックの押し込みスイッチの入力は、プルアップ回路で構築しています。
プルアップ回路とは、スイッチ入力がOFFのときにArduino入力が「5V=HIGH」になる接続方式です。
プルダウン回路で構築することもできますが、抵抗器を直列接続する必要があり手間がかかります。
プルアップ回路を使うことで、Arduino内部の抵抗を接続させることが出来るため抵抗器の配線が不要となります。
プルアップ・プルダウン回路についてはこちらの記事にて詳しく説明しています。
プログラミングのやり方
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、本LESSONの動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:スクラッチベースのビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
LiquidCrystal_I2Cライブラリのインストール
ArduinoIDEを使用した文字列プログラミングを行うためには、LiquidCrystal_I2Cライブラリのダウンロードとインストール作業が必要となります。
LiquidCrystal_I2Cライブラリのダウンロードとインストール方法を解説します。
mBlockでプログラミングをする場合は、本ライブラリインストール作業は不要です。
「Download ZIP」をクリックして、ZIPファイルをダウンロードします。
ArduinoIDEを開き、「スケッチ」⇒「ライブラリをインクルード」⇒「.ZIP形式のライブラリをインストール…」の順に選択して、STEP3でダウンロードしたZIPファイルを選択。
インストールが行われ、ライブラリインストール作業が完了となります。
Arduino IDEプログラミング
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが記載されているので、関数を調べるときに重宝します!(私も所有しています)
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON20 */
/* 作成者:せでぃあ https://cediablog.com */
/* ジョイスティック入力 */
#include <LiquidCrystal_I2C.h> // ライブラリのインクルード
// LiquidCrystal_I2C型変数の宣言
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27のアドレス,16列2行のLCDを使用
//変数の宣言
int BTN_SOCKET = 2; //ジョイスティックSWの入力ソケット番号
int center_X = 0; //ジョイスティックX軸中央値変数
int center_Y = 0; //ジョイスティックY軸中央値変数
void setup() {
//プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(BTN_SOCKET, INPUT_PULLUP); //2番ピンはプルアップ入力として使用
//LCDディスプレイ表示
lcd.init(); // LCDの初期化
lcd.backlight(); // LCDバックライトの点灯
}
void loop() {
//プログラム起動後ループ処理される回路
//ジョイスティック状態をLCDディスプレイに表示させる
lcd.setCursor(0, 0); //上段1列目にカーソルを移動
lcd.print("X: "); //LCDディスプレイに「X:␣␣␣␣␣␣␣␣」と表示させる
lcd.setCursor(0, 1); //下段1列目にカーソルを移動
lcd.print("Y: "); //LCDディスプレイに「Y:␣␣␣␣␣␣␣␣」と表示させる
lcd.setCursor(10, 0); //上段11列目にカーソルを移動
lcd.print("SW: "); //LCDディスプレイに「SW:␣␣␣」と表示させる
lcd.setCursor(2, 0); //上段3列目にカーソルを移動
lcd.print(analogRead(A0) - center_X); //ジョイスティックX座標を表示(右がプラス)
lcd.setCursor(2, 1); //下段3列目にカーソルを移動
lcd.print(center_Y - analogRead(A1)); //ジョイスティックY座標を表示(上がプラス)
//SWが押されたらXY軸の現在地を中央値として代入する
//SWのON-OFF状態をLCDディスプレイに表示させる。
if (digitalRead(BTN_SOCKET) == HIGH) {
lcd.setCursor(13, 0); //上段14列目にカーソルを移動
lcd.print("OFF"); //LCDディスプレイに「OFF」と表示させる
} else {
lcd.setCursor(14, 0); //上段15列目にカーソルを移動
lcd.print("ON"); //LCDディスプレイに「ON」と表示させる
center_X = analogRead(A0); //現在のX軸入力値をX軸の中央値として代入
center_Y = analogRead(A1); //現在のY軸入力値をY軸の中央値として代入
}
delay(300); //0.3秒ウェイト
}
上記がLCDディスプレイへのアナログジョイスティックの入力状態表示プログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
デジタル入力とアナログ入力を使うだけなので、プログラムは難しくないです。
命令語の解説
今回のプログラムで使用した命令文について、解説します。
変数のデータ型指定
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
またアナログ出力値は「0~255」の整数を扱いますので、同じく「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
pinMode(入出力番号,INPUTまたはOUTPUT)
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
今回プルアップ入力回路として接続するため、「INPUT_PULLUP」を指定します。
if else文
条件式が成立しているか否かで、どちらの命令文を実行するか振り分けます。
if( 条件 ){
条件成立時に実行する文 ;
} else {
条件不成立時に実行する文 ;
}
digitalRead(入出力番号)
指定したデジタル入出力ソケット番号の状態がON、またはOFFであるか確認します。
ONのときは「HIGH」、OFFのときは「LOW」の値が返ってきます。
LiquidCrystal_I2Cライブラリの説明
今回はLCD1602の制御をするために、「LiquidCrystal_I2Cライブラリ」を使用します。
このライブラリを使うだけで、簡単にLCD表示を制御できます。
LiquidCrystal_I2Cライブラリの読み出し
プログラム冒頭の宣言部にてLiquidCrystalライブラリを読み出します。
#include <LiquidCrystal_I2C.h>
LiquidCrystal型変数の指定
プログラム冒頭の宣言部にてLiquidCrystal_I2C型の変数を定義します。
LiquidCrystal_I2C lcd(I2Cアドレス, 桁数, 行数)
変数「lcd」は例であり、任意の変数文字列を指定してください
init()
LCDの表示内容をクリアし、カーソルを左上に移動させます。
lcd型変数.init
clear()
LCDの表示内容をクリアします。
lcd型変数.clear()
setCursor(桁 , 行)
カーソル位置を指定します。テキスト表示開始位置を指定することができます。
lcd型変数.setCursor(桁、行)
桁は左端が「0」、行は上段が「0=1行目」になります。
print(“表示させたい文字列”)
LCDに文字列を表示させます。
lcd型変数.print(“表示させたい文字列”)
backlight()
LCDバックライトを点灯させます。
lcd型変数.backlignt()
プログラミング初心者の方に、おすすめなArduinoの参考書を紹介しています!
mBlockプログラミング
ここからは、mBlockを使ったプログラムの作り方を解説します。
- デバイスにArduino Uno R3を追加する
- 接続モードを「アップロードモードON」にする
- mBlockプログラムを作成する
- プログラムをArduino本体に転送する
これらの基本操作方法については、こちらの記事を参照してください。
動画を参考にプログラミングしてみよう
プルアップ入力ブロックの追加方法
mBlockではデジタル・アナログ入力ブロックはありますが、プルアップ入力ブロックが標準では準備されていないため、拡張ブロックを追加する必要があります。
mBlockを開いて、拡張ボタンをクリックします。
検索窓に「pullup」と入力して、拡張ブロックを検索します。
INPUT_PULLUPと書かれた拡張ブロックを追加します。
プルアップ入力ブロックが追加され、プログラムに使用可能となります。
I2Cを使ったLCD制御ブロックの追加方法
LCDを制御(LCD画面クリア、カーソル位置を指定、LCDへの文字列表示など)するために必要な、専用ブロックを追加する必要があります。
mBlockを開いて、拡張ボタンをクリックします。
検索窓に「i2c」と入力します。
I2Cを使ったLCD制御用の拡張ブロックを追加します。
I2Cを使ったLCD制御ブロックが追加されます。
mBlockを使ったプログラム内容
今回は「アップロードモード オン」でのプログラム作成例を紹介しています。
プログラム開始条件が「Arduino Unoが起動したとき」になっている点に注意してください。
以下のプログラムが動作プログラムになります。
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
動作確認方法
- LCDディスプレイにアナログXY入力値、押し込みSW状態が表示されるか?
- 押し込みSWを押すとアナログXY値が0リセットされるか?
- アナログジョイスティックを倒した角度に応じてXY値が変化するか?
上記項目について確認していきましょう。
LCDディスプレイにアナログXY入力値、押し込みSW状態が表示されるか?
プログラムの演算が開始されたら、LCDディスプレイに「X:512」「Y:512」「SW:OFF」が表示されていることを確認してください。
LCDディスプレイのバックライトが点灯状態であることを併せて確認してください。
押し込みSWを押すとアナログXY値が0リセットされるか?
アナログジョイスティックが中立状態(どちらにも倒れていない状態)で、スイッチを押し込んでください。
再びアナログジョイスティックから手を離して中立状態にしたとき「X:0」「Y:0」になればリセット成功です。
スイッチを押し込んだときに「SW:ON」に表示が変わります。
アナログジョイスティックを倒した角度に応じてXY値が変化するか?
アナログジョイスティックが中立状態にあるときを0として、x方向は右が+、Y方向は上を+として値が表示されます。
アナログスティックをいろいろな方向に倒してみて、数値の変化を確認してください。
個体差がありますが、±512の範囲で表示されます。
アナログ入力は可変抵抗器で作られていた(まとめ)
- アナログジョイスティック入力は可変抵抗による電圧変化を変換している
- プルアップ入力を使えばArduinoの内部抵抗が接続される
- 拡張ブロックを追加することでmBlockでもプルアップ入力が可能
小学生のお子様には断然、ブロックプログラミングがおすすめです!
mBlockはブロックのドラッグアンドドロップで簡単にプログラミングができます!
小学生のプログラミング学習におすすめな、mBlockが使えるプログラミングロボットを紹介しています。
最後まで読んでいただき、ありがとうございました。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント