今回からいよいよスケッチの作成に入ります。
最初のスケッチ内容
それでは、これから初めてのスケッチ(プログラム)を作っていきます。まずはゴールの確認です。
ゴールは、前回までの記事で製作したArduino Microの回路で「12番端子に接続したLEDを1秒ごとにつけたり消したりする」というスケッチを作り、実際に動作させる、という内容です。
なんだか簡単なゴールにみえますが、実際に動作させるまでたくさん覚えることが出てきます。ぜひ用意したノートに自分なりにまとめてみてください。
Arduino IDEの起動
Arduino IDEを起動しましょう。起動すると次のようなウィンドウが表示されます。
今後はWindowsとmacOSで画面が共通の場合、どちらか片方のOSのみのスクリーンショットで説明します。
このウインドウはテキストエディタのようなものでここにスケッチを書いていきます。
新規スケッチのウィンドウが表示されているわけですが、ん???って感じですよね。
すぐに違和感を感じたと思いますが、新規作成したはずなのに、すでに勝手に文字が書かれていますよね。
普通のアプリ、例えばオフィスアプリでは、新規ファイルを作成すると何も書かれていないウィンドウが表示されます。でもArduino IDEの新規ファイル(新規スケッチ)は、最初から何やら勝手に書かれています。
これから、この書かれている内容を解明して、一緒にスケッチを作成していきましょう!
といきたいところですが、その前に、、、
新規スケッチの保存
Arduino IDEを初めて起動したときに表示されるウインドウは、新規に作成されたスケッチのファイルです。
この状態ではファイルはまだ保存されていません。そこで、最初にこのスケッチに名前をつけて保存しておきましょう。
スケッチの名前は、、、そうですね、、、LEDを点滅するスケッチなので「LED_blink」という名前にします。
「blink」とは日本語で「まばたきをする」とか「点滅する」という意味です。わかりづらかったら「LED_tenmetsu」など、自分でわかる名前にしても構いません。
使用するアルファベットは大文字でも小文字でも構いませんが、日本語は使えませんので注意してください。使用できる文字は、半角アルファベット、数字、「-」(ハイフン)、「.」(ドット)、「_」(アンダースコア)です。
それでは保存します。「ファイル」メニューから「save」を選択します。(2024年11月時点のArduino IDEでは保存の項目だけ「save」になっています。最新版では「保存」かもしれません)
次のような保存ダイアログが表示されます。
このダアログでスケッチの保存名を指定します。Windowsの場合は「ファイル名」欄に「LED_blink」、macOSの場合は「名前」欄に「LED_blink」と入力して「保存」ボタンをクリックします。
これで保存ができましたが、実際にどのように保存されているのか確認しておきます。
保存フォルダの場所は、Windowsの場合は「ドキュメント」→「Arduino」フォルダ、macOSの場合は「書類」→「Arduino」フォルダです。(保存場所を変更してある場合はそのフォルダを確認してください)
それでは「Arduino」フォルダの中身を見てみましょう。
Arduinoフォルダの中には「LED_blink」というフォルダと、「libraries」というフォルダがあります。
「libraries」フォルダは作った覚えがないですよね。このフォルダは前回の記事でArduino IDEを起動した時に自動的に作成されたもので、Arduino IDEが使用します。この「libraries」フォルダの役割はこのシリーズの基礎編パート2で解説します。
「LED_blink」フォルダは先ほどの保存操作で作成されたものです。
ところで、スケッチの「ファイル」を保存したので、「LED_blink」という「ファイル」が保存されると思っていませんでしたか?
でも実際には「LED_blink」という「フォルダ」が作成されています。
それではさらに「LED_blink」フォルダの中を見てみましょう。「LED_blink.ino」というファイルがありますよね。
このファイルが先ほど保存したスケッチのファイルです。
Arduino IDEで作成したスケッチのファイルは拡張子が「ino」のファイルになります。「ino」は「Arduino」の最後の3文字から取られています。
Arduinoスケッチファイルの拡張子は「ino」ですが、中身はテキストですので普通のテキストエディタで開いて編集することができます。
それにしてもちょっと疑問ですよね。
というのは、保存したスケッチのファイルは「LED_blink.ino」という1個のファイルなのに、なんでわざわざ1個のファイルをフォルダの中に入れておくのか、という疑問です。
スケッチファイルは、「Arduino」フォルダの下に「LED_blink.ino」ファイルを保存しておけば十分な気もします。
実は、このようにスケッチをフォルダに入れておく、というのはプログラムの作り方と深い関係があります。この理由については残念ながら今の知識では理解することは困難です。基礎編パート1の後半でこの理由を明らかにします。
それでは、もう少しスケッチのことを知っておきましょう。
スケッチを開く方法
Arduino IDEを終了して、再度「LED_blink」のスケッチを開きたいときにどのようにすればよいか確認しておきます。
いつくか方法がありますので、それらを説明します。
スケッチファイルをダブルクリックして開く
ひとつは、先ほど保存した「LED_blink.ino」ファイルをダブルクリックする方法です。エクスプローラ(Windows)やFinder(macOS)で「LED_blink.ino」ファイルを探してダブルクリックすると開きます。
Arduino IDEのメニューから開く
また、他の方法としてArduino IDEのメニューから表示する方法があります。
「ファイル」メニューから「開く…」を選択して、保存した「LED_blink.ino」を指定して開く方法があります。
他にも、「ファイル」メニューから「最近使った項目を開く…」を選択すると文字通り最近使った順にスケッチファイルが保存されます。
さらに「スケッチブック」というメニューから開く方法があります。
このメニューを選択すると、Arduinoフォルダにあるスケッチがすべて表示されます。
絵を描く時に使用する「スケッチブック」は「スケッチを束ねたもの」ですよね。
Arduino IDEでも、「スケッチファイル」が複数入っているArduinoフォルダのことを「スケッチブック」と呼んでいます。
Arduino IDEではプログラムのことをなぜここまで「スケッチ」という言葉にこだわるのか、ちょっと謎ですよね。この謎については記事の最後に解き明かします。
それでは、スケッチ(プログラム)を作成していきましょう!
スケッチの決まり 〜setupとloop〜
これから、12番端子に接続したLEDを1秒ごとにつけたり消したりするスケッチを作成します。
新規にスケッチを作成すると、最初から勝手に文字が書かれていましたよね。このような内容です。
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
書かれている内容は英語ですし、意味もさっぱりわからない、って感じです。
ここに書かれている内容を詳細に理解するには、基礎編の後半で説明するプログラミングの理解が必要です。かといってずっと先で説明することを今ここで説明されても、プログラミングの知識がない状態ではその説明が理解できないよ…..ということになってしまいます。
実はこれがプログラミングを習得するときの難しさのひとつの原因なんです。
一番簡単なプログラミングなのに、プログラミング後半で習得する知識が必要になる、というケースがあり、習得する順序に矛盾が出てしまうわけです。
そこでこれから習得する上で、ずっと先の記事に出てくる、詳しい知識がないと理解できない部分は「まずはそういうものだ」ということにして頭に入れておくようにしてみてください。
いったん「そういうものだ」と片付けてしまったものは、このシリーズの後半で詳しく説明して正確に理解できるようにします。
また、「そういうものだ」というものについても、その説明をする時は、なるべく頭に入りやすい形で説明していきます。
それでは理解の仕方を確認したところで、まずは最初に書かれている内容をみていきましょう。
第3回の記事「プログラミングとは」で、「スケッチ」は、Arduinoがどのように動作するか、というArduinoに対する指示書であることは説明しました。
この指示の書き方にとても重要なポイントがあります。
指示は、次の図のように「setup」の部分と「loop」の部分に書きます。
具体的には「setup( )」と「loop( )」の後に出てくる「{ 」と「 }」(中括弧)の間に書いていきます。
両方ともArduinoに対する指示ですが、何が違うのでしょうか。
Arduinoは次のように、書かれている指示(スケッチ・プログラム)を実行します。
なんのこっちゃ、って感じです。
「動作開始直後」とは要するにArduionボードの電源がONになった直後、「動作している間」は電源がONの間ずっと、という意味合いです。
でも「動作開始直後に1回だけ実行する指示」「動作している間ずっと繰り返し実行する指示」って、なんでこんなふうに分けて指示を出す必要があるんですかね…
Arduinoボードにやってもらいたいのは「LEDを1秒ごとにつけたり消したりする」という動作だけなんですが…
これからArduinoに対する指示の書き方を説明しますが、なぜこのように分けて書く必要があるのか、これから行うことをArduinoボードの内部構造から探っていきます。
Arduinoの端子の機能を設定する指示
Arduinoボードの内部構造
Arduinoのプログラミングについて説明した時に、Arduinoの内部は次のように、スケッチで制御できるスイッチが入っている、と説明しました。
すみません!今までウソをついていました。実はこの図、間違ってはいないのですが正しくもありません。
これから、より正しい説明をしていきますが、100%正確に説明するとわかりづらくなりますので、理解しやすさ優先で説明していきます。(まだ実際と異なる部分がある点をご了承ください…)
Arduinoの端子は、上の図のようにスイッチを制御してLEDをつけたり消したりすることができるのですが、他にも機能があるんです。
その機能とは、端子の電圧を電圧計で読み取る、というものです。
実際に電圧計が入っているわけではありませんが、次の左側のように端子の電圧を読み取る機能が内蔵されています。例えば、右側のように端子に電池などを接続すると電圧を読み取ることができます。(実際はセンサーなどを接続して電圧を読み取ることにより気温などの状態を知ることができます)
ここで重要なポイントがあります。
端子の中には、電池とスイッチの機能も入っています。つまり次の左側のように1つの端子に電圧計とスイッチの2つの機能が入っています。
でもこのような接続では、電圧計はスイッチの影響を受けてしまいます。例えばスイッチをONにすると、上の右側のように内部の電池の電圧を読み取ることになってしまいます。(さらに、上の右側の状態で外部に電池を接続すると、電圧のよっては内部の電池に悪い影響が出てしまいます)
つまり、内部の「電池&スイッチ機能」と「電圧計機能」は分離しておいた方が安全です。
そこで、端子の内部では2つの機能を分離するために、次のように「電池&スイッチ機能」を分離するスイッチが内蔵されています。(なんだかややこしくなってきましたね…)
「『電池&スイッチ機能』を分離するスイッチ」と説明しましたが、要するに端子を「電池&スイッチ機能」として使うのか「電圧計機能」として使うのか、という「機能を選択するスイッチ」になっています。
Arduinoボードの動作開始時では、次の左側のイラストのようにこの機能選択スイッチはOFF、つまり「電圧計機能」になっています。
端子を「電池&スイッチ機能」として使用するときは、上の右側のイラストのようにこのスイッチをONに設定する設定する必要があります。また、このスイッチは一度設定すると設定を変更しない限りそのままの状態を保ちます。
今までのことをまとめると、次のようになります。
端子に接続したLEDを「電池&スイッチ機能」で制御するには、Arduioボード動作開始後にスケッチ内で「機能選択スイッチをONにする」指示をする必要がある
それでは、実際のスケッチではこの機能選択スイッチをどのように指示するのかみていきましょう。
端子の機能を「電池&スイッチ」機能にする指示の書き方
この機能選択するスイッチは、スケッチで以下のように書きます。
pinMode(端子名, 機能);
この指示の具体的な内容は次のようになっています。
なんだか急にわからない言葉がいろいろ出てきましたよね。ひとつひとつ確認していきましょう。
「pinMode」という指示は「内部の機能を選択するスイッチを操作してください」という指示になります。「pin」は「ピン、端子」の意味、「Mode」は「状態」という意味です。つまり「端子の状態」を指示する、というイメージですね。
「pinMode」と書くと、意味としては「機能選択スイッチを操作する」ということになりますが、これだけですとArduinoボードは「何番の端子をどの機能にするか」わかりませんよね。
そこで、「pinMode」という指示の後ろに、カッコでくくって、上のように端子番号と機能を書きます。さらに、指示の終わりは必ず「 ; 」(セミコロン)をつけます。
「端子番号」はArduinoボードに書かれている番号、「機能」は「INPUT」「OUTPUT」「INPUT_PULLUP」のいずれかを指定します。LEDをON/OFF制御する場合は電池&スイッチ機能にしますので、その場合は「OUTPUT」と指定します。
まとめると、12番端子を電池&スイッチ機能で制御する場合、スケッチに以下のように書きます。
pinMode(12, OUTPUT);
それでは、スケッチに以下のように書いた場合はArduino内部はどのようになるかわかりますか?
pinMode(12, INPUT);
先ほどのpinModeの説明を見ると、「機能」のところで「INPUT」と書くと電圧計の機能にするということがわかります。このように書くとArduino内部では、機能選択スイッチをOFFにして「電池&スイッチ機能」を分離して「電圧計機能」にします。
pinModeでどの機能に設定するか、「OUTPUT」「INPUT」と指定しますが、これらの意味について補足します。
「OUTPUT」「INPUT」は日本語でそれぞれ「出力」「入力」という意味です。
「電池&スイッチ機能」で端子を制御するとき、端子から電圧の信号を出す(=出力する)、という意味合いで「OUTPUT」という言葉が使われています。
また電圧計機能は、Arduinoの端子から電圧の信号を入れる(=入力する)、という意味合いで「INPUT」という言葉が使われています。
なお、pinModeの「機能」のところに書いてある「INPUT_PULLUP」という機能ですが、これについては基礎編パート1のスイッチを追加するところ使いますので、その時に詳しく説明します。今は見なかったことにしてください。
さて、この「pinMode」という指示について今後必要になる用語を覚えましょう。
今までArduinoに対する「指示」と呼んできましたが、pinMode(12, INPUT) のような指示のことを「関数」と呼びます。「関数」という呼び名は基礎編パート1の後半で詳しく説明します。
ただ、「関数」という言葉はまだ馴染みがないので、関数を説明するまでは「指示」や「命令」と呼ぶことにします。
pinMode命令では「どの端子を、どの機能にするか」という内容をカッコで囲んで指定しました。この具体的な指示内容のことを「引数」(ひきすう)と呼びます。
「引数」なんて日常会話では出てきませんのでなんだか違和感があるかもしれません。これは「指示(pinMode)が引き連れている数」って感じで覚えていただければと思います。
命令の書き方も注意点があります。
「pinMode」という命令を「PinMode」や「pinmode」など大文字/小文字も含めて1文字でも違うとArduinoは命令を理解してくれません。
また引数の「OUTPUT」も1文字でも間違ってもArduinoは理解してくれません。間違うとどのような目にあうか、このあと確認してみます。
なお、「pinMode(端子番号, 機能);」という命令は「pinMode」「 ( 」「端子番号」「 , 」「機能」「 ) 」「 ; 」から構成されていますが、それぞれの間にスペースを入れても問題ありません。
pinMode( 12, OUTPUT );
上のように書いてもArduinoは命令をきちんと理解してくれます。
1文字でも間違えるとダメなのに、スペースは入ってても問題ない、というのは、きちんとしてるんだか、ルーズなんだか、ちょっと捉えどころのない性格ですよね。こういうタイプは気をつけたほうがいいですね。
どのぐらいまでは許してくれるのか、最初は感覚がわからないと思いますが、スケッチの書き方ルールについては、「考え方」がありますので、今後の記事で説明していきます。
それではスケッチ作成に戻りましょう。
最初のスケッチは「12番端子に接続したLEDを1秒ずつつけたり消したりする」というものです。そのため、次のように12番端子を「電池&スイッチ機能」にする必要があります。
pinMode(12, OUTPUT);
ところで、この命令はスケッチのどこに書けばよいか、わかりますか?
Arduinoのスケッチでは、setupかloopのどちらかに書くことは説明しました。
このpinModeはArduinoの動作開始後に一度だけ指示すれば大丈夫です。
setupとloopは次の違いがありました。
ということで、pinMode(12, OUTPUT); はsetupのところに書くことになります。
ここまで理解したことを元に、12番端子をスイッチにする命令をスケッチに書いてみましょう。スケッチに書くときはコピペせずに、必ず自分で入力してみてください。より記憶に残りやすくなります。
スケッチに書けましたか?
書いたスケッチを見ると、「pinMode」はオレンジ色になっていますよね。最後の「e」を入力した瞬間にオレンジ色になったと思います。Arduino IDEではpinModeなどの命令の文字部分はオレンジ色にしてくれます。
これでやっとLEDをON/OFF制御する準備ができました。LEDのON/OFFを制御するスケッチを書くにはまだまだたくさんの知識が必要になりますので、次回の記事でLEDを制御します。
でもスケッチに入力した内容が本当に正しいかちょっと心配かもしれません。そこで、スケッチが正しいかどうかArduino IDEに検証してもらいましょう!
スケッチの検証
Arduino IDEには、入力したスケッチの内容が正しいかどうかチェックする機能があります。
次のように、スケッチのウィンドウ左上にチェックマークのボタンがあります。これをクリックするとスケッチをチェックしてくれるのですが、この機能を使う前に準備が必要です。
そこで、準備をして実際にスケッチの検証をしてみましょう!
準備
Arduino IDEは、スケッチをArduinoボードに送る前にいろいろな処理をしています。その処理は、スケッチを送るArduinoボードの型番に合わせて行われます。
つまり、このスケッチはどの型番のArduinoボードに送るのか、あらかじめ設定しておく必要があります。
その設定は、ウィンドウ左上にあるArduinoボードを選択するメニューで行います。
上の状態では「ボードを選択」となっていますよね。これは型番が選択されていない状態です。
この入門シリーズでは「Arduino Micro」を使用しますので、次の手順でここをArduino Microに設定しましょう。
最初にボード型番を選択するメニューをクリックします。次のようにメニューが表示されますので「他のボードとポートを選択…」をクリックします。
次のようなダイアログが表示されます。
左側がボードを選択する領域でリストから型番を選択します。ただ、種類が非常に多くリストからArduino Microを探すのは大変ですので次のように検索して選択しましょう。
最初に検索欄に「micro」と入力します。すると「Arduino Micro」がどこかに見つかると思いますので、「Arduino Micro」をクリックしてチェック状態にします。
OKボタンをクリックするとダイアログが閉じて、次のようにボート選択メニューにArduino Microが選択された状態になります。
これでスケッチの検証の準備ができました!
スケッチの検証
それでは検証ボタンをクリックして検証してみてください。
検証が終わるとウィンドウの下の方に結果が表示されます。以下のように「最大28672バイトのうち…」と表示されればOKです。
ちょっと?ですよね。検証したんだったら「検証OKです」とか「間違いがあります」などのように伝えてくれればいいのに、ずいぶん難しい内容が表示されていますよね。
最初は判断が難しいと思いますが、このような白い文字で2行の結果が表示されていればOKと覚えておけばOKです!
それでは、スケッチを間違いがあるように変更すると、結果がどのようになるのか確認してみましょう。
例えば「pinMode」を「pinmode」のように間違えて書いてみてください。
スケッチを変更したら「検証ボタン」をクリックします。クリックすると先ほどとは違う感じ、何か大変なことが起こった、という結果になりましたよね。
検証結果のところ見ると、先ほどと違って今回は英語で何か言ってますね。さらに、たった一文字間違えた「pinmode」という部分に下線を引いて、しつこく何度も「pinmode」おかしい、と言っています。(上の図の注釈は私が勝手に意訳したものです)
正しい時は日本語で丁寧に結果を教えてくれたのに、1文字でも間違えると怒り爆発って感じて、急に母国語の英語で喋り出して、間違えたところをこれ見よがしに何度も嫌味っぽく指摘する、というところから見ると、Arduino IDEは紳士なビジネスパーソンというよりは、ちょっと頑固で短気なところがある職人気質ということがわかります。
正しくは「pinMode」ってわかってるんだったら、裏でそっと直しておいて「問題ありませんでした」って言ってくれればいい気もしますが、そこは職人によくある「背中を見て育てる」という方針なんでしょうかね。
今回の説明はここまでです。長い間大変お疲れさまでした!
でも、なんだかまだ気持ち悪いところがありますよね。setupとloopの中に書かれている「// put your setup code here, to run once:」とかのグレー色の文字というか文章です。
1文字でも間違えたらArduino IDEに怒られるのに、なんだか結構自由に英語を書いているような気もします。よく怒られませんね。
習得したこと
今回習得したことをリストします。忘れていることはないか、理解不足のところはないか確認してから次の記事に進んでください。
- スケッチの保存方法
- スケッチを開く方法
- setupとloopの違い
- 関数(命令)
- 引数
- pinMode
- スケッチの検証
- Arduino IDEは頑固で短気なこと(ちょっと嫌味っぽい)
更新履歴
日付 | 内容 |
---|---|
2019.7.15 | 新規投稿 |
2021.8.21 | 新サイトデザイン対応 |
2022.2.8 | 新デザイン対応 |
2022.9.19 | Arduino IDE Version2系の情報を追記 |
2024.11.15 | Arduino IDE 2の内容に変更 内部回路を実際に近い形に変更 より正確な説明にするために「パラメータ」を「引数」に変更 |
すみません、少し先回りしているかも知れませんが
void setup よりも前の行に int ledPin = 13;と言う書き方もあるようですが、void setupのあとに書くpinMode(13,OUTPUT);と言う書き方の違いが良く理解できません。
かなり先の内容になってしまいますが、以下の理由と思われます。
int ledPin=13;をsetup、loop外に書くのは、グローバル変数として端子番号を定義するためです。setupとloop内の関数で、そのグローバル変数を使用して端子番号を指定するためだと思われます。