エントリー

カテゴリー「電子工作」の検索結果は以下のとおりです。

ページ移動

キャラクタLCD表示用ライブラリ

秋月電子のI2C接続小型キャラクタLCD(AQM1602XA)を利用するための表示用ライブラリを作ることにした

電子負荷の消費電流および電源電圧の表示部を作製しようとしたところ今後も良く使いそう(毎日でないので使い方を忘れてしまうから)なのでライブラリにしておこうと考えた訳である

ライブラリ化する方法と注意点

  • ライブラリはIDEの環境設定で指定したフォルダに新規のライブラリフォルダを作ってファイルを置く
  • 必要ファイルは,XXX.hとXXX.cppとなる(その他は無くても問題なし,.cではダメだった)
  • XXXは同じでなくてはならない
  • 新規のライブラリフォルダ名はXXXでなくても良い

 

AQM1602LCD.h

#define _AQM1602_H_
#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif

#define LCD_ADDR 0x3E

void LCD_clearScreen(void);
void LCD_setLocate(int col, int row);
void LCD_putChar(byte c);
void LCD_putString(byte *str);
void LCD_init3();
void LCD_init5();
#endif /* AQM1602LIB_H */

AQM1602LCD.cpp

// LCD_init3        - LCDの初期化(3.3V)
// LCD_init5        - LCDの初期化(5V)
//
// LCD_clearScreen  - LCDモジュールの画面をクリア
// LCD_setLocate    - LCDモジュール画面内のカーソル位置を移動
// LCD_putChar      - LCDにデータを1バイト出力
// LCD_putString    - LCDに文字列データを出力
//

#include <Wire.h>
#include "AQM1602LCD.h"

// LCDにコマンドを送信
//
static void LCD_writeCommand(byte command) {
    Wire.beginTransmission(LCD_ADDR);    // スタートコンディション
    Wire.write(0x00);                    // control byte の送信(コマンドを指定)
    Wire.write(command);                // command byte の送信
    Wire.endTransmission();                // ストップコンディション
    delay(10);
}

// LCDにデータを送信
//
static void LCD_writeData(byte data) {
    Wire.beginTransmission(LCD_ADDR);    // スタートコンディション
    Wire.write(0x40);                    // control byte の送信(データを指定)
    Wire.write(data);                    // data byte の送信
    Wire.endTransmission();                // ストップコンディション
    delay(1);
}

// LCDの初期化
//
static void LCD_init(int volt) {
    Wire.begin();

    delay(100);
    LCD_writeCommand(0x38); delay(20);        // Function set
    LCD_writeCommand(0x39); delay(20);        // IS=1
    LCD_writeCommand(0x14); delay(20);        // Internal OSC frequency

    if(volt == 3) {
        // 3.3V
        LCD_writeCommand(0x73); delay(20);    // Contrast set
        LCD_writeCommand(0x56); delay(20);    // POWER/ICON/Contrast control
    } else /* if(volt == 5) */ {
        // 5V
        LCD_writeCommand(0x7A); delay(20);    // Contrast set
        LCD_writeCommand(0x52); delay(20);    // POWER/ICON/Contrast control
    }
    LCD_writeCommand(0x6C); delay(20);        // Follower control
    LCD_writeCommand(0x38); delay(20);        // Function set
    LCD_writeCommand(0x01); delay(20);        // Clear Display
    LCD_writeCommand(0x0C); delay(20);        // Display ON
    LCD_writeCommand(0x06); delay(20);        // Entry Mode
}

// LCDの初期化(3.3V)
//
void LCD_init3() {
    LCD_init(3);
}

// LCDの初期化(5V)
//
void LCD_init5() {
    LCD_init(5);
}

// LCDモジュールの画面をクリア
//
void LCD_clearScreen(void) {
    LCD_writeCommand(0x01);                // Clear Display
}

// LCDモジュール画面内のカーソル位置を移動
//    col : 横(列)方向のカーソル位置(0-15)
//    row : 縦(行)方向のカーソル位置(0-1)
//
void LCD_setLocate(int col, int row) {
    static int row_offsets[] = { 0x00, 0x40 } ;
    // Set DDRAM Adddress : 00H-0FH,40H-4FH
    LCD_writeCommand(0x80 | (col + row_offsets[row]));
}

// LCDにデータを1バイト出力
//      c :  出力する文字データを指定
//
void LCD_putChar(byte c) {
    LCD_writeData(c);
}

// LCDに文字列データを出力
//    str :  出力する文字列
//
void LCD_putString(byte *str) {
    while(*str) LCD_writeData(*str++);
}

