今回はArduinoの端子をスイッチ制御する命令を習得します。
Arduinoの端子を制御する命令
前回の記事で、12番ピンをスイッチ機能に設定しました。
やり方は、setupのところでpinMode命令を使って設定したんですよね。
今回は、以下のLEDをつけたり消したりするスイッチを制御する命令を説明します。
このスイッチを制御する命令は、スケッチに以下のように書きます。
「digitalWrite」は「デジタルライト」と読みます。日本語では、「digital」は「デジタル」(そのままですが…)、「Write」は「書く」という意味です。
「デジタル」は日常会話でもよく使いますよね。「1か0か」、「ONかOFFか」という、2つの状態を意味しています。
この命令では、スイッチをONにするか、OFFにするか、という2つの状態を制御しますので「デジタル」という言葉が使われています。
「書く」というのはちょっとイメージしづらいかもしれません。Arduino内部のスイッチを操作して、その状態を端子に書き出す、というイメージでしょうか。
この命令でWriteを使う理由は、Arduino内部のかなり奥深いところの理解が必要になりますので、ここでは「端子に書き出す」というようなイメージで覚えてみてください。
digitalWrite命令では、パラメータとして端子番号とスイッチ制御を指定します。
端子番号パラメータは、端子の数字を書きます。
スイッチ制御パラメータは、「HIGH」か「LOW」を書きます。「HIGH」と書いた場合はスイッチがONになります。「LOW」と書いた場合はスイッチがOFFになります。
スイッチ制御は普通のイメージだと「ON」「OFF」なので、「HIGH」と「LOW」というのはちょっとわかりづらいですよね。
「HIGH」は「高い」、「LOW」は低い、という意味です。
スイッチをONにすると、端子の電圧が高くなります。
スイッチをOFFにすると、端子の電圧は0Vになります。
digitalWrite命令は内部のスイッチ制御というより、端子の電圧に注目して指定するイメージで考えるとわかりやすいと思います。
では、12番端子に接続したLEDをつける場合、どのような命令を書けばよいかわかりますか?
以下のように書けばLEDがつきます。
digitalWrite(12, HIGH);
Arduinoがこの命令を実行すると、内部のスイッチはONのままになります。次にスイッチをOFFにする場合は、以下のように書けばOKです。
digitalWrite(12, LOW);
これでLEDをつけたり消したりすることができるようになりました!
ただ、これだけの命令では「LEDを1秒ごとにつけたり消したりする」というスケッチは作成できません。「1秒ごとに」つけたり消したりしたいわけです。
第3回の「プログラミングとは」の記事で、1秒ごとにLEDをつけたり消したりするプログラムのイメージを確認しましたよね。
その時の考え方を思い出してみると、次の制御をずっと繰り返せばLEDを1秒ごとにつけたり消したりできそうです。
digitalWrite(12, HIGH);
1秒待つ
digitalWrite(12, LOW);
1秒待つ
ということで、1秒待つ命令があるとスケッチが作成できそうですよね。このような時にぴったりな命令が用意されていますので、さっそく確認してみましょう。
一定時間何もしないで待つ命令
指定した時間、Arduinoは何もしないで待っている命令が用意されています。
「delay」は日本語で「遅れる」とか「ぐずぐずする」という意味です。
delayのパラメータは待ち時間になりますが、単位は「ミリ秒」です。1秒 = 1000ミリ秒なので、1秒指定したい場合はパラメータを1000にします。
delay(1000);
このようにスケッチに書くと、Arduinoは1秒間何もしないでぐずぐず待ってくれます。
ここまでの命令で「1秒ごとにLEDをつけたり消したりする」というスケッチが作れそうですよね。
それではいよいよスケッチを完成させましょう!
1秒ごとにLEDをつけたり消したりする指示を考える
作成するスケッチは「1秒ごとにLEDをつけたり消したり」ということをずっと繰り返す動作です。
Arduinoが電源が入っている間ずっと繰り返し命令を実行してくれるところがありましたよね。
loopの「{」と「}」の間に命令を書けば、Arduinoの電源が入っている間、ずっと命令を繰り返してくれます。
「命令を繰り返す」というのはちょっとはっきりしないところもありますので、もう少し正確に理解しておきましよう。
例えば、以下のようにloopの中に「命令1」「命令2」「命令3」という順序で3つの命令を書いたとします。
この場合、Arduinoは以下のように命令を繰り返し実行します。
- 命令1
- 命令2
- 命令3
- 命令1
- 命令2
- 命令3
- 命令1
- 命令2
- 命令3
- 以下、ずっと繰り返し
それでは、LEDを1秒ごとにつけたり消したりする、という動作をずっと繰り返す場合、loopには命令をどのように書けばいいでしょうか。
まずは用意したノートにこの動作のようすを書いて一緒に考えましょう。
横軸を時間の経過とすると、スイッチの操作とLEDの点滅のようすは以下のようになります。
この図の中に、Arduinoに対する指示を書いてみると以下のようになりますよね。
上の図の指示をよくみると繰り返しのパターンがあります。どの指示の組み合わせが繰り返しのパターンになっているかというと、、、
色分けしたように、「スイッチON」「1秒待つ」「スイッチOFF」「1秒待つ」という4つの指示が繰り返し繰り返し出てきてますよね。つまり、この4つの命令をloopの中に書けば、Arduinoは1秒ごとにLEDをつけたり消したりしてくれるはずです。
これで必要な情報はそろいました!それではスケッチを完成させましょう!
スケッチ完成
これで必要な情報は全てそろいました。Arduinoに対する指示もわかりましたし、何をどのように書けばよいかも整理できました。
今までの知識をもとに、まずは自分でスケッチを作成してみてください。といってもかなり簡単ですよね。
完成したスケッチは以下になります。今回も自分で入力してください。ただ、このスケッチでは同じような命令(digitalWrite)や、同じ命令(delay)が出てきます。このウィンドウは普通のテキストエディタですので、自分で入力したらコピーペーストを活用してスケッチを効率よく入力してみてください。
入力できましたか? 命令の部分はオレンジ色、パラメータの部分は緑色になっていますか?
それでは、ねんのためスケッチに間違いがないか「検証ボタン」で検証してみてください。以下のようになればOKです!
それではいよいよ動作させてみます。
動かしてみよう!
最初に、ブレッドボード上のArduinoのUSB端子とPCを接続してください。
これから作成したスケッチをArduinoに送りますが、その前にいくつか設定が必要です。
設定する内容は「使用するArduinoの製品名」と「ArduinoがつながっているUSBコネクタ」です。
なんでこんなものを設定するんだろう、ってちょっと疑問に思いますよね。これらについて簡単に説明しておきます。
Arduino IDEはスケッチをArduinoに送るときに、入力されたスケッチをそのまま送っているわけではなく、形式を変換して送っています。この変換の内容はArduinoの製品によってちょっとずつ異なっています。
そのため、どのArduino用に変換すればよいかArduino IDEで設定しておく必要があります。なお、スケッチを変換する仕組みについては、基礎編の後半で詳しく説明します。
次に「ArduinoがつながっているUSBコネクタ」です。普通のPCはUSBコネクタが複数ありますよね。Arduinoは1台のPCに複数接続することができます。
その場合、スケッチをどのArduinoに送ればよいかわかりません。そこで、スケッチをどのUSBコネクタにつながっているArduinoに送ればよいのか、設定する必要があります。これはArduinoを1つだけ接続している場合でも設定する必要があります。
それでは、この2つを設定しましょう。
「使用するArduinoの製品名」は「ツール」→「ボード」メニューで設定します。また、「ArduinoがつながっているUSBコネクタ」は「ツール」→「シリアルポート」メニューで設定します。
最初に「使用するArduinoの製品名」の選択です。
「ツール」→「ボード」メニューを選択すると製品の分類メニューになりますので、「Arduino AVR Boards」を選びます。そのメニューの中に「Ardino Micro」という選択肢がありますのでそれを選択します。
「ArduinoがつながっているUSBコネクタ」は、「ツール」→「シリアルポート」メニューをみると、「Arduino Micro」という名前がついた選択肢があると思いますのでそれを選択します。
Windowsの場合は、「COM4」などのあとに「Arduino Micro」という名前がついた選択肢があると思います。
以下の画像は「COM3」となっていますが、COMの後の数字は4以上のことが多いです。
macOSの場合は、「/dev/cu.usb.modemXXXX」のあとに「Arduino Micro」という名前がついた選択肢があると思います。
もし、これらの例に当てはまらない選択肢が出てきて、どれを選んだらよいかわからない場合、以下の手順で対応してみてください。
- いったんArduinoをUSBコネクタから外す
- 「ツール」→「シリアルポート」メニューの選択肢を覚えておく(スクリーンショットを撮るとよいでしょう)
- 再度ArduinoをUSBコネクタに接続する
- もう一度「ツール」→「シリアルポート」メニューの選択肢を見て、(2)の時になかった選択肢が接続されているArduinoです
設定できましたか?
それではいよいよスケッチをArduinoに送ります。以下の矢印マークのボタンをクリックすると、Arduino IDEはスケッチをArduino Micro用に変換して送ります。送り終わるとすぐにLEDがついたり消えたり、という動作を開始します。
初めてのスケッチ作成でしたが、うまく動きましたか?
それでも残る多くの疑問
初めて自分でスケッチを作成して、Arduinoに接続したLEDを制御したわけですが、なんだかスッキリしませんよね。
スケッチには謎の文字「// put your setup code here, to run once:」があります。これはなんなのか、という疑問です。
あと、注意深い人は気づいたかもしれませんが、この謎の文字列の前にスペースが2個ありますよね。もし気づかなかったらもう一度スケッチを見てみてください。なぜ行の先頭から書かないのでしょうか。
謎の文字とかいう前に、そもそも「setup() { }」とか、変なカッコが出てきたり、なんなんですかね。
あと、「検証」ボタンでスケッチに問題ないか確認した時、気づいた人がいるかもしれませんが、スケッチに問題がないとウインドウの下の方に「コンパイルが完了しました。」って表示されます。「コンパイル」って?
それと、、、最初から気にしていた人もいるかもしれませんが、そもそも私たちはどんなプログラミング言語を習得しているのでしょうか。「プログラミング言語」という言葉を知らない人は、今わからなくても問題ありません。あとで関連する用語も含めて説明します。
プログラミングに興味があってこのシリーズを読んでくださってる人は、おそらくネットでプログラミングのことをいろいろ調べたことがあるかもしれません。
ネットで調べると「いま人気のプログラミング言語はPython(パイソン)です」とか「Web系のプログラミング言語だったらJavaScript(ジャバスクリプト)をおさえよう」とか、「プログラミング言語」という言葉をよく見かけると思います。また、毎年のようにプログラミング言語の人気ランキングが発表されています。
このシリーズでも当然なんらかのプログラミング言語を学ぶわけですが、その話はまったく出てきませんでした。私たちは何を習得しようとしてるのでしょうか。
次回からだんだん複雑なスケッチを作成していきますが、一緒にこれらの疑問を徐々に解き明かしていきたいと思います。
ミニチャレンジ課題
LEDを制御できるようになりましたので、以下の課題にチャレンジしてみてください。
今回の記事ではLEDを「1秒つけて1秒消す」という動作をずっと繰り返しました。
それでは、今回作成したスケッチを変更して「2秒つけて1秒消す」という動作をずっと繰り返すようにスケッチを変更してみてください。
更新履歴
日付 | 内容 |
---|---|
2019.7.18 | 新規投稿 |
2021.8.22 | 新サイトデザイン対応 |
2022.2.2 | Arduino IDEのボード選択メニュー変更対応 |
2022.2.9 | ミニチャレンジ課題追加 |