「Arduinoの基礎」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
67行目: 67行目:
     Serial.println(fVoltage);
     Serial.println(fVoltage);
     delay(1000);  
     delay(1000);  
}
</source>
<br><br>
== 割り込みとISR ==
Arduinoのスケッチでのハードウェア割込み(hardware interrupt)の利用方法について記載する。<br>
<br>
Arduino Unoでは、2個のピン(D2, D3)が割込みに利用できる。D2は割込み番号が0、D3は割り込み番号が1である。<br>
Arduino Mega2560では、6個(D2, D3, D18, D19, D20, D21)が使えます使用できる。割込み番号は順に0, 1, 5, 4, 3, 2が設定されている。<br>
<br>
割込みサービスルーチン(ISR, interrupt service routine)は、引数および戻り値が無い(void)の関数が割り当てられる。<br>
attachInterrupt(割込み番号, 関数名, モード)でISRをセットする。<br>
また、attachInterruptの引数にはピンの番号ではなく、割込み番号を指定することに注意すること。<br>
ピン番号から割込み番号の解決には、digitalPinToInterruptを使用する。<br>
<br>
次のサンプルコードでは、toggle_ledという名前のISRを、D2ピンでの割込み処理に指定している。<br>
モードのFALLINGはHIGHからLOWの状態へ遷移したことで割込みを発生させることを意味する。<br>
ISRでLEDが接続されたピンの状態を表す変数をLOWまたはHIGHに変化させている。<br>
そして、loop()関数でその変数をdigitalWrite()関数に渡している。<br>
<source lang="c++">
const byte PIN_LED      = 10;
const byte PIN_INTERRUPT = 2;
volatile byte state      = LOW;
void setup()
{
    pinMode(PIN_LED, OUTPUT);
    digitalWrite(PIN_LED, state);
    attachInterrupt(digitalPinToInterrupt(PIN_INTERRUPT), toggle_led, FALLING);
}
void loop()
{
    digitalWrite(PIN_LED, state);
}
void toggle_led()
{
    state != state;
  }
  }
  </source>
  </source>

2019年7月25日 (木) 19:01時点における版

概要

Arduinoのスケッチには、setup()関数とloop()関数が存在する。
setup()関数はスケッチの実行開始時(電源を投入した直後)、またはボードのリセット後に1度だけ呼ばれる。
変数の初期化や、ピンモードの設定、ライブラリの初期化などを行うのに適している。
loop()関数は、setup()関数が呼ばれた後に繰り返し呼び出される。


スケッチのダウンロード

まず、スケッチをコンパイルする。
次に、Arduino IDEの[ツール]メニューバー - [ボード]メニューでArduinoボードを選択する。
更に、Arduino IDEの[ツール]メニューバー - [ポート]メニューでCOMポートを選択する。
最後に、[マイコンボードに書き込む]ボタンを押下して、コンパイルしたスケッチをダウンロードする。


LEDの点滅(ArduinoのHello World)のサンプルコード

次に示すのは、LEDを点滅させるサンプルコードである。

 const int LED_PIN = 13;
 
 void setup()
 {
    pinMode(LED_PIN, OUTPUT);
 }
 
 void loop()
 {
    digitalWrite(LED_PIN, HIGH);
    delay(1000);
    digitalWrite(LED_PIN, LOW);
    delay( 1000 );
 }



Arduinoで電圧を測定する(アナログ入力を読み取る)

Arduinoボードは、A0 - A5までの6チャネルの10ビットのADCを持っている。
Arduino Uno等の動作電圧が5[V]のボードでは、0[V] - 5[V]までの電圧は、0 - 1023までの整数に対応付けられる。

Arduino IDEでは、analogRead()関数を用いることで、指定したアナログピンから値を読むことができる。
analogRead()関数は読み取った値を0 - 1023までの整数値で返す。
従って、5[V]を1023に対応する場合は、"analogRead()関数の戻り値 * 5 / 1023"とすれば電圧が分かる。

尚、デフォルトでanalogRead()の戻り値である0 - 1023が、0[V] - 5[V](Arduino Gemmaのような3.3[V]の動作電圧の場合は0[V] - 3.3[V])に
対応付けられているが、analogReference()関数を用いてこの範囲を変更することは可能だが、設定可能な値はボードに依存する。

図.1 電圧を測定する回路図


Arduino AnalogRead 01.png


次に記述するのは、電圧を読み取った結果をシリアルモニタに出力するサンプルコードである。
これによって 1秒毎にシリアルモニタに電圧が表示される。

図.2 電圧を測定してシリアルモニタに表示


Arduino AnalogRead 02.png


 const int PIN_ANALOG_INPUT = 5;
 
 void setup()
 {
    Serial.begin(9600);
 }
 
 void loop()
 {
    int iVoltage = analogRead(PIN_ANALOG_INPUT);
    float fVoltage = iVoltage * 5.0 / 1023.0;
    Serial.println(fVoltage);
    delay(1000); 
 }



割り込みとISR

Arduinoのスケッチでのハードウェア割込み(hardware interrupt)の利用方法について記載する。

Arduino Unoでは、2個のピン(D2, D3)が割込みに利用できる。D2は割込み番号が0、D3は割り込み番号が1である。
Arduino Mega2560では、6個(D2, D3, D18, D19, D20, D21)が使えます使用できる。割込み番号は順に0, 1, 5, 4, 3, 2が設定されている。

割込みサービスルーチン(ISR, interrupt service routine)は、引数および戻り値が無い(void)の関数が割り当てられる。
attachInterrupt(割込み番号, 関数名, モード)でISRをセットする。
また、attachInterruptの引数にはピンの番号ではなく、割込み番号を指定することに注意すること。
ピン番号から割込み番号の解決には、digitalPinToInterruptを使用する。

次のサンプルコードでは、toggle_ledという名前のISRを、D2ピンでの割込み処理に指定している。
モードのFALLINGはHIGHからLOWの状態へ遷移したことで割込みを発生させることを意味する。
ISRでLEDが接続されたピンの状態を表す変数をLOWまたはHIGHに変化させている。
そして、loop()関数でその変数をdigitalWrite()関数に渡している。

 const byte PIN_LED       = 10;
 const byte PIN_INTERRUPT = 2;
 volatile byte state      = LOW;
 
 void setup()
 {
    pinMode(PIN_LED, OUTPUT);
    digitalWrite(PIN_LED, state);
 
    attachInterrupt(digitalPinToInterrupt(PIN_INTERRUPT), toggle_led, FALLING);
 }
 
 void loop()
 {
    digitalWrite(PIN_LED, state);
 }
 
 void toggle_led()
 {
    state != state;
 }