Arduinoを使ったタコメーターにI2C LCDを接続しサーボモーターの回転速度を表示しました

どのように作るの?

  • 連続回転サーボモーター(SG90-HV)の回転数を計測するために、シンプルな構成のタコメータを作り、計測結果をArduino IDEのシリアルモニタに出力する記事をまとめました。また、I2C LCDに文字や画像を表示する方法も記事にまとめました。タコメーターにI2C LCDを取り付けてPCと接続しなくても測定結果を表示・確認できる機能を追加します。
ArduinoでI2C LCDに文字や図形を表示させた記事は?
I2C LCDのケースを作ります
  • 購入したI2C LCDは、半田面は部品がむき出しで、部品面はFPCに手が触れるので、このままでは使用中に部品ショートや断線による不具合が発生するかもしれません。取り付ける前に3Dプリンタで作成したケースで保護します。(これはオプションです。ケースが無くても動作します。)
I2C LCDとフォトセンサPCBでシールドを作ります
  • Arduino UNO R3シールド用のPCBにLCDと反射型フォトセンサ用のヘッダーを取り付けます。シールドにすることで測定毎に配線する煩わしさがなくなります。(これはオプションです。ブレッドボードでも動作します。)
回転速度をLCDに表示するスケッチを作成します
  • サーボモータの回転数を測定するスケッチと、I2C LCDで文字・画像を表示させるスケッチを合体して、回転速度をI2C LCDに表示するスケッチを作成します。

I2C LCDのケースを作ります

  • 購入したI2C LCDは、半田面は部品がむき出しで、部品面はFPCに手が触れるので、このままでは使用中に部品ショートや断線による不具合が発生するかもしれません。I2C LCDを覆う保護カバーを作成して、外部からの接触を減らします。
  • 保護カバーをFreeCADで設計して3Dプリンタで作成しました。
  • 作成した部品はバリや、上手く入らない箇所をやすりで削って勘合させています。保護カバーの上下は接着剤を使って固定しました。部品が小さいので、「パッチン止め」の部品は作成できませんでした。

I2C LCDとフォトセンサPCBを接続するシールドを作ります

  • Arduino UNO R3のシールド作成用のPCBを準備します。
  • I2C LCDを組み込んだケースと、測定用PCBへの接続用のピンヘッダをシールド用PCBに取り付けます。
  • 測定用PCBからの信号出力をArduino UNO R3の割り込み測定用のピンヘッダに接続して回転速度を測定します。アナログ測定用のピンヘッダは、回転速度が測定できない時に測定用のPCBからの信号出力を接続し測定波形が出力されているかどうかを確認するために使います。
関連する商品・製品は?

回転速度をLCDに表示するスケッチを作成します

  • 回転速度を測定するスケッチとI2C LCDに文字や図形を表示するスケッチを学習しました。両方の機能を含んだスケッチを作成します。
  • 回転速度(RPM)の測定結果をI2C LCDに表示させます。LCDは128×64の画素数があります。回転速度(RPM)の表示だけでは画面が寂しいので、それらしいタイトルなど含んだ画面構成を考えます。
// Tachometerで計測した回転数をI2C LCDに表示する

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

float rev=0;
unsigned long rpm;
unsigned long oldtime=0;        
unsigned long time;

void isr()          //interrupt service routine
{
  rev++;
}

void setup() {
  Serial.begin(9600);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  //割込みポートの設定
  digitalWrite(2 ,HIGH);// Instead of using a pull up resistor
  attachInterrupt(0,isr,RISING);  //attaching the interrupt

  //I2C LCD 背景の描画
  display.clearDisplay();
  drawback();
  display.display(); 
}

void drawback(){

  //I2C LCD に背景を描画する
  display.setTextSize(1); // Draw 1X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(F("Mini TachoMeter"));
  
  display.drawRect(1, 12, 125, 24, SSD1306_WHITE);

  display.setTextSize(2); // Draw 2X-scale text
  display.setCursor(80, 17);
  display.println(F("RPM"));
  
  display.setTextSize(1); // Draw 1X-scale text
  display.setCursor(0, 40);
  display.println(F("Test Duration"));

  display.setTextSize(1); // Draw 1X-scale text
  display.setCursor(40, 52);
  display.println(F("second"));

  display.setTextSize(1); // Draw 1X-scale text
  display.setCursor(15, 52);
  display.println("30");  

  display.drawLine(0, 63, 78, 63, SSD1306_WHITE);   
}

void loop()
{
  //割込みを使って回転速度を測定する
  delay(30000);               // 30 second delay
  detachInterrupt(0);         //detaches the interrupt while calculating
  time=millis()-oldtime;      //finds the time 
  rpm=(rev/time)*60000;       //calculates rpm
  rev=0;

  //I2C LCDの表示を消し-背景と測定した回転速度を書き込み表示する
  display.clearDisplay();
  drawback();
  display.setTextSize(2); // Draw 2X-scale text
  display.setCursor(20, 17);
  display.println(rpm);  
  display.display(); 

  //現在時間の取得と割込みの再開
  oldtime=millis();           //saves the current time 
  attachInterrupt(0,isr,RISING);
}

作成したタコメータの構成は?

  • 作成したLCDシールドに反射型フォトセンサのPCBをワイヤで配線します。
  • 今回作成した簡易タコメーターは回転速度を測定する反射型フォトセンサのPCBとシールドPCBを分離しています。シールドPCBにI2C LCDを追加し測定値をPC無しで確認できるようになりました。
  • 測定対象によっては、反射型フォトセンサの回路をシールド基板に直接接続すれば携帯性のある構成になります。

ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。