前回の続きとして、今回はセンサーの値をArduinoで読み取り、それをProcessingでグラフにします。
まず、int型は2バイトです。しかし、シリアル通信は1バイトずつデータを送るので、センサーの値を送るのにはひと手間かかります。
・Arduino側のプログラム
この部分はたびたび使いますが、大量のデータをいっぺんに送るときの方法です。このブログでは、GPSを使ったときに似たようなことをやっていて、センサーから送られてきた様々なデータから必要なデータを持ってくるときに使っていました。このような処理はよく使うので、プログラムがちょっとできる人なら見たことがあると思います。
今回はここまでです。次回はメーター類の基礎をできればいいと思います。それではまた今度。
2020/10/13更新 プログラムがたぶん読みやすくなったはずです。
まず、int型は2バイトです。しかし、シリアル通信は1バイトずつデータを送るので、センサーの値を送るのにはひと手間かかります。
・Arduino側のプログラム
- void setup() {
- Serial.begin(9600);
- }
- void loop() {
- int value = analogRead(0);
- Serial.write('H'); // ヘッダの送信
- Serial.write(highByte(value)); // 上位バイトの送信
- Serial.write(lowByte(value)); // 下位バイトの送信
- }
ヘッダーをつけて二つに分割して送ります。
・Processing側のプログラム
このようにするとできます。まあそもそも、データをそのままグラフにして表示するのならArduino IDEのシリアルプロッタを使えばいいのですが...
一応出力はこのようになります。シリアルプロッタと違うところは背景や線の色を自由に変えられるところでしょうか...
この中で大事なのは以下に抜き出した部分です。
・Processing側のプログラム
- import processing.serial.*;
- Serial serial;
- int[] data;
- void setup() {
- size(400, 250);
- data = new int [width];
- serial = new Serial( this, Serial.list()[1], 9600 );
- }
- void draw() {
- background(10);
- strokeWeight(2);
- stroke(0, 255, 0);
- //グラフの描画
- for (int i=0; i<data.length-1; i++) {
- line( i, convToGraphPoint(data[i]), i+1, convToGraphPoint(data[i+1]) );
- }
- }
- void serialEvent(Serial port) {
- if ( port.available() >= 3 ) {
- if ( port.read() == 'H' ) {
- int high = port.read();
- int low = port.read();
- int recv_data = high*256 + low;
- //時系列データを更新
- for (int i=0; i<data.length-1; i++) {
- data[i] = data[i+1];
- }
- data[data.length-1] = recv_data;
- }
- }
- }
- float convToGraphPoint(int value) {
- return (height - value*height/1024.0);
- }
このようにするとできます。まあそもそも、データをそのままグラフにして表示するのならArduino IDEのシリアルプロッタを使えばいいのですが...
一応出力はこのようになります。シリアルプロッタと違うところは背景や線の色を自由に変えられるところでしょうか...
この中で大事なのは以下に抜き出した部分です。
- void serialEvent(Serial port) {
- if ( port.available() >= 3 ) {
- if ( port.read() == 'H' ) {
- int high = port.read();
- int low = port.read();
- int recv_data = high*256 + low;
この部分はたびたび使いますが、大量のデータをいっぺんに送るときの方法です。このブログでは、GPSを使ったときに似たようなことをやっていて、センサーから送られてきた様々なデータから必要なデータを持ってくるときに使っていました。このような処理はよく使うので、プログラムがちょっとできる人なら見たことがあると思います。
今回はここまでです。次回はメーター類の基礎をできればいいと思います。それではまた今度。
2020/10/13更新 プログラムがたぶん読みやすくなったはずです。