topmenu

トップコンピュータカメラ雑記プロフィールこのページについて

2018/03/28

ESP-WROOM-02 と Arduino と 1.8インチTFT


スイッチサイエンス社の ESP-WROOM-02 (ESP-WROOM-02ピッチ変換済みモジュール《フル版》; https://www.switch-science.com/catalog/2347/)と Adafruit 1.8 インチ TFT LCDモジュールを使って、遊んだメモ。記事にするには、いまさら感、である。
Adafruit の TFT LCDモジュールはいくつか発売されているが、今回は、1.8 インチのものを使って遊んだ。このモジュールも、何年も前に購入していたが、放置していた。
Amazon の MP(中国系の業者) から購入したはずである。
余談
同時期に、DC-DC昇圧回路も購入したが、動かそうとしたら回路の抵抗がはずれた値で、昇圧回路をなしてなかった。使うには、チップ抵抗を外して定数を変えなければならないので投げてしまった。(これも後になって確認したが、商品表記されたものが届かなかった。定数が違うというようなクレームは通るのだろうか?もし怪しい MP から購入するときには、現物を早めに確認して、買い貯めはよしたほうがよいことを教訓にする。)

ESP-WROOM-02 には、 ESP8266 というマイコンが搭載されている。さまざまなソフトウェアは公式で配布されているが、今回は、Arduino を採用した。
他の SDK としては、公式の RTOS や NON OS がある。 有名?どころは Mongoose OS (https://mongoose-os.com/) であろうか?(機会があればぜひとも使ってみたいが、予定はない)
TFT モジュールには TFT だけでなく MicroSD カード用のスロットもあるので、SD カードと液晶のどちらも使用できるようした。使用する ESP-WROOM-02 のピン数は少ないが、 UART も通信用(送信のみ)にログが出力できるように設定した。
安い GSP モジュールが手に入ったときのために、プログラムできるのか確認しておきたい。といっても、特に難しいことはやらない(設定だけ・・・)。Arduino は有名だけれど、使ったことはないのではじめてのプログラムとなった。
GPS でログを取りつつ、時計を表示させたり、ほかのセンサーなどを積んでみたい。ただし、ESP-WROOM-02 には ADC が一つしかないので、できることは限られる。正直、そういった用途だけだとせっかくの WiFi がもったいないし、過剰なスペックであるように思う。
回路図は、以下のようにした。
回路図


公式で配布されているスタートガイドには、記載されていない抵抗もあるが、安定性のためにいれといたほうがよいとのことで、一部記述した。URL をメモしていたのだが見つからない、github にて有志の Wiki がソースであったと思う。。
GPIO2 はプルアップしているが、実際にはフローティングさせても(どこにつながなくても)フラッシュへの書き込みや実行ができる。JP3 は、書き込み用 UART (2-1)であり、実行時には LCD (2-3)に切り替えて実行させる。TxD や RxD には、470オーム程度の抵抗を入れといたほうがよいと思われるが、表記はしていない。
スイッチサイエンスの Developer board (https://www.switch-science.com/catalog/2500/) の回路では、入れられている。というか、作るよりは買ったほうが面倒でない。書き込み用の回路も乗っているようなので、OTGでプログラムできる。

プログラム
乱数を発生させて、その値を MicroSD にロギングした後に、乱数を計数し、ディスプレイの高さ方向(縦軸)に1カウントにつき1ピクセルとして表示することで分布を視覚的に見てみる。なお、発生させる乱数はディスプレイの幅で制限しておき、横方向(横軸)は乱数の値そのものを示す。 よって x-y 軸が、乱数値 - 出現数 として表示されることになる。乱数がまんべんなく発生すれば、表示が一直線(上下でまっぷたつに色が分かれる)になるはずである・・・乱数が本当に乱数であり、信頼性があって使えるのかというのは・・・・?であるが遊びなのでよし?とする。


/*
   This source code is public domain.
       flapper @ decentdress.blogspot.com
*/
#include <Adafruit_ST7735.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <SD.h>

#define LOG_FILENAME "test.log"

#define ADC_PIN
#define SD_CS 3

// TFT pin
#define TFT_DC    4
#define TFT_RST   5
#define TFT_CS    16

// TFT colors
#define TFT_BLUE  ST7735_BLUE
#define TFT_RED   ST7735_RED
#define TFT_GREEN ST7735_GREEN
#define TFT_WHITE ST7735_WHITE
#define TFT_BLACK ST7735_BLACK

// Initialize TFT class for Adafruit 1.8in. LCD.
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup(void) {
 // Serial.begin(115200);
 Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);

 tft.initR(INITR_BLACKTAB);
 tft.fillScreen(TFT_BLACK);

 // Check SD card.
 Serial.print("Initializing SD card...");
 if (!SD.begin(SD_CS)) {
  Serial.println("failed!");
  return;
 }
 Serial.println("OK!");

   // wait 3 sec
 delay(3000);
 
 const int tft_width  = tft.width();
 const int tft_height = tft.height();
 const char num_trial = 10;
 const char random_buff = 100; // num_trial * random_buff = num of random vals.
 File dataFile = SD.open(LOG_FILENAME, FILE_WRITE);
  
 if (dataFile) {
  Serial.println("Success: open SD(W)");
 } else {
  Serial.println("Error: cant open SD(W)");
  return;
 }
 
 for (int n = 0; n < num_trial; ++n) {
  char rand_num[random_buff];
  const int rand_num_size = sizeof(rand_num);
  String dataString = "";

  // Init seed.
  randomSeed(analogRead(0));

  for (int i = 0; i < rand_num_size; ++i) {
   rand_num[i] = random(0, tft_width-1);
  }
  for (int i = 0; i < rand_num_size; ++i) {
   dataString += String(rand_num[i], DEC);
   dataString += ",";
  }
  dataFile.println(dataString);
   
 }
 Serial.println("Success: write data");
 dataFile.close();


 dataFile = SD.open(LOG_FILENAME, FILE_READ);
 if (dataFile) {
  Serial.println("Success: open SD(R)");
 } else {
  Serial.println("Error: cant open SD(R)");
  return;
 }
  
 char rand_cnt[tft_width];
 for (int i = 0; i < sizeof(rand_cnt); ++i) { rand_cnt[i] = 0; }
 while ( dataFile.available() ) {
  int idx;
  String dataString = "";
  
  idx = dataFile.parseInt();
  if ( (idx < 0 ) && (idx >= tft_width) ) { 
   Serial.println("Err: rand_idx");
   return;
  }
  rand_cnt[idx]++;
 }

 // The value of rand_cnt[inx] display as a bar in axi-Y. 
 for (int x = 0; x < tft_width; ++x) {
  int16_t
   x0 = x, 
   y0 = 0, 
   x1 = x, 
   y1 = rand_cnt[x];
  
  tft.drawLine(x0, y0, x1, y1, TFT_WHITE);
 }
 dataFile.close();
 
}

void loop() {


}


結果・・・何回か実行させてみて写真を撮ったが(画像は小さい)、うーん・・・微妙
プログラムミス?
実行結果


SD のファイルオープンは、追記で開くようになっているので決まった点数のデータを得ようと思うと、ログファイルを消すかファイル名で管理するとかしないといけないみたい・・・何回も実行するとファイルサイズがどんどん大きくなっていく。