ライブラリインタフェースはコメントのとおり

ヘッダーファイルの

#include "Arduino.h"

を,忘れがちなので忘れないようにする事

(追加:2017.01.22)

C++に書き換えた

注意点
  • コンストラクタで電圧の指定とかやってみたが上手く動作しないので保留(現状はsetup()を呼び出す仕様)
  • 割込み禁止で使うとハングアップするようだ
  • C版も使用しているので名称を変更

AQMI2CLCD.h

//秋月電子通商 I2C接続小型キャラクタLCDモジュール
//    AQM0802A-RN-GBW(8x2行)
//    AQM0802A-FLW-GBW(8x2行,バックライト付)
//    AQM1602XA-RN-GBW(16x2行)
//
//Sitronix ST7032 CONTROLED
//    電源電圧:2.7~5.5V
//    インターフェース:I2C
//    I2Cアドレス:0x3E
//    I2Cスピード: 最大400kHz
//    使用可能温度:-30~+85℃
//
#ifndef _AQMI2CLCD_H_
#define _AQMI2CLCD_H_
#if ARDUINO >= 100
 #include <Arduino.h>
#else
 #include <WProgram.h>
#endif

#define AQMI2CLCD_ADDR 0x3E

class AQMI2CLCD {
    public:
//        AQMI2CLCD();
        void setup();
        void setup(int);
        void clearScreen(void);
        void setLocate(int, int);
        void putChar(char);
        void putString(char *);
        void putString(int);
};

#endif /* AQMI2CLCD_H */

AQMI2CLCD.cpp

//秋月電子通商 I2C接続小型キャラクタLCDモジュール
//
// コンストラクタ
// void AQMI2CLCD()
//
// void setup
// void setup(int)
//        3        - LCDの初期化(3.3V)
//        5        - LCDの初期化(5V)
// void clearScreen    - LCDモジュールの画面をクリア
// void setLocate    - LCDモジュール画面内のカーソル位置を移動
// void putChar        - LCDにデータを1バイト出力
// void putString    - LCDに文字列データを出力
//
#include <AQMI2CLCD.h>
#include <Wire.h>

//AQMI2CLCD::AQMI2CLCD() {}

// LCDにコマンドを送信
//
static void LCD_writeCommand(byte command) {
    Wire.beginTransmission(AQMI2CLCD_ADDR);    // スタートコンディション
    Wire.write(0x00);                        // control byte の送信(コマンドを指定)
    Wire.write(command);                    // command byte の送信
    Wire.endTransmission();                    // ストップコンディション
    delay(10);
}

// LCDにデータを送信
//
static void LCD_writeData(byte data) {
    Wire.beginTransmission(AQMI2CLCD_ADDR);    // スタートコンディション
    Wire.write(0x40);                        // control byte の送信(データを指定)
    Wire.write(data);                        // data byte の送信
    Wire.endTransmission();                    // ストップコンディション
    delay(1);
}

// LCDの初期化
//
static void LCD_init(int volt) {
    Wire.begin();

    delay(100);
    LCD_writeCommand(0x38); delay(20);        // Function set
    LCD_writeCommand(0x39); delay(20);        // IS=1
    LCD_writeCommand(0x14); delay(20);        // Internal OSC frequency

    if(volt == 3) {
        // 3.3V
        LCD_writeCommand(0x73); delay(20);    // Contrast set
        LCD_writeCommand(0x56); delay(20);    // POWER/ICON/Contrast control
    } else /* if(volt == 5) */ {
        // 5V
        LCD_writeCommand(0x7A); delay(20);    // Contrast set
        LCD_writeCommand(0x52); delay(20);    // POWER/ICON/Contrast control
    }
    LCD_writeCommand(0x6C); delay(20);        // Follower control
    LCD_writeCommand(0x38); delay(20);        // Function set
    LCD_writeCommand(0x01); delay(20);        // Clear Display
    LCD_writeCommand(0x0C); delay(20);        // Display ON
    LCD_writeCommand(0x06); delay(20);        // Entry Mode
}

// LCDセットアップ
//
void AQMI2CLCD::setup() {
    LCD_init(5);
}
void AQMI2CLCD::setup(int volt) {
    LCD_init(volt);
}

// LCDモジュールの画面をクリア
//
void AQMI2CLCD::clearScreen(void) {
    LCD_writeCommand(0x01);                // Clear Display
}

