艦楽のtwitter濃縮箱

twitterを濃縮したよ

第2回 Arduinoで遊ぼう・ホールセンサで簡易サイコンの回だよ

かんらだよ

 

Arduinoで遊ぼう!ホールセンサ使うよ!

 

 

 

第2回です。今回はホールセンサを使っていきます。

 

ホールセンサは、

ホールセンサー(ホール素子)とはホール効果を利用して「磁石が発する磁界」や「電流が発する磁界」を電気信号に変換して出力する非接触型の磁気センサーです。

lab.fujiele.co.jp

ですね。

 

まあ磁力を数値として出力してくれるセンサです。

f:id:kanra_6236:20200428132225j:plain

ホールセンサくん

 

かわいいね。

この子はセンサキットに入ってました。


f:id:kanra_6236:20200428132326j:image

 

今回は、タイトルにもある通りこのセンサを使って簡易サイコンを作っていきます。

 

サイコンはサイクルコンピュータの略で、自転車につけて走行速度や走行距離を測れるデバイスです。

 

主にサイコンで使われる速度の計測方法としては

 

  • フレーム、スポークに付けたセンサとの通信で出す
  • 上の無線ver
  • GPSでなんか測る。

 

があります。

 

今回はフレームにホールセンサをつけ、スポークに磁石を付けて速度を測る、選択肢で言うと一番上の方式でやっていきます。

 

まず、ホールセンサとArduinoを繋ぎ、シリアルモニターで数値が見れるようにします。

 

その状態で磁石を近付けたり、離したりすると、

 

f:id:kanra_6236:20200428170654p:plain

ホールセンサの値をとる

 

こんな感じで数値が変わります。732とか542とか、751が近づいた時の値ですね。

ホールセンサの表裏で移動する値が異なります。

今回は磁石を近付けると値が増える方を使ってコードを考えて行きます。

 

磁石をホールセンサの前をサッと通過させたとき、出る値をある程度カバー出来る値を閾値とします。

 

とりあえず閾値は520としました。

 

最終的に磁石はスポークに、センサはフレームに付けるので、ちょっと距離が離れたり、メチャハヤで通り過ぎたりするので、ちょっと余裕をもたせるといいと思います。

 

 

速度を出すために必要なものは、距離と時間です。

 

今回は、

距離(ホイールの周長)/時間(ホールセンサに磁石が近づいてからもう一度近づく間)

で速度を出します。

 

ホイールの周長は

https://www.cateye.com/files/manual_dl/1/129/Tire_size_chart_JP_151023.pdf

 

ここで確認しました。僕のは700×25Cのホイールなので、2105mm。約2.11mです。/1000してkmにします。

 

ホイール1周にかかる時間はmillis()を使います。

int sensorPin = A0;
int loop_counter = 0;
int start_time = 0;
int before_time = 0;

int monitor_St, monitor_Bt;

void setup() {
  
  Serial.begin(9600);
  start_time = millis();
  before_time = millis();
  monitor_Bt = millis();
  monitor_St = millis();
}

void loop() {
  float sp = 0;
  
  if(analogRead(sensorPin) > 520){

    if(loop_counter == 0){
      start_time = millis();
    }
    loop_counter++;

    delay(50);
  
    if(loop_counter > 1){
      
      before_time = millis();
      float loop_time = before_time - start_time; //ms

      /*
      loop_km = 2.11 / 1000;
      loop_time_s = loop_time / 1000;
      loop_time_h = loop_time_s / 3600;
      */

      sp =  2.11 / loop_time * 3600; //時速

      Monitor(sp);
      
      loop_counter = 0;

    }
  } 
}

void Monitor(float Speed){

  monitor_Bt = millis();

  if(monitor_Bt - monitor_St >= 1000){
    Serial.print("loop_time(ms):");
    Serial.println(Loop_time);
    Serial.print("SPEED(km/h):");
    Serial.println(Speed);
    
    monitor_St = millis();
  }
}

 

millis()ではmsの値がとれるので、/1000して秒、/60して分、/60して時にします。

 

距離を時間で割ると

  sp = 2.11 / loop_time * 3600

となり、速度が求められます。

 

モニターに映す部分は今後表示する値が増えていくので別の関数を作りました。


ついでに1周にかかった時間も表示するようにしました。

 

早速測ってみます。

 

f:id:kanra_6236:20200428134632j:image

 

ホールセンサの前を通過させます。

 


f:id:kanra_6236:20200428134653j:image

f:id:kanra_6236:20200428134649j:image

 


f:id:kanra_6236:20200428134709j:image

f:id:kanra_6236:20200428134712j:image

 

数値が出ます。

 ヤッタネ!

 

とりあえず速度を出すものが出来たので自転車に取り付けてみます。

 

f:id:kanra_6236:20200428132233j:image

 

仮止めでもしっかりしないとホイールにはさまったらえらいことになるから気ぃつけてね。

 

磁石もつけて、値が取れてるか確認。

 

f:id:kanra_6236:20200428134746j:image

 

突貫工事。

 

f:id:kanra_6236:20200428134736j:image

 

漕いでみます。

 


f:id:kanra_6236:20200428134812j:image

f:id:kanra_6236:20200428134809j:image

 

ちゃんと出ますね。

 

f:id:kanra_6236:20200428134824j:image

 

 

 

まあ、今回は簡易サイコンということでここら辺で。

 

次はワット、瞬間パワーウェイトレシオを出します。

 

以上

 

艦楽(⊿Δδ)