Arduinoに外部回路を接続する

Arduino

前回は Arduino 単体で実行できる内容でしたが、今回はブレッドボードを用いて Arduino 基板の外に簡単な回路をつくり、それを Arduino から制御する方法を試してみます。

Arduino の入出力インターフェイス

Arduino UNO は、LED やモータを制御したり、各種センサからの信号を受信したりするために数多くの入出力インターフェイスが備わっています。

写真の上下に並んでいる端子(ピンソケット、ジャンパ線のピンなどを差し込めるようになっている穴)の一部が入出力のためのインターフェイスになっています。それでは、端子の配置を見てみましょう。

Arduino UNO の基板を写真のようにロゴが読める向き・USBポートが左手にくる向き置いた場合、上の列には出力/デジタル入力に使用できる端子( D0 ~ D13 の14個)が並んでいます。これらは入力として使うか、出力として使うかをプログラムから切り替えて使用します。

入力として使う場合、『スイッチのON/OFF』のような二段階の入力(デジタル入力)が可能です。

出力として使う場合、D0 ~ D13 のすべての端子は ON(最大値=255)か OFF(0)かの二段階のデジタル出力が可能です。また『 PWM 』と書かれている D3、D5、D6、D9、D10、D11 については、『 LED の明るさ』や『モータの回転速度』などを0から最大値 255 まで 256 段階で制御できるアナログ(正確には PWM )出力が可能です。アナログ出力可能な端子は、ボード上に『 ~ 』記号が描かれています。

Arduino 基板の下の列には、アナログ入力に使用できる端子( A0 ~ A5 の 6個)が並んでいます。アナログ入力では、『オン/オフ』の二段階ではなく、外部に接続するセンサの種類によって『明るさがどのくらいか』『温度がどのくらいか』など、『どの程度の量なのか』を読み取ることができます。

外部のLEDなどを制御するには、『出力』である D0 ~ D13 端子のいずれかを使用します。最初の例では ON/OFF のみのデジタル制御をしますが、あとで明るさの調整もやってみたいので、今回はアナログ出力も可能な D3 を使用することにします。

また、入力にしろ出力にしろ電源供給にしろ、かならず電位の基準となる『 GND 』と書かれたいずれかの端子をセットで使用します。

製作

使用部品

今回、Arduino 以外に使用する部品は以下の通りです。

部品名数量備考
ブレッドボード1小型のものでOK
赤色LED1『抵抗入り』『高輝度』『自己点滅』などではないもの
抵抗器(330Ω)14本帯なら橙橙茶+誤差、5本帯なら橙橙黒黒+誤差
ジャンパー線
(オス-オス)
2黄×1本、黒×1本

それぞれの部品について詳しく見て行きましょう。

ブレッドボード

ブレッドボードは実験基板ともいい、半田付けをせずに電子回路を組むことができる部品です。見た目は多数の小さな穴が空いた板で、この穴に電子部品の脚を差し込むことで回路を組み立てます。今回は小さなブレッドボードが1つあれば充分です。

LED

LED は発光ダイオードともいい、電流を流すと発光する部品です。白熱電球に較べて小さな電流で発光します。電流が小さいため発熱も少なく、部品の寿命も長いのが特徴です。LED には単品以外にも、複数の LED をモジュール化したものなど様々な形状がありますが、今回は標準的な単品の赤色LEDを使用します。

抵抗器

LED を使用する場合、必ず電流制限用の抵抗器を直列に挿入します。抵抗値の計算方法は別項にゆずります。今回は LED の型番が不明なため、少々抵抗値が大きめの 330Ω のものを使用します。LED のデータが判る場合は適切な抵抗値なものを選んで下さい。

ジャンパ線

両端がピンまたはソケットになっている被覆導線で、ブレッドボード上などで半田付けをせずに配線を行うことができます。ピンはブレッドボードの穴やソケットに挿し混んで使います。ソケットは部品の脚やモジュール基板のピンヘッダを挿し混んで使います。両側がピンになっているものを『オス-オス』、両側がソケットになっているものを『メス-メス』、片側がピンで反対側がソケットのものを『オス-メス』といいます。

回路図

今回の回路は下図の通りです。

Arduino の出力端子 D3 から抵抗を経由して LED のアノードに接続し、LED のカソードと Arduino の GND を接続するだけ、という非常にシンプルな回路です。

配線図

配線の作業中はまだ電源( USB ケーブル)を接続しないで下さい。電源が入っていると、配線中に誤って回路を短絡させたときに Arduino が破損する危険もあります。

配線は以下の通りです。

