Arduino UNO

Arduino UNO に関する記事です。



Arduino UNO R3

Arduino が何なのか?というのは Wikipedia でどうぞ。Arduino UNO の詳細については公式サイトを確認してください。

MCU は Atmel ATmega328P で、書き込めるスケッチの最大サイズは 32,256 バイト (約 32KB) です。

ボードサイズ 普通 小さい
書き込み装置 あり なし あり なし
ATMega328P Arduino Uno Arduino Pro Arduino Nano Arduino Pro Mini
Arduino Mini (05)
ATMega32U4 Arduino Leonardo Arduino Leonardo
(ピンソケット無し)
Arduino Micro
Da Vinci 32U*1
Pro Micro*2

*1 Strawberry Linux 社の製品で正式な Arduino ではない。    *2 SparkFun 社の製品で正式な Arduino ではない。

See Also:


購入

Amazon 等で買えます。

表面実装 (SMD) 版もありますが、純正の SMD 版にはほぼメリットがないため DIP 版の購入をオススメします。

私が購入したのは SainSmart 社の互換機です (DIP 版 / SMD 版)。

Arduino UNO は安価なコピー品が出回っていますが、最初の一台目は正規品完全互換品を選ぶのがよろしいかと思います。うまく動作しない場合に、ボードのせいなのか自分のやり方が悪いのかを切り分けることが困難になるからです。

スターターキットには 19 プロジェクトが試せるものもありますが、私は 17 プロジェクトのものを選びました (2016/03 現在: 17 プロジェクト版はないようです)。内容物は以下のようになっています。

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

他にもこんなのがあります。

