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

ここでは、シリアル通信を使って、分圧回路の出力電圧をバイト形式でArduinoからPCに送信することに挑戦します。PC側では、そのバイト形式のデータを受け取り、グラフ表示するプログラムを使います。

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

接続図

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

プログラムを書こう

分圧回路の出力電圧をバイト形式でArduinoからPCに送信するためのArduinoのプログラム(下のserial_voltage_byte_sample1)を、ArduinoのIDEを使って書きましょう。


// serial_voltage_byte_sample1

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

int vol_value = 0;

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

void loop() {
  vol_value = analogRead( vol_pin );

  analogWrite( led_pin, vol_value/4 );

  Serial.write( byte(vol_value/4) );

  delay( 50 );
}
	  

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

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

プログラムを理解しよう

まずは、関数loop()内の関数analogRead()を見てください。


vol_value = analogRead( vol_pin );
	  
この関数で引数vol_pinで指定されたアナログピンの電圧値を計測しています。そして、ArduinoのAD変換器は10bitのAD変換器ですので、計測された電圧値に応じて0から1023の整数値を返します。ここではその返り値をint型の変数vol_valueに格納しています。Arduinoではint型変数は2byte(16bit)の値を格納します。

今回データ送信には、関数Serial.write(val)を使用します。関数Serial.print(val)ではvalをアスキー形式に変換して送信しますが、この関数はバイナリ形式でデータを送信します。

ここでは、LEDへの印可電圧を指令している


analogWrite( led_pin, vol_value/4 );
	  
と同様に、

Serial.write( byte(vol_value/4) );
	  
として、変数vol_valueを4で割ることで0から255の範囲に入るように修正し、さらにbyte()で明示的にbyte型にキャストしてから、関数Serial.write()でPCに送信しています。

おまけ:画像をボリュームで動かそう

この画像をボリュームで左右に動かしてみよう。そのためのProcessingのプログラムは以下のようになります。このプログラムが保存されているフォルダに、上の画像も保存しておきましょう。


// volume_motion_sample1

import processing.serial.*;

Serial port;

int data, x;
PImage warai;

void setup() {
  size( 500, 200 );
  warai = loadImage( "warai.jpg" );
  port = new Serial( this, "/dev/tty.usbserial-A600afZk", 9600 );
}

void draw() {
  background( 255 );
  x = (int)map( data, 0, 255, 0, width );
  image( warai, x, 50 );
}

void serialEvent(Serial p) {
  data = port.read();
}
			

Referenceへのリンク


back to "Arduino Tutorial"