1.抵抗器をブレッドボードの適当な位置に挿します。向きはどちらでも大丈夫ですが、2つの脚が同じ列にならないように(縦に並ばないように)して下さい。

2. LED のアノード(長い脚)を、『抵抗器の右側の脚と同じ列』になるように挿します。カソード(短い脚)は、『アノードや抵抗器の2本の脚とは違う列』になるように挿します。

3.ジャンパ線(黄)の両端のピンを、それぞれ『 Arduino の D3 』と『抵抗器の左側の脚と同じ列』に挿します。

4.ジャンパ線(黒)の両端のピンを、それぞれ『 Arduino の GND のいずれか』と『 LED のカソード(短い方の脚)と同じ列』に挿します。

配線に使用するジャンパ線の色にも気をつけましょう。色は自分の好みで決めてもいいですが、小型模型や電子工作の配線としては +側が赤(なければ暖色系)、-側が黒(なければ寒色系)という配色が定着していますので、このサイトではそれに準拠して、電源供給(+側)に接続する線は赤色、GND に接続する線は黒色を使用します。

※ちなみに電力用の配線ではニュートラル(0V)が白、ライブ(±100V)が赤または黒、アースが緑…などとルールがはっきり決まっています。ホビー電子工作で定着しているものとは色使いがまったく違うことにも注意して下さい。

以上で配線は終了です。間違いが無いか見直したら先に進みましょう。

プログラム

PC で Arduino IDE を起動し、新規スケッチを作成して、以下の通りに入力します。

C++
#define LED_PIN 3

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

基本原理

LED は、アノード→カソードの向きに電流が流れると発光します。よって、アノード側の電位がカソード側より高くなるようにすれば良いわけです。回路図によると、アノード側は Arduino の D3 端子に、カソード側は電位の基準(0V)である GND に接続されていますので、大雑把に言えば

D3 端子の電位を 0V より高い値にすれば LED が発光
D3 端子の電位を 0V にすると LED が消灯

となります。

プログラムの解説

setup() と loop()

Arduino のスケッチは、C言語によく似た言語で記述します。C言語、C++、Java などの経験がある人はすぐに Arduino のプログラムが組めるようになると思います。

まず、Arduino 独自の仕様である setup()loop() について説明します。

スケッチを新規作成したとき、

C++
void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}

このようなコードが最初から記述されています。このうち、『 // 』から行末まではコメント(注釈)であり、プログラムの動作には関係ありません。コメントを削除すると、

C++
void setup() {
 
}

void loop() {
 
}

となります。

このプログラムは、2つのよく似た部分で構成されているのにすぐ気付くと思います。

C++
void setup() {
 
}
C++
void loop() {
 
}

このような『 void 名前(){ … } 』のような記述を、『関数定義』といいます。C や Java を学んでいればお馴染みの型式です。独自の関数の定義の仕方は別記事に譲るとして、今回は『 setup() 』と『 loop() 』の2つについて説明します。

この2つの関数は、Arduino のスケッチでは特別な意味を持っています。この2つの関数は、

setup() に記述された処理は、プログラム開始時に1回実行される
loop() に記述された処理は、Arduino が起動している間じゅうずっと繰り返し実行される

と決まっています。

よって、

setup() には初期設定の処理
loop() にはArduino動作中にずっと継続する処理

を記述します。なお、loop() は自動的に繰り返し実行されるので、loop() 内部のコードとして『 for(;;) 』や『 while(1) 』のような無限ループを記述する必要はありません( C言語でプログラムを作った経験があるとついやりたくなってしまいますが)。

この2つの関数は Arduino のスケッチでは必須なので、新規作成時にも最初からひな形として入力された状態になっています。その代わり、というのも変ですが、Arduino のスケッチには一般的なC言語のプログラムには必須の main() 関数がありません

これ以外に関数を定義することもできますが、当面はこの2つの関数の中(『 』から『 』までの間)に必要な処理を記述することでプログラムを作っていきます。

#define で定数を定義
C++
#define LED_PIN 3

最初の行にある『 #define 』は定数を定義するための命令です。『定数』といいながら、正確には『数』ではなく、文字列の置換のような動作をします。

書式は、

#define 定数名 値

です。他の命令語と違い、末尾に『 』(セミコロン)は書きません。

このプログラムの例では、『 LED_PIN 』という名前の定数の値を『 3 』と定義しています。

pinMode()で端子の入力/出力を切り替え
C++
void setup() {
  pinMode(LED_PIN, OUTPUT);
}

先に、Arduino UNO の場合、D0 ~ D13 の 14個の端子が入力/出力をプログラムから切り替えて使える、と説明しました。pinMode() 関数は、まさに入力/出力の切り替えのための関数です。

