ELEGOO Arduino用UNO R3スターターキット レベルアップ チュートリアル付
前回の続き
引き続きチュートリアルに沿って電子工作入門していく
アナログジョイスティック
使用する機器
- (1) x Elegoo Uno R3
- (1) x Joystick module
- (5) x F-M wires (Female to Male DuPont wires)
ジョイスティックモジュール
モジュールには VCC、グランド、X、Y、キーの 5 つのピンがあります。
モジュールを入手した場所によって、あなたのラベルが若干異なる場合があります。
親指の棒はアナログであり、単純な「指向的な」ジョイスティックよりも正確な読み取りを提供する必要があります。
さらに、ジョイスティックを押し下げてプッシュボタンをアクティブにすることができます。
X / Y ピンからデータを読み出すにはアナログの Arduino ピンを使用し、ボタンを読むにはデジタルピンを使用する必要があります。
Key ピンは、ジョイスティックが押されるとグランドに接続され、そうでなければフローティングになります。
キー/セレクト・ピンから安定した読み出しを得るには、プルアップ抵抗を介して VCC に接続する必要があります。
ジョイスティックのキャップ以外、基盤部分はどのような仕組みでスティックの動きを数字化しているのか?
ピン名からわかるように、X,Y 軸方向お読み取りと、SW スイッチによる ON/OFF を読み取っている
ON/OFF など今までデジタル入力についてずっと色んなモジュールで触ってきたけれどアナログ入力とは?
X,Y 軸の動きは電圧の変化として入力されアナログ値として読み取られる
Arduino のアナログ入力は 10ビット分解能なので 0V~5Vの電圧を 0 ~ 1023 の値で表現される
真上からみてコントローラーの左右上下がそれぞれ 0 ~ 1023
中心にあるデフォルトの場合 x,y それぞれ 511 くらいってことになる
基盤部分は スイッチの ON/OFF と 電圧の変化を伝えてるってことですね
analogRead() - www.arduino.cc
構成
先に述べたように X,Y はアナログ入力なため アナログピンに
以前学習した スイッチ 同様に SW は デジタルピンに
GND、5Vはそれぞれピンに
いつもどおりサンプルプログラムをデプロイし
シリアルモニタを開くと X,Y の座標とスイッチの状態が取得できている
スティックを動かすと値の変化を確認できるだろう
微妙にデフォルト値が 511 ではなくずれているけどそこはキットの精度なんでご愛嬌かな
コードを見てみると
// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = A0; // analog pin connected to X output
const int Y_pin = A1; // analog pin connected to Y output
void setup() {
pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
Serial.begin(9600);
}
void loop() {
Serial.print("Switch: ");
Serial.print(digitalRead(SW_pin));
Serial.print("\n");
Serial.print("X-axis: ");
Serial.print(analogRead(X_pin));
Serial.print("\n");
Serial.print("Y-axis: ");
Serial.println(analogRead(Y_pin));
Serial.print("\n\n");
delay(500);
}
各ピンを指定しdigitalRead()
、analogRead()
でそれぞれ読み取り表示しているだけのシンプルなコード
スイッチ時同様に、ブレボで 入力値に基づいて RGB RED の色を変化させるとかやったら面白そう
またよく電池残量を知る仕組みとかあるけど、電圧の変化によるアナログ出力からとってるのかなー?
赤外線受信モジュール
使用する機器
- (1) x Elegoo Uno R3
- (1) x IR receiver module
- (1) x IR remote
- (3) x F-M wires (Female to Male DuPont wires)
赤外線受信モジュール IR RECEIVER SENSOR
IR 検出器は、赤外線を受信するように調整されたフォトセルを備えたマイクロチップです。 ほとんどの場合、リモコンの検出に使用されます。
テレビや DVD プレーヤーの前面には、クリッカーからの IR 信号を受信するためのものがあります。
リモコンの内部には一致する IR LED があり、赤外線パルスを発してテレビの電源をオン、オフ、または変更するようにテレビに指示します。
赤外光は人間の目には見えません。
IR 検出器はデジタル出力です。これらは 38KHz IR 信号を検出してロー(0V)を出力するか、いずれも検出せず、ハイ(5V)を出力します。
光電池は抵抗器のように振る舞い、どれだけの光が当たるかによって抵抗が変化します。
赤外領域の光(赤外線)を受光し電気信号に変換して、必要な情報を取り出して応用する技術、またその技術を利用した機器。人間の視覚を刺激しないで物を見られる、対象物の温度を遠くから非接触で瞬時に測定できるなどの特徴を持つ。
と Wikipedia にも書いてあるとおり割と身近なもの
そして電磁波の一種であるため、通信は波によって伝わります
詳しくは下記を参考にして方が良いと思うけど
赤外線を利用したリモコン通信はモールス信号のように ON/OFF を組み合わせてやりとりしている(PPM パルス位相変調)
PPM方式にはフォーマットがあり、「NECフォーマット」、「Sonyフォーマット」等がある
※PPMは以前出てきたPWMとは別
赤外線リモコンについて - www.256byte.com
PWMと似たような新しく PPM という単語が出てきましたね
他にもいくつかあるようですが要はパルス、ON/OFF による短波系をどうデータに変調させるかの方式たちのこと(かな?)
それぞれにメリット・デメリットがあるらしい、わからん
パルス変調 - Wiki
今回のチュートリアルで利用するのはレシーバーモジュール
リモコン等から赤外線通信した際にどのようなデータが受信されているのか確認してみようって感じかな
赤外線通信自体は昔からある成熟された技術なのでか、初学者に対してわかりやすく纏まってるきれいなサイトって中々無いね・・・
構成
学習キットに含まれてるのは AX-1838HS という IR赤外線レシーバーモジュール
レシーバー自体には 3本ピンがありそれぞれ Vcc,GND,DATAとなっていて
モジュールになってもそこは変わらず3本のピンとなっていてそれぞれ
G:GND
R:Vcc
Y:DATA
となっている(なんでモジュール化するとピン配置かえるんじゃ?)
構成通りに組み、いつもどおりサンプルプログラムとライブラリをデプロイして
付属のリモコンでセンサーに向かってボタンを押すと下記のようにシリアル出力される
一番下のother button
は他家にあったリモコンから送った場合のデータ
コードを見てみよう
#include "IRremote.h"
int receiver = 11; // Signal Pin of IR receiver to Arduino Digital Pin 11
/*-----( Declare objects )-----*/
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
/*-----( Function )-----*/
void translateIR() // takes action based on IR code received
// describing Remote IR codes
{
switch(results.value)
{
case 0xFFA25D: Serial.println("POWER"); break;
case 0xFFE21D: Serial.println("FUNC/STOP"); break;
case 0xFF629D: Serial.println("VOL+"); break;
case 0xFF22DD: Serial.println("FAST BACK"); break;
case 0xFF02FD: Serial.println("PAUSE"); break;
case 0xFFC23D: Serial.println("FAST FORWARD"); break;
case 0xFFE01F: Serial.println("DOWN"); break;
case 0xFFA857: Serial.println("VOL-"); break;
case 0xFF906F: Serial.println("UP"); break;
case 0xFF9867: Serial.println("EQ"); break;
case 0xFFB04F: Serial.println("ST/REPT"); break;
case 0xFF6897: Serial.println("0"); break;
case 0xFF30CF: Serial.println("1"); break;
case 0xFF18E7: Serial.println("2"); break;
case 0xFF7A85: Serial.println("3"); break;
case 0xFF10EF: Serial.println("4"); break;
case 0xFF38C7: Serial.println("5"); break;
case 0xFF5AA5: Serial.println("6"); break;
case 0xFF42BD: Serial.println("7"); break;
case 0xFF4AB5: Serial.println("8"); break;
case 0xFF52AD: Serial.println("9"); break;
case 0xFFFFFFFF: Serial.println(" REPEAT");break;
default:
Serial.println(" other button ");
}// End Case
delay(500); // Do not get immediate repeat
} //END translateIR
void setup() /*----( SETUP: RUNS ONCE )----*/
{
Serial.begin(9600);
Serial.println("IR Receiver Button Decode");
irrecv.enableIRIn(); // Start the receiver
}/*--(end setup )---*/
void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
{
if (irrecv.decode(&results)) // have we received an IR signal?
{
translateIR();
irrecv.resume(); // receive the next value
}
}/* --(end main loop )-- */
ものすごいベタにセンサー入力値を switch
文でぶん回してマッピングさせてる
実際の値を知りたい場合は Serial.print(results.value);
を translateIR()
関数の中に書いてあげれば表示してくれる
例えば「Vol-」ボタンを押すと
16:45:08.546 -> 16754775 VOL-
となる
しかし switch 文の case に書かれてる文字と違うのがわかる
例えばパワーボタンの 0xFFA25D
、 0x
は 16進数であることの宣言なので
その後に続く FFA25D
が実際に取得しているデータの16進数番という事
試しに Serial.print(results.value, HEX);
にすることで 16進数にした値を確認できる
17:00:03.666 -> FFE21D FUNC/STOP
17:32:31.701 -> A90 other button
レシーバー自体はデジタル入力なので2進数なのを、赤外線データのようなリモコン等多数のボタンが付くもので網羅しようとすると多種、及び長大になるため
コード上は16進数で制御している感じだね
Arduino 周りで赤外線レシーバーで遊んでる人見ると
これでパスワード認証を構築している人もいて面白かったりする
ついに登場アナログ入力と
デジタル入力における制御と通信の仕組みなどちょっとづつ応用的になってきた感じかな?
リモコン側のコーディングができるようになればまさに、スマートリモコンが作れるんだろうね
このチュートリアルで登場した物単体は外部入力に基づく数値化と表示だけなんだけど
身の回りのものとの関連や制御対象に対するコントローラーと見た場合色々面白そうな仕組みです
とりあえず今回はここまで
多分次回に続く