Blinkから始まるArduino入門 その1 ハードは何使う

 市販されているArduinoは数多くの種類があります。もともと8ビット・マイコンのATMega168が使えるボードがベースになり、現在は、メモリ容量の増えたATMega328を搭載したArduino UNO REV3が最終形です。組織が分裂したときにGenuino Unoモデルが発売されたのですが、まったく同じ製品です。現時点の最新開発統合環境Arduino IDE1.8.5では、ボード名をArduino/Genuino Unoと呼びます。

 ハードウェアとファームウェアを商用利用してもOKで公開にしているので、他人がまったく同じものを作れます。ただし、ボードの名称はArduino AGの商標なので、他社が作るときは別の名前にしてねというのが唯一の条件です。コストを下げるために、USB-シリアル変換ICを別の製品にしているボードがあり、OS用のドライバを別途インストールしなくてはならない製品もあります。Windows 10も進化していて、待っているだけで、ドライバがインストールされてしまう場合もあります。

 2018年4月現在、純正のArduino UNO REV3は22ドルです。同等品(コンパチブル)は数百円です。コンピュータのプログラミングと電子工作で、初心者は、動かないとき部品が壊れているのではないか、この開発システムはおかしいじゃないか、と思います。なので、1台は純正を手元に置いておきます。動かないのは、ほんの単純なミスが原因です。

接続

 USBケーブルでPCとつなぎます。電源も兼用で、PCから5Vをもらって動きます。スケッチが完成したら、PCとは切り離しても別途電源をつなげば単独で動作します。Arduino IDEを起動してArduino UNO REV3をつなぐと、通常は、ボードはArduino/Genuino Uno、シリアルポートはCOMxx(Arduino/Genuino Uno)と認識されているはずです。純正でないボードもそうなるはずです。これで、プログラムを作る準備ができました。

 このような環境で評価用マイコン・ボードを使ってプログラムを開発するのは、組み込み用コンピュータでは一般的です。プロトタイピングによる動作の確認が終われば、プリント基板を新規に作り量産します。今は組み込み用コンピュータとはいわずIoTデバイスとも呼ばれます。Arduinoはイタリア生まれですが、同様な開発は40年ほど前から日本では行われていました。その多くはマイコンの能力を限界まで利用するため、開発装置ICEも大変高価でした。

開発に必要なのはArduino IDE

 ずっとむかし、Arduino IDE 1.01で今の開発環境のベースが出来上がりました。その後、いろいろなライブラリが追加されていった流れと、ATMega328以外のマイコンもサポートするようになりました。ATMega328は本当に小さなマイコンで、メモリ容量が少なく、実行速度も遅いです。マイコンの価格はほとんど同じで、高性能なCortex-Mシリーズを採用したArduinoボードも購入できます。これら高性能なArduinoでも、I/Oをつなぐピンヘッダは同じレイアウト、同じ役割になっていることがほとんどです。Arduino IDEで開発できなくとも、ピンヘッダの並びが同じマイコン評価用ボードは数限りなくあります。

 Arduino IDEの最新版は1.8.5で、無償で利用できます。気に入ったら寄付をしてください。Arduino IDEの開発には、スイッチサイエンスの社長 金本氏が参加しています。筆者は電子パーツの約半分を同社から購入しています。

