ラベル 電子回路の基礎 の投稿を表示しています。 すべての投稿を表示
ラベル 電子回路の基礎 の投稿を表示しています。 すべての投稿を表示

2010年1月24日日曜日

ArduinoでLEDを点滅させる

この投稿は、建築発明工作ゼミ2008を参考に、現在の仕様にあわせて新たに書き起こしたものです。
この投稿内容については、上記ブログ管理人のkousakuさんの許可を得ております。

Arduinoのスケッチは、基本的に以下のような構成になっています。

void setup(){

    //初期設定のプログラム
}

void loop(){

    //ループ処理のプログラム
}

setup()は、スケッチが実行される最初に、一回だけ実行される特別な関数です。『 { 』と『 } 』で囲い、その中に初期設定を記述します。
後述するスケッチでは、pinMode()を使って基盤上のどのピンを出力または入力で使いたいのかを設定しています。

setup()内の処理を終えると、次はloop()関数内の処理に移ります。
loop()は、setup()関数内の初期設定やsetup()上部で宣言された変数、defineで定義された定数などの設定値を使い、入力値の加工や、どのピンにどんな値をどのように出力すればよいかなどの計算をさせるための処理プログラムを記述します。
この中に記述された処理は、電源がつながっていてなんらかのトラブルがない限りループし続け、処理を続けます。

Arduino IDEでスケッチを書き、LEDを点滅させてみます。
まずは、以下のように、LEDをArduinoに直接セットします。
アノードはデジタル13ピン、カソードはGNDに接続します。


次にArduino IDEを起動させ、以下のようなスケッチを書いてみます。


スケッチの説明をします。
1. LEDのアノードを差し込むデジタルピンの番号を、任意でつけた "ledPin" という名前の変数に格納します。
変数とは、スケッチで扱う様々な値をいれておく箱のようなものと考えてください。この箱(変数)を使うと、スケッチ上のいろんな箇所で、変数名を記述するだけで入れておいた値を使う事ができます。もし変数を使わなかったら、上記の "ledPin" と記述されている箇所すべてに値(この場合は13という数値)を書き込まなければなりません。例えばもし「13」という値を変えてみたいと思った時に、"ledPin" と書かれている箇所すべてを書き直す事になります。変数を設定しておけば、1行目の「13」という値を書き換えるだけで済みます。
その他に様々な不便なことが出てくるのですが、今回は割愛します。

int ledPin = 13;

これは、整数型(integer)の値13を変数 ledPin に代入するという意味です。決してイコール(等号)ではないので、間違えないようにしてください。スケッチ内で等号を記述するときは、== と書きます。条件分岐の構文 if 文などでよく使います。プログラムでは、式の右辺から評価(大雑把に言うと計算するということ)し、左辺に代入もしくは比較します。

2. setup()関数(上記参照)

3. pinMode()関数で、"ledPin" の値(この場合は13)のピンを「OUTPUT」(出力)に設定します。

4. loop()関数(上記参照)。関数内の処理のループが始まります。

5. digitalWrite()関数で、"ledPin" の値(この場合は13)のピンを「HIGH」にします。つまり、13ピンに差し込んでおいたLEDのアノードに、5Vの電圧を出力します。そうすると、LEDが光ります。

6. delay()関数で、()内の指定したミリ秒だけ現状を維持します。1000ミリ秒、つまり1秒間LEDが光り続けます。

7. digitalWrite()関数で、"ledPin" の値(この場合は13)のピンを「LOW」にします。つまり、13ピンに差し込んでおいたLEDのアノードに、0Vの電圧を出力します。そうすると、LEDの光りが消えます。

6. delay()関数で、()内の指定したミリ秒だけ現状を維持します。1000ミリ秒、つまり1秒間LEDの光りが消え続けます。

-> 5. に戻って処理を繰り返します。


