ここから本文です

Arduino、Processingに関する質問 現在、フォトトランジスタのアナログ値を読み...

hor********さん

2019/6/1923:26:50

Arduino、Processingに関する質問

現在、フォトトランジスタのアナログ値を読み取り、シリアル通信でProcessingに送っています。

その際、不要な変動をなくすため、Meanフィルターをかけています。(参考:『Prototyping Lab』)

そのプログラムは1つのセンサを対象としているのですが、僕は複数のセンサの値を読み取りたいです。

そのプログラムの変え方がわからないので、わかる方教えていただきたいです。


___________以下、現状のプログラム_________________


const int BUFFER_LENGTH = 23; //バッファの長さ
const int INDEX_OF_MIDDLE = BUFFER_LENGTH / 2; //バッファの中央のインデックス
int buffer[BUFFER_LENGTH]; //バッファ
int index = 0; // バッファにデータを書き込むインデックス
const int sensorPin = 0;
int raw;

void setup() {
Serial.begin(9600);//シリアルスタート

//バッファの初期化
for (int i = 0; i < BUFFER_LENGTH; i++) {
buffer[i] = 0;
}
}

void loop() {
raw = analogRead(sensorPin);
buffer[index] = raw; //読み取った値をバッファに書き込む

// 次回バッファに書き込む位置を更新
// バッファの最後まで来たら折り返す
index = (index + 1) % BUFFER_LENGTH;

//MeanフィルタとMedianフィルタでそれぞれスムージング
int smoothedByMeanFilter = smoothByMeanFilter();

//結果をシリアルで出力
Serial.print(raw);
Serial.print(",");
Serial.println(smoothedByMeanFilter);
delay(100);
}

//Meanフィルタによるスムージング
int smoothByMeanFilter() {
//バッファの値の合計を集計するための変数
long sum = 0;

//バッファの値の合計を集計
for (int i = 0; i < BUFFER_LENGTH; i++) {
sum += buffer[i];
}

//平均をフィルタの出力結果として返す
return (int)(sum / BUFFER_LENGTH);
}


//クイックソートで使用する比較用の関数
int comparisonFunction(const void *a, const void *b) {
//void型をint型にキャスト
int _a = *(int *)a;
int _b = *(int *)b;
if (_a < _b) {
//a<bであれば-1を返す
return -1;
}
else if (_a > _b) {
//a>bであれば1を返す
return 1;
}
else {
//いずれでもない(つまりa==b)であれば0を返す
return 0;
}
}

閲覧数:
12
回答数:
1

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

qui********さん

2019/6/2000:33:37

それ以前の話として...

Processingはこの話に全然関係してないように思いますけれど、違うの?
あと、クイックソートの関数は何?

スムージングするのもArduino側でやるのがいいか、Processing側でやるのがいいか、ちょっと悩みどころ。まぁ、どっちでもいいや...というレベルではあるけれど。計算リソースはPCの方が遥かに大きいので、私だったらPC側でやるかなぁ。

で、本題。極論を言っちゃえば、「そのプログラムは1つのセンサを対象としている」のをちゃんと理解したならば、必要な要素を各センサ毎に用意してやればいいのです。
ものすご~くベタにやるなら、2つにしてみると、(コンパイル出来ることは確認してますが、実動作はさせてません。なにかミスがあったらごめん)

const int BUFFER_LENGTH = 23; //バッファの長さ
int buffer[BUFFER_LENGTH]; //バッファ
int buffer2[BUFFER_LENGTH];//2個めのセンサーのバッファ
int index = 0; // バッファにデータを書き込むインデックス
const int sensorPin = 0;
const int sensorPin2 = A1;//2個めのセンサーの接続ピン
int raw, raw2; //2個めのセンサーのデータ保存追加

void setup() {
Serial.begin(9600);//シリアルスタート

//バッファの初期化
for (int i = 0; i < BUFFER_LENGTH; i++) {
buffer[i] = 0;
buffer2[i]= 0;
}
}

void loop() {
raw = analogRead(sensorPin);
buffer[index] = raw; //読み取った値をバッファに書き込む
raw2 = analogRead(sensorPin2);
buffer2[index] = raw2;

// 次回バッファに書き込む位置を更新
// バッファの最後まで来たら折り返す
index = (index + 1) % BUFFER_LENGTH;

//MeanフィルタとMedianフィルタでそれぞれスムージング
int smoothedByMeanFilter = smoothByMeanFilter();

//結果をシリアルで出力
Serial.print(raw);
Serial.print(",");
Serial.println(smoothedByMeanFilter);

smoothedByMeanFilter = smoothByMeanFilter2();

//結果をシリアルで出力
Serial.print(raw2);
Serial.print(",");
Serial.println(smoothedByMeanFilter);
delay(100);
}

//Meanフィルタによるスムージング
int smoothByMeanFilter() {
//バッファの値の合計を集計するための変数
long sum = 0;

//バッファの値の合計を集計
for (int i = 0; i < BUFFER_LENGTH; i++) {
sum += buffer[i];
}

//平均をフィルタの出力結果として返す
return (int)(sum / BUFFER_LENGTH);
}

int smoothByMeanFilter2() {
long sum = 0;
for (int i = 0; i < BUFFER_LENGTH; i++) {
sum += buffer2[i];
}
return (int)(sum / BUFFER_LENGTH);
}

で出来なくはないでしょう。
ある程度以上手慣れた人なら一案としてこんなプログラムになるかな。これもコンパイルのみ確認。

const int SENSOR_PIN[] = {A0, A1};//必要数センサを追加
const int BUFFER_LENGTH = 23;

class RingBuf {
int buf[BUFFER_LENGTH] = {};
int index = 0;
public:
void addData( int data ) {
buf[index] = data;
index = (index + 1) % BUFFER_LENGTH;
}
int smoothByMeanFilter() {
long sum = 0;
for (int i = 0; i < BUFFER_LENGTH; i++) {
sum += buf[i];
}
return (int)(sum / BUFFER_LENGTH);
}
};

const int SENSOR_NUM = sizeof(SENSOR_PIN) / sizeof(SENSOR_PIN[0]);
RingBuf buffer[SENSOR_NUM];

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

void loop() {
for ( int i = 0; i < SENSOR_NUM; i++) {
int raw=analogRead(SENSOR_PIN[i]);
buffer[i].addData(raw);
int smoothedByMeanFilter = buffer[i].smoothByMeanFilter();
Serial.print(i+1);
Serial.print(": ");
Serial.print(raw);
Serial.print(",");
Serial.println(smoothedByMeanFilter);
delay(100);
}
}

質問した人からのコメント

2019/6/20 00:51:51

Processingは本筋ではなかったですごめんなさい...

回答してくださったプログラムに少し変更を加えて、自分の思い描いていた結果がでました。誠にありがとうございます!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる