エントリー

ESP8266開発ボードを作る

次回に「ESP-WROOM-02」を使おうとした時に,また回路図など探してブレッドボードに展開するのが面倒なので,偉そうなものではないが開発ボードを作っておくことにした

必要な仕様
  • プログラム書込みボタンとリセットボタン
  • 3.3V電源(USB電源から降圧させる)
  • 3.3ロジックのUSBシリアル変換
  • ESP-WROOM-02は取り外し可能(こうしないと意味がない)
  • LEDをIO15に接続(動作確認用)
準備

USBシリアル変換はaitendoのUSB-TTL変換キットを使う(既に制作済の物)

USB

このUSB-TTL変換キットは5Vロジックなので3.3Vロジックにする

CH340Gの仕様などを参照して3.3VをVCCに入れれば3.3Vとして動作するのを確認

パターンを見てみるとVCCに入るUSB5Vの部分をカットして3.3Vの3端子レギュレーターを経由しVCCに入れれば良さそう

パターン

他にカットできそうな場所が無かったのでココにしたが,削ったパターンのカスがUSBコネクタとの間に入り+-がショートするといった問題が起きて嵌った

パターンカット

入念に掃除して解決

ボードに実装

今回はブレッドボード基板を使ってみた

基板1

ミニブレッドボードを載せるためのスペースを作るため両端の空きに寄せて配置

基板

黒:リセットボタン

白:プログラム書込みボタン(押しながらリセットするとプログラム書込みモードとなる)

SWやLEDを配置するためパターンのカットも行った

基板裏

3端子レギュレーター(NJM2845DL1-33 3.3V800mA)は裏に配置

開発中

SDカードスロットを取り付けてプログラム開発中(AVR用のプログラムはCSの変更のみで動作した)

開発中

NTPで日時を取得できるのでタイムスタンプが使えそうだ

ロギング装置の作製とESP8266のセットアップ

ロギング装置の構想は前々からあるのだがロギングするようなシステム作ってないので着手しなかった

ところが今回作製した放電器はロギングの必要性が高いと感じログ装置を作製することにする

どう実現するか,基本スタンドアロンでのロギングするとして,装置毎(例えば放電器)にSDカード等を実装して保存する内蔵型か,UART通信などを経由してので外付け型となる

外付け型ならSDカード保存の他にフラッシュメモリー保存や無線通信にてクラウド保存も可能だし融通がききそう

そこで楽しめそうな外付け型でSDカードへのロギングをやってみることにした

SDログ

この装置は前にも似たような物を作製したことあるのでさくっと実験版は完成

SDカードは3.3Vロジックのため3.3V版Arduino(AVR)を利用したほうが回路が楽になる

外付けなのでプロトコルが必要となるが通信は無手順,ログの記録として開始と終了のみ決めた

 開始:@Begin

 終了:@End

ログ装置側のプログラム(簡単すぎだけど公開)

//    Serial Logging To SD Card
//
//    シリアル出力のロギングをSDカードに書き込む
//    シリアル:9600bps
//    SD:ファイル名は連番(Ex.log.1xxxx.txt)
//    プロトコル
//        @Begin. - @End.間をSDに書き込む
//    Ex.
//        @Begin.
//        ;Constant current : 500mA
//        ;End voltage : 1000mV
//        0, 1237, 0, 0
//        1, 1237, 499, 8
//        2, 1226, 501, 16
//        131, 1051, 499, 1088
//        @End.
//
#include <EEPROM.h>
#include <SPI.h>
#include <SD.h>

// SD card attached to SPI bus as follows:
// * MOSI - pin 11
// * MISO - pin 12
// * CLK  - pin 13
// * CS   - pin 10
// ※CS pinは使用しているシールドで変更する必要がある
//        イーサーネットシールドは 4
//        Adafruit のSDシールドは 10
//        Sparkfun のSDシールドは 8
//
//#define DEBUG        1

#define CSPIN        10                  //チップセレクト
#define LEDPIN        8                  //状態表示LED
#define BLINKTIME    1000                //点滅間隔

static char strBegin[] = { '@', 'B', 'e', 'g', 'i', 'n', '.', '\r', '\n', '\0' };
static char strEnd[] = { '@', 'E', 'n', 'd', '.', '\r', '\n', '\0' };

