チーム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);
       }
}

チップ
1465.PNG

考察

参考にしたのはlab3_adcである。
今回は、二歩歩くたびに、音程が変化するようにしたが、
本来は、一定数歩くことで何か音楽を流そうとしたが、ソフト上で実装すると待ち時間設定が難しく、ハード上ではタイマー系のユーザーインターフェイスを使用しなければいけなかったので音階の変化のみの実装にした。
また、LEDを光らせる際に使用したPRT1DR&=(~LED)の意味が実習ではいまいちわからなかったが実際に使用してみて理解することができた。
他に、万歩計は大きく分けて、一軸か三軸センサーのものに分けられる。
今回作ったのは一軸センサーだけだが、もし三軸センサーを作るなら、センサーの配線と、AD変換器二つ、三軸加速度を全て足すという処理が必要であると考えられる。


  • 最終更新:2014-12-16 16:33:42

このWIKIを編集するにはパスワード入力が必要です

認証パスワード