このエントリは(リンク)の関連記事になっています。
Arduino界のHelloWorld、またの名をLチカこと「blink.ino」を理解する上での基礎知識について解説しています。
今回はプログラミングに関する内容の解説です。
もくじ
①Arduino言語について
Arduinoでプログラムを作成する際に使用するプログラミング言語のことを、公式リファレンスなどでは「Arduino言語」と呼んでいます。
このように呼ばれていますが、「C言語」や「C++」という言語をベースに使いやすいようにオリジナルの命令を追加したりしたものです。
CやC++の知識があれば、割と簡単に使いこなせるでしょう。
逆に、Arduino言語を使えるようになると、C言語やC++もある程度使えるようになります。
また、プログラムそのもののことを「スケッチ」と呼んでいます。
②Arduino IDE
Arduinoのスケッチ作成やスケッチの書き込みに使用するPCのソフトをArduinoIDEと呼びます。
「IDE」=Integrated Development Environment:統合開発環境の略です。
どんなプログラミングでも同じですが、IDEを使わずにやろうとするとその時々で色々なソフトを使う必要が出てきます。
それらを1つのソフトとしてまとめたものがIDEというわけです。
ArduinoIDEの場合はスケッチを書くエディタ、スケッチをArduino用に変換するコンパイラ、Arduinoとの通信に使うシリアルモニタなどがひとつのソフトになっています。
③Arduino言語の動作する順番
スケッチに書かれた命令は基本的に「上から順番に」実行されます。
その中でもsetup()はArduinoの電源を入れた直後やリセットをかけた直後に1回だけ実行し、その後はloop()を無限ループで実行します。
電源を入れると、
setup()を上から→loop()を上から→loop()を上から→loop()を上から→loop()を上から→…
という順番で命令が実行されていきます。
この「上から順番に」実行していくというのが、作りたいものによっては割とやっかいなハマりポイントになったりします。
そのうち紹介しますね。
④「入力」と「命令」と「出力」
Arduino言語(に限らずプログラミング言語全般)の意味や使い方を理解する際に、この「入力」と「命令」と「出力」ということを考えると理解しやすいかなと思っています。
…
Arduinoのスケッチやコンピュータのプログラムというのは「マイコンやコンピュータに人間が思った通りの動きをさせたり、答えを計算させるための命令の詰め合わせ」です。
こんな風にイメージしてみましょう。
3つの箱です。Amazonの段ボール箱です。なんでもいいんですけどね。
人間はコンピュータに「入力(データ)」と「命令」を与え、そしてコンピュータはいろいろな計算や処理を行って「出力(データ)」を作って人間に提出します。
(実際には出てきた出力を次の命令の入力として使うこともよくあります)
人間は出すべき「命令」を間違えさえしなければ、「命令」の中身を気にする必要はありません。
実際にはひとつの命令でコンピュータやマイコンの内部では結構複雑な処理が走ってたりしますが気にしなくていいです。
この人間がコンピュータに与える「入力」「命令」「出力」を箱としてとらえてみましょう。
例えば「2×3」の掛け算を行う場合はこうですね。
(掛け算させたいのに図が足し算なのでちょっとややこしいね…)
「2」と「3」というデータを入力し、「掛け算しなさい」という命令を与えておきます。
実行すると、2×3の答え「6」が出力されます。
ここで重要なポイントが2つあって、
- 入力が変われば出力も変わる。
- 入力が同じでも命令の内容が違えば出力は変わる。
ということです。当たり前のようですが重要です。
PCやスマホの電卓ソフトはこうした命令をたくさん備えた計算専用のソフトウェア、電卓はこうした命令をたくさん備えた計算専用のコンピュータですね。
Arduinoではどうでしょうか。
digitalWrite命令を使って、D13ピンにつながっているLEDを点灯させるときはこうです。
「D13ピン」と「HIGH」を入力として与えると、「LEDが点灯する」という出力が出てきます。
「D13ピン」を例えば「D12ピン」に変えると別のLEDを点灯できますし、
「HIGH」を「LOW」に変えるとLEDを消灯できます。
続いて、A0ピンにつないだ温度センサの値を読み取る場合は、
「A0ピン」を入力として与えると、「温度センサの読み取り値」という出力が出てきます。
こちらも「A0ピン」を「A1ピン」に変えると別の端子につないだセンサの読み取り値を出力できます。
…
Arduino以外のプログラミング言語のほとんどは、この「出力」がコンピュータの内部で完結します。
先の電卓ソフトは「計算結果をPCの画面に表示して」そこで終わりです。
インターネットブラウザは「文字や画像をPCの画面に表示して」終わりです。
音楽再生ソフトは「PCのスピーカーで音楽を鳴らして」それで終わりです。
ほぼすべてのソフトは人間からの指示をもとに動きますが、マウスとキーボードがそのほとんどでしょう。
反面、Arduinoでスケッチに書いたことは
「LEDを点灯させる」
「モーターを回す」
「温度センサで温度を測る」
「スイッチを操作する」
など、コンピュータの外の私たちの居る世界に何かしらのアクションを起こします。
これがArduino(などのフィジカルコンピューティング)とその他プログラミング言語との一番大きな違いです。
⑤スケッチの道しるべ「コメント」
スケッチを描く際、コメントと呼ばれるちょっとしたメモ書きをすることができます。
書き方は2通りでいたってシンプル。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* ①「/*」と「* /」で囲んだ部分がコメントになります。 ↑ここのスペースは本来なしです。普通に打っちゃうとここでコメント終わっちゃうので(笑) このコメントの終わりのホンモノをよく見てみてください。 この間であれば改行してもスペースを空けてもすべてコメントになります。 ↓コメント終了記号のホンモノです。 */ //②スケッチ中に「//」と書くと、その行の「//」以降がすべてコメントになります。 digitalWrite(13,HIGH); //ね? // 行の頭にひたすら「//」を書いていくと // 複数の行のコメントだって作れます。 delay(500); //動作の確認やデバッグの時に「一部の処理をいったん止めてみる」のにも使えます。 digitalWrite(13,HIGH); delay(500); //digitalWrite(13,LOW); delay(500); |
こんな感じで作れます。
Arduinoではスケッチをコンパイルする際にコメントをそぎ落としてくれますので、コメントの内容はそもそもArduino本体のマイコンに書き込まれません。
つまり、スケッチの容量も消費しません。
「コメントいっぱい書いてたらスケッチが大きくなりすぎて書き込めなくなった!」
なんてことは起きませんのでどんどん書きましょう。
↓のエントリで、コメントの重要性について熱く語って/*コメントして*/ます。
コンパイルとはなんぞや
(注:普通にArduinoを使う上では知らなくても大丈夫だと思いますが、知っておいて損はないでしょう。)
ArduinoIDEはArduinoにスケッチを書き込む際、コンパイルという作業をしています。
というのも、そもそも ArduinoのマイコンはArduino言語を理解できないんです。
…は?って感じですが、理解できないんだそうです。難しすぎて。
Arduino(に限らずほとんどのコンピュータやマイコン)が理解できるのはマシン語と呼ばれる、「0~9」の数字と「A,B,C,D,E,F」の16種類の文字だけで作られたデータの羅列です。
こちらは逆に人間が見ても全くと言っていいほど理解できないものです。
(図のマシン語は実際にblink.inoをコンパイルしたマシン語です。これ読めます?私は無理です(笑))
そこで「人間が理解できるArduino言語」を「Arduinoが理解できるマシン語」に変換する作業を行います。
この変換がコンパイルという作業で、コンパイルするためのソフトウェアをコンパイラと呼びます。
このコンパイル作業の時にコメント部分をそぎ落としたり、マクロ定義と呼ばれる処理をしたり、うまいこと容量を抑えたりしてくれます。
まとめ
Arduinoを理解するためのプログラミング知識の基礎編というイメージで、つらつらと書いてみました。
基礎編、と言いましたが、
応用編、としてまとめる予定は今のところありません。
Arduinoで作るものによって、Arduinoの使い方によって実際に使う命令やライブラリは大きく変わってくるからです。
(なので、実際にこんなもの作ったよって記事を書く時にはそのものを作った時のスケッチについて解説はします。言うなればそれが応用編かな?)
というのも、ぶっちゃけると
命令などは丸暗記する必要はない
からです。
ネット上の情報や書籍の情報をその都度調べて作ればそれでOKです。
Arduinoで何かを作るというのは学校のテストじゃないんで。
命令などの内容を暗記するよりも、
Arduinoでどんなことができるとか、どんな命令があるとか、どこに情報があるかとか、
知っていて必要な時に引き出せるほうがよほど重要です。
たぶん他のプログラミング言語でも同じことがと思います。
その上で便利な書籍を紹介しています↓
プログラミング言語というのは命令の中身とか、与えるべき入力のデータといった、そもそもの仕様が変わってしまうことがままあります。
Arduinoのライブラリでも一部で実際に起きてます。命令やライブラリの丸暗記は無駄です。
コメント