// LCDモジュール画面内のカーソル位置を移動
//    col : 横(列)方向のカーソル位置(0-15)
//    row : 縦(行)方向のカーソル位置(0-1)
//
void AQMI2CLCD::setLocate(int col, int row) {
    static int row_offsets[] = { 0x00, 0x40 } ;
    // Set DDRAM Adddress : 00H-0FH,40H-4FH
    LCD_writeCommand(0x80 | (col + row_offsets[row]));
}

// LCDにデータを1バイト出力
//      c :  出力する文字データを指定
//
void AQMI2CLCD::putChar(char c) {
    LCD_writeData(c);
}

// LCDに文字列データを出力
//    str :  出力する文字列
//
void AQMI2CLCD::putString(char *str) {
    while(*str) LCD_writeData(*str++);
}
void AQMI2CLCD::putString(int n) {
    char bf[16];
    sprintf(bf, "%d\0", n);
    char *str = bf;
    while(*str) LCD_writeData(*str++);
}

予告なく改良

いろんな種類のニッケル水素電池を充電

しばらく何もできなくて,ふと思い出したのがニッケル水素電池の事

カメラやビデオカメラなど専用バッテリーは思い出して定期的に充電しているが,エネループを使い始めてエネループ以外のニッケル水素電池の充電をすっかり忘れるようになってしまった

で,すっかり忘れて放置していた以下の充電池を確認したら電圧が低下していて危ない事になっていた(すべて2個ごとあった)

①秋月で購入したニッケル水素電池パック(3セル:3.6V)

3セル

②コードレス電話の子機用バッテリ(2セル:2.4V)

2セル

③100¥ショップのライトから取り出したバッテリ(1セル:1.2V)

1セル

充電には3.6V用の充電用ACアダプタを利用

充電器

①はブレッドボードに簡単な回路を展開して充電

回路

充電完了はテスターで電圧確認した

テスター

②③は電圧を下げるべきだったが,不良になるのを覚悟のうえ急速充電できるか,そのままやってみた

結果的には放置期間が長すぎた②と③のバッテリ1個が使用不可となる(それぞれ残り1個は問題なし)

定期的に充電するためそれぞれに適応する充電器を作製しておいたほうが良さそう考えてみようってことで検討

  • 良く使うものではないので,まずは単純かつ安上がりで良しとする
  • セル1~3までを対象とし,既に簡易9V用充電器があり9V(セル7)も含まれるものにしたい
  • 将来の改造を見据えインテリジェントとしAVRを使う(拙者はソフト屋ですし)
  • いつものことで完了期限なし

充電完了を電圧を判断する方法とすれば出来そうに思える

電子負荷の修正

改良しようにもケーブルが太すぎて取り回しが困難になりそうなので許容電流7Aのケーブルに付け直した

付け直し

結線済となったシャント抵抗5Ωと0.5Ωの抵抗値を計測(厳密には4端子法で測定する予定)

5Ω

0.5Ω

簡易実験用電源を確認

5Vで800mA位の電源で800mA+の出力になると電圧降下が発生したので正常のようだ

電源1

新しく作製した電源を確認(まだケースは無い)

12Vで1Aの出力が可能であることを確認

電源2

この電源は再度確認する予定

電子負荷の作製

実験用電源の確認をセメント抵抗を使っていたら,情けないことに不意に触って火傷してしまった

そこで簡易ながら電子負荷を作製しておくことにした

前々から作っておこうと考えてはいたので材料はある

ベースは廃材のアルミ放熱版

放熱版1放熱版2

回路は簡易で以下のとおり

回路1

2SJ334(60V30A,Rds29mΩ)× 2

シャント抵抗は0.1Ωとかの方が良いが手持ちがないので1Ωを2つ並列で0.5Ωとして5Wのセメント抵抗で10Wを確保

抵抗

アルミテープで固めて0.3mmのアルミ板で放熱版に固定(規定以上の熱を放出可能かな)

放熱

電圧・電流の測定をArduinoで行うため回路を修正

  • Arduinoからの測定で0Vを統一するためシャント抵抗を移動
  • 複数だと電流補正が必要となるためFETを1個にした

回路2

2SJ554(60V45A,Rds37mΩ)× 1

さくっと完成させたが,ケーブルは太いほうが良いだろうと思い2sqにしたためちょっと収まりが悪くなってしまった

完成

とりあえず確認してみて大丈夫そう(以下は400mAとなる)

試験

改良も考えるため本日はこれで終わり

ページ移動

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/16 from 権限がありません
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/15 from admin
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/14 from 権限がありません
Re:NOAA受信システム復旧
2025/06/11 from admin
Re:NOAA受信システム復旧
2025/06/11 from とおりすがり

過去ログ

Feed