加速度センサとローパスフィルタ

加速度センサとローパスフィルタ
加速度センサとローパスフィルタ

Arduinoと加速度センサで計算した角度にローパスフィルタをかけ、Processingで動きの違いを視覚化させてみた。

この記事では、そのプログラミングを紹介する。

はじめに

はじめに、Processingでおすすめの参考書をご紹介します。

RCローパスフィルタのアルゴリズム

次の式がデジタル信号におけるRCローパスフィルタのアルゴリズムである。

$$y[n]=ay[n-1]+(1-a)x[n]$$

非常に単純な式で表すことができ、使い方も簡単だ。やっていることは単純で、1つ前のデータに係数をかけてそれを現在のデータと足し合わせている。

なぜ電子回路のRCローパスフィルタがこのような式になるのかは、こちらで詳しく説明したので参考に。

プログラミングでRCローパスフィルタ

ローパスフィルタの強さによるブレの違い
ローパスフィルタの強さによるブレの違い

係数aの値を変えて6つのオブジェクトで動作の違いを確認するプログラムがこちら。動画のようにローパスフィルタを強くかけるにつれ微細な振動に強くなり安定するが、動作が鈍くなり遅れが出てしまう。

import processing.serial.*;

Serial serial;
int lf = 10; // line feed
float ra = 0; // radian
int w = 100; // objects width
int h = 40; // objects height
int n = 6; // objects count
float[] y = {0, 0, 0, 0, 0, 0};
float[] a = {0, 0.2, 0.3, 0.5, 0.7, 0.9};
void setup() 
{
  println(Serial.list()[3]);
  
  size(900, 600);
  frameRate(30);
  
  serial = new Serial(this, Serial.list()[3], 9600);
  serial.bufferUntil(lf);
}

// y[n] = a*y[n-1] + (1-a)*x[n]
float rc_lpf(float y, float x, float a) {
  return a * y + (1-a) * x;
}

void drawObject(int i, float ra) {
  float dx = float(w) * float(i);
  float dy = 0;
  if(i >= 3) {
    dx = float(w) * float(i-3);
    dy = w * 1.5;
  }
  translate(width/(n+1) + dx, height/3 + dy);
  if(n == 0) {
  } else {
    translate(dx, 0);
  }
  textSize(16);
  text("a="+a[i], -w/2, h*2);
  float r = rc_lpf(y[i], ra, a[i]);
  y[i] = r;
  rotate(r + PI);  
  rect(-w/2, -h/2, w, h);
  resetMatrix();
}



void draw()
{
  background(255, 255, 255);
  fill(77, 77, 77);
  textSize(24);
  text("Low-Pass Filter", 50, 70);
  text("y[n] = a*y[n-1] + (1-a)*x[n]", 50, 120);
  
  for(int i = 0; i < n; i++) {
    drawObject(i, ra);
  }
  
}

void serialEvent(Serial p) {
  if (serial.available() >= 2) 
  {
     ra = float(p.readString());    
  }
}

加速度センサから角度を計算する方法はこちらを参考に。

ProcessingでArduinoとシリアル通信する方法はこちらを参考に。

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事