2017/05/19
歴史あるマイコン雑誌、月刊I/Oさんとご縁があり、このたび同誌2017年6月号にArduino初心者向けの作例付き記事「Arduinoで電子工作」を寄稿させていただきました。
電子工作における「Hello, World」であるLチカから始まって、センサーからデータを取得したりLCDに文字を表示したりする作例を通して手軽にArduinoの魅力に触れていただける内容となっています。
誌面には限りがあるので月刊I/Oさんの許可を得て誌面で割愛した部分も含めた全文をここで公開します。
同号にはArduinoと人気を二分するRaspberry Piの導入記事をはじめ、小型ボード全般の話題からウェアラブルデバイス、VR、3Dモデリング、AI、ディープラーニング、ロボット、Node-RED、最近話題のマストドンについてなど、IT・IoT界隈の最近の話題が網羅されているほか、筆者もおじゃましたことがある新宿の電子工房「My Tech Lab」さんの紹介などもあり、盛りだくさんの内容ですのでぜひ手に取っていただけると嬉しいです。
関連資料・記事
Arduinoで電子工作 〜Arduinoの魅力に触れる〜
Arduinoとは
Arduino(アルデュイーノ)とはRaspberry Pi(以下ラズパイ)とともに人気がある電子工作あるいはIoT用のデバイスです。両者は見た目こそ似ているものの中身は全く異なります。ラズパイがGPIOを備えたLinuxやWindow 10 IoTなどが動作する小型PCなのに対し、ArduinoはGPIOを操作することに特化したマイコンです。
どちらを使うかで迷っているかたはこの特徴を知った上で目的に応じて使い分けるとよいでしょう。
ArduinoはマイコンのためOSのインストールやネットワークの設定などを行う必要がなく、母艦となるPC(Linux、macOS、Windows)とUSBケーブル一本でつないで母艦側にArduino IDE(以下IDE)という専用の開発環境をインストールすればすぐに使い始めることができます。最近ではNode.jsからでも制御ができるのでフロントエンド開発などで使い慣れたJavaScriptをそのまま使えることも大きいです。しかもNode.jsを使用する場合はIDEも必要ありません。
関連資料・記事
ただArduinoに関する情報は書籍にしろネットにしろIDEを前提にしたものが多いので慣れるまではIDEを使用したほうがいいかもしれません。この記事でも作例はIDEを使用します。
尚、Arduinoには小型のもの、性能が良いもの、拡張性が高いものといった具合に用途によって様々な機種が存在します。またハードウェアがオープンな仕様のため互換機も多数存在しますがここでは一般的なArduino UNOを使用します。
始めてみよう
それではさっそくArduinoを使い始めてみましょう。最低限必要なものはArduino本体、母艦となるPCと接続するためのUSBケーブル、GPIOに接続する入出力機器です。
入出力機器はこの記事ではLEDと抵抗(330Ω)、温度センサーとLCD、そしてブレッドボードとジャンパワイヤ(オス - オス x 7本)を使用します。
これらは全てAmazonやスイッチサイエンス、秋葉原の秋月電子通商などで買い揃えることができます。
機材が揃ったら母艦にIDEをインストールします。IDEはArduino公式サイトからダウンロードしてインストールします。パッケージ形式で提供されているのでインストールで特に迷うことはないでしょう(記事執筆時点の最新バージョンは1.8.2)。
デスクトップやドック、スタートメニューにIDEのアイコンが追加されるので起動します。
まず初めに行うことはIDEにArduinoを認識させることです。
ArduinoをUSBケーブルで母艦と接続し、Arduinoがシリアルデバイスとして認識されるのを待ちます。OSによってはここでデバイスドライバを要求される場合があるのでその場合は指示に従ってデバイスドライバをインストールします。
Arduinoがシリアルデバイスとして認識されたらまずIDEの[ツール] > [ボード]から[Arduino/Genuino UNO]を選択します。続いて同じく[ツール] > [シリアルポート]から先ほど認識させたArduinoのシリアルデバイスを選択します。これでIDEからArduinoを制御することができるようになります。
IDEには初めからいろいろなサンプルプログラムが同梱されています。Arduinoの世界ではIDEで使用するプログラムのことを『スケッチ』と呼ぶので覚えておくとよいでしょう。
Lチカをやってみよう
IDEからArduinoが制御できるようになったのでさっそくLチカをやってみましょう。
Lチカとはプログラミングでいうところの『Hello, World』と同じで、電子工作の世界における初めの一歩。LEDをチカチカ光らせることから通称『Lチカ』と呼ばれています。
用意するものはブレッドボードとLEDと抵抗、それとArduino本体とブレッドボードをつなぐジャンパワイヤ2本です。
LEDを扱う上で最初に一つ注意すべきことがあります。LEDは弱い電流で動作しますが、Arduinoからの電流をそのままLEDに流すと流量が多すぎてLEDが壊れてしまうので途中に抵抗というものを挟んで電流を弱める必要があります。
抵抗には電流をどのくらい弱くするかによって様々な値のものがあって単位はΩ(オーム)で表します。値が大きくなればなるほど流れる電流を弱めることができます。ここでは深く考えずに330Ωの抵抗を使用します。(それより大きな値でも構いません)
抵抗の説明はこのくらいにして、ブレッドボードにLEDを刺しましょう。
LEDにはプラスとマイナスの極があって、ピンの長いほうがプラス、短いほうがマイナスです。(それぞれ『アノード』『カソード』と呼びます)
ブレッドボードは長辺の両端に「+」と「-」と書かれた線がありますが、この線に沿って電気的に内部で一列につながっています。その内側は逆に中心に向かって電気的に内部で一列につながっています。
ブレッドボードにLEDを刺す場合は右の写真のように電気的につながっていない場所にプラスとマイナスを刺すようにします。ここではプラス(ピンの長いほう)が右側になるように刺します。そしてプラスの線上に抵抗を刺しておきます。抵抗に向きはありません。
ブレッドボード上の接続が終わったらArduino本体とつなげましょう。
Arduino側で使用するピンは「5V」と書かれた電源を取るピンと、電流を逃がすアースとしての7番ピンの2ヶ所です。(7番ピン以外でも大丈夫です)
この5Vピンにジャンパワイヤ(ここでは赤)を刺し、もう片方をブレッドボード上のLEDのプラス側(抵抗の先)に刺します。そして7番ピンにジャンパワイヤ(ここでは黒)を刺し、もう片方をブレッドボード上のLEDのマイナス側の線上に刺します。
以上で接続は終わりです。
あとはLチカを行うスケッチを書いてArduinoに送り込めばLEDがチカチカするはずです。
スケッチを一から作るのは面倒なのでIDEに同梱されているサンプルを流用しましょう。[ファイル] > [スケッチ例] > [01.Basics] > [Blink]を選択すると新しいウィンドウが開いてスケッチが表示されます。
このスケッチはArduinoの基板上にある内蔵LEDをLチカさせるためのものなので、LEDの指定を内蔵LED(LED_BUILTIN)から先ほど接続したLED(7番ピン)に変えればOKです。
void setup() { pinMode(7, OUTPUT); // LED_BUILTINを7に変更 } void loop() { digitalWrite(7, HIGH); // LED_BUILTINを7に変更 delay(1000); digitalWrite(7, LOW); // LED_BUILTINを7に変更 delay(1000); }
ここで少しスケッチの構造について説明しておきます。
コードを見るとsetup()とloop()という2つの関数が用意されており、読んでなんとなく想像が付く通りsetup()はプログラムが動き出して一回だけ実行される関数なので初期設定などを書いておき、loop()は繰り返し実行される部分なのでここにメインの処理を書きます。
スケッチはArduinoに書き込まれたあと電源を切る(USBケーブルを抜く)か他のスケッチを書き込むまで無限に動き続けるので途中で終了するという概念がありません。電源を切っても再度電源を入れ直すと以前書き込んだスケッチがまた動き始めます。
Arduino(に載っているようなマイコン)はセンサーからデータを取得し続けたり何かのデータを出力し続けるといった用途に使うことが多いのでこのような構造になっています。
さてこのスケッチの処理内容ですが、まずsetup()中のpinMode()で7番ピンを出力用(OUTPUT)に設定しています。入出力機器をつなぐポートはINPUTかOUTPUTのモードを持つので明示的に宣言することが大切です。
続いてloop()中のdigitalWrite()で先ほどモードを宣言した7番ピンの電圧レベルを高(HIGH)に設定し、もともと電圧の高い5V側と揃えることによって電流が流れない状態にしてLEDを消灯させます。
次のdelay()で1000ミリ秒待ってから7番ピンの電圧レベルを低(LOW)に設定して5V側から電流が流れるようにしてLEDを点灯させます。
さらに1000ミリ秒待ってループの先頭に戻るので結果として1秒おきにLEDが点滅し続けるという動きになります。
スケッチを動作させるにはIDEの画面左上のチェックボタンをクリックしてスケッチをコンパイルし、隣の右矢印ボタンをクリックすればコンパイルされたスケッチがArduinoに書き込まれてLEDがチカチカするはずです。とても簡単ですね。
温度を測ってみよう
Lチカがうまくいったら次は温度センサーを使って室温を測ってみましょう。
ここではシンプルに扱える「LM61BIZ」という温度センサーを使います。
先ほどのLチカ用の接続を全て取り外し、温度センサーを刻印面を前にしてブレッドボードに刺したあと3本のピンを左からそれぞれArduinoの5V、A0ピン、GND(アース)につなぎます。そして以下のようなスケッチを書いてコンパイルし、Arduinoに書き込みます。
センサーから取得したデータを温度に変換するにはひと手間必要になりますが、最初はあまり深く考えずおいおい動作原理を覚えていけばよいでしょう。
void setup() { // シリアルポートを9600bpsに設定 Serial.begin(9600); } void loop() { // A0ピンからセンサーデータを取得 int val = analogRead(A0); // 取得したセンサーデータ(0〜1023)を電圧(0〜5000)に変換 float volt = map(val, 0, 1023, 0, 5000); // このセンサーの計測範囲の電圧(300〜1600)を温度(-30〜100)に変換 float temp = map(volt, 300, 1600, -30, 100); // 温度を出力 Serial.println(String(temp)); delay(1000); }
出力されたデータはIDEの[ツール] > [シリアルモニタ]で確認できます(左)。
また[ツール] > [シリアルプロッタ]でグラフとしても確認できます(右)。
温度センサーに手を触れると温度が上がっていくのが確認できると思います。
測った温度をLCDに表示してみよう
温度センサーが使えるようになったら今度は他のパーツと組み合わせてみましょう。
ここでは測った温度をLCDに表示してみます。
LCDはI2C接続で8桁x2行分の文字が表示できる小型LCD「AQM0802A-RN-GBW」を使用します。
先ほどの接続はそのままにしてLCDの5つあるピンのうち4本をそれぞれ以下のようにArduinoと接続します。
VDD: 3.3Vに接続
RESET: (未使用)
SCL(クロック): A5に接続
SDA(データ): A4に接続
GND: GNDに接続
このLCDにはコントローラICとしてST7032iが使われているのですが、このICを簡単に使えるようにしたライブラリがオレ工房さんから配布されているのでダウンロードしてインストールします。
http://ore-kb.net/archives/195
% wget https://github.com/tomozh/arduino_ST7032/archive/master.zip % unzip master.zip % mv arduino_ST7032-master ST7032 % mv ST7032 <IDEのインストールパス>/libraries % rm master.zip
同じページでサンプルスケッチも公開されているので先ほどの温度センサーの値を取得するスケッチと組み合わせて以下のようなコードを書き、コンパイルしてArduinoに書き込めば温度センサーから取得した温度データがLCDに表示されます。
このように入力機器と出力機器を組み合わせれば様々なことが可能になりますし、さらにインターネットと接続すれば無限の可能性が広がります。
#include <Wire.h> #include <ST7032.h> ST7032 lcd; void setup() { // シリアルポートを9600bpsに設定 Serial.begin(9600); // LCD表示領域設定(8桁, 2行) lcd.begin(8, 2); // LCDコントラスト設定(0〜63) lcd.setContrast(30); } void loop() { // A0ピンからセンサーデータを取得 int val = analogRead(A0); // 取得したセンサーデータ(0〜1023)を電圧(0〜5000)に変換 float volt = map(val, 0, 1023, 0, 5000); // このセンサーの計測範囲の電圧(300〜1600)を温度(-30〜100)に変換 float temp = map(volt, 300, 1600, -30, 100); // 温度を出力 Serial.println(String(temp)); // 温度をLCDに表示 lcd.setCursor(0, 0); lcd.print(String(temp)); delay(1000); }
電子工作仲間を作ろう
このようにArduinoそのものの扱いが簡単なことに加え、ネットを調べれば必要な情報はすぐに集まるでしょう。筆者もいろいろ記事を書いています。(Arduino関連資料、電子パーツデータシートまとめ)
さらに筆者は同じように電子工作に取り組んでいる仲間を作ることをオススメします。
一人でやるよりも仲間と一緒のほうが純粋に楽しいですし、分からないことを教え合ったりいろいろな情報交換もできます。新たなアイデアにもつながるでしょう。
この界隈もやはり中心地は東京になりますが、IoTLTというコミュニティなどは全国規模でイベントを開催していて各地に電子工作に興味を持つ仲間を作ることができます。
また筆者もArduinoファンというコミュニティを主催しており初心者のかたも大歓迎ですので、もし興味があればFacebookグループやもくもく会に参加して電子工作仲間を見つけてみて下さい。
参考サイト
Arduino (Wikipedia)
Arduino関連情報 (Device Plus)
Arduino記事一覧 (Think IT)
Arduino技術情報 (Qiita)
エレクトロニクス豆知識 (ROHM)