static uint16_t year = 2017;
static uint8_t month = 1, day = 1, hour = 19, minute = 0, second = 0;

static char fileName[16];                //ログファイル名

static boolean sd = false;               //SD書込み開始フラグ
static boolean light;                    //LED点灯フラグ
static int timer;                        //LED点滅時間カウンタ

static int getByte() {
    for(;;) {
        timer++;
        if(Serial.available()) {
            return(Serial.read());
        }
        delay(1);
        if(timer > BLINKTIME) {
            timer = 0;
            if(sd) {
                if(light) {
                    digitalWrite(LEDPIN, LOW);
                    light = false;
                } else {
                    digitalWrite(LEDPIN, HIGH);
                    light = true;
                }
            }
        }
    }
}

void dateTime(uint16_t *date, uint16_t *time) {
    // FAT_DATEマクロでフィールドを埋めて日付を返す
    *date = FAT_DATE(year, month, day);
    // FAT_TIMEマクロでフィールドを埋めて時間を返す
    *time = FAT_TIME(hour, minute, second);
}

static void makeFileName() {
    int fileNum = (EEPROM.read(0)<<8) + EEPROM.read(1);
    if(fileNum < 10000) fileNum = 10001;
    sprintf(fileName, "log%5d.txt", fileNum);
    //次のファイル番号
    fileNum++;
    EEPROM.write(0, fileNum>>8);
    EEPROM.write(1, fileNum&0xff);
}

void setup() {
    Serial.begin(9600);                    // 9600bpsでポートを開く
#ifdef DEBUG
//    Serial.println("Start");
#endif
    //SSピンは使用しない場合でも出力にしないとSDライブラリが動作しない
    //pinMode(SS, OUTPUT);
   
    //SDライブラリの初期化
    if(!SD.begin(CSPIN)) {
        Serial.println("SD Card failed");
        for(;;);
    }   
    //日付と時刻を返す関数を登録
    //登録することでファイルの作成日時や変更日時が記録できる
    SdFile::dateTimeCallback(&dateTime);

    //初期化正常で開始
    pinMode(LEDPIN, OUTPUT);
    digitalWrite(LEDPIN, HIGH);            //点灯
    light = true;
    sd = false;
    timer = 0;
}

void loop() {
    char c, buf[128];
    int n = 0;
    File dataFile;

    for(;;) {
        c = getByte();
        buf[n++] = c;
        if(c == '\n') {
            buf[n] = '\0';
            n = 0;
#ifdef DEBUG
//            Serial.print(buf);
#endif
            if(!sd) {
                if(!strcmp(buf, strBegin)) {
                    //sd write start
                    makeFileName();
                    if(dataFile = SD.open(fileName, FILE_WRITE)) {
                        sd = true;
#ifdef DEBUG
                        Serial.println("logging start");
#endif
                    } else {
                        //ファイルが開けなかったらエラーを出力
                        Serial.print("can not open ");
                        Serial.println(fileName);
                    }
                }
#ifdef DEBUG
                else {
                    //ignore string
                    Serial.print("ignore : ");
                    Serial.print(buf);
                }
#endif
            } else {
                if(!strcmp(buf, strEnd)) {
                    //sd write done
                    dataFile.close();
                    sd = false;
#ifdef DEBUG
                    Serial.println("logging done");
#endif
                } else {
                    //sd writting
                    dataFile.print(buf);
#ifdef DEBUG
                    Serial.print("sd wrt : ");
                    Serial.print(buf);
#endif
                }
            }
        }
    }
}

ログ装置側が動作してるかどうか判るようにLEDで通知(点灯:Reday,点滅:Logging)するようにした

・・・

さてボードに組み込もうかと思ったところで,どうせならってことで・・・

ESP-WROOM-02

いつか使おうと思いながら購入して置きっぱなしだった「ESP-WROOM-02」を取り出す(世間では「ESP-WROOM-32」が旬みたいだけど・・・)

いつもお世話になってるこちらを参考にしてブレッドボードに展開

ブレッドボード

ATコマンドで動作確認して(115200bps8N1,行末:CR+LF)

AT1

AT2