ブルジョワジーならともかく、最初からすべてを揃えるのはやめておいたほうがいいかと思います (^^;A

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


各部詳細

オリジナルの UNO R3 の各部詳細はこのような感じです。

下の画像はサインスマートの互換機のものですが、拡張ピンヘッダを除けばオリジナルの UNO R3 とほぼ同じです (アナログピンが A7 まであります)。付属の A ケーブルは太く短く取り回しが利かないため、もう少し長いケーブルを用意した方がいいかもしれません。

左上の USB コネクタの近くに 6 ピンのピンヘッダ (ICSP2) がない Arduino UNO 互換機は USB<->シリアルに Atmega16U2 が使われていない (恐らく CH340G 使用) と思われるので避けたほうがいいでしょう。

See Also:


セットアップ

まずは Arduino Software を DL します。

普通にインストールしてください。難しいことはありません。但し...

Arduino UNO の VID は 2341、PID は 0043 です。

ドライバは Arduino Software に含まれており、自動的にインストールされます。正しくインストールされたら、Arduino UNO を PC と接続します。正常に接続されると仮想 COM ポートとして認識されます。

COM13 として認識されていますね。この状態でデジタルピンの 13 と GND に (色は何でもいいので) LED を挿してみましょう。足の長いほうが 13、短いほうが GND です。

一秒おきに LED が点滅すると思います…いわゆる "Lチカ" ですね。

どうやら最初から Lチカスケッチ (プログラム) が入っているようです。


Arduino 言語マニュアル

言語リファレンスは [ヘルプ | リファレンス] で閲覧できます。実体は Arduino IDE インストールフォルダの reference サブフォルダにあります。Web 上にもあります

See Also:


注意点

SainSmart の UNO R3 互換機 (サインスマート改造バージョン) を使う場合には、3.3V / 5V 切り替えスイッチを 5V 側にしておく必要があります

ここが 3.3V 側になっているとアナログポートを使う UNO 用のスケッチがうまく動かない事があります。



チュートリアル

とりあえず参考書が必要ですね。


Arduino をはじめよう

最初の一冊としてはこれが適当かと思います。後半は Arduino 言語の日本語リファレンスとなっています。マストバイ。

以下の記事は、書籍 Arduino をはじめよう をなぞったものですが、私か購入した時点の第2版準拠なので、新しい版とは異なる箇所がある事をお断りしておきます。

第3版では LEONARDO の記事が追加されていたりしますので、できるだけ新しい版を購入した方がいいと思います。



Example 01: LED を点滅させる

最初からLチカスケッチが入っているので LED を刺すだけで終わりです。あとはスケッチの delay() を変更して点滅間隔を変えて遊ぶくらいですかね (^^;A

UNO にはビルトイン LED があるので、実は外部 LED を繋がなくてもLチカできます。

Arduino IDE 付属のスケッチ Blink ([ファイル | スケッチ例 | 01.Basics] にある) のコードでは、13 ではなく LED_BUILTIN が指定されています。この LED_BUILTIN は Arduino UNO では 13 ですが、他の Arduino ではそれ以外の値で定義されている事があります。

LED を抵抗なしでLチカさせる事の是非

さて、「LED を抵抗なしで D13 に挿すのはよくないよね?」 という話が多いようなので補足しておきますね。もちろん LED を接続するのに抵抗が必要だという事を否定しているのではありません。

恐らく Arduino をはじめよう の趣旨は最初に Arduino を触らせようという事なのだと思います。抵抗を使うのであれば、ブレッドボード (とジャンパーワイヤ) が必要であり、Arduino に触る前にブレッドボードの使い方を知る必要がありますので。

D13 には抵抗が初めから入っているのか?

「D13 には抵抗が入っているから直接 LED を挿してもいいよね!」 という話があるようですが、半分正しくて半分間違っています。

Duemilanove も UNO も D13 には抵抗が入っていません。つまりこの話はかなり古い Arduino にしか当てはまらない事になります。

では、Arduino をはじめよう も古い Arduino を元に書かれているから直接 LED を挿しているのでしょうか?いえ、時期的にそれはありえません。イラストの四角いチップは ATMega16U2 / 8U2 ですので、明らかに UNO を参考に書かれています。

初版のイラストは Duemilanove だったようです。

結論

個人的には、

...と思っています。

話の順番が逆ですが、LED を使う時に抵抗をつなげる必要があるのは LED に過大な電流が流れるからです。

この抵抗を電流制限抵抗と呼び、名前の通り LED に流れる電流を制限する働きがあります。抵抗を使った接続例は Example 04: LED のフェードインとフェードアウト で出てきます。

See Also:



Example 02: プッシュボタンを使って LED をコントロール

プッシュボタンは割と強引に挿します (足は手前の2本が刺さっていればいいです) 。4本足のタクトスイッチは向きに注意してください。向きを間違えると常に導通してしまいます。

プルダウン抵抗が入っていますが、これについての詳しい説明はありません。「プルアップ / プルダウン抵抗が何のためにあるのか?」 ですが、簡単に言えば 「プルアップ / プルダウン抵抗がないと信号が HIGH なのか LOW なのかハッキリしないから」 です。ボタンにプルダウン抵抗が付いていると、ボタンが押されない場合には LOW になります (押されたら HIGH)。ボタンにプルアップ抵抗が付いていると、ボタンが押されない場合には HIGH になります (押されたら LOW)。

プルアップ / プルダウン抵抗がない場合、意図しない動作になる事があります。

等々。ソフトウェア的に言えば "初期値" を設定するようなものでしょうか。

See Also:



Example 03: ボタンを押すと LED が点灯し、ボタンから指を離した後も点いたままにする

回路は Example 02 と全く同じです。ここで紹介されている バウンシングチャタリング とも呼ばれます。

See Also:



Example 04: LED のフェードインとフェードアウト

書籍には 270Ωと書いてありますが、キットの都合上 220Ωを使います。1KΩでもいいかと思いますが、明るくないかもしれません。

PWM (Pulse Width Modulation: パルス幅変調) に使えるピンは以下の通りです。

PWM というと大層な感じがしますが、昔ポケコンで擬似中間色を出すのに ON/OFF を高速で繰り返したりしたアレです (w

analogWrite() の分解能は 256 (8bit: 0~255) です。

See Also:



Example 05: ボタンを押すと LED が点灯し、ボタンから指を離した後も点いたままにする。ボタンを押したままにすると明るさが変化する

Example 03Example 04合体させろという無茶振りをしてきます。そしてここには二通りの接続方法が示唆されています。

前者は素直に合体させる方法です。"GND 端子が 2 つある" と書かれていますが、僕の目には 3 つあるように見えます (^^;A 後者はブレッドボードの GND レーンを使って配線する方法ですが、イラストが描かれていないのでブレッドボードに不慣れな方は意味が解からないかもしれません。画像はこちらの方法の配線例です。別途ブレッドボード用のジャンパーワイヤがあると配線しやすいと思います。



Example 06: アナログ入力の値に応じて LED の点滅レートが変化 / 明るさを変える

光センサーは上の画像のものです。

よく読めば解りますが、(書籍の) イラストの配線だけではなく Example 04 の配線も必要となります。スターターキットには CdS セルが 3 つ入っている気がするのですが、どれも特性は変わらないのでしょうか?

analogRead() の分解能は 1024 (10bit: 0~1023) です。

See Also:



Example 07: アナログ入力ピン 0 の値をコンピュータへ送る

回路は Example 06 と全く同じです。

Leonardo の場合、ハードウェアシリアル (Digital #0, #1) を使うには Serial ではなく Serial1 を使います。



Example 7.5: モーターの駆動

Example 07Example 08 の間にあるモーターを回すサンプルはスケッチ (プログラム) が掲載されていません。スターターキットには MOSFET / ダイオード / モーターが付属しないのでこれを試す事はできません。別途パーツを購入する必要があります。

念のために配線図を書いておきます。MOSFET とダイオードには向き (極性) がありますので注意が必要です。また、電池ボックスを接続して 9V を供給する必要があります。モーターに関しては、PC のジャンクパーツをお持ちならファン (12V) を探してみましょう…この際には 12V の AC アダプタを接続する必要があります。

DC ジャックに接続した電源は Vin から取り出せます。また、名前の通りここに電源を繋ぐ事もできますが、DC ジャックと Vin の両方に電源を繋いではいけません

See Also:



Example 08: Arduino ネットワークランプ


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

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

22 プロジェクト分のサンプルが付属していますが、標準のスターターキット (16プロジェクト) で試せるのは Chapter 17 までです。



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" の方でもそれをやらなかったのか不思議で仕方ありません。

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 キーパッドを購入した方がいいと思います。

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

接続は以下の通りです。

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:


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

メニュー: