分圧回路の出力電圧をバイト形式で送信してみよう(2バイト送信)

分圧回路の出力電圧をバイト形式で送信してみよう(1バイト送信)では、AD変換で得られた10ビットのデータを、8ビットのデータに精度を落として、バイト形式のシリアル通信でPCに送信しました。

ここでは、AD変換で得られたデータを精度を落とすことなくPCに送信することに挑戦します。

ArduinoとLED、ボリュームを接続しよう

接続図

回路に変更はありません。
led_volume_sample1.png

プログラムを書こう

下記のプログラムでは、int型変数vol_value(2バイト=16ビット)に格納された分圧回路の出力電圧をシリアル通信でArduinoからPCに送信します。プログラム名はserial_voltage_2byte_sample1です。Arduino IDEを使って書き込みましょう。


// serial_voltage_2byte_sample1

const int led_pin = 9;
const int vol_pin = 1;

int vol_value = 0;

void setup() {
  Serial.begin( 9600 );
}

void loop() {
  byte buffer[2];

  vol_value = analogRead( vol_pin );

  analogWrite( led_pin, vol_value/4 );

  if ( Serial.available() > 0 ) {
	buffer[0] = byte( vol_value );
	buffer[1] = byte( vol_value >> 8 );
	Serial.write( buffer, 2 );
    Serial.read();
  }
}
	  

とりあえず実行してみよう

プログラムが完成したら実行してみましょう。PC側では、ここで解説するProcessingのプログラム(data_plot_2byte)を実行します。新しいウインドウが開き、's'キーを押すとデータを取得し始めます。ウインドウにAD変換器で計測した分圧回路の出力電圧値がプロットされれば成功です。ボリュームを回して出力電圧を変化させ、プロットが変動することを確認しましょう。こんな感じでArduinoからのデータがプロットされます。
images/serial_voltage_2byte_plot.png

プログラムを理解しよう

serial_voltage_byte_sample1からの変更点は、


Serial.print( vol_value/4, BYTE );
	  
が、

byte buffer[2];

if ( Serial.available() > 0 ) {
  buffer[0] = byte( vol_value );
  buffer[1] = byte( vol_value >> 8 );
  Serial.write( buffer, 2 );
  Serial.read();
}
	  
になった点です。

今回のプログラムでは、PC側のプログラムがArduinoに何か1バイトのデータを送信すると、ArduinoはAD変換の結果をPCに送信します。

Serialライブラリの関数available()は、arduinoのシリアル通信の受信バッファに、何バイトのデータが届いているかを知るための関数です。例えば、PCから合計2バイトのデータが既に届いており、受信バッファに貯まっていれば、関数available()は2を返します。

今回のプログラムでは、


if ( Serial.available() > 0 ) {
	  
としていますので、Arduinoの受信バッファに何か1バイトでもデータが届いていれば、

buffer[0] = byte( vol_value );
buffer[1] = byte( vol_value >> 8 );
Serial.write( buffer, 2 );
Serial.read();
	  
が実行されます。4つめの命令

Serial.read();
	  
は、受信バッファの先頭にある1バイトのデータを取り出すための命令です。Serialライブラリの関数read()は、その取り出したデータを返り値としますが、今回のプログラムではそのデータは必要ないので、何の変数にも代入していません。この命令を実行しないと、受信したデータはずっと貯まったままになります。

つぎに、AD変換の結果のデータをPCに送信している以下の3つの命令を説明します。


buffer[0] = byte( vol_value );
buffer[1] = byte( vol_value >> 8 );
Serial.write( buffer, 2 );
	  
変数vol_valueはAD変換の結果を保存している2バイトの変数です。そして、そのAD変換の結果をbyte型変数の配列buffer[]に格納しています。buffer[0]にvol_valueの下位8ビットが、buffer[1]に上位8ビットを格納しています。そして、これらのデータを関数write(buf, len)で送信しています。

Referenceへのリンク


back to "Arduino Tutorial"