ナーフの性能を評価するためには色々な要素があります。その中で最も簡単に計測できるのが弾の速さ、つまり初速であり…それを計測する機器が弾速計となります。弾の初速が早いほど飛距離が伸びることとなりますので、その数値を比較することで各ナーフの性能スケールとして使うことが出来るようになります。またバラツキを図ることでおおよその精度の目安にもなります。初速がバラバラ=弾道もバラバラということになりますから。
前回の記事はコチラ
今では低価格化が進んで5000円位で手に入れることができるようになってきた弾速計。ですがそれらはほとんどがエアガン用であり、ナーフでは検出部が小さく使いにくかったりします。そういうこともあって自作することにしました。
材料・必要物品
処理部分はarduino(アルドゥイーノ、アーデュイノ)と呼ばれるマイコンボードを使用します。もともとはフィジカルコンピューティングの学習用マイコンとして作られておりまして、比較的簡単にI/O機器が作れるようになっています。
格安で互換品なんかも売っていますがデバイスドライバー周りや開発環境のセットアップにクセがあるので慣れない人は避けた方が無難です。最初に買うならば正規品をおすすめします。
パーツを刺していくだけで回路が作れるブレッドボードは試作には必須です。
センサーは色々ありますが簡単なフォトセンサーを使用します。
ホビー用の弾速計は2種類あり、LEDとフォトダイオードを対向させる透過型、今回のように並列させる反射型があります。一般に感度や精度は透過型の方が高いのですが、筒に入らない物体は測定できないという弱点が有ります。
ナーフのようにノーマルダーツやらミサイル、はては矢のように色々な物体を飛ばす玩具では制限となってしまいますので、今回は反射型で製作していきたいと思います。
その他パーツとしてセンサーを安定化させるためとして1kΩ、LEDの発熱を抑える制限用に18~33Ω抵抗を使います。 基本セットに入っているもので代用できますし、紛失や破損した場合はセット販売されています。
基板上で配線する場合はハンダゴテと半田、コテ台や作業用トレー、ニッパーなど細かい工具が必要となります。ブレッドボード上で済ます場合はボードや配線類が必要となります(Arduinoキットを買った場合は同梱品で可)。
回路図
回路図は以下の通り。3.3v出力を使って赤外線LEDを発光させます。
フォトダイオードからの信号はデジタル2とデジタル3それぞれに入力します。D2、D3を使うと割り込み(attachInterrupt)が使えるようになります。今回のようにセンサーによる素早い処理をさせたい場合は割り込みを考慮しておいたほうが後々の拡張がしやすくなります。
※この記事については少しずつ追記していきます
ソースコード
arduino用のコードは以下の通り。まるっとコピペすれば動作すると思います。使用の際は実際のセンサー間距離を計ってから書き換えてください。
前述のように反射型のコードとなっております。透過型で作った場合はセンサーの条件分岐式が逆になりますのでご注意ください。
boolean TIMER_SWICH = false; //ダーツ通過フラグ
//———————————————————————
void setup(){
Serial.begin( 9600 );
pinMode(2, INPUT);
pinMode(3, INPUT);
}
//———————————————————————
double BULLET_SPEED = 0; //弾速(m/s)
double DIST_LED=100; // ***センサー間距離(mm)***
unsigned long TR_TIME_F = 0; //1個めのセンサー通過時間(μs)
unsigned long TR_TIME_R = 0;//2個めのセンサー通過時間(μs)
//———————————————————————
void loop(){
Bullet_speed_count(); //弾速計モード
}
//———————————————————————
// 弾速計モード
//———————————————————————
void Bullet_speed_count(){
double tr_time; //(センサー2)-(センサー1)=通過時間
if(TIMER_SWICH == false){
if(digitalRead(2) == LOW){
TR_TIME_F=micros();
TIMER_SWICH=true;
}
}
if(TIMER_SWICH == true){
if(digitalRead(3) == LOW){
TR_TIME_R=micros();
TIMER_SWICH=false;
tr_time=TR_TIME_R-TR_TIME_F ;
BULLET_SPEED = (DIST_LED / 1000) /(tr_time/1000000);
if(BULLET_SPEED<=500){Serial.println(BULLET_SPEED);}
}
}
}
計測値の取得方法について
弾速計側に表示部を持たない構造ですので、計測値の取得にはパソコンが必要です。開発環境でしたらIDEのシリアルモニターを使うか…
Tera Termのようなターミナルエミュレータを使います。接続の際はシリアルを選択してください。通信ポート番号は環境によって変わります。
「Tera Term」定番のターミナルエミュレーター – 窓の杜ライブラリhttp://forest.watch.impress.co.jp/library/software/utf8teraterm/
どちらも起動した状態でダーツの通過を検出すると以下のように初速データを送信してきます(画面にどんどんと表示されます)。単位はm/sになります。
13.05
11.90
11.57
12.37
…
検出ミスがあると0.0とか0.1というような極端な値が出ることがありますが、そこは手動でデータの整理を行ってください。データが出揃ったらEXCEL等でグラフ化や集計をしても良いかもしれませんね。