気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
IoT・電子工作

Arduinoで『回転計』を作る

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Arduinoって?

Arduinoで『回転計』を作る

Arduinoで『回転計』を作る

2017/11/19

 Arduinoを使って『回転計』を作るページ。

 ここでは、入力電圧1.5〜3V 140型、その他詳細不明なDCモータの回転数(rpm)をArduinoボードとフォトリフレクタ(反射型の光センサ)を使ってArduino IDEのシリアルモニタ上に表示させるものとする。

Arduino回転計で計測

Arduinoとライントレースモジュールによる回転計回路(停止時)

 今回、Arduinoボードには、Nanoを、光センサには、37センサーキットに入っていてフォトリフレクタを搭載したトラッキング・ライントレースモジュールを、トレース用にホールケーキのように8等分(任意)した丸く切り抜いた(白に近い)厚紙の領域の内1つを黒く塗りつぶしたものを使用した。

 ちなみにモータを固定している黄色い土台は、100均で買ったミニバイス、あまり期待していなかったのだが、かなり役立っている(とはいえ、軽すぎてモータを回すと振動で動いてしまうこともあるが)。

Arduinoとライントレースモジュールによる回転計回路(動作時)

 後述の通り、見た目にわかりやすいようにライントレースモジュールの出力を利用して検知時にLEDが点灯する(ある程度の回転なら点滅してみえる)ようにしてみた。

 円盤は、厚紙の中心に適度な穴を空け、単にモータシャフトに挿してあるだけであるため、モータはできる限り水平を維持する必要がある。

 あらゆる軸径や軸形状でも使えるような汎用性をもたせた上、できれば簡単に固定できるようにしたいところだが、いまのところ妙案が浮かばない。

 簡単にモータを水平に維持しつつ、円盤も固定させることができれば、光センサは、反射型のフォトリフレクタに限らず、透過型のフォトインタラプタというチョイスもできる。

Arduino IDEのシリアルモニタに計測した回転数を表示

 さて、使用済みの単3アルカリ乾電池2本(残量4.7V程度)を使った際のシリアルモニタ表示結果がこれ。

 5300〜5400rpm程度で推移しているのが見て取れる。

 残量1.2V程度の単3アルカリ乾電池1本だと3200rpm前後だった。

 仕様書はない代物だが、140型相当のモータらしいので、相応に思える結果となった(ことを以て、ある程度正しく計測できていると判断した)。

 Nano 370円、ブレッドボードとミニバイス、単3アルカリ乾電池4本が108円、2000円で買った37センサーキットにあったライントレースモジュールを70円前後、それ以外を約20円として約784円、あとはモータと電池ボックス代といったところか。

KKHMF Arduino Nano Ver 3.0互換ボード ATmega328P CH340G 5V 16MHz

HiLetgo 37センサーモジュールアソートキット/Arduino開発スターターキット

Rasbee 400穴 ブレッドボード 8.5*5.5cm 1個

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 5個セット

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 10個セット

Rasbee SY-170 ミニブレッドボード カラフルブレッドボード 5個

HiLetgo 金属皮膜抵抗 1/4W 41種類x20=820個

HiLetgo ジャンパーワイヤー(オス-オス) 20cmx40本 5セット

Rasbee ジャンパーワイヤー(オス-オス) 各種長さx65本

Arduino回転計の回路とスケッチ

 回転数を求める方法には、いくつかあるものと思われるが、少なくともArduinoのスケッチとしては、意外にも再現できそうな情報が少ない気がする中、MsTimer2を使ったフォトリフレクタで回転計を参照させて頂いた。

 ただ、そのままだと機能させることができなかったため、一部、スケッチを編集した(が、正直これで正しいのかは自信がないが、それっぽい結果が出たため、よしとした)。

#include <MsTimer2.h>
 
int sensorPin = A0;
unsigned long start_time = 0;
unsigned long elapsed_time = 0;
unsigned long tet = 0;
float rpm = 0;
unsigned int cnt = 0;
 
void setup() {
  Serial.begin(9600);
  MsTimer2::set(1000, avg);
  MsTimer2::start();
}
 
void loop() {
  while (analogRead(sensorPin) > 18){
    noInterrupts();
    elapsed_time = micros() - start_time;
    tet += elapsed_time;
    cnt++;
    interrupts();
  }
  start_time = micros();
 
}
 
void avg(){
  if(cnt != 0 ){
//    rpm = ((float)60000000 / (tet / cnt));
    rpm = ((float)60000000 / (tet / cnt) / 8);
    Serial.println(rpm);
  }
  cnt = 0;
  tet = 0;
}

 編集箇所は、loop()内の処理内容のないwhile文2つを削除、残りのコードの内、[start_time = micros();]以外の行を新たに追加した実際のアナログ値が[18]より大きい場合にループするwhile文に入れた。

 この[18]は、検証時、なぜか、計測していない時にシリアルモニタに17〜18の値が表示されたため。

 また、トレース用に使う丸い厚紙は8つに仕切ったため、micros()でマイクロ秒(1,000,000マイクロ秒=1秒)として1,000,000倍して1秒、1分間あたりの回転数であるrpm用にこれを60倍、これを検知継続時間を検知回数で除した1回あたりの検知時間で除している行において、更に8で除した(割った)。

 計測時間は1/8の領域の経過時間だから、1周回った場合、8倍かかるからだが、丸をかたどるにはスプレー缶、ジュース缶、ビニールテープやセロテープ、ガムテープなどいくらでも手近のありもので適当にやってもほぼ正確にできるが、今回、領域分割については、見た目に差がわかるほど雑に行ったため、誤差が出ること必至。

 等分してあるため、円周上にあって対面させれば、フォトリフレクタ(発光するLED、受光するフォトトランジスタ)の計測位置は基本どこでもよい(が、マーキーマジック細で書いた1本線など、あまり領域が細いと検知しきれなかったため、良きに計らう、はやり言葉で言えば忖度する?必要はある)。

 尚、検証では、フォトリフレクタの出力(OUT)をA0と抵抗+LEDにつなぎ、回転検出時にはブレッドボード上のLEDが点灯するようにしてみた。

 今回、電圧計の時と同様にLCDに出力しようと試みたが、MsTimer2の仕組みでは、無理そうなので、これが必要なら他の方法を検討した方がよさ気。

 前述の通り、汎用性、水平維持、円盤の固定、更にLCD搭載ができれば、実用的な試作・完成品として常備することもできるだろう。

Arduinoとライントレースモジュールによる回転計回路ブレッドボード版

 とりあえず、ブレッドボード上だけでもと思い、スッキリさせてみた。