2020年6月27日土曜日

【Arduino】delay関数を使わないLチカ

こんにちは。そろそろ遠隔授業に疲れてきたたかみやです。

みなさんは、Lチカってご存じですか?知らない方はいませんよね(強引)

LEDを点滅させる「Lチカ」は、Arduinoのチュートリアル的存在としても知られています。
新品のAVRにブートローダーを書き込んだ時なんかの動作確認にも用いられますよね

そんなLチカに関してですが、僕は最近、こんなものを書きました。Bloggerへのコードの張り方がわからないので画像で失礼しますが...
これ、なんだか分かります?実はこれも「ただのLチカ」なんです。このスケッチの動作自体は、Arduino IDEのスケッチ例に入っている「Blink」と全く同一です。

delay関数を使わない代わりに、millis関数を使って計時しているのがこのスケッチの特徴です。計時中もloop関数は常に実行されているので、計時しながら別の処理を実行させることができるのも特徴です。

実はこのLチカは、delay関数を使えばこんな風にシンプルに書くことができます。
非常に簡単ですね。
じゃあ、いつもdelay関数を使えばいいのでは...と思うかも知れませんが、そういうわけにはいきません。
delay関数は、指定した時間だけ、(ほとんど)すべての処理を止めてしまう関数です。ms単位で指定するので、引数に1000を指定すれば、1000ミリ秒=1秒間もの間、すべての処理が止まってしまうことになります。
Lチカの場合はLEDを光らせることにしかマイコンを用いていないので無問題ですが、マイコンで様々な情報を処理させたり、複数の表示デバイスを同時に用いたり、スイッチやセンサからの入力をリアルタイムで監視する場合など、delay関数が問題になる場面は多いのです。
そんなわけで、なるべくdelay関数を排除してプログラミングできないか、最近は模索するようにしています。今回のLチカプログラム「Blink_NoDelay」はその一環です。

ちなみに先ほどのLチカですが、pinModeやdigitalWrite関数などをAVR寄りに置き換えるとこういう書き方もできます。名付けて「Blink_NoDelay_HS」。HSは「High Speed」の略で、プログラムの動作を高速化させたという意味合いで付けた名前です。
この手法はマイコンの動作を高速化できる手法として知られていますが、スケッチの容量削減にも一役買ってますね。標準的なblinkスケッチが924バイトもあるのに対し、こちらはコードがゴリゴリ記述されているにもかかわらず、654バイトしかありません。
ちなみに先ほど説明した「Blink_NoDelay」は936バイトと、標準的なblinkスケッチよりもスケッチのサイズが大きくなってしまっています。pinModeやdigitalWrite関数を省いたことでスケッチの容量を削減できたことは明らかです。

ところで、なんでこの期に及んでLチカなんか書いているんだい?と思われるかも知れませんが...
実は実家に帰省していて、ArduinoとPCだけ実家に持って帰ってきたんですが、他の電子部品を全部アパートに置いてきたので、電子パーツを使った工作が全然できない状況なんです。
そのため、他の電子部品を一切使わないようなプログラムを書いたりして、気晴らしをしています。
Arduinoに2次方程式を解かせたり...

Arduinoに5元連立1次方程式を解かせたり...

とにかく色々やって遊んでます。まあ、C言語の練習かな。
2次方程式を解くプログラムはオリジナルですが、連立方程式はQiitaに掲載されていたプログラムをほぼ流用しています。
今までJavaでプログラミングを学んでいたので、C言語は訳が分からなくて苦労していますが、少しずつ慣れていけたらなと思います。

---- おまけ(三角関数を含む総和計算) ----
Arduino、何やってもめちゃくちゃ高速に演算して結果返してくれるので、ヤケクソになって「とにかく時間かかる演算ばかりさせてCPUパワーを消費してやるー!」と思い、こんな計算をさせてみました。この計算はATmega328Pにはしんどいようで、約2.8秒かかるという結果に。ですがよく考えてみると、16MHzのCPUでここまでできれば、まあ優秀ですよね。
ちなみに、計算に使用した数式ですが、以下のサイトで紹介されていたものを利用しました。

0 件のコメント:

コメントを投稿

ATmega328P-PUを最小構成で動かす

最近、空き時間にAVRマイコンで遊んでいるのですが、Arduinoボードのように周辺機器や回路を満載せず、最小構成で動かしたいと感じることがあります。 Arduinoボードには、USB-シリアル変換インターフェース、5Vおよび3.3V定電圧電源、水晶発振子やセラミック発振子、電源...