先ほども名前が出てきた『関数』ですが、『関数』とは、C言語では『まとまった一定の役割を持った命令』のようなもののことです。数学の『関数』、たとえば \(y=f(x)\) ならば、\(x\) に何か値を代入したときの計算結果を得ることが出来るものですが、C言語では必ずしも『結果』が戻ってくるとは限りません。この pinMode() も、結果が返ってこない関数です。

pinMode()の書式は次の通りです。

void pinMode(int pin, int mode)

pinMode()には2つの引数 pinmode があります。

pin には、設定したい端子の番号を数値で指定します。このプログラムでは、『 LED_PIN 』という定数に『 3 』という値が設定されているので、3番の端子(D3)に対する設定だと判ります。

mode には、『 OUTPUT 』、『 INPUT 』、『 INPUT_PULLUP 』 のいずれかの値を指定します。意味は下の表の通りです。

名前意味
OUTPUT端子を出力に設定する
※アナログ出力、デジタル出力の区別はありません
INPUT端子を入力に設定する
INPUT_PULLUP端子を入力に設定し、かつ内蔵プルアップ抵抗を有効にする

この例では、D3 端子を出力に設定します。
pinMode() 関数は、最初に一回設定すれば良いため、setup() 関数の中に記述します。

digitalWrite() で出力する
C++
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

digitalWrite() 関数は、出力端子に出力するためのものです。書式は以下の通りです。

void digitalWrite(int pin, int value)

pin は、pinMode() 関数と同じく、端子番号(ピン番号)を数値で指定します。

value には『 HIGH 』か『 LOW 』のいずれかを指定します。意味は以下の通りです。

名前意味
HIGH端子の電位を最高値(電源電圧と同じ、5V または 3.3V )にする
LOW端子の電位を最低値( 0V )にする

この例では、D3 端子に HIGH を出力しています。すると D3 端子の電位が 5V となり、D3 端子に接続された LED のアノード側が GND に接続されたカソード側より電位が高くなるため、電流が流れて LED が点灯します。

D3 端子に LOW を出力すると、LED のアノード側とカソード側の電位がともに0Vとなるため、電流が流れず、LED が消灯します。

このように、digitalWrite() 関数は外部に接続した電子機器を制御するためにもっとも重要な役割を担っています。

delay() で指定された時間だけ待つ
C++
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

digitalWrite() を使用して HIGH と LOW を交互に出力すればLEDが点滅する…はずなのですが、その切り替えがあまりに速いので、人間の目にはついたり消えたりが別々に見えず、ずっと薄暗くついているように見えてしまいます。そこで、出力を切り替えた後はなにもせずに待つ時間を設けることにします。

delay() はそのための関数です。書式は以下の通りです。

void delay(int time)

delay() は引数 time で指定された時間だけプログラムの実行を停止して待ちます。time は ms 単位の数値で指定します。よって、例のように delay(1000) とすると 100ms = 1秒だけ待つことになります。

以上を繰り返す

loop() 関数内に記述された処理は、Arduinoの 電源が入っている間ずっと繰り返し実行されます。

従って、このプログラムでは、

『LEDを点灯させる』→『1秒待つ』→『LEDを消灯させる』→『1秒待つ』→(最初に戻る)

という処理がずっと続けられます。これによって LED が点滅を繰り返すわけです。

コンパイル&実行

それでは、USB ケーブルを PC と Arduino に接続し、Arduino IDE の『 』ボタンをクリックしてスケッチをコンパイル&実行してみましょう。

このように動作したでしょうか?

うまく動かなかった場合

思った通りに動かなかった場合、すぐに電源(USB ケーブル)を外してから配線を確認しましょう。

たとえば LED を指し込む向きが逆だと点灯しません。小型の LED は逆方向の電圧にあまり強くなく、品番によっては 5V が逆方向にかかると破損する恐れがあります。

また、どこかが短絡している(繋がってはいけないところが繋がってしまっている)場合も点灯しません。Arduino の出力に設定した端子が電源や GND と短絡してしまうと、Arduino が破損する恐れがあります。

どちらも早急に修正しないと部品が破損する恐れがありますので、電源を入れたままのんびりチェックをするのはよくないです。

まとめ

  • 電子回路を試作するには、ブレッドボードを使うと簡単
  • setup() 関数には、初期設定の処理を記述する
  • loop() 関数には、起動中継続する処理を記述する
  • pinMode() 関数は、入出力端子の入力・出力を設定する
  • digitalWrite() 関数は、デジタル出力端子にHIGHまたはLOWを出力する

コメント

タイトルとURLをコピーしました