入門者向け

Arduino(アルディーノ)電子工作の基本③ デジタル出力でLEDを点灯制御しよう

第1回:電子部品を動かそう!
第2回: Arduinoの準備

 

※この記事は2019年6月20日に公開した記事を再編集し、2022年3月15日に再度公開しました。

デバプラでは、Arduinoのさまざまな応用作品例をご紹介していますが、どんなものを作るにも大事なのは基礎知識!
ということで、今回あらためてお届けするのは、Arduino(アルディーノ)電子工作の基本の「キ」。教えてくれるのは、『これ1冊でできる!Arduinoではじめる電子工作 超入門』などの入門編の書籍でも有名な、福田和宏さんです。

前回はArduino用の開発環境を準備し、Arduinoに搭載するLEDと外部に接続したLEDの点滅させてみました。

今回は、Arduinoでオン、オフを切り替えられるデジタル出力について説明し、LEDを利用してデジタル出力のプログラムの作成方法について紹介します。

また、電子部品を使うには、「電圧」や「電流」といった電気に関わる用語が多く出てきます。これらの用語の意味を理解していないと、電子部品を購入する場合に目的の用途に合っているかを判断できません。また、実際に電子部品を接続する場合にも、正しく動作するために電圧などを考慮する必要があります。そこで、電子工作をする上で必須となる用語の意味についても理解しておきましょう。

 

目次

  1. Arduinoに搭載するインタフェース
  2. 二つの状態を出力できる「デジタル出力」
  3. プログラムでLEDを点灯する
  4. プログラムの構成
  5. 知っておきたい電気用語
  6. 抵抗を使って電気の流れを抑制する
  7. LEDは抵抗を接続して点灯する

 

1. Arduinoに搭載するインタフェース

Arduinoには、電子部品を接続して制御できるインタフェースとして、ソケット状の端子が上下に配置されています。ここにLEDやモータなどを接続して動作を制御したり、スイッチなどを接続してオンオフを判断したり、温度センサを接続して室温を計測するなどさまざまな制御が可能となります。

Arduino UNOの場合は、上に14個(0~13)の「デジタル入出力」端子、右下に6個(A0~A5)の「アナログ入力」端子を備えています。

デジタル入出力端子は、電圧の「高い状態」と「低い状態」の2通りの状態で出力して、電子部品を動作させたり、端子の電圧の状態が高いか低いかを確認して電子部品の状態を確認するのに利用されます。

一方、アナログ入力は、連続した電圧の変化を入力できる端子です。

それぞれの端子には番号が割り当てられており、実際にプログラムで電子部品を制御する際は、この番号を指定することとなります。

01

 

2. 二つの状態を出力できる「デジタル出力」

デジタル出力は、プログラムから各端子の状態を変化させることのできるインタフェースです。電圧の「高い状態」または「低い状態」の2通りの状態に、自由に切り替えることができます。たとえば、LEDを接続して電圧の高い状態にすればLEDが点灯し、逆に低い状態にすればLEDを消灯させることができます。

11

Arduinoでは、電圧の高い状態にすると端子の電圧が「5V」になり、低い状態にすると「0V」に切り替わります。また、電圧の高い状態のことを「HIGH」、低い状態のことを「LOW」と言います。プログラムで指定する場合には、「HIGH」、「LOW」と指定します。なお、デジタル入力、アナログ入力については、今後この連載で紹介する予定です。

 

3. プログラムでLEDを点灯する

では、プログラムでデジタル出力を制御してLEDを点灯させてみましょう。ここでは、前回説明した13番目のデジタル入出力端子に接続したLEDで点灯する方法を説明します。プログラムは次のように作成します。プログラムを作成し、前回説明したようにArduinoに書き込んで、LEDが点灯することを確認しましょう。

デジタル出力を制御する際に重要なのが、4行目と8行目です。デジタル入出力では、端子の状態を変更できる「デジタル出力」と端子の状態を読み取る「デジタル入力」の二つの利用方法が可能です。このため、どちらを利用するかをあらかじめ設定で指定する必要があります。この設定をしているのが4行目の「pinMode()」です。

pinMode( LED_PIN, OUTPUT );

pinMode()では、括弧の中に対象の端子の番号と利用するモードの順に指定します。今回は13番端子を使うので対象の端子は「13」、デジタル出力モードを利用する場合は「OUTPUT」と指定します。ただし、今回は端子番号を「LED_PIN」という名前で使えるように設定しているため、対象の端子番号には「LED_PIN」と指定しています(後述します)。
出力を変更するのが8行目の「digitalWrite()」です。

digitalWrite( LED_PIN, HIGH );

出力を変更する対象の端子番号、端子への出力の順に指定します。端子の番号はpinMode()同様に「LED_PIN」と指定します。端子の状態を「HIGH」と指定すると5Vが出力された状態となります。今回のようにLEDを接続すれば、電気が供給されLEDが点灯します。もし、LEDを消灯したい場合は、「LOW」を指定して端子が0Vになるようにします。

 