左側の数値はスケッチ説明用の行番号なので、実際に入力する必要はありません。
ArduinoをPCに接続し、ボードとシリアルポートの設定を確認します(ここの「Arduino ボードの選択」と「シリアルポートの選択」を参照)。
Arduinoボード上の「PWR」ランプが光っていることを確認したら、Arduino IDEの「Verify」ボタンをクリックします。スケッチに不備があれば、
スケッチ記述エリア下部のモニタにエラーメッセージが表示されます。
エラーがなければ、「Upload」ボタンをクリックしてArduinoボードにスケッチを送信します。
成功すれば、モニタに「Done uploading」と表示されます。
Arduinoに差し込んだLEDが、1秒のタームで点滅を始めるはずです。

電子回路の基礎 -4 LEDについて

この投稿は、建築発明工作ゼミ2008を参考に、現在の仕様にあわせて新たに書き起こしたものです。
この投稿内容については、上記ブログ管理人のkousakuさんの許可を得ております。


LEDライト

簡単にLEDを説明します。
LEDは電流を一方向にしか流さない特性があるため、+と-を電源に対して正しくつながないと発光しません(逆につないでも壊れるということは、ほぼありません)。上図のように、通常二つの端子(アノードとカソード)があります。アノード側をプラスに、カソード側をマイナス(GND)に接続します。

LEDの多くは2.5V前後の電源で発光するようにつくられています。正確に言うと、+から-にかけて、その両端にかかる電圧の差(電圧降下)が2.5V前後必要であるということです。単三乾電池は1.5Vですから、一つでは光らせる事はできません。そして、Arduino基盤上の5V電源とGND(0V)に直接つなぐと、電圧降下の差が大きすぎて壊れる恐れがあります。そのためにArduinoに接続する回路に抵抗をかませる必要があります。

Arduino基盤の13番ピンは特別で、抵抗なしで直接つなぐことができますが、0〜12番ピンに接続する際には、抵抗(220〜470Ω程度)を直列つなぎしてください。LEDによって特性が異なりますので、より精確に行いたい場合は、購入する際に使用電圧や最大電流についてメモしておくか、付属のデータシートを参考にしてください。


アノード側に抵抗をつないだ場合は、抵抗を通して5Vの電圧が2.5Vまで下げられ、LEDによって2.5Vから0Vに下げられます。
カソード側に抵抗をつないだ場合は、LEDを通過することで5Vの電圧が2.5Vまで下げられ、抵抗によって2.5Vから0Vに下げられます。
最初にプラス側で電圧をさげておくか、最後にマイナス側で電圧を下げるかという違いです。もし、抵抗を取付けなければ、LEDにおいて5Vから0Vに一気に下げられ、電位差が5Vになってしまい使用電圧である2.5Vをはるかに上回り破損してしまうという感じです。抵抗の取付けについては、回路設計やLED の特性に応じて使い分けてください。

2010年1月23日土曜日

電子回路の基礎 -3 回路の法則 -2

当投稿は、東北学院大学工学部 機械知能工学科講義「メカトロニクスIおよびII」の『電子回路の基礎』項目を参考にさせて頂きました。一見難しい記号や式が並んでいるように見えますが、よく読めば大変わかりやすく書いてあります。

Arduinoが感知できる範囲内に電圧と電流を整える為には、いくつもの電子部品を使う必要があります。その中の一つに抵抗器があります。回路の法則-1 で扱ったように抵抗は電気の流れをおさえる役目を持っており、その電気抵抗の単位は「オーム(Ω)」で表されます。

通常、電子工作においては、センサをとりあえず一つだけ使ってみるといった簡単な実験でもない限り、一つの回路内に抵抗器一つだけということはありません。「入力」->「処理」->「出力」の流れの中で、複数の抵抗を使って想定の電圧を調整していくのが普通です。二つ以上の抵抗を使った場合の電圧と電流の関係を求めるには以下の法則を使います。


合成抵抗
  • 複数の抵抗を直列に並べた場合の合成抵抗は以下のようになります。


R = R1 + R2

