チーム1465
課題名
デジタル万歩計
研究者名
2年14組46番 Tsukasa Morita
2年14組47番 Daiki Yanai
概要
加速度センサを使い簡単な万歩計を作った。
特徴として音とLEDを使って歩いていることがわかりやすく作成した。
また、LCDには使用者の脂肪とやる気を燃やすために歩数の他に消費calを表示するようにした。
他に、resetボタンを追加し、歩数をリセットできるようにした。
使用器具
PSoC基盤 1個
加速度センサー 1個
LED 5個
スピーカー 1個
ジャンパー線 12本
MiniProg 1個
仕様
加速度装置が外部からの振動を検知し、その信号をデジタルに変換する。
その値が一定以上だった場合、それを一歩としてカウントしている。
LEDは一歩をカウントした際ととまっているときの違いが分かるように2種類のLEDを使っている。
一定数歩くごとに音程を上げたり下げたりするようになっている。(シャトルラン)
また、一定数(5、10、50)歩くたびに、様々な色のLEDをつけることでイルミネーションのような見ても美しい万歩計とした。
ソースコード
/----------------------------------------------------------------------------
/C main line
/----------------------------------------------------------------------------
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define WALK_MIN 2353
#define WALK_MAX 3353
#define STAY_MIN 2700
#define STAY_MAX 5000
#define LED1 0b10000000
#define LED2 0b01000000
#define LED3 0b00100000
#define LED4 0b00010000
#define LED5 0b00001000
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. unsigned int adc_data;//加速度センサー用 unsigned int count = 0;//カウント unsigned int cal = 0;//カロリー unsigned int count_stop = 0;//連続カウントを防ぐ変数 //LCD char number[5];//カウント出力 char cal_number[6];//カロリー出力 //sound int PW=125; int SILENT=0,D=229,L=204,M=182,F=172,S=153,R=136,C=121,DD=115; int TC=0;
//start PWM16_1_Start(); PGA_Start(PGA_HIGHPOWER); LCD_Start(); LCD_InitBG(LCD_SOLID_BG); M8C_EnableGInt; ADCINC_Start(ADCINC_HIGHPOWER); ADCINC_GetSamples(0); while(1){ while(ADCINC_fIsDataAvailable()==0){}; adc_data=ADCINC_wClearFlagGetData();//加速度取得 //walk if(adc_data >= WALK_MAX && count_stop == 0){ count++; count_stop = 1; itoa(number,count,10); //countを10進数として文字列に変換、numberに入れる cal = 50*(70*count/100); itoa(cal_number,cal,10); //sound TC += 1; //led PRT1DR |= LED1; PRT1DR &= (~LED2); if(count / 10 % 2 == 1){ PRT1DR |= LED3; } else{ PRT1DR &= (~LED3); } if(count / 5 % 2 == 1){ PRT1DR |= LED4; } else{ PRT1DR &= (~LED4); } if(count / 50 % 2 == 1){ PRT1DR |= LED5; } else{ PRT1DR &= (~LED5); } } //stay else if(STAY_MIN <= adc_data && adc_data <= STAY_MAX){ count_stop = 0; //led PRT1DR &= (~LED1); PRT1DR |= LED2; } //reset button if(PRT1DR & 0b00000001){ TC = 0; count = 0; itoa(number,count,10); cal = 0; itoa(cal_number,cal,10); } //sound if(count >= 1){ PWM16_1_WritePulseWidth(PW); if(TC%32==0) PWM16_1_WritePeriod(D);else if(TC%32==2) PWM16_1_WritePeriod(L);else if(TC%32==4) PWM16_1_WritePeriod(M);else if(TC%32==6) PWM16_1_WritePeriod(F);else if(TC%32==8) PWM16_1_WritePeriod(S);else if(TC%32==10) PWM16_1_WritePeriod(R);else if(TC%32==12) PWM16_1_WritePeriod(C);else if(TC%32==14) PWM16_1_WritePeriod(DD);else if(TC%32==16) PWM16_1_WritePeriod(DD);else if(TC%32==18) PWM16_1_WritePeriod(C);else if(TC%32==20) PWM16_1_WritePeriod(R);else if(TC%32==22) PWM16_1_WritePeriod(S);else if(TC%32==24) PWM16_1_WritePeriod(F);else if(TC%32==26) PWM16_1_WritePeriod(M);else if(TC%32==28) PWM16_1_WritePeriod(L);else if(TC%32==30) PWM16_1_WritePeriod(D); } //display //step LCD_Position(0,0); LCD_PrString(number); LCD_Position(0,5); LCD_PrCString("steps"); //cal LCD_Position(1,0); LCD_PrString(cal_number); LCD_Position(1,6); LCD_PrCString("cal"); //swing LCD_Position(0,11); LCD_PrCString("Swing"); LCD_DrawBG(1,11,5,(adc_data/20)-135); }
}
チップ
考察
参考にしたのはlab3_adcである。
今回は、二歩歩くたびに、音程が変化するようにしたが、
本来は、一定数歩くことで何か音楽を流そうとしたが、ソフト上で実装すると待ち時間設定が難しく、ハード上ではタイマー系のユーザーインターフェイスを使用しなければいけなかったので音階の変化のみの実装にした。
また、LEDを光らせる際に使用したPRT1DR&=(~LED)の意味が実習ではいまいちわからなかったが実際に使用してみて理解することができた。
他に、万歩計は大きく分けて、一軸か三軸センサーのものに分けられる。
今回作ったのは一軸センサーだけだが、もし三軸センサーを作るなら、センサーの配線と、AD変換器二つ、三軸加速度を全て足すという処理が必要であると考えられる。
- 最終更新:2014-12-16 16:33:42