4. プログラムの構成

デジタル出力以外のプログラムに記述されている内容について説明します。1行目の以下の記述は、電子部品の接続先となる端子番号に名前を付けています。

const int LED_PIN = 13

Arduinoに電子部品を接続するインタフェースには番号が振られています。たとえば、前回LEDを外部接続した端子には「13」が割り当てられています。実際にLEDを制御する場合には接続したインタフェースの番号をプログラムで指定することとなります。しかし、プログラム上に番号を直接記載すると、何の番号であるかを把握しづらくなり、後にプログラムを修正する場合に調査の手間がかかってしまいます。また、接続先を変更した場合、プログラム内すべてのインタフェースの番号を指定した場所を変更する必要があり、手間がかかる上、誤って他の部分を変えてしまい正しく動作しなくなることも考えられます。

そこで、電子部品を接続したインタフェースの番号に、分かりやすい名前をつけておきます。ここでは「LED_PIN」という名前(変数名)を定義し、その変数の中に「13」を格納しています。この後、LEDを制御したい場合には「LED_PIN」と記述しておきます。なお、変数名の前にある「int」は整数であることを表し、「const」はプログラム内で変数の内容を変更できないようにしています。
3〜5行目の以下部分は、はじめの一度だけ実行されるsetup()関数と言います。

void setup() {

}

Arduinoの電源を入れると、中に書き込まれたプログラムに従って実行されます。この際、setup()関数内に記載されたプログラムが一度だけ実行されるようになっています。このため、setup()関数には、初期設定などの用途に利用します。このプログラムでは、デジタル入出力端子のモード設定をするのに利用しています。
7〜9行目の以下部分は、繰り返し実行するloop()関数と言います。

void loop(){

}

setup()関数内のプログラムを実行し終わると、loop()関数の実行に移ります。また、loop()関数の最後まで達すると、loop()の先頭に戻り、再度プログラムが実行されるようになっています。ここにLEDの点灯やモータの制御などプログラムの本体を記述するようにします。このプログラムでは、デジタル出力を切り替え、LEDを点灯するようにしています。

 

5. 知っておきたい電気用語

いくつかの基本的な電気用語の意味を理解しておきましょう。電子部品を選択する場合や、電子工作をする際に電気用語を知っておくことでスムーズに作業が進むようになるためです。一つ目の覚えておきたい電気用語は「電流」です。

金属の中には、「正電荷」と呼ばれるプラスの静電気が存在します。静電気というとわかりずらいので、正電荷は図のようにプラスを帯びた電気の粒のようなものと考えると良いでしょう。
この正電荷が電池などの電源から供給し、導線の中を通り、LEDなどの電子部品に流れ込むことで電子部品が動作します。「電流」は金属などの中を流れる正電荷の量を表します。正電荷がたくさん流れればLEDなどの電子パーツが電気の力(エネルギー)をたくさん利用できるようになり、より明るく光るなどします。逆に電流が小さければ供給される正電荷が少なくなるため、LEDであれば暗く点灯することとなります。
電流は、「A(アンペア)」という単位を利用します。
なお、マイナスの静電気を帯びた電荷は「負電荷」といいますが、一般的に電子回路では正電荷が回路を動いている状態を考えるようにしています。

21

もう一つ覚えておきたい電気用語が「電圧」です。導線などに金属の中には、電気の素となる正電荷がたくさん入っています。この正電荷は電気的な力を加えることで動かすことができます。この正電荷を動かすための力のことを「電圧」と言います。電圧が大きければたくさんの正電荷を動かすことができ、大きな電流となります。一方で電圧が小さいと動く正電荷の量が少なくなるため、電流は小さくなります。

電圧は、「V(ボルト)」という単位を利用します。電池であれば1.5V、Arduinoの電源端子であれば5V、家庭用コンセントであれば100Vの電圧を供給することが可能です。

22

 

6. 抵抗を使って電気の流れを抑制する

電子部品の多くは、流せる電流の上限が決まっており、これ以上の電流を流してしまうと、壊れてしまいます。例えば、LEDで耐えられる電流よりも大きな電流を流してしまうと、LEDから発煙があったり、高温になり最終的に壊れてしまいます。壊れたLEDは再度利用することはできません。また、高温になったLEDを触るなどしてやけどしてしまう危険性もあります。

このため、電子部品に流れる電流の量を適切に調節するのが重要となります。この電流の制限に用いるのが「抵抗(または抵抗器)」です。抵抗とは、電気の流れを阻害し、内部で正電荷が流れにくくする電子部品です。抵抗で電流が抑制されることで、電子部品に流れる電流の量も抑えられ、安全に動作します。

31