キルヒホッフの第ニ法則で考えてみます。
E = IR1 + IR2
E = I(R1 + R2)
E = IR
つまり、
R = R1 + R2
抵抗の直列つなぎは、その抵抗値の和に等しいことになります。

  • 複数の抵抗を並列に並べた場合の合成抵抗は以下のようになります。


R = (R1 × R2) / (R1 + R2)

この場合、抵抗R1とR2の両端には、等しく電圧E(5V)がかかります。
オームの法則により、
I1 = (E / R1)
I2 = (E / R2)
全体としては
I = (E / R)
キルヒホッフの第一法則により、
I = I1 + I2
だから、
(E / R) = (E / R1) + (E / R2)
(1 / R) = (1 / R1) + (1 / R2)
(1 / R) = (R1 + R2) / (R1 × R2)
よって、
R = (R1 × R2) / (R1 + R2)


分圧回路

E2 = (R2 / (R1 + R2)) × E

電圧を分ける回路です。電圧はA点において、もとの電圧(5V)より低い3V(マイナス電源を基準とする)となります。この3Vという値は、二つの抵抗R1R2の値の比率によって決まります。例えば、抵抗R1R2の比が 2 : 3 の時、5Vの3/(2+3)で3Vです。
なんとなく感覚でもわかるでしょうが、あえて法則化してみると、
オームの法則により、
E = IR1 + IR2
E2 = IR2
これを解くと、
E2 = (R2 / (R1 + R2)) × E
となります。

この分圧回路は、オペアンプという電子部品を使ってArduinoのアナログ入力端子にセンサからの値を適切な範囲内に整えて入力させる回路を作る時に重要な役割を果たします。
オペアンプは、センサによって変化する電圧の振り幅を一定の範囲(Arduinoの感知する0V〜5V)に整える時に使います。例えば、光センサの出力する電圧の範囲が0V〜1Vであるのを、0V〜5Vに変えてやると、Arduinoのアナログ入力値幅1024段階をフルに使えるようになります。つまり振り幅を5倍にするわけですが、この倍率を決める時に分圧回路が役にたつわけです。

電子回路の基礎 -2 回路の法則 -1


当投稿は、東北学院大学工学部 機械知能工学科講義「メカトロニクスIおよびII」の『電子回路の基礎』項目を参考にさせて頂きました。一見難しい記号や式が並んでいるように見えますが、よく読めば大変わかりやすく書いてあります。


電子回路ではおもに電圧電流を扱います。電圧(V -ボルト)というのは電気の流れる圧力、電流(A -アンペア)というのは電気の量です。リンク先にも記述があるのですが、電子回路は水の流れに例えると理解しやすいと思います。


オームの法則
電子回路の基礎法則です。電圧と電流と抵抗は以下の関係が成り立ちます。

E = IR [ 電圧(E) = 電流(I) × 抵抗(R) ]
I = E / R [ 電流(I) = 電圧(E) / 抵抗(R) ]
R = E / I [ 抵抗(R) = 電圧(E) / 電流(I) ]

水の圧力(電圧)
水の量(電流)
パイプの太さ(抵抗)

と例えると、

同じ水量(電流)の場合、パイプの太さを細くする(抵抗値を上げる)と水圧(電圧)が上がります。
同じパイプの太さ(抵抗)の場合、水圧(電圧)を上げると水量(電流)が増えます。
電子回路の場合、回路上の全ての点で「電位」という値が定義されます。この電位は、その回路に使う電子部品や抵抗、センサなどによって各点で異なる値を示します。ある回路上の二点の電位差が電圧として定義されます。

図1

図1の場合、電源は5V、250Ωの抵抗を使っているので、回路に流れる電流は
I(?) = E(5V) / R(250Ω)
0.020 = 5 / 250
つまり、0.02A(20mA)です。
抵抗Rの両端のA点とB点の電位差(電圧)は5Vとなります。


キルヒホッフの第一法則
ある回路において、入ってくる電流と出て行く電流の和は等しくなります。当たり前のことのようですが、これが後述する法則の基礎として重要な役割を果たします。

