みなさん,こんにちは
おかしょです.
以前から始動しているこのレーダー探知機作成プロジェクトもこの記事で完結となります.
はたしてレーダー探知機は思った通りの出来となったのか,はたまたできなかったのか
ぜひ,最後まで読んでいただければなと思います.
この記事を読むと以下のようなことがわかる・できるようになります.
- レーダー探知機で使用しているプログラム
- ProcessingとArduinoの通信方法
- レーダー探知機の出来栄え
この記事を読む前に
この記事は以下の記事の続きとなっています.
以下の記事ではレーダ探知機の作り方やArduinoのプログラムを公開しているので,まだ読んでいない方はそちらを先に読んでおくことをおすすめします.
レーダー探知機の全体図
レーダー探知機の全体図は以下のようになりました.
このようにサーボモータが反トルクで動かないようにマスキングテープをおもりにしています.
見栄えは悪いですが,ちゃんと機能はするので問題ありません.
Arduinoのプログラム
前回までの記事では,ArduinoとProcessingで通信をしていませんでした.
そのため,プログラムには通信を行うプログラムがかかれていなかったのでここではプログラムの完全版を示します.
これからお見せするレーダー探知機でも以下のプログラムを使用しています.
#include <Servo.h>
Servo servo;
int angle = 0;
bool ch = true;
int data;
int L = 0;
float T = 0.05;
float K = 1.0;
unsigned long t0, t1;
float y0, y1;
int u0, u1;
void setup() {
Serial.begin(9600);
servo.attach(3);
servo.write(angle);
y0 = 0.0;
y1 = 0.0;
u0 = 0.0;
u1 = 0.0;
t0 = millis();
}
void loop() {
y0 = y1;
u0 = u1;
if(ch)
{
angle = angle + 1;
if(angle>=180)
{
ch = false;
}
}
else
{
angle = angle - 1;
if(angle<=0)
{
ch = true;
}
}
servo.write(angle);
data = analogRead(0);
u1 = data;
t1 = millis();
float Ts = (float)(t1-t0)/1000;
y1 = (2*T-Ts)/(2*T+Ts)*y0+K*Ts/(2*T+Ts)*(float)(u1+u0);
L = (int)(pow(y1, -1.25)*21000);
Serial.write((byte)(1));
Serial.write((byte)(200));
Serial.write((byte)(angle));
Serial.write((byte)(L));
delay(20);
t0 = t1;
}
このプログラムでは測距モジュールから得られたデータをローパスフィルタにかけています.(ローパスフィルタについてはこちらを参照してください)
ArduinoとProcessingの通信方法に関してはこちらで解説しています.
Processingのプログラム
Processingのプログラムは以下のものを使用しています.
import processing.serial.*;
Serial port;
int[] data = new int[2];
float W, H;
int angle = 0;
int ch = 1;
float L = 0;
float[] Point = new float[181];
void setup() {
size(displayWidth,displayHeight); // windowのサイズを画面いっぱいにする
port = new Serial(this, Serial.list()[0], 9600);
background(25); // 背景の色指定 黒に指定
W = displayWidth/33.87; // 位置を調整しやすいようにPowerPointの単位に合わせる
H = displayHeight/19.08;
}
void draw() {
pushMatrix(); // 現在の座標系を保存
translate(displayWidth/2, H*15); // 円の中心に原点を移動
noFill(); // 塗りつぶしなし
strokeWeight(1); // 線の幅は1
stroke(157, 195, 230); // 線の色設定
ellipse(0, 0, H*13, H*13); // 25cmを示す円
ellipse(0, 0, H*26, H*26); // 50cmを示す円
fill(49, 235, 255); // ロボットの位置を表すマークの設定
noStroke();
triangle(0, 0, 0, -H*1, -W*0.5, H*0.25); // ロボットの位置を表示
triangle(0, 0, 0, -H*1, W*0.5, H*0.25);
popMatrix(); // 原点を元に戻す
noStroke();
fill(157, 195, 230); // 文字の色設定
textAlign(CENTER, TOP); // 文字を中心のトップにそろえる
textSize(18);
text("15", displayWidth/2, H*2);
text("7.5", displayWidth/2, H*8.5);
pushMatrix();
angle = data[0];
L = data[1];
Point[angle] = L; // 距離と角度を配列として格納
fill(25, 10); // 残像の設定
rectMode(CORNER);
rect(0, 0, displayWidth, displayHeight);
pushMatrix(); // 現在の座標系を保存
translate(displayWidth/2, H*15); // レーダーの中心に原点を移動
rotate(-angle*PI/180); // レーダーの向いている角度に合わせる
fill(49, 235, 255);
stroke(49, 235, 255);
triangle(0, 0, H*13/15*L, 5, H*13/15*L, -5); // レーダーの描画
popMatrix();
translate(displayWidth/2, H*15); // 原点を下に戻す
strokeWeight(10); // 物体を認識した場所に点を打つ
for(int i=0; i<181; i++)
{
point(H*13/15*Point[i], 0); // 格納したポイントに点を打つ
rotate(-1*PI/180);
}
popMatrix(); // 原点を元に戻す
}
void serialEvent(Serial port){
// シリアルポートからデータを受け取ったら
if (port.available() >=4) {
//// シリアルデータ受信
if(port.read()==1)
{
if(port.read()==200)
{
data[0] = port.read();
data[1] = port.read();
}
}
}
}
以前の記事ではレーダーの長さはランダムの変数を使用していましたが,このプログラムではArduinoから送られてきたデータを使用しています.
また,測距モジュールの精度が思ったよりも悪かったので,表示する範囲も変更しました.
実行結果
以上のプログラムを使用して,レーダー探知機を動かしてみました.
周りに何もない状態
まずは周りに何も置かずに実行してみました.
先程のProcessingのプログラムでは30 cm以上遠くにあるものは表示されないようにしているので,レーダー探知機の半径30 cm以内には何もないような状態です.
レーダー探知機できたはいいんですけど,ノイズがひどくて何も周りにない(少なくとも半径30cm以内)のにこんな感じです.これでもローパスフィルタをデータにかけています. #Processing #Arduino pic.twitter.com/pUSoM6jY3I
— おかしょ (@okasho_engineer) September 10, 2020
このように,センサーからのノイズがひどく何もないにもかかわらず,データがぶれてしまっています.
目の前に物がある状態
次にレーダー探知機の目の前に物を置いて,レーダがどのように反応するのかを実験してみました.
ちなみにレーダー探知機の目の前に物を置くとこんな感じです. #Processing #Arduino pic.twitter.com/xetWGJp4O2
— おかしょ (@okasho_engineer) September 10, 2020
ノイズは相変わらずありますが,確かに目の前に物があるように見えます.
まとめ
この記事ではこのプロジェクトで作成したレーダー探知機の出来栄えを説明しました.
結論としては満足したできとはなりませんでした.
原因としてはセンサーのノイズが関係していると思います.
ローパスフィルタをかけているにもかかわらず,上記のような結果になってしまっていたのでフィルターでは除去しきれないほどのノイズがのっていたのが原因だと思います.
ノイズを除去するためにフィルターの時定数を大きくするということもしたのですが,そのようにすると物があってもデータが変動しなくなってしまいます.
このレーダー探知機を改善するには,現在使用している赤外線を使った測距センサーから別のセンサーに変える必要があります.
今のところ目をつけているのは,超音波センサーです.
超音波センサーを使ったらどうなるのか,今後検証してい見たいと思います.
続けて読む
このブログでは他にもさまざまなプロジェクトを行っているので,興味のある方は見てみてください.
Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.
それでは最後まで読んでいただきありがとうございました.
コメント