Arduino遅延機能とそれを使用すべきでない理由

Arduino遅延機能とそれを使用すべきでない理由

あなたが最初に始めたとき 開発方法を学ぶ にとって Arduino 、おそらく次のように少し機能する製品を作成しました。





Arduinoに接続されるのは単一のLEDライトです。これは毎秒かそこらでオフになり、Arduinoがオフになるまで続きます。これはの「HelloWorld」プログラムです Arduino 、そしてほんの数行のコードで具体的なものを作成する方法を完全に示しています。





私もあなたが使用したことを喜んで賭けます 遅れ() ライトがオンとオフになる間隔を定義する関数。しかし、ここに問題があります。Arduinoがどのように機能するかについての基本的なデモンストレーションには遅延が便利ですが、実際にはそれを現実の世界で使用するべきではありません。これが理由です–そして代わりに何を使うべきか。





Delay()のしくみ

方法 遅れ() 関数の動作は非常に簡単です。単一の整数(または数値)引数を受け入れます。この数値は、プログラムが次のコード行に移動するまで待機する時間(ミリ秒単位で測定)を表します。

しかし、問題は、 遅れ() 関数は、「ブロッキング」関数として知られているものであるため、プログラムを待機させる良い方法ではありません。



ストップコード不良システム設定情報ウィンドウズ10

ブロッキング関数と非ブロッキング関数の違い

ブロッキング機能が悪い理由を説明するために、キッチンにいる2人の異なるシェフを想像してみてください。 ヘンリーブロッキング 、 と エドゥアルドノンブロッキング 。どちらも同じ仕事をしますが、方法は大きく異なります。

ヘンリーが朝食を作るとき、彼はトースターに2ラウンドのパンを入れることから始めます。ついに ping 、そしてパンが黄金色に飛び出し、ヘンリーはそれを皿に置き、フライパンに2個の卵を割る。再び、彼は油がはじけるのを待ち、白は固まり始めます。それらが終わったとき、彼はそれらを皿に盛り、ベーコンの2つのラッシャーを揚げ始めます。カリカリになったら、フライパンから取り出して皿にのせて食べ始めます。





エドゥアルドは少し異なる方法で動作します。彼のパンが乾杯している間、彼はすでに彼の卵とベーコンを揚げ始めています。 1つのアイテムが調理を終了するのを待ってから次のアイテムに移動する代わりに、彼は複数のアイテムを調理しています 同時に 。その結果、エドゥアルドはヘンリーよりも朝食を作るのにかかる時間が短くなります。ヘンリーブロッキングが終了するまでに、トーストと卵は冷たくなっています。

それはばかげたアナロジーですが、それは要点を示しています。





ブロッキング 関数は、その特定のタスクが完了するまで、プログラムが他のことを実行できないようにします。複数必要な場合 行動 同時に起こるために、あなたは単に使用することはできません 遅れ()

特に、アプリケーションで接続されたセンサーから常にデータを取得する必要がある場合は、 遅れ() 機能、絶対に一時停止します すべての

幸運にも、 遅れ() Arduinoのコーディング時にプログラムを待機させる唯一の方法ではありません。

Millis()に会う

NS ミリス() 関数は単一のタスクを実行します。呼び出されると、(として 長さ datatype)プログラムが最初に起動されてから経過したミリ秒数。それで、なぜそれが役に立つのですか?

少し簡単な計算を使用することで、プログラムの動作に影響を与えることなく、プログラムの側面を簡単に「時間」調整できるためです。以下は、millis()がどのように機能するかの基本的なデモンストレーションです。ご覧のとおり、プログラムはLEDライトを1000ミリ秒(1秒)オンにしてからオフにします。しかし決定的に、それは非ブロッキングの方法でそれを行います。

それでは、Arduinoでどのように機能するかを見てみましょう。

このプログラム -これは大きく基づいています Arduinoの公式ドキュメントから1つ -現在の時刻から以前に記録された時刻を引くことによって機能します。残り(つまり、時間が最後に記録されてから経過した時間)が間隔(この場合は1000ミリ秒)よりも大きい場合、プログラムは previousTime 現在の時刻に可変で、LEDをオンまたはオフにします。

Facebookでフォトアルバムをプライベートにする方法

そして、それは非ブロッキングであるため、最初にその外側にあるコードはすべて ifステートメント 正常に動作するはずです。

簡単ですね。変数をどのように作成したかに注意してください 現在の時刻 として 署名なし 長さ。 NS 署名なし 値は、それが決して負になることはないことを単に意味します。これは、保存できる最大数が大きくなるようにするためです。デフォルトでは、数値変数は符号付きです。つまり、その変数の1つの「ビット」メモリが、値が正か負かを格納するために使用されます。正の値のみを指定することで、1ビット余分に操作できます。

割り込み

これまでのところ、Arduinoプログラムでタイミングにアプローチする1つの方法について学びました。 遅れ() 。しかし、別のはるかに優れた方法がありますが、より複雑です。 割り込み 。これらには、Arduinoプログラムの時間を正確に計り、外部入力にすばやく応答できるという利点がありますが、 非同期 マナー。

つまり、コードのフローを中断することなく、メインプログラムと連携して実行され、イベントが発生するのを常に待機します。これにより、Arduinoプロセッサのパフォーマンスに影響を与えることなく、イベントに効率的に対応できます。

割り込みがトリガーされると、プログラムを停止するか、一般に 割り込みハンドラ または 割り込みサービスルーチン 。これが完了すると、プログラムは元の状態に戻ります。

Arduinoに電力を供給するAVRチップは、ハードウェア割り込みのみをサポートします。これらは、入力ピンがハイからローに変化したとき、またはArduinoの組み込みタイマーによってトリガーされたときに発生します。

それは不可解に聞こえます。紛らわしいです。しかし、そうではありません。それらがどのように機能するかを確認し、実際に使用されている例をいくつか確認するには、 Arduinoのドキュメントをヒット

ブロックされないでください

使用する ミリス() 確かに、使用する場合と比較すると、少し余分な作業が必要です 遅れ() 。しかし、私を信じてください、あなたのプログラムはそれをあなたに感謝します、そしてあなたはそれなしではArduinoでマルチタスクを行うことができません。

の例を見たい場合 ミリス() 実際のArduinoプロジェクトで使用されている場合は、JamesBruceのArduinoナイトライトとサンライズアラームを確認してください。

注意すべき他のブロッキング関数が見つかりましたか?以下のコメントで知らせてください、そして私たちはチャットします。

写真クレジット: Arduino (ダニエルスパイ)チーフ (オリー・スベンソン)

共有 共有 つぶやき Eメール Windows 11にアップグレードする価値はありますか?

Windowsが再設計されました。しかし、それはWindows10からWindows11に移行するように説得するのに十分ですか?

次を読む
関連トピック
  • DIY
  • プログラミング
  • Arduino
著者について マシューヒューズ(386件の記事が公開されました)

Matthew Hughesは、イギリスのリバプール出身のソフトウェア開発者兼ライターです。彼は手に濃いブラックコーヒーがない状態で見つかることはめったになく、MacbookProとカメラを絶対に愛しています。彼のブログはhttp://www.matthewhughes.co.ukで読むことができ、Twitterの@matthewhughesで彼をフォローすることができます。

グーグルマップで場所を固定する方法
マシューヒューズのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください
カテゴリ Diy