I1 + I2 = I3 + I4

図2

図2において、電流I1 + 電流I2 = 電流I3 + 電流I4 が成立します。


キルヒホッフの第二法則
ある回路において、電圧は一周したら0になる、という法則です。

E - I1R1 - I2R2 - I3R3 = 0

図3

図3は、E-A-B-C-D と輪になっている回路を、ある回路の一部から取り出したものとします。点A・点B・点C・点Dの先はもとの回路とつながっています。こうしないと、後述する合成抵抗の法則により、電流I1I2I3がすべて同じ値になってしまうからですが、とりあえずあまり気にしないものとします。

まず、A点の電圧(D点を基準とした電位差)は5Vです。

次に、抵抗R1にかかる電圧(B点を基準とした電位差)は、オームの法則によりI1R1となります。
つまり、B点の電圧(D点を基準とした電位差)は、E - I1R1 となります。

次に、抵抗R2にかかる電圧(C点を基準とした電位差)は、オームの法則によりI2R2となります。
つまり、C点の電圧(D点を基準とした電位差)は、E - I1R1 - I2R2 となります。

次に、抵抗R3にかかる電圧(D点を基準とした電位差)は、オームの法則によりI3R3となります。
つまり、D点の電圧(D点を基準とした電位差)は、E - I1R1 - I2R2 - I3R3 となります。
D点を基準にD点の電圧をみると、0Vになっているはずです。

電子回路の基礎 -1 Arduinoと電子回路


Arduinoを扱う上で、電子回路の知識は必須です。
Arduinoとはで説明した通り、Arduinoは様々なセンサとアクチュエータを繋げる便利なマイコンボードです。しかし、決して万能というわけではありません。
「入力」->「処理」->「出力」の流れの中の「処理」を担当する、人間で言えば脳の役割を果たしているのですが、脳は、それ自体では外部の情報を得たりものを動かしたりすることはできません。情報を得る時は目や耳などのセンサが必要になりますし、得た情報によってなんらかのアクションを起こしたい時には手や足などのアクチュエータが要ります。そして、脳に情報を送る、または手や足に命令を送るための経路も必要です。この経路が、エレクトロニクスの世界では電子回路になります。

電子回路ではさまざまな電子部品を使用し、電気の圧力(電圧)や量(電流)を制御します。電子部品にはそれぞれ明確な役割があり、それぞれの仕様に則って使わないと壊れてしまいます。Arduinoが受け取れる電圧の最大値も決まっていて、それを超えると壊れたり正しい値を受け取れなかったりします。いかに想定した範囲の電圧を精密にArduinoに送れるかがキーとなります。

例えば0℃〜100℃の温度を計測してArduinoに伝えたいとします。Arduinoへは温度の値を電圧に変換して送らなければなりません。デジタル入力ピンは0Vか5Vのどちらかしか伝える事はできないので、電圧を0〜1023の1024段階で受け取れるアナログ入力ピンを使います。Arduino自体の最大入力電圧は5Vです。つまり、0℃〜100℃の温度を電圧0V〜5Vの触れ幅に変換する回路を組む必要があります。0V〜5Vの電圧は0〜1023の値として、指定したアナログピンから取得できます。きちんと回路が組めれば、温度センサを使ってArduinoに送られた電圧が1.2Vだとすると、Arduinoはアナログピンから245(1.2V / 5V × 1024)という値を受け取るはずです。これは、1.2 / 5 × 100 で、約24℃という温度を計測したことになるわけです(『Arduinoで温度を計測する』参照)。

電子回路の基礎知識は、以下のサイトと書籍がたいへん参考になります。一見難しい記号や言葉が並んでいるようにみえますが、よく読むと、非常にわかりやすいです。
また、電子部品の販売店は主に以下の店がおすすめです。
初めてだとちょっと入りづらいかもしれませんが、気にする事なく通いつめましょう。