000000 ランダム
 HOME | DIARY | PROFILE 【お気に入りブログ登録】 【ログイン】

CPUを作ろう ~計算機教材とマイコンと電子工作~

加速度をBluetooth送信

同僚と話をしててあったら何か使えるかなと思って、2-3時間で工作。
Atmega328と秋月さんの3軸加速度センサと端子を並べてハンダ付け。
3軸加速度の値はアナログ値でマイコンで読み取り。

  • CIMG5979.JPG


  • 裏面は、Bluetoothモジュール。

  • CIMG5980.JPG


  • 5V電源は、以前購入した3V->5Vの携帯用充電器を加工。

  • CIMG5982.JPG


  • とりあえず、ビニールテープでぐるぐる巻きにして、こんな感じになりました。

  • CIMG5985.JPG


プログラムと動作状態はこんな感じ。
X,Y,Zの値がコンマ区切りでダダ流しでPCのに送られます。

  • CIMG5984.JPG


グラフ書いてみたところ。

  • 3軸加速度ログ.jpg


いろいろ面白い使い方ができそうです。


------------------------------------------

3軸加速度+1軸ジャイロセンサをBluetoothで飛ばす。

Arduino(ATmega328)のアナログポートは6ポート、昨日作った3軸加速度だけではあと3ポート空いてるので、ジャイロを追加してみました。
こんな感じ↓

  • CIMG5988.JPG


一緒にまとめてビニールテープでぐるぐる巻きにして動作確認。
角度もオフセットをキャンセルした電圧のよみを積算しただけの値を連続して出力。

  • CIMG5987.JPG


またちょっと夢が広がります。


------------------------------------------

加速度+ジャイロをBluetoothで飛ばして、スポーツの練習応用

先日作ったセンサの応用に簡単な実験。
卓球を5年くらいやってた人(自分)のヘソ前にセンサを付けて素振りした時のセンサの値をログにとってグラフ化。

  • 卓球素振り全体.jpg


  • 分析してみると、こんな感じ↓

  • 卓球素振り-へそ前にセンサ.jpg


結構簡単におもしろいデータが取れそうなのでちゃんと研究してる人いそうだなぁ、と思って検索したらいらっしゃいましたので、ブックマークしておきます。
例えば↓
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で飛ばしてスポーツの練習応用、終了

ラケット振ったりするなら、スイングスピードに関する信号も取りたいよなぁ、と思って
残りのアナログポートにも入力できるように端子を出しました。

  • CIMG6000.JPG


  • ジャイロセンサをこんな風にパックして、接続。

  • CIMG6002.JPG


踏み込みによる重心移動とスイングスピードがほぼ同じでピークを示すデータがとれました。

テニスやってる先生と話してみました。
データを取るとこうなるというのは面白いけど、練習に使えるかは疑問。
上級者なら詳細なデータが取れるとそれなりに活用方法はあるだろうけど、
必要なデータを得るには、種目に特化してセンサ系を組んだほうがいい。
ヘタな人がヘタって分かるデータがとれたからって、どうなの?って結論。

なので、電子工作としてはここらで終了としますか。。。


------------------------------------------
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);
}


Copyright (c) 1997-2018 Rakuten, Inc. All Rights Reserved.