気の向くままに辿るIT/ICT/IoT
IoT・電子工作

Arduinoで『回転計』を作る

ホーム前へ次へ
Arduinoって?

Arduinoで『回転計』を作る

Arduinoで『回転計』を作る

2019/04/04

 Tachometer using Arduinoが良さ気です。

 リンク先に沿ってI2Cモジュール付きではあるものの、LCD 1602も加えましたが、(自身が書いた)このページで使った機器類(Arduino Uno/Nanoとトラッキングラインセンサーなど)そのままで測定できました。

 久しぶりにデフォルトのLiquidCrystalではなく、LiquidCrystal_I2Cライブラリを使うべく、以前、Arduino製距離計の時使ったjm_LiquidCrystal_I2Cの仕様が変わったようで追加で2つほどヘッダファイルをダウンロードしてこなくてはならず、いざやってみたら、ちょっとハマり、ライブラリ管理で探すとLiquidCrystalのI2C系ライブラリが複数存在、いくつか試した結果、今回は、LiquidCrystal_PCF8574をArduino IDEのライブラリ管理からインストールしました。

 このライブラリは、LiquidCrystal_PCF8574.hをインクルード、LiquidCrystal_PCF8574 lcd(0x27);/LiquidCrystal_PCF8574 lcd(0x3F);のように表示文字数や行数指定は不要で識別子のみでOK、また、そのままだとバックライトが点かないので点けるためには、lcd.setBacklight(HIGH);行が必要でした。

 ちなみにライブラリを眺めているとlcd.setBacklight(0);/lcd.setBacklight(255);などとありますが、他の値でコントラストが大きく変わるわけではなさげなのでLOW/HIGHで十分な気がします。

 ただ、リンク先のコメントにもあるも返答はないのですが、二重ループになっているところの[1227]という値の出処?は謎です。

 また、リンク先にある動画の初期画面では、Pro Miniを使っているように見えましたが、MegaやDueとかの小さいボードだったのかスケッチには、sensor用に18ピンを使っていますが、自身は、Arduino UnoとNano(SDA/SCLはUno系ボードではA4/A5で代用可)で試したため、センサ用に9ピン、計測開始ボタン用に10ピンを使いました。

 そもそも、なぜ、これで良いのか、イマイチぴんとは来ていませんが、130型、140型モーターで安定化電源により与える電圧で速度を変えながら試すと、それなりの値が結果としてかえってきました。

 ただし、究明はしていないですが、速度を変えた直後の計測値については、前の値を引き継いでいるように見受けられる気がするので読み飛ばす必要はありそうです。

2019/02/15

 今更ながら、このページの内容は、もしや、不正確ではないか...という思いに駆られた...ので参照しない方がよいかも。

 今まで閲覧頂いた方々、誠に申し訳ありません...。

 再検証予定については未定...。

2017/11/19

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

 ここでは、入力電圧1.5〜3V 140型(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円、あとはモータと電池ボックス代といったところでしょうか。

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とライントレースモジュールによる回転計回路ブレッドボード版

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

ホーム前へ次へ