Arduino UNO チュートリアル: サインスマートのプロジェクト練習教本

サインスマートのプロジェクト練習教本のチュートリアルです。



サインスマートのプロジェクト練習教本

サインスマートのプロジェクト練習教本はソースコード付きのものを DL できます。

22 プロジェクト分のサンプルが付属していますが、標準のスターターキット (16プロジェクト) で試せるのは Chapter 17 までです。私は 17 プロジェクトのものを選びました (2016/03 現在: 17 プロジェクト版は存在しないようです)。内容物は以下のようになっています。

イロイロ入っているのでお得です。また、プラスアルファのプロジェクトで必要なモジュールは個別に購入できます。

サインスマート教本の古いバージョンや Amazon での説明には Nixie Tube と書いてありますがそんなものは入っていません (ニキシ管とはコレの事)。



Chapter 1: Arduino Introduction

Android IDE と UNO R3 についての説明です。配線及びスケッチ (プログラム) はありません。



Chapter 2: First Sketch - Blink

最初からLチカスケッチが入っているので LED を刺すだけで終わりです (^^;A

書籍 Arduino をはじめようExample 01: LED を点滅させる と同じです。



Chapter 3: Hello World!

回路はありません。Arduino IDE の右上にあるボタンを押してシリアルモニタを開きます。Arduino UNO のリセットボタンを押すたびに "Hello, World!" が表示されます。

See Also:



Chapter 4: LED Blink

抵抗の位置と GND の位置が異なるだけで、書籍 Arduino をはじめようExample 04: LED のフェードインとフェードアウト とほぼ同じです。

なお、教本ではデジタルの 8 ピンに挿すようになっていますが、サンプルソースコードでは 9 ピンが指定されています。



Chapter 5: PWM

回路は Chapter 4: LED Blink と全く同じです。こちらはデジタルの 9 ピンに挿すようになっていますし、回路図も同じです (^^;A



Chapter 6: Tri-Color LED Module

三色 LED モジュールとは以下の画像のものです。裏にピンアウトのシルク印刷があります。

このチャプターには配線図がありません。本来ならこのようになるハズです (適当な三色 LED パーツがなかったので他のパーツで代用しています)。

が、このモジュールには 220Ω抵抗が組み込まれているので抵抗は必要ありません。正しい配線図は以下のようになります。



Chapter 7: Buzzer

裏が黒く背が高いのがアクティブブザー (画像左)、裏が基板になっていて背が低いのがパッシブブザー (画像右) です。どちらも極性があり マークがある方がプラスです。アクティブブザーの方は足の長さでも判別できると思います。但し製品によってはこの見分け方では区別が付かないものがあるので注意してください。あくまでキット付属のブザーの見分け方になります。

二つのブザーの違いは以下の通りです。

つまり、このスケッチで使うのはパッシブブザーです。適当なブザーパーツがなかったので形状の違うブザーで代用していますが、配線はこんな感じになります。

アクティブブザーのスケッチは用意されておらず、教本にはアクティブブザーの使い方として「ブザーを 5V / GND につないでみ?音鳴るでしょ?警告音に使いたいなら ON/OFF して制御してね」という、投げやりな説明がされています (w

ブザーに "REMOVE SEAL AFTER WASHING" というシールが貼ってあったのなら剥がして構いません...むしろ剥がしてください。

See Also:



Chapter 8: Flame Sensor

赤外線/炎検知センサーとは下の画像のものです。LED に似ていますが LED ではなくフォトトランジスタです。足の長い方がエミッタ、足の短いほうがコレクタです。LED とは違い、GND に落とすのは足の長い方 (エミッタ) です。

適当なフォトトランジスタパーツがなかったので LED で代用していますが、配線はこんな感じになります。

フォトトランジスタ側に 10KΩ抵抗を、LED 側に 1KΩ抵抗を使います。この状態で付属リモコンの送光部をフォトトランジスタに当ててボタンを押しっぱなしにしてみると、LED の光がゆらめきます (指先を近付けるだけでもいいかもしれません)。火災発生時に出る赤外線を検知するという訳ですね。

See Also:



Chapter 9: Tilt Sensor

傾斜センサー (ティルトスイッチ)とは下の画像のものです。電解コンデンサーのような形をしています。

振ればカチカチ音がする事で大体の構造が解るかと思います。Arduino をはじめよう の P.44 にあったアレです。

傾けるとスイッチが切れて LED が消えます。さて、この状態で傾斜センサーを抜いてアナログピンにつながっているジャンパワイヤをゆすってみましょう。何故か LED が点灯しますよね?このセンサーはスイッチなので、"Example 02: プッシュボタンを使って LED をコントロール" のようにデジタルピンで使うのが正解のような気がするのですが?



Chapter 10: Potentiometer

ポテンショメータ…何の事はないただのボリューム (可変抵抗) です。

ボリュームは普通のブレッドボードには挿せません。ミニブレッドボードを使いましょう。どうしても普通のブレッドボードに挿したければジャンパワイヤをハンダ付けするか、端子をヤスリで削るしかありません。秋月電子で売っている EIC-102BJ には挿せます (正直、スターターキット付属のブレッドボードより、EIC-102BJ の方がオススメです)。

シリアルモニタを開き、ボリュームを回すと、値が 0~1023 の範囲で変化します。

ちなみに、ボリュームには種類があります。

キットに含まれているのは B カーブのボリュームです。「抵抗は端子が 2 つなのに可変抵抗や半固定抵抗はどうして端子が 3 つあるの?」と悩んだ事はありませんでしたか?

See Also:



Chapter 11: Photoresistor

"Example 06: アナログ入力の値に応じて LED の点滅レートが変化 / 明るさを変える" でも使った光センサーを使います。ここで使うブザーはアクティブブザーです。

教本の通りに組むと、LED は単にLチカしているだけで光センサーやブザーとは何の関係もないので回路から省きます (光センサーと LED を隣接させて暗い部屋で試せば意味があるかもしれませんが…)。

光センサーを指で覆って光を遮断するとブザーが鳴ります。これを放置したまま寝ないようにしましょう。部屋の電気が消えた途端にピーピー言い出します (^^;A



Chapter 12: LM35 Temp Sensor

下の画像のものが温度センサーです。少し足を広げないとブレッドボードに挿せません。

教本のものはちょっとややこしい繋ぎ方をしていますが、コレでいいです。単純なのでミニブレッドボードでもいいですね。

シリアルモニタを開き、ドライヤーなどでセンサーを暖めると表示されている温度が変化します。

但し、この接続方法では温度が正確ではない事があります。簡易的に回避しようとするならば、10KΩ抵抗を追加するといいようです。

教本のややこしい繋ぎ方は "抵抗を入れようとした名残" なのかもしれませんね。

なお、この温度センサー (LM35) ではマイナスの温度は測れない (負電源が必要) のと、3.3V では使えません。代わりに LM60 / LM61 を使うといいと思います。

また、環境温度を計測するのには使えませんが、ATMega328PATMega32U4 は内部温度計を持っており、チップの温度を計測する事ができます。ケースで密封していなければ、電源投入直後でなくともほぼ環境温度を示すとは思います。

See Also:



Chapter 13: 7-Segment Display

下の画像のものが7 セグメントディスプレイ (5101AS) です。表面保護シールが貼ってあります。

配線がちょっと多いですが難しくはありません。カソードコモンなので、共通端子は GND に接続されています。

まず、セグメントがそれぞれ光ってから、0, 1, 2...9 とカウントアップします。文字化け (?) するのは配線が間違っているからです。

See Also:



Chapter 14: Multi-digit,7-Segment Display

下の画像のものが4 桁 7 セグメントディスプレイです。表面保護シールが貼ってあります。

配線はちょっと複雑です。

サンプルコード shuma.pde を実行しても変な表示になるので焦りますが、多分配線は間違っていません。間違っているのはソースコードです。しかもドキュメントに掲載されているソースコードも不完全です。配線の方を直そうと思うとグチャグチャになるので、動作するソースコードを掲載しておきます。

/* Stop-Watch Sketch

 Momentarily conectiong pin 13 to ground, either by
 push button or similar.starts and stops the count.
*/

// Pin declarations
// --segments
int a = 5;
int b = 7;
int c = 9;
int d = 11;
int e = 12;
int f = 6;
int g = 8;
int p = 10;

// --digits
int d4 = 4;
int d3 = 3;
int d2 = 2;
int d1 = 1;

//--start/stopreset control
int startStopReset = 13;

long n = 0;
int x = 100;
int del = 55;
int currState = 0;

void setup()
{
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(p, OUTPUT);
  pinMode(startStopReset, INPUT_PULLUP); // set pull-up resister on
}

void loop()
{
  int swButtonState = digitalRead(startStopReset);
  if (swButtonState == LOW) {
    currState++;
    while (digitalRead(startStopReset) == LOW) {}
  }
  clearLEDs();
  pickDigit(1);
  pickNumber((n/x/1000)%10);
  delayMicroseconds(del);

  clearLEDs();
  pickDigit(2);
  pickNumber((n / x / 100) % 10);
  delayMicroseconds(del);

  clearLEDs();
  pickDigit(3);
  dispDec(3);
  pickNumber((n / x / 10) % 10);
  delayMicroseconds(del);

  clearLEDs();
  pickDigit(4);
  pickNumber(n / x % 10);
  delayMicroseconds(del);

  if ((currState % 3) == 0)      // reset state
    n = 0;
  else if ((currState % 3) == 1// start state 
    n++;
  else {}                        // stop state                             
}

void pickDigit(int x) 
{
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);

  switch(x)
  {
  case 1: 
    digitalWrite(d1, LOW); 
    break;
  case 2: 
    digitalWrite(d2, LOW); 
    break;
  case 3: 
    digitalWrite(d3, LOW); 
    break;
  default: 
    digitalWrite(d4, LOW); 
    break;
  }
}

void pickNumber(int x)
{
  switch(x)
  {
  default: 
    zero(); 
    break;
  case 1: 
    one(); 
    break;
  case 2: 
    two(); 
    break;
  case 3: 
    three(); 
    break;
  case 4: 
    four(); 
    break;
  case 5: 
    five(); 
    break;
  case 6: 
    six(); 
    break;
  case 7: 
    seven(); 
    break;
  case 8: 
    eight(); 
    break;
  case 9: 
    nine(); 
    break;
  }
}

void dispDec(int x)
{
  digitalWrite(p, LOW);
}

void clearLEDs()
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(p, LOW);
}

void zero()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}

void one()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void two()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void three()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void four()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void five()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void six()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void seven()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void eight()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void nine()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

同梱されている 4 桁 7 セグメントディスプレイが途中から別の製品に変わってしまったのかもしれませんね。プッシュボタンを押すとストップウォッチがスタート、もう一度押すとストップ、さらに押すとリセットとなります。カウントダウンタイマーにして「クソッ、赤と青のどっちのコードを切ればいいんだ!」的なスケッチを書いてみるのもいいかもしれません (w



Chapter 15: 74HC595

下の画像のものが 74HC595 です。この IC はシリアル信号をパラレルに変換してくれます。出力ポートが足りない場合に使います (3 ピンで 8 出力)。逆に入力ポートが足りないときは 74HC165 / CD4021B を使います (3 ピンで 8 入力)。

下の画像のように配線すると、多分ジャンパワイヤが足りません。配線のアレンジが利かなくなるので、別途ブレッドボード用のジャンパワイヤか、スターターキットに入っているタイプのジャンパワイヤ (ジャンパーコード) を購入しておくといいと思います。また、このサンプルでは 220Ω抵抗もすべて使ってしまいますが、220Ω抵抗を無くしてしまったのであれば赤色 LED に 220Ω、青色 LED に 1KΩを使うといいと思います。

…さて、スケッチを Arduino IDE で開こうとしても開けないのではないでしょうか?これはスケッチ名が命名規則に則っていないからです。数字で始まるスケッチ名 (ファイル名) はエラーになると思います。a74hc595.ino のように、頭に適当なアルファベットを付けてみてください。

このスケッチを実行すると、赤い LED と青い LED が交互に点滅します…しかしながら、点滅スピードが速すぎて意味不明ですので、loop() 内の delayTime を 1000 くらいにしてみてください。

え?LED をブチ撒けてどれがどの色か判らなくなった?そんな時は LED の足の長さを調べてみましょう。赤色 LED だけは足が短いです (緑と青は足の長さが変わらない)…光の波長と同じように R(長), G(中), B(短) となっていればシャレが利いててよかったと思いませんか?

See Also:



Chapter 16: 8x8 matrix LEDs

下の画像のものが 8x8 ドット LED マトリクスです。表面保護シールが貼ってあります。

ポッチのある方が 1 番ピン側で、こちらを下にして使います。

ブレッドボード一つでは配線できません。ミニブレッドボードも使いましょう。

mLED.pde を実行します。testLEDs.pde の方は恐らくですが意図したとおりに動作しません。

LED を光センサーにする

余談ですが、LED に強い光を当てると発電します。これを応用すると LED マトリクスで光センサーが作れます。

See Also:



Chapter 17: Infrared remote control

下の画像は赤外線受光素子と赤外線リモコンです。リモコンの (電池) 絶縁シートは引き抜いて使います。

 

スケッチから配線するとこうなります。LED は使われていません (そもそも赤外線 LED はスターターキットに含まれていない)。

リモコンのボタンを押すとその値をシリアルモニタに表示するというものです。

私の環境ではこのスケッチはマトモに動作しませんでした…リモコンには反応していますが、ボタンを押さなくても反応する時があります。仕方ないので付属のスケッチは無視して教本の通りにやってみます。

教本の通りにやるには Arduino-IRremote を GitHub から持ってくる必要があります。Arduno IDE にも IRremote は含まれているのですが、こちらを使うとコンパイルエラーになります (Arduino IDE 1.0.6 時点)。

  1. Arduino-IRremote を DL します (右下に [Download ZIP] ボタンがあります)。
  2. Arduino IDE のインストールフォルダにある libraries フォルダから RobotIRremote フォルダを削除します。
  3. Arduino IDE メニューの [スケッチ | ライブラリを使用 | Add Library...] にて DL した ZIP を指定。
  4. 念のために Arduino IDE を再起動。
    (ライブラリは "C:\Users\<ユーザ名>\Documents\Arduino\libraries" に格納されます)

以下のスケッチがコンパイルできれば OK です。

#include <IRremote.h>

int RECV_PIN = 8;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

リモコンのボタンを押すとリモコンのコードがシリアルモニタに表示されます。



Chapter 18 (Option): 1602LCD

下の画像が液晶キャラクタディスプレイです。表面保護シールが貼ってあります。型番の 1602 というのは 16 桁 2 行という意味です。2004 とかもありますが、もちろん 2004 年に製造されたという意味ではありません。

最初からピンヘッダがハンダ付けされており、バックライト用の抵抗も実装されているようです。

ブレッドボードに挿せないシリーズ Part2 です。ミニブレッドボードを使って配線しましょう。

赤丸と青丸の所をジャンパワイヤで結線するとバックライトが点灯します。液晶のコントラストはボリュームを回して調整します…ブレッドボードに挿しにくいので半固定抵抗を付けてくれてもよかった気はしますが。

このスケッチを "LCD + キーパッドシールド" で試すには、

LiquidCrystal lcd(12115432);

こうなっている箇所を

LiquidCrystal lcd(894567);

このように書き換えます。

余談ですが、このスケッチの名前は _1602.ino で、ちゃんと Arduino IDE で読み込めます…頭にアンダーバーがありますからね。何故、"Chapter 15: 74HC595" の方でもそれをやらなかったのか不思議で仕方ありません。

また、NanoNano Every と半固定抵抗を使うとスッキリ配線できます。

See Also:



Chapter 19 (Option): Opto-Isolated, 2 Channel Relay module

下の画像のものがリレーモジュールです。そのままでは裏側が危険なので、私は絶縁ビニールテープとゴムシートを貼って保護しました。

端子はこのようになっています。

このリレーモジュールを扱うのに必要な知識はLチカだけですので、LED 電球を使ってLチカをやってみます (w

レセップのスイッチをバラします。片方が切断されているので、この部分の被覆を剥いてリレーの NO1 端子COM1 端子に接続します。NOxNormally Open で、通常は OFF という意味で、信号を HIGH にすると ON になる端子です。NCx は逆に Normally Close で通常は ON という意味で、信号を HIGH にすると OFF になる端子です。このモジュールはそれが2系統あります。

Arduino UNO での接続は以下のようになります。ジャンパーピンは VCC<->JD-VCC 側に挿しておきます。間違っても GND<->VCC 側に挿してはいけません。ショートしてしまいます。

リレーモジュール Arduino UNO
(5V ボード)
VCC 5V
IN1 13
GND GND

3.3V のボードで使う場合であっても 5V を供給する必要があります...信号レベルは 3.3V で構いませんが、リレーの駆動には 5V が必要です。3.3V のボードではジャンパーピンを抜いて以下のような接続にします。

リレーモジュール 3.3V ボード
VCC 3.3V
IN1 (任意のピン: 3.3V 信号)
GND GND
JD-VCC 5V

何故このような接続になるのかは回路図を見ると解ります。

動作させてみた様子が以下の動画となります。

電源投入時のポケモンフラッシュを回避するには Blink スケッチで使っている 13 番ピンではなく 4 番ピンなどを使います。

See Also:



Chapter 20 (Option): Distance Sensor

下の画像のものが超音波距離センサーです。2cm-180cm の距離を計測する事ができます。

...が、スイッチサイエンスの Web サイトに注意書きがある通り、広く出回っているものには不具合があります。見分け方ですが、

簡単に言えばこれらは不具合を抱えています。

不具合がある製品での解決方法は Suwa Koubou さんのトコロによると R1 の 10KΩ抵抗を取り外す事だそうです。

説明の通り、R1 を取り外して 10KΩプルダウン抵抗を付けてみましたが、当方の個体では一旦測定不能 (0.00cm) になると自動で復帰してはくれませんでした。

アーカイブに含まれるスケッチ (HC_sr04.ino) の想定している接続は以下のようになります。

HC-SR04 Arduino UNO
VCC 5V
Trig 3
Echo 2
GND GND

コンパイルしてシリアルモニタ (9600 bps) を開くと、対象物との距離が cm で表示されます。

しかしながらマニュアルでは違うライブラリを使う方法が書いてあります。最新のライブラリは Arduino.cc にあります。これを [スケッチ | ライブラリを使用 | ライブラリをインストール] でインストールします。

サンプルスケッチはライブラリの examples\NewPingExample にある NewPingExample.pde です。このスケッチの想定している接続は以下のようになります。

HC-SR04 Arduino UNO
VCC 5V
Trig 11
Echo 12
GND GND

コンパイルしてシリアルモニタ (115200 bps) を開くと、対象物との距離が cm で表示されます。

先述の不具合ですが、当方の個体では以下のスケッチで回避できるようです。

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}

void loop() {
  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

  if (digitalRead(ECHO_PIN) != 0) {
    pinMode(ECHO_PIN, OUTPUT);
    digitalWrite(ECHO_PIN, LOW);
    pinMode(ECHO_PIN, INPUT);
  }
}

赤字部分が回避ロジックです。なお、この距離センサーは測定に超音波を使っているため、理屈上温度や気圧によって誤差が出ます

See Also:



Chapter 21 (Option): Servo Motor

下の画像のものがサーボです。サーボホーンとビスも付属しています。ケーブルには 3 ピンのメスコネクタが付いています。

配線は以下のようになります。サーボは PWM 可能なデジタルピンに接続する必要があります。

ちなみに、サインスマートの UNO R3 互換ボード (サインスマート改造バージョン) にはピンヘッダが出ているので、サーボを直接接続する事ができます。

サーボを複数接続する場合には AC アダプタ等の外部電源を繋げた方がいいと思います。

See Also:



Chapter 22 (Option): XBee shield - 未検証

XBee シールドだけ持っていても何もできません。XBee を試すためには 7,000円程必要になります。

XBee (ZigBee) モジュールを Amazon で購入すると技適を通っていないものが送られてくる可能性があるので注意してください。

7,000円あったら電子部品 (抵抗とかコンデンサとかトランジスタとか) や工具 (ハンダごてとかニッパーとかワイヤーストリッパーとか) を揃えた方が (最初は) イロイロ勉強になると思うんですよねぇ。



Chapter 23 (Option): MPU-6050 Sensor

下の画像のものが MPU-6050 です。"3 軸ジャイロスコープ" とありますが、正確には "3 軸加速度センサー + 3 軸ジャイロ" モジュールです。

配線は以下のようになります (I2C 接続)。

私が購入したものには 8 ピンのストレート/L字ピンヘッダが付属していましたが、これは使わずに秋月の細ピンヘッダをハンダ付けしました。

サンプルスケッチをコンパイルするためには、サンプルフォルダにある以下のファイルを、C:\Users\<ユーザ名>\Documents\Arduino\libraries\mpu6050 フォルダにコピーする必要があります (mpu6050 サブフォルダは新規作成)。

最新のライブラリは GitHub にあります。こちらを [スケッチ | ライブラリを使用 | ライブラリをインストール] でインストールした方が簡単でいいでしょう。

コンパイルしてシリアルモニタ (38400 bps) を開くと、センサーの生データが表示されます。このライブラリで定義されている MPU-6050 の I2C スレーブ ID はデフォルトで 0x25 (37) です。

MPU-6050 の座標系は以下のようになっています。

MPU-6050 をイロイロな方向に傾けると、値が刻々と変化します。

...それはいいのですが、このモジュールはこのままではマトモに使えません。

センサーから取得したデータをソフトウェア的に加工しなければならないのです。

たとえばサーボと組み合わせて二軸ジンバルを作ろうと思うと、それなりのノイズフィルタを実装しなくてはなりません。「何か動いた」程度の観測であれば簡単なスケッチでどうにかなりますが (100 回測定して平均値を算出するとか)...もっとも、「何か動いた」程度であれば傾斜センサーでやるのが簡単ですけれど。

三軸ジンバルを作ろうと思うと、加えて地磁気センサー (コンパス) を併用する必要があります (重力があるので水平はわかるけど方位がわからないので位置決めができない)。

See Also:



Chapter 24 (Option): Keypad

下の画像のものがキーパッドです。裏面はシールとなっていますのでペタリと貼り付ける事ができます。

...が、動かなかったのです。単純なキーマトリクスなのに、なぜ動かなかったのかというと、フィルムケーブルが劣化してパリパリと割れていたからです。

試せませんでしたので投げやりに説明すると、Arduino とこのキーパッドをブレッドボード用のジャンパーワイヤーでデジタル 9~2 ピンに全部つなぎます。そしてスケッチですが、これまた収録されているものと説明が異なるので、arduino.cc からライブラリを持ってきましょう。

[スケッチ | ライブラリを使用 | ライブラリをインストール] でインストールし、スケッチを新規作成します。

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}

void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){
    Serial.println(key);
  }
}

コンパイルしてシリアルモニタ (9600 bps) を開き、キーパッドを押すと押したキーの文字が表示されます。

押したキーと表示されたキーが異なる場合にはジャンパーワイヤーの接続先を変えてみてください。

船便でくる上に、フィルムケーブルは折り曲げられた状態で梱包されており、さらにフィルムケーブルの質もよくありません。個体差があるのかもしれませんが、これを購入するくらいならタクトスイッチを 16 個使って自作するなり、メカニカルスイッチな 4x4 キーパッドを購入した方がいいと思います。

...ホッタラカシのままだと寝覚めが悪いので購入してみました、タクトスイッチのキーパッド (購入時価格: ¥209)。

接続は以下の通りです。

KeyPad Arduino
Rows 1 9
2 8
3 7
4 6
Cols 5 5
6 4
7 3
8 2

先述のスケッチでキッチリ動作しました。S1 を押すと 1S2 を押すと 2...S16 を押すと D がシリアルモニタに表示されます。

See Also:


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: