- 製品の動くプロトタイプを作ってユーザーの反応を見てみたい。
- Arduinoを買ってみたけど、回路とどうつなげばよいのか分からない。
- 中学校の理科で習った電気回路の知識(オームの法則、簡単な回路図など)は何とか思い出せる。
今回はそんな人を対象に、Arduino UNOを例に挙げて、回路をArduinoに接続すると回路が、Arduinoが、どんな振る舞いをするのかを説明する。
Arduino UNOの外観↓
なお、Arduinoの中の本当の回路構造がどうなっているのかを説明するつもりはなく、あくまでボタンとかLEDをArduinoにつなぐ上で必要な「Arduinoを外から見たらどんな振る舞いをするのか」という最低限の情報だけ説明するので誤解無きよう。(実際はもっと複雑な回路になっている)
デジタル入力とデジタル出力で、Arduinoを外から見たときの振る舞いは全然異なるので、それぞれの場合について説明する。
アナログ入出力については後日。
もくじ
デジタル入力
デジタル入力は、ボタンを押した/押さない、スライドスイッチをON/OFFにした、人感センサーが反応した/しないなど2状態の検出に使う。
Arduino UNOでデジタル入力に使えるピンはこれら↓
2~13番のピンが使える。
例えば8番のピンをデジタル入力として使うとき、Arduino自体はこんな回路になっているものとして扱える。
8ピンとGNDはArduino内部でとっても大きな抵抗を介してつながっている。その大きさはArduino公式サイトに100MΩと書かれている。
他のピン(2~13番のどれか)をデジタル入力として使うときも全く同様だ。
これにボタンをつないでみると、例えばこうなる。(これは悪い例だ。理由は後述)
見やすさの都合から、回路に直接関係の無い箇所は灰色にしている。
このような回路を組んだ上で、ArduinoのプログラムでdigitalRead(8)を実行すると、8ピンの電圧が読み取れる。
ボタンを押すと8ピンの電圧は5Vになり、 digitalRead (8)の結果はHIGHになるが、
ボタンから手を離しても実は0V(LOW:GNDと同じ)にはならない場合がある。「不定(どうなるか保証できない)」と呼ばれる状態だ。
Arduinoに内蔵されている100MΩの抵抗というのは抵抗の中ではかなり大きな方で、電流がほぼ流れない(電流=電圧÷抵抗だから)。電流が流れないということは、それはもう「回路がつながっていない」のと同じだ。
回路がつながっていないということは、ボタンから指を離した瞬間から上図の赤いところは回路のどこにもつながっていない「浮いた」状態になる。英語で float などと呼ばれる状態だけど、こうなると、GNDと浮いたところとの間の電圧が一体どのくらいなのかが決まらない。(指を離した直後はおそらく5V、その後はゆらゆら揺れたり、何か物が触れたりすると急に変化したりする)
このような理由から、浮いた状態ができる回路は普通つくらず、次のように「プルアップ抵抗」などを使う。
プルアップ抵抗というのは、上図のようにピンと電源の+極とをつなぐ抵抗のことで、Arduinoにはプルアップ抵抗として使える10kΩの抵抗が内蔵されている。この内臓のプルアップ抵抗を使う場合、Arduinoプログラムの中でピンモードの指定は次のようにする。
pinMode(8, INPUT_PULLUP);
このときdigitalRead(8)の結果は、ボタンを押すとLOW、ボタンから指を離すとHIGHになる。(逆ではないので注意)
もちろん、元々浮いた状態ができない回路であれば無理してプルアップ抵抗を使う必要はない。
デジタル出力
デジタル出力は、LEDを光らせる/光らせない、ブザーを鳴らす/鳴らさないなど2状態の出力に使う。
Arduino UNOでデジタル出力に使えるピンはこれら↓
2~13番のピン(デジタル入力に使えるのと同じピン)が使える。
例えば8番のピンをデジタル出力として使うとき、Arduino自体はこんな回路になっているものとして扱える。
Arduino内部には5Vの電源と、ArduinoプログラムでON/OFFが切り替えられるスイッチがある。スイッチがOFFだと8番ピンは0Vになり、ONだと5Vになる。
他のピン(2~13番のどれか)をデジタル出力として使うときも全く同様だ。
これにLEDをつなげると、たとえばこうなる。見やすさの都合から、回路に直接関係の無い箇所は灰色にしている。
スイッチがONになるとLEDに電流が流れ(光り)、OFFになると電流が流れない(光らない)ことが分かる。
スイッチをONにするためにはArduinoプログラムで
digitalWrite(8, HIGH);
と記述する。
スイッチをOFFにするためにはArduinoプログラムで
digitalWrite(8, LOW);
と記述する。