Blinkからはじまる

 Arduino IDEで利用できる開発言語は、C言語に似ています。なので、文法はC言語の解説を読んで勉強します。WindowsやLinuxのOS上でプログラムを作るのと電子工作はちょっと違います。OS上でプログラムを動かすと、実行が終われば、そのメモリ領域はOSの管理下に戻されます。Arduinoは、電源を切らない限り動き続けます。

 OS上のプログラムはmain()から実行が始まります。Arduino IDEで作るスケッチにはmain()はありません、代わりにloop()にメインのプログラムを記述します。名前が表しているとおり、ループします。終わりはありません。Arduinoではプログラムのことをスケッチと呼びます。

 Arduino IDEでスケッチを開発し、Arduino UNO REV3に実行プログラムを書き込むと、マイコンにリセットがかかり、ATMega328のプログラムが動き始めます。この一連のPCとのやり取りをするのがファームウェアです。これもオープン・ソースで公開されています。Arduino IDEには統合開発環境にはあるはずのデバッグ機能はありません。

 Arduino IDEで新規を選択すると、次の編集画面になります。どこから手を付けてよいのやら。

 C言語の書籍では、Hello,world!を画面に表示するところから勉強が始まります。ArduinoではLチカから始めるのが最良の勉強方法です。メニューの「ファイル」から「スケッチ例」を選び、一番上にある「内蔵のスケッチ」の下の「0.Basics」、その中の「Blink」を選びます。

 /*と*/で挟まれている部分はコメントです。//以降行末までもコメントです。コメント部分をぜんぶ取り去ります。

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

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

 メニューの下にある右矢印のアイコンをクリックします。スケッチをコンパイルして、Arduino UNOに実行プログラムを書き込み、リセットをする手順が連続して実行されます。リセットがかかると、13番につながっているLEDが1秒おきに点滅します。まちがえようがないです。絶対に動きます。

 LEDは小信号用です。夜道を照らすためのパワーLEDではありません。

 けれど、純正でないボードやCortex-Mマイコンを搭載したボードを利用するとき、失敗することもあります。LEDが点滅するプログラムなので、Lチカと呼びます。

 ふつうのCのプログラムにあるように、#include xxx.h の記述はありません。普通のCのプログラムでもスタンダード・ヘッダ・ファイルは自動でインクルードされます。Arduino IDEでは、LED_BUILTIN、OUTPUT、HIGH、LOWはヘッダ・ファイルに定義されています。

 Arduino UNO REV3では、LED_BUILTINは13です。Arduino UNOが発売された当時、13とスケッチ内では書かれていましたが、その後、13ではないボードを作りました。

 delay()関数はms単位でCPUを待たせます。かっこの中に引き数を入れます。最小は1msの'1'ですが、あまり正確ではないようです。数ms以上だとほぼ正しいようです。1000msは1秒です。この関数は、Cortex-Mなどのボードでも共通に使えます。つまり、どのようなボードでも、このスケッチを動かしてみれば、正常に動作していることが確認できます。

 setup()は各種設定を記述します。スケッチの中で一度だけ動かしたい内容を記述します。voidは昔はなかったですが、今は、何もないとか、関数の返り値がないという意味で付けます。()の中は何もないです。一度だけ実行したいスケッチであれば、loop()に何も書かないこともあります。

 自分の作る関数、例えばセンサからデータを読み込む関数とかは、setup()とloop()以外のどこに記述してもかまいません。グローバル変数も、setup()とloop()、および独自関数以外の場所に記述します。関数内の変数とは区別されます。

 大文字と小文字は区別されますが、変数の命名方法にルールはありません。

 スケッチの字下げインデントにもルールはありません。本Webは4文字相当のtabを元のスケッチでは入れていますが、このWebのリスト表示ではtabを処理できないので、スペースに変更しています。ダブルクリックで全選択になり、CTRL-Vでコピーできますが、改行とスペースのコードが化けていることがあります。テキスト・エディタで修正してください。

 Arduino IDEでは全角文字が使えますが、なぜかコメント以外の部分に全角のスペースを入れることが頻繁にあります。いちどどういうエラーが出るのか経験してみてください。

コラム OSはない

大規模

 Windows 10やMacOSはOSです。AndroidやiOSもOSです。CPUの実行時間やメモリというリソースを効率よく配分する役目を担っています。ユーザもリソースの一つなので、マルチユーザ・マルチタスクOSと呼ばれる規模の大きな製品です。この上は、複数のサーバや複数のOSをまとめて管理できる仮想OSが存在します。

 これらのOSは、仮想記憶をサポートするために、MMUというハードを搭載したCPUで実行されます。代表的なCPUはインテルやAMDのほとんどの製品、armのCortex-Aシリーズとその派生品です。

中規模

 上記のCPUからMMUをなくし機能を少しシュリンクしたモデルの多くは、モニタ、リアルタイムOS(RTOS)を搭載して利用されます。armの推進するmbed5.x、先日インテルが手放した Wind River SystemsのVxWorks、アマゾンのクラウドが推奨するFreeRTOS、日本の家電に入っていたITRONなど、たくさんありますが、いずれも32/64ビットCPUで高速に処理することが求められます。

小規模

 上記のCPUからより機能を削ったコスト優先の16/32ビット・マイコンでは、開発会社独自にモニタを搭載しています。モニタやリアルタイムOSが動く状態でソフトウェアの開発は、そうでない場合に比べて比較的短時間で終了するといわれています。

小規模未満

 Arduino IDEで開発するソフトウェアは、いずれでもありません。動かしたいことをスケッチで書いたら、その機能だけが動きます。ATMega328はAVRというATMEL社の製品でした。ライバルであるマイクロチップ社のPICと同じ分野で競争をしていました。PICは名前がPeripheral Interface Controllerを略したもので、メインのCPUの補助的な仕事をするような役割で利用されていました。かっこよく言えば、マイクロコントローラです。この呼び方は、インテルが本格的なマイクロプロセッサとして市場に出した8080Aの呼び名でもあったのですが。

 8080AはCPUでしかありませんでした。ATMega328は、CPUの機能に加えて、タイマ、A-Dコンバータ、シリアル通信機能などが追加されており、とても使い勝手があります。ただ、コストを下げるためにICの中でも面積の必要なメモリが極端に少ないので、たくさんのプログラムを入れることができません。モニタやRTOSはそれ自体でメモリを消費します。なので、AVRやPICなどの8ビット・マイコンはOSを利用しません。

 マイクロチップ社は、数年前ATMEL社を買収しました。10年前で考えれば、その分野の独占に当たり実現しなかったM&Aです。8ビット組み込み用マイコンのライバルとして、armのCortex-M0+が登場したからです。32ビット・マイコンですが、価格競争力があります。

(※)これらの分類は筆者の独断です。その範疇に入らない製品もあります。

前へ

距離を正確に測る その2 レーザーVL53L0X

次へ

Blinkから始まるArduino入門 その2 pinMode()