開発環境を整え(参考

IDE

プログラムを書き込み動作させることができた

注意点や嵌った事など

デフォルトでは「softAP」モードになっていて先ずは「station」モードに変更しないとWiFiが使えない(AT+CWMODE=1)

cc版でないとESPは扱えないのでダウンロードしてarduino.1.8.1を設定(和解統合されてIDEはorg版オンリーになったようだが),拙者はcc版だと何故か問題があったためorgを使っていたので,これまでのローカル設定が全部使えてない

尚,分裂時のorg版とは共存できるようなので良かった

ボード選択設定(追加)

ボード Generic ESP8266 Module
Flash Mode QIO
Flash Frequency 40MHz
CPU Frequency 80MHz
Flash Size 4M(3M SPIFFS)
Debug port Disabled
Debug Level なし
Reset Method 手動SWなら「ck」,自動の場合(スイッチサイエンスの開発ボードなら)「nodemcu」
Upload Speed 115200
シリアルポート シリアルポート番号

放電器の作製(その4)

アルミのアングルを2枚増やして放熱版を改良(大して発熱なかったので手抜きしたのがミス)

これで1A以上の放電でも放熱できるようになったようだ

そこで長期放置(3カ月以上半年未満位)の充電池を放電処理した(尚,管理者は年1回は長期放置の充電池をまとめて再充電している)

放電は定電圧放電1.0V,終止電流250mAで行う

VOLCANO

VOLCANO(単4形,750mAh)

VOLCANO

管理番号 内部抵抗(mΩ) 放電容量(mAh) 備考
188 595 ¥100 NiMH
146 610 ¥100 NiMH
208 602 ¥100 NiMH
146 615 ¥100 NiMH
146 590 ¥100 NiMH
208 578 ¥100 NiMH
210 148 ¥100 NiMH
eneloop(単4形,Min.750mAh)

eneloop

管理番号 内部抵抗(mΩ) 放電容量(mAh) 備考
159 604 HR-4UTGA
139 677 HR-4UTGB
199 601 HR-4UTGA
Ni-MH700(単4形,650mAh,min.600mAh)

Ni-MH700

管理番号 内部抵抗(mΩ) 放電容量(mAh) 備考
140 426 旧新品
100 331 旧新品
STAMINA(Cyber-shot用 単4形,min.740mAh)

STAMINA

管理番号 内部抵抗(mΩ) 放電容量(mAh) 備考
632 513 旧新品

 

全てにおいて放電容量が公称値より少ないのでオペアンプの倍率の調整ミスかプログラムの計算ミスかと思ってシャント抵抗の電圧を計測してみたが問題ないようだ

放電器の作製(その3)

充電部をブレッドボードに統合して確認しようと充電回路を試用確認したブレッドボードを見たら・・・

充電部1充電部2

焼けていた・・・ので,ブレッドボードへの展開は止めてユニバーサル基板へ載せることにした

C基板(秋月サイズ)では無理そうだったので,(2階建ても考えたが)B基板にしてみたらスペース余ったので電池ボックスも入った(スタンドアロンでロギングのためのSDカード設置もできそう)

基板1基板2

ちなみに裏は

基板3

とりあえず確実なエネループ(単三)で確認

エネループ

内部抵抗は115mΩ

内部抵抗

1000mA電流,1.0V未満で終了にして放電する

放電1放電2

放電容量は1560mAhとなったが,まだ余力はあるようだ

(ブレッドボードから基板に載せて判った事)

  • 同PWM値で流れる電流が増えた(接触抵抗が減ったのか)
  • 放電用トランジスタの発熱が多い

 

ロギング出力(定電流放電500mA,終止電圧1.0V)をOpenOfficeでグラフ化(上記の充電池のログではない)

ユーティリティ

検索

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

新着コメント

Re:NOAA受信システム復旧
2025/06/11 from admin
Re:NOAA受信システム復旧
2025/06/11 from とおりすがり
Re:SDRplay社RSP1クローンを購入
2025/05/25 from 匿名希望
Re:Mozilla FirefoxではNHKプラスを再生できない件
2025/05/09 from Donabeyaki
Re:ATS-25を作製する
2025/03/23 from kazu

過去ログ

Feed