抵抗では、正電荷の流れを阻害する程度を「抵抗値」として表記しています。抵抗値が小さいほど正電荷の流れが多くなり、電流が大きくなります。逆に抵抗値が大きいと電流が小さくなります。なお抵抗値の単位は「Ω(オーム)」です。抵抗値と電圧、電流は、「オームの法則」により計算式で表すことができます。特定の抵抗の両端に電圧をかけると、電圧を抵抗値で割った値が流れる電流値となります。

33
例えば、Arduinoの5V端子に1kΩの抵抗を接続すると、以下のような計算式で求められます。なお、1kΩは1000Ωとなります。

5V ÷ 1000Ω = 0.005A = 5mA

逆に特定の電流を流したい場合、接続する抵抗値を求めることもできます。この場合は、かける電圧から流したい電流の値を割ると求まります。例えば、5Vの電圧をかけた場合に10mAの電流を流したい場合は、以下のような計算式で求められます。なお、10mAは0.01Aとなります。

5V ÷ 0.01A = 500Ω

オームの法則については、こちらでも詳しく紹介しています:Lチカonラズパイで、オームの法則・GPIO・トランジスタをちょっと詳しく知る

抵抗は側面に4本または5本の色帯が印刷されています。この色帯から抵抗値を知ることができます。色帯は次の表のような意味があります。1本目と2本目は2桁の数字、3本目は2桁の数字に掛け合わせる数です。4本目は抵抗の誤差を表しています。

33

例えば、「茶黒赤金」と印刷された抵抗であれば、1kΩの抵抗だとわかります。

 

7. LEDは抵抗を接続して点灯する

LEDを利用する場合には適切な抵抗を接続して点灯する必要があります。どの程度の抵抗を接続するかは簡単な計算で求めることが可能です。LEDと抵抗を直列に接続しその両端に電源を接続した場合には、次のような計算式で抵抗値を求めます。

41

電源電圧は接続した電池などの電源の電圧を指定します。Arduinoのデジタル出力に接続する場合は、HIGHにすると5Vが出力されるので「5」と指定します。LEDに流す電流と電圧は、電子部品の販売サイトやデータシートに記載された「順電圧(Vf)」や「順電流(If)」の値を使います。LEDに流す電流を順電流の値にした場合、両端の電圧は順電圧になっていることを表しています。例えば、赤色LED「SLR-56VC3F」の場合、順電圧が2V(電気的光学的特性の順方向電圧Vfの欄)、順電流が10mA(電気的光学的特性のIfの欄)と記載されています(https://docs-apac.rs-online.com/webdocs/101f/0900766b8101fb48.pdf)。この値を「LEDの電圧」と「LEDの電流」に当てはめて計算します。電源電圧を5V、LEDの電圧を2V、電流を10mAとすると以下のように「300Ω」と抵抗値が求まります。

(5V – 2V) ÷ 0.01A = 300Ω

また、これよりも暗く点灯させたい場合は電流の値を小さくします。この際LEDの電圧はほとんど変化しないので、順電圧の値を利用して計算するようにします。例えば、1mAの電流を流す場合には、以下のように計算して求めます。

(5V – 2V) ÷ 0.001A = 3000Ω = 3kΩ

求めた値の抵抗を利用しLEDを接続するようにしましょう。なお、計算で求めたちょうどの抵抗がない場合には、近い値の抵抗を利用するようにします。例えば、計算で900Ωと求まった場合は、近い値の1kΩの抵抗を利用するようにします。

今回は、デジタル出力の方法と電圧、電流について説明しました。次回は、LEDの点灯する明るさを変化させてみましょう。

 

 

今回の連載の流れ

第1回:電子部品を動かそう!
第2回: Arduinoの準備
第3回:デジタル出力でLEDを点灯制御しよう(今回)
第4回:LEDの明るさを調節する
第5回:モータを動かし自動制御する
第6回:スイッチの状態を読み取る
第7回:アナログ入力で電圧を読み取る
まとめ:Arduino電子工作のまとめ! マイコンを使った電子工作基礎の基礎編

smartwatch_ebook_banner_580-230
アバター画像

札幌在住のライター。電子工作やパソコン、Linux、スマートフォンなどの記事を執筆。「ラズパイマガジン」や「日経Linux」へ記事の執筆。著書として「これ1冊でできる!ラズベリー・パイ 超入門 」(ソーテック社)、「電子部品ごとの制御を学べる!Arduino 電子工作 実践講座」(ソーテック社)、「Arduino[実用]入門」(技術評論社)など。 現在、ものづくりをしたいメンバーを集めて電子工作を利用した作品などを制作する「サッポロ電子クラフト部」を主催(https://sapporo-elec.com/)。誰でも参加可能ですので、ご参加をお待ちしています。

NHK学生ロボコン2016 出場ロボット解剖計画