加速度をBluetooth送信
同僚と話をしててあったら何か使えるかなと思って、2-3時間で工作。
Atmega328と秋月さんの3軸加速度センサと端子を並べてハンダ付け。
3軸加速度の値はアナログ値でマイコンで読み取り。
裏面は、Bluetoothモジュール。
5V電源は、以前購入した3V->5Vの携帯用充電器を加工。
とりあえず、ビニールテープでぐるぐる巻きにして、こんな感じになりました。
プログラムと動作状態はこんな感じ。
X,Y,Zの値がコンマ区切りでダダ流しでPCのに送られます。
グラフ書いてみたところ。
いろいろ面白い使い方ができそうです。
3軸加速度+1軸ジャイロセンサをBluetoothで飛ばす
Arduino(ATmega328)のアナログポートは6ポート、昨日作った3軸加速度だけではあと3ポート空いてるので、 ジャイロを追加してみました。 こんな感じ↓一緒にまとめてビニールテープでぐるぐる巻きにして動作確認。 角度もオフセットをキャンセルした電圧のよみを積算しただけの値を連続して出力。
またちょっと夢が広がります。
加速度+ジャイロをBluetoothで飛ばして、スポーツの練習応用
先日作ったセンサの応用に簡単な実験。 卓球を5年くらいやってた人(自分)のヘソ前にセンサを付けて素振りした時のセンサの値を ログにとってグラフ化。分析してみると、こんな感じ↓
結構簡単におもしろいデータが取れそうなのでちゃんと研究してる人いそうだなぁ、 と思って検索したらいらっしゃいましたので、ブックマークしておきます。 例えば↓
http://www.rcp.keio.ac.jp/sip/technic_patent/technic/doc/ohgi.pdf
http://toragi.cqpub.co.jp/Portals/0/backnumber/2010/10/p172.pdf
学校の部活の指導用などに、安価に組み込めるといいですね。
加速度+ジャイロをBluetoothで飛ばしてスポーツの練習応用、その2
ラケット振ったりするなら、スイングスピードに関する信号も取りたいよなぁ、と思って 残りのアナログポートにも入力できるように端子を出しました。ジャイロセンサをこんな風にパックして、接続。
踏み込みによる重心移動とスイングスピードがほぼ同じでピークを示すデータがとれました。
テニスやってる先生と話してみました。
データを取るとこうなるというのは面白いけど、練習に使えるかは疑問。 上級者なら詳細なデータが取れるとそれなりに活用方法はあるだろうけど、 必要なデータを得るには、種目に特化してセンサ系を組んだほうがいい。 ヘタな人がヘタって分かるデータがとれたからって、どうなの?って結論。
なので、電子工作としてはここらで終了としますか。。。
Arduinoのスケッチ(動作無保証)
// ********************************************************************* // 3軸加速度センサ+1軸ジャイロセンサ+アナログポート2個を // Bluetoothにより送る計測システム // 葉山清輝(熊本高専) // // コマンドにより設定可能とする。 // DLY20 (20msのディレイを設定) // ほか、50,100,200,500,100msを設定可能 // RESET (角度をリセット) // EXON (外部センサON) // EXOFF (外部センサOFF) // // 2012/5/17 ver.1.0 // ********************************************************************* #include < MsTimer2.h> #define XAXIS 0 #define YAXIS 1 #define ZAXIS 2 #define GYRO_IN 3 // gyro port number #define EX1 4 #define EX2 5 char str[120]; // 文字列バッファ char *hdr, *cmd1; int fex=1; // 外部センサのON-OFFフラグ volatile float goff=0; // offset of gyro volatile float gout=0; // gyro sensor output volatile float dgout=0; // gyro sensor output volatile float angle=0; // angle int interval=20; // ----------------------------------------------- float smooth(float data, float dataB, float kf){ return(data*kf+dataB*(1-kf)); } // ----------------------------------------------- void mstimer() { gout=analogRead(GYRO_IN); angle+=(gout-goff-3); // ノイズでずーっとプラス方向にシフトするので、値をマイナスしたらちょっと落ち着いた if (abs(gout-goff)<10) goff=smooth((float)gout, goff, 0.001); } // 文字列読み取り関数2,バッファ読み出しが終わったら区切る,1文字入力も可 void recvStr2(char *buf) { int i = 0; char c; while (Serial.available()) { c = Serial.read(); buf[i] = c; i++; } buf[i] = '\0'; // 文字列終わり } // -------------------------------------------------- void setup() { int i; // get offset value of gyro delay(100); goff=(float)analogRead(GYRO_IN); for(i=0;i<100;i++){ goff = smooth( (float)analogRead(GYRO_IN), goff, 0.01); delay(10); } angle=0; gout=goff; // set ms timer MsTimer2::set(2, mstimer); // 10ms period MsTimer2::start(); Serial.begin(115200); } void loop() { if (Serial.available()) { // シリアル信号を受信したとき recvStr2(str); // シリアル信号を文字列バッファに読み込む if(strcmp(str,"DLY20")==0) interval=20; if(strcmp(str,"DLY50")==0) interval=50; if(strcmp(str,"DLY100")==0) interval=100; if(strcmp(str,"DLY200")==0) interval=200; if(strcmp(str,"DLY500")==0) interval=500; if(strcmp(str,"DLY1000")==0) interval=1000; if(strcmp(str,"RESET")==0) angle=0; if(strcmp(str,"EXON")==0) fex=1; if(strcmp(str,"EXOFF")==0) fex=0; } Serial.print("Angle, "); Serial.print(angle); Serial.print(", Gyro, "); Serial.print(gout); Serial.print(", X, " ); Serial.print(analogRead(XAXIS)); Serial.print(", Y, " ); Serial.print(analogRead(YAXIS)); Serial.print(", Z, " ); Serial.print(analogRead(ZAXIS)); if (fex==0) Serial.println(); else { Serial.print(", EX1, " ); Serial.print(analogRead(EX1)); Serial.print(", Ex2, " ); Serial.println(analogRead(EX2)); } delay(interval); }
ESP32 Wifi Bluetooth開発ボード |
Arduino Nano Every |
Raspberry Pi pico |
FPGA XILINX Artix-7 |