2012年8月4日土曜日

ArduinoとGR-SAKURA analogRead、analogWrite編

 シリアルに続いて、ArduinoとGR-SAKURAのanalogRead, analogWrite についてです。
以下のソース(スケッチ)をArduino と GR-SAKURA で動かしてみました。

#define RXDUINO

#ifdef RXDUINO
#include <rxduino.h>
#else
#include <Arduino.h>
#endif

#define INTERVAL 500
#define PIN_ANALOG_IN0    0
#define PIN_ANALOG_OUT    9


void setup()
{
    // IO初期化。
    pinMode(PIN_ANALOG_OUT, OUTPUT);
#ifdef RXDUINO
    analogReference(EXTERNAL);
#endif
    
    // シリアルポートを9600bpsで開始。
    Serial.begin(9600);
    // 受信バッファにデータが入るまで待機。
    while (Serial.available() == 0);        
    Serial.println("Hello!");
    // 一旦、受信バッファにデータがあれば、
    if (Serial.available() > 0) {
        // 読み込んで、廃棄。
        char c = Serial.read();
    }
}

void loop()
{
    unsigned int intValue = analogRead(PIN_ANALOG_IN0);
    Serial.println(intValue);
    analogWrite(PIN_ANALOG_OUT, (int)(intValue / 4));
    delay(INTERVAL);
}

ブレッドボード上に可変抵抗をおいて、電源電圧からボリューム調整で分圧した電圧をAN0に入れて、analogRead(AN0)で読み込みます。読み込んだ10bit値を4でわって8bit値に縮めて、analogWrite(PIN9)でPWM出力して抵抗を直列に入れたLEDを光らせています。



 一応、同じような動きをしてくれていますね。ここでも、注意が必要なのは、電源電圧で、Arduinoは5V、GR-SAKURAは3.3Vで、PWM等で供給できる電圧も当然低くなるわけで。
 また、AD入力も3.3V以上の入力を加えても測定できないばかりか、壊してしまう可能性もあるので、要注意です。

 また、GR-SAKURAでは電源3.3Vをブレッドボードに供給して、当然、最大3.3Vがアナログ入力に帰ってくるわけですが、
   analogReference(EXTERNAL);
を入れておかないと、3.3Vを5Vを1023としたときの値、3.3V→675として返して来てしまいます。3.3Vを1023として取得したい場合は、上記の記述が必要でした。