満を持してarduinode v0.0.7が公開されました。
今まではNode-Arduino-General-IOと言う長い名前でしたが、リポジトリ名を変更してarduinodeとしました。
リンク切れなどが発生する可能性はありますが、今のうちに変更してしまおうということで、エイヤッと変更しました。
今回のバージョンアップに伴う変更は以下の通りです。
- 外部割込み処理に対応(attachInterrupt、detachInterrupt API追加)
- APIの引数の型チェックを行うようにした
- APIが複数同時に実行されないようにした
- Arduinoがメモリ不足によってリセットされる不具合を修正
- サンプルプロジェクトを更新
大きな変更としては1の外部割込みへの対応です。
ここでは外部割込み処理の使い方を紹介します。
割込みってなんだ?
外部割込み処理とは特定のポートに何らかの変化(例:電圧の変化Low -> High)が起こった時に、今行なっている作業を中断して(割り込んで)、何らかの処理をするを言います。
「プログラミングをしている時に、電話が鳴ったからプログラミングを中断して電話に出る」という感じです。
この時の「電話が鳴った」という事象を割込要因(トリガ)と言い、「電話に出る」という動作を割込処理と言います。
割込には内部割込と外部割込があり、内部割り込みはCPU内部のタイマーなどが割込要因となって発生するものです。
外部割込みはスイッチなどに接続されているポートの電圧の変化等が割込要因となって発生するものです。
割込みに関する説明は以上です。
何が便利なのさ?
では外部割込みはどんな時に役に立つのでしょうか?
ここではArduinoの2番目のポートに接続されているスイッチの状態を読み取る場合を考えてみましょう。
このスイッチは押された時に5V、押されていないときには0Vを出力するものとします。
このスイッチが押された時に何か処理をしたいと思います。
さて、どのようにスイッチが押された事を取得すればよいでしょうか?
一番簡単なのは以下の様にdigitalRead()APIを使って一定間隔(200msecぐらい?)でポートの値を読み取る方法です(ポーリングと言います)。
この時に読み取った値が0から1に変化していれば、スイッチが押されたことになります。
しかし、スイッチが操作されていない時もずっと値を読み続ける必要があるため、非効率です。
重要なのは「スイッチが押された」という動作を取得することです。
その為に何度も何度もポートの状態を取得するのは無駄が多いですね。
外部割込みを使用するとそういった無駄を一気に解決することが出来ます。
まずattachInterrupt()APIを使用して外部割込みを有効にします。
次に割込が発生したことを受け取るイベントリスナを登録します。
このリスナ内でスイッチが押された時に行いたい処理を書きます。
これだけです(下記コード参照)。
外部割込みを有効にするためのAPIを実行した後は、そのイベントが発生するのを待つだけで良いので効率も良いです。
その間に無駄な通信を行う必要はありません(なおイベントを待っている間に他のAPIを実行することは可能です)。
スイッチの状態変化をトリガにして何からの処理を行うシーンはよくあると思いますので、是非そういった用途にご活用下さい。
更に詳しい情報はarduinodeのAPIドキュメントとArduinoのリファレンスを参照して下さい。
なお、このバージョンはArduino Unoでのみ確認を行なっています。
Arduino Megaではコンパイルすら通らないとおもいます。
スイッチの状態変化をトリガにして何からの処理を行うシーンはよくあると思いますので、是非そういった用途にご活用下さい。
更に詳しい情報はarduinodeのAPIドキュメントとArduinoのリファレンスを参照して下さい。
なお、このバージョンはArduino Unoでのみ確認を行なっています。
Arduino Megaではコンパイルすら通らないとおもいます。
0 件のコメント:
コメントを投稿