sparkfun Pro Micro の情報
- 2017/11/02 21:52
- カテゴリー:Arduino・AVR, 電子工作
日々の生活を好き勝手につづったブログ(なので,あまり役にはたたないかと・・・)
カテゴリー「Arduino・AVR」の検索結果は以下のとおりです。
開発ボードでSD版が完成したので基板に載せた
(写真のようにESP-WROOM-02を置いたが上下逆に付けるようにすればコンパクトになるなと完成した後に気が付く)
正式なマイクロSDカードスロットはブレッドボートで開発用にとして利用したいのでマイクロSDカードアダプタにピンを付けて(余り物を)利用してみた
両端は未使用なので7ピンのみ取付,なかなか良い感じ
ピンの接続情報を記録しておく(上がスロット,下がアダプタの場合)
放電器と高さを合わせ(合体)接続できるようにしたが,放電器の電源アダプタが左側で電源が接続できなくなり取り外して付け替えるのも大変なので電源アダプタを右側にも付け,ついでに入力が直5Vなので安全のため5.1Vのツェナーダイオードを追加
テスト実施のログ出力(SDカード)
;Constant voltage : 1000mV
;End current : 100mA
0, 991, 325, 0
1, 1003, 311, 5
2, 1002, 310, 10
3, 997, 314, 15
4, 997, 314, 20
5, 996, 316, 26
6, 995, 318, 31
7, 995, 322, 36
8, 997, 323, 42
9, 1000, 326, 47
10, 1000, 332, 53
11, 1004, 334, 58
12, 1000, 344, 64
(略)
291, 999, 84, 1595
292, 998, 83, 1596
293, 997, 82, 1597
グラフ化すると
青線:放電流値(mA)
赤線:累積電力(mAh)
上記の試験サンプルは劣化している充電池のため大きな電流を流せていない
このボードではIoT化しないと効果を発揮しないのでWebとの連携仕様を考える
基本仕様として当初はロギング装置を汎用化と考えていたが,別物を作製することも早々無いしその都度プログラムを変えるのも趣味の世界はありなので,放電器専用のロギング装置として構築することにする
ログの数値表とグラフを表示する位までは構築していこうと思う(気長に・・・)
次回に「ESP-WROOM-02」を使おうとした時に,また回路図など探してブレッドボードに展開するのが面倒なので,偉そうなものではないが開発ボードを作っておくことにした
USBシリアル変換はaitendoのUSB-TTL変換キットを使う(既に制作済の物)
このUSB-TTL変換キットは5Vロジックなので3.3Vロジックにする
CH340Gの仕様などを参照して3.3VをVCCに入れれば3.3Vとして動作するのを確認
パターンを見てみるとVCCに入るUSB5Vの部分をカットして3.3Vの3端子レギュレーターを経由しVCCに入れれば良さそう
他にカットできそうな場所が無かったのでココにしたが,削ったパターンのカスがUSBコネクタとの間に入り+-がショートするといった問題が起きて嵌った
入念に掃除して解決
今回はブレッドボード基板を使ってみた
ミニブレッドボードを載せるためのスペースを作るため両端の空きに寄せて配置
黒:リセットボタン
白:プログラム書込みボタン(押しながらリセットするとプログラム書込みモードとなる)
SWやLEDを配置するためパターンのカットも行った
3端子レギュレーター(NJM2845DL1-33 3.3V800mA)は裏に配置
SDカードスロットを取り付けてプログラム開発中(AVR用のプログラムはCSの変更のみで動作した)
NTPで日時を取得できるのでタイムスタンプが使えそうだ
ロギング装置の構想は前々からあるのだがロギングするようなシステム作ってないので着手しなかった
ところが今回作製した放電器はロギングの必要性が高いと感じログ装置を作製することにする
どう実現するか,基本スタンドアロンでのロギングするとして,装置毎(例えば放電器)にSDカード等を実装して保存する内蔵型か,UART通信などを経由してので外付け型となる
外付け型なら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-32」が旬みたいだけど・・・)
いつもお世話になってるこちらを参考にしてブレッドボードに展開
ATコマンドで動作確認して(115200bps8N1,行末:CR+LF)
開発環境を整え(参考)
プログラムを書き込み動作させることができた
注意点や嵌った事など
デフォルトでは「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 |
シリアルポート | シリアルポート番号 |