Arduino IDEの使い方【OLEDを使ってみよう】

OLED 128×64 i2c通信(SPI通信じゃない)を使ってみよう。電源はUSBからの供給でArduinoのマイコンボードはNanoですがUnoとかでもOKです?。

作ろうと言っても二輪・四輪以外世間知らずのお馬鹿さんだからそれに絡む物しか思い浮かばずでごめんなちゃ~い?。

注意:OLEDの電源部の±極が逆になっている物があるので状態に合わせて配線してください?✋またこのOLEDはコントラストが高く綺麗なんですが、明度が高くないので昼間の直射日光などを当てると全然が見えないです?二輪などには不向です?。

Arduinoの外部ライブラリには[ u8glib ]というOLED画面を単純に制御できてしまうライブラリが存在しますこれは本当に強い見方です。

以前AVR STUDIO4でOLED( チップSSD1306 )の制御プログラムを一から作ってオートクルーズのOLEDを動かしていたので[ u8glib ]を使用したOLED制御があまりに楽すぎてびっくりした??。

まずはu8glibを使うためにライブラリをインストールします☺。

赤点枠部からZIP形式のライブラリをインストールをクリック?。

ライブラリマネージャが立ち上がるので[ u8glib ]と入力しエンターキーを押してライブラリリストを表示。そうすると一覧の何処かに[ u8glib ]があるのでそのリストのインストールボタンをクリックするだけ??。これでu8glibを使用できる準備ができました?。

U8glibの使い方はこちらとフォント系はこちらに詳しく載っています?。

OLED128x64(チップSSD1306)I2Cを使用する場合、スケッチに以下のコードを書き込めばu8glibの関数が使えるようになるです?✍。

#include “U8glib.h"。
U8GLIB_SSD1306_128X64 u8g( U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST );

実際のプログラムコードはこんな感じでシンプルです。

/* -------------------------------------------------- */ 
 * Engine Tacho Meter 128x64 OLED Test Program        *
 * -------------------------------------------------- *
 * CPU: Arduino NANO V3 CPU Board                     *
 * File Name: ???                                     *
 * Author: MarchKun                                   *
 * Created: 2017/11/06                                *
 * URL: http://super-evolution.com/                   *
/ --------------------------------------------------- */
#include "U8glib.h" // u8glibをインクルード(追加)
U8GLIB_SSD1306_128X64 u8g( U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST );

/* ----------------------------------------- *
 * Define                                    *
 * ----------------------------------------- */
#define MAXEGRPM (12000.0f)
#define MAXANGLE (180.0f)
#define ANGLESTEP (MAXANGLE/MAXEGRPM)

/* ----------------------------------------- *
 * Variable                                  *
 * ----------------------------------------- */
volatile char g_buffer[ 20 ];
char *charbuf = (char *)&g_buffer;
volatile float deg=0.0f, rad = 0.0f;
volatile unsigned int EgRpm = 0;

/* ------------------------------------------------------ *
 * Program Codes                                          *
 * ------------------------------------------------------ */

/* ----------------------------------------- *
 * Cpu Init Program                          *
 * ----------------------------------------- */
void setup( )
{
  // OLED画面のドット色(ドットを白出力)設定
  u8g.setColorIndex( 1 );
  return;
}

/* ----------------------------------------- *
 * Main Loop Program                         *
 * ----------------------------------------- */
void loop( )
{
  // EgRpmシュミレーション
  if( EgRpm >= 12000 ){ EgRpm = 0; }
  else{ EgRpm += 50; }

  // EpRpmをASCII文字に変換
  sprintf( charbuf, "%5d", EgRpm );
  // EgRpmをメーター針の角度に変換
  deg = (float)ANGLESTEP * (float)EgRpm;
  if( MAXANGLE < deg ){ deg = MAXANGLE; } rad = deg / (180.0f / PI); // OLED Control Program
  u8g.firstPage( );
  do {
    // フォント設定
    u8g.setFont( u8g_font_7x13B ); // エンジン回転数が7000rpm以上の場合
    if( EgRpm > 7000 ){
      // 色埋め枠を出力
      u8g.drawRBox( 1, 0, 25, 15, 4 );
      // OLED画面のドット色(ドットを黒出力)設定
      u8g.setColorIndex( 0 );
      // Power BandのPow文字を出力
      u8g.drawStr( 4, 12, "Pow" );
    }

    // エンジン回転数が11000rpm以上の場合
    if( EgRpm > 11000 ){
      // OLED画面のドット色(ドットを白出力)設定
      u8g.setColorIndex( 1 );
      // 色埋め枠を出力
      u8g.drawRBox( 103, 0, 25, 15, 4 );
      // OLED画面のドット色(ドットを黒出力)設定
      u8g.setColorIndex( 0 );
      // RevlimitのRev文字を出力
      u8g.drawStr( 106, 12, "Rev" );
    }

    // OLED画面のドット色(ドットを白出力)設定
    u8g.setColorIndex( 1 );
    // メーター枠(半円形)を出力
    u8g.drawCircle( 64, 50, 50, U8G_DRAW_UPPER_RIGHT );
    u8g.drawCircle( 64, 50, 50, U8G_DRAW_UPPER_LEFT );
    // メーター針の中心部を出力
    u8g.drawFilledEllipse( 64, 50, 8, 8, U8G_DRAW_UPPER_RIGHT );
    u8g.drawFilledEllipse( 64, 50, 8, 8, U8G_DRAW_UPPER_LEFT );
    // メーターの数字を出力
    u8g.drawStr( 18, 52, "0" );
    u8g.drawStr( 30, 27, "3" );
    u8g.drawStr( 60, 14, "6" );
    u8g.drawStr( 91, 27, "9" );
    u8g.drawStr( 97, 52, "12" );
    u8g.drawStr( 54, 37, "rpm" );
    // メーター針を描く
    u8g.drawLine( 64, 50, 64.0f-(42.0f * cos(rad)), 50.0f-(42.0f * sin(rad)) );

    // フォント設定(少し文字が大きい)
    u8g.setFont( u8g_font_9x15B );
    // Tochoを出力
    u8g.drawStr( 2, 64, "Tacho" );
    // rpmを出力
    u8g.drawStr(101, 64, "rpm" );
    // EgPpm文字を出力
    u8g.drawStr( 56, 64, charbuf );
  } while( u8g.nextPage( ) );
}

上記スケッチを書き込んだ雰囲気は以下動画です(大きな音がでるので注意です)。

単純なプログラムコードでOLEDを動かせるなんて豊富なライブラリのおかげだね?ライブラリ製作者に感謝感謝ですm(_ _)m。

後は点火入力回路を作り、タイマー1のインプットキャプチャを利用して点火信号隙間を測定し、エンジン回転数に変換するプログラムを作れば、実際のタコメータとして使えるようになりまっちゅ?✋。

記事を最後までみてくださってありがとうございました~(@⌒ο⌒@)b。