今回はArduinoの端子をスイッチ制御する方法を習得します。
Arduinoの端子を制御する指示
前回の記事では、スケッチに12番ピンをスイッチ機能に設定する指示を書きました。スケッチのsetup部分で「pinMode」を使って設定したんですよね。
今回は、LEDをつけたり消したりするスイッチを制御する具体的な指示の方法を説明します。
このスイッチを制御する指示は、スケッチに次のように書きます。
「digitalWrite」は「デジタル ライト」と読みます。日本語では、「digital」は「デジタル」(そのままですね…)、「Write」は「書く」という意味です。
「デジタル」は日常会話でもよく使いますよね。「1か0か」「ONかOFFか」という、2つの状態を意味しています。
この指示では、スイッチをONにするか、OFFにするか、という2つの状態を制御しますので「デジタル」という言葉が使われています。
「書く」というのはちょっとイメージしづらいかもしれません。Arduino内部のスイッチを操作して、その状態を端子に書き出す、というイメージでしょうか。
このdigitalWriteで「Write」という用語を使う理由は、Arduino内部のかなり奥深いところの理解が必要になります。ここでは「端子に書き出す」というようなイメージで覚えてみてください。
digitalWriteでは、引数として端子番号とスイッチ制御を指定します。
引数の「端子番号」は、Arduinoボードに書かれている端子の数字を書きます。
引数の「スイッチ制御」は、「HIGH」か「LOW」を書きます。「HIGH」と書いた場合はスイッチがONになります。「LOW」と書いた場合はスイッチがOFFになります。
一般的なイメージの場合、スイッチ制御は「ON」「OFF」ですよね。「HIGH」と「LOW」というのはちょっと違和感があるかな、と思います。
「HIGH」は「高い」、「LOW」は低い、という意味です。
スイッチをONにすると、端子の電圧が高くなります。スイッチをOFFにすると、端子の電圧は0Vになります。
digitalWriteは内部のスイッチ制御というより、端子の電圧に注目して指定するイメージで考えるとわかりやすいと思います。
では、12番端子に接続したLEDをつける場合、どのようなに書けばよいかわかりますか?
以下のように書けばLEDがつきます。
digitalWrite(12, HIGH);
Arduinoがこの指示を実行すると、内部のスイッチはONになります。スイッチを操作しない限りONの状態を保ちます。
次にスイッチをOFFにする場合は、以下のように書けばOKです。
digitalWrite(12, LOW);
これでLEDをつけたり消したりすることができるようになりました!
ただ、これだけの指示では「LEDを1秒ごとにつけたり消したりする」というスケッチは作成できません。「1秒ごとに」つけたり消したりしたいわけです。
第3回の「プログラミングとは」の記事で、1秒ごとにLEDをつけたり消したりするプログラムのイメージを確認しましたよね。
その時の考え方を思い出してみると、次のように「1秒待ってはON、1秒待ってはOFF」という制御をずっと繰り返せばLEDを1秒ごとにつけたり消したりできそうです。
digitalWrite(12, HIGH);
1秒待つ
digitalWrite(12, LOW);
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
- 以下、「指示1」「指示2」「指示3」をずっと繰り返す
それでは、LEDを1秒ごとにつけたり消したりする、という動作をずっと繰り返す場合、loopには指示をどのように書けば良いでしょうか。
まずはこの動作のようすを書いて一緒に考えましょう。
横軸を時間の経過とすると、スイッチの操作とLEDの点滅のようすは以下のようになります。
この図の中に、Arduinoに対する指示を書いてみると以下のようになりますよね。
上の図の指示をよくみると繰り返しのパターンがあります。どの指示の組み合わせが繰り返しのパターンになっているかというと、、、
ちょっとわかりづらいですが、色分けしたように、「スイッチON」「1秒待つ」「スイッチOFF」「1秒待つ」という4つの指示が繰り返し繰り返し出てきてますよね。
つまり、この4つのしじ
をloopの中に書けば、Arduinoは1秒ごとにLEDをつけたり消したりしてくれるはずです。
これで必要な情報はそろいました!それではスケッチを完成させましょう!
スケッチ完成
これで必要な情報は全てそろいました。Arduinoボードに対する指示もわかりましたし、何をどのように書けばよいかも整理できました。
今までの知識をもとに、できればこの段階で自分でスケッチを作成してみてください。
完成したスケッチは次のようになります。
このスケッチでは同じような記述が出てきます。
このウィンドウは普通のテキストエディタですので、自分で入力したらコピーペーストを活用してスケッチを効率よく入力してみるのも良いと思います。
それでは、念のためスケッチに間違いがないか「検証ボタン」で検証してみてください。以下のようになればOKです!(検証後しばらくすると右下に一定時間「コンパイルが完了しました」と表示されますが、これは正常です)
もし怒られてしまったら、どこかに入力間違いがあるはずですので見直してみてください。(そこまで怒らなくても…という怒り方ですので心中お察しします。どうぞお気を落とさずに…)
それではいよいよ動作させてみます。
動かしてみよう!
これから作成したスケッチをArduinoボードに送りますが、その前に、Arduino IDE上で送る先のArduinoボードを選択しておく必要があります。これからこの作業を行います。
Arduinoボードの選択
それでは、Arduino MicroのUSB端子とPCをUSBケーブルで接続してください。
接続後、Arduino IDEのボードを選択するメニューをクリックしてください。次のようなリストが表示されると思います。
ここには、接続されているArduinoボードがリストされます。
Macintoshの場合、「不明」という項目が表示されることがあります。これは、Arduino IDEが認識しているUSB接続ポートがあり、そこにはArduinoボードが接続されていないのため、ボードの型番は不明と表示されてしまっています。
このリストに「Arduino Micro」がありますので、クリックして選択してください。選択すると次のように「Arduino Micro」という文字が太字になると思います。このようになれば正しくArduinoボードが選択されています。
Arduino Microがリストに表示されない場合
もし、Arduino Microが表示されない場合、次の手順で設定してみてください。
Arduinoボード選択メニューから「他のボードとポートを選択…」をクリックします。
次のダイアログが表示されます。このダイアログの左側でArduinoボードの型番を設定、右側で接続しているUSBポートを選択します。
Arduinoボードの選択は、次のように、検索欄に「micro」と入力して、Arduino Microを見つけてクリックします。
USBポート(コネクタ)は次のように選択してください。
Windowsの場合は「COM3」や「COM4」など、数字が3以上のことが多いので、その項目をクリックして選択します。
macOSの場合は「/dev/cu.usb.modemXXXX」というようにXXXの部分に数字が書かれていることが多いので、その項目を選択します。
もし、これらの例に当てはまらない選択肢が出てきて、どれを選んだらよいかわからない場合、以下の手順で対応してみてください。
- 上のダイアログを開いたままにして、ArdinoボードをUSBコネクタから外す
この段階でリストから1つ選択肢が消えると思います。消えたあとの状態を覚えておきまます(スクリーンショットを撮っておくといいかもしれません)。 - もう一度ArduionボードをUSBコネクタに接続する
リストに1つ何か追加されると思います。❶との差分が接続されたUSBポートになります。 - ❷で表示されたUSBポートを選択する
設定できたらOKボタンをクリックしてダイアログを閉じます。
それではいよいよスケッチをArduinoに送ります。
スケッチをArduinoボードに送る
これで準備ができましたので、いよいよスケッチをArduinoボードに送ります。
送るには、次の矢印マークのボタンをクリックします。
送り終わるとすぐにLEDがついたり消えたり、という動作を開始するはずです。
初めてのスケッチ作成でしたが、うまく動きましたか?
うまく動作しなかった場合は次の内容を確認してみてください。
・ブレッドボードの接続に問題はないか?
特にLEDの接続が次のようになっているか確認してみましょう。
「Arduinoボードの12番端子」➡︎「LEDのアノード」➡︎「LEDのカソード」➡︎「ArduinoボードのGND端子」
・スケッチの内容は問題ないか?
スケッチの検証に問題がなくても、digitalWriteの2番目の引数に正しくHIGHやLOWを設定しないとうまく動きませんので、動作内容に問題ないか確認してみてください。
それでも残る多くの疑問
初めて自分でスケッチを作成して、Arduinoに接続したLEDを制御したわけですが、なんだかスッキリしませんよね。
スケッチには謎の文字「// put your setup code here, to run once:」があります。これはなんなのか、という疑問です。
あと、注意深い人は気づいたかもしれませんが、この謎の文章の前にスペースが2個ありますよね。もし気づかなかったらもう一度スケッチを見てみてください。なぜ行の先頭から書かないのでしょうか。(pinModeなどの自分で書いた指示は行の先頭から書いたのですが、ダメなのでしょうか?)
謎の文字とかいう以前に、そもそも「setup( ) { } 」とか、変なカッコが出てきたり、なんなんですかね。
それと、、、最初から気にしていた人もいるかもしれませんが、そもそも私たちはどんなプログラミング言語を習得しているのでしょうか。「プログラミング言語」という言葉を知らない人は、今わからなくても問題ありません。あとで関連する用語も含めて説明します。
プログラミングに興味があってこのシリーズを読んでくださってる方は、おそらくネットでプログラミングのことをいろいろ調べたことがあるかもしれません。
ネットで調べると「いま人気のプログラミング言語はPython(パイソン)です」とか「Web系のプログラミング言語だったらJavaScript(ジャバスクリプト)をおさえよう」とか、「プログラミング言語」という言葉をよく見かけると思います。また、毎年のようにプログラミング言語の人気ランキングが発表されています。
このシリーズでも当然なんらかのプログラミング言語を学ぶわけですが、その話はまったく出てきませんでした。私たちは何を習得しようとしてるのでしょうか。
次回からだんだん複雑なスケッチを作成していきますが、一緒にこれらの疑問を徐々に解き明かしていきたいと思います。
ミニチャレンジ課題
LEDを制御できるようになりましたので、以下の課題にチャレンジしてみてください。
この記事ではLEDを「1秒つけて1秒消す」という動作をずっと繰り返しました。
次は「Arduinoが動作を開始したら、『1秒つけて1秒消す』という動作を2回だけ繰り返す」ようなスケッチを作成してみてください。点滅を2回繰り返したら、それ以降は何もしません。
次は、以下の動作をずっと繰り返すようなスケッチを作成してみてください。
(点滅イメージは「ピカー、ピカピカ」というような感じです)
- 1秒間ON
- 1秒間OFF
- 0.2秒間ON
- 0.2秒間OFF
- 0.2秒間ON
- 2秒間OFF
ミニチャレンジ課題解答例
これが唯一の正解というわけではありません。動作が思った通りであればOKです!
課題1
1秒ごとの点滅をloop部分に書くとずっと繰り返してしまいます。
「1秒ごとの点滅を2回繰り返す」という動作を1回だけ行えば良いので、この指示をsetupに書けばOKです。
void setup() {
// put your setup code here, to run once:
pinMode(12, OUTPUT);
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
}
課題2
動作の内容をdigitalWriteとdelayを組み合わせて指示します。
ずっと繰り返すので指示はloop部分に書きます。
また0.2秒待ちは、0.2秒は200ミリ秒ですので、delayの引数を200にします。
void setup() {
// put your setup code here, to run once:
pinMode(12, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
digitalWrite(12, HIGH);
delay(200);
digitalWrite(12, LOW);
delay(200);
digitalWrite(12, HIGH);
delay(200);
digitalWrite(12, LOW);
delay(2000);
}
更新履歴
日付 | 内容 |
---|---|
2019.7.18 | 新規投稿 |
2021.8.22 | 新サイトデザイン対応 |
2022.2.2 | Arduino IDEのボード選択メニュー変更対応 |
2022.2.9 | ミニチャレンジ課題追加 |
2024.11.17 | Arduino IDE2の内容に変更 ミニチャレンジ課題内容変更 |