投稿

2月, 2020の投稿を表示しています

Arduinoでタイマー割り込み

イメージ
Arduinoでタイマー割り込み 前回の記事( Arduinoを使ってみよう )で簡単な時間計測プログラムを作成しましたが実は正確ではありません。 なぜならば、デッドラインを意識したリアルタイム設計が成されていないからです。 そこで、今回は、Arduinoのタイマー割り込みを使ってより正確な時刻計測を行うプログラムを作成してみましょう。  目次:            ・ デッドラインとは?  ・ タイマーで1秒間隔の割り込みを作るには?   ・ 正確なストップウォッチを作ってみる! デッドラインとは? なぜ、前回のタイマー処理では正確な時間計測ができないのでしょうか? 処理を時間で見てみると下記のようになっています。 LCDへの表示を行い、その後1ミリ秒のディレイを行っています。 1回の処理時間は下記のようになります。  処理時間 = LCD表示処理時間 + 1ミリ秒ディレイ LCDの表示にかかる処理時間は短いものですが、使い続けると誤差が大きくなってしまいます。 組み込み機器は、電源を入れられるとそのまま動き続けることが多いため、このような誤差も問題になってきます。 或いは、実際の競技計測のように厳密な計測を求められるような場合も同様です。 そこで、下記のように1秒の間隔の間でLCDの表示処理を行うようにする方法が考えられます。 このような処理形態とした場合、 必ず1秒以内に処理を完了しなければなりません 。 この1秒という時間が『 デッドライン 』になります。 上記の図では、2つ目の1秒の間隔で処理が終わることができませんでした。 このような場合、次の1秒の処理に影響が出てしまうため、このような状況は避けなければなりません。  だから、『 デッドライン 』といいます。 また、このデッドラインを意識した設計は、組み込み機器のリアルタイム性能に大きく影響を及ぼします。 さて、ではどうやって1秒の間隔を作り出せばよいのか? このブログの以前の記事「 STM32F3 Discovery、タイマーと割り込みのキホン 」ではタイマーで割り込み駆動してLEDをソフトPWMで制御しました。 Arduinoでも同様に、タイマーによる割り込みが可能です。

Arduinoで割り込み処理

イメージ
Arduinoで割り込み処理 Arduinoだって割り込み処理、できるもん。 今回は、Arduinoを使った割り込み処理についてです。 さて、今回もArduino Microを使ってのコードです。  目次:            ・ スイッチ状態を読み取る  ・ スイッチの状態変化を割り込みで受け取る   スイッチ状態を読み取る まずは、外部にタクトスイッチを取り付けてArduinoで受け取るプログラムを作成してみましょう。 回路図は、下記のようになります。 この回路では、電源電圧5Vを220Ωの抵抗を挟んでデジタル入力の12とスイッチに接続しています。スイッチのもう1方はGNDに接続としています。 このような接続方法を”プルアップ接続”といいます。 この接続方法では、ボタンを押さない状態ではデジタル入力ピンに電圧がかかっているため、HIGHとして認識され、ボタンを押すとGND側に電流が流れるためLOWなることでボタンが押されたことを検出できます。 実際に使うスイッチはタクトスイッチです。 ブレッドボード上ではこんな感じになります。 まずは、簡単なプログラムとしてスイッチが押された状態ならば、ボード上のLEDを点灯し、離された状態ならばLEDを消灯するプログラムを作成してみましょう。 プログラムは、下記のようになります。 スイッチの状態を検出するプログラム const byte LED_PIN = 13; const byte INPUT_PIN = 12; void setup() { // Digital Pin設定 pinMode(LED_PIN, OUTPUT); // On-Board LED pinMode(INPUT_PIN, INPUT); } void loop() { if(digitalRead(INPUT_PIN) == LOW) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } } デジタル入出力12番を入力に設定し、ボード上のLEDを点灯するためデジタル入出力13番を出力に設定