macsbug

Just another WordPress.com site

NES GAME with M5STACK

leave a comment »

M5STACK で NES GAME を 動かしてみました。        2018.05.07

Mac ( マック) での方法を記載します。
FACES を購入しますと マリオ風のゲームがインストールされています。
ゲームは エミュレーターで動いています。

NES EMULATOR と GAME の ソースは

m5stack/M5Stack-nesemu にあります。

M5Stack-nesemu-master を DL し、

中にある firmware.zip を解凍します。

4つのファイルを転送すると動きます。

1. bootloader.bin

2. partitions.bin

3. nesemu.bin

4. SuperMario4.nes


m5stack/M5Stack-nesemu:(SuperMario4.nes) をインストールする方法。
_ デスクトップに rom フォルダーを作成し bootloader.bin, partitions.bin,
_ nesemu.bin, SuperMario4.nes を入れておきます。
以下の4つを Terminalへ入力します。
1. esptool.py –port /dev/tty.SLAB_USBtoUART write_flash 0x1000 ~/Desktop/rom/bootloader.bin
2. esptool.py –port /dev/tty.SLAB_USBtoUART write_flash 0x8000 ~/Desktop/rom/partitions.bin
3. esptool.py –port /dev/tty.SLAB_USBtoUART write_flash 0x10000 ~/Desktop/rom/nesemu.bin
4. esptool.py –port /dev/tty.SLAB_USBtoUART write_flash 0x100000 ~/Desktop/rom/SuperMario4.nes

M5Stack-nesemu には、Controller、ROM,Copyright について書かれており
通常 FACES GAME Controller で操作できますが 他に NES, Playstation 1, 2
controller の接続方法が書かれています。(CLK=14,DAT=27,ATT=16,CMD=2)


Terminal入力の説明:
esptool.py –port /dev/tty.SLAB_USBtoUART write_flash 0x100000 ~/Desktop/rom/galaxian.nes
1. Python 2.7 又は Python 3.4以上がシステムにインストールされている事。
2. esptool.py:esptool.py がマックにある事が条件です。
_ 無い場合: esptool.py の Read.me に書かれています。
_ Terminal に 「pip install esptool」 を入力しますと動きます。
_ パーミッションエラーの場合は 「sudo pip install esptool 」を入力します。
3. –port /dev/tty.SLAB_USBtoUART:接続したM5STACKの USBの名前です。
_ 異なる USB デバイスの場合は 接続する USBの名前にします。
_ USBの名前の確認は Terminal に ls -l /dev/tty.* を入力しますと
_ usb デバイス名が表示されます。 ( /dev/tty.SLAB_USBtoUART )

crw-rw-rw-  1 root  wheel   19,   8  5  7 05:18 /dev/tty.SLAB_USBtoUART

4. write_flash:M5STACK の FLASH Memory へ書き込みます。
_ memo : 読み込みの場合は read_flash になります。
5. 0x100000:16進の100000番地に書き込みます。
6. ~/Desktop:デスクトップの場所です。他に書類の場所は Document です。
7. /rom:rom というフォルダーを作り nes ROM データーを入れておきます。
8. /galaxian.nes:galaxian の ROM DATA です。

MEMO:データーを読み込む方法:
_ write_flash を read_flash にし 読み込む長さを追加します。
例:esptool.py –port /dev/tty.SLAB_USBtoUART read_flash 0x1000 0x0010 ~/Desktop/data.bin
_ read_flash 開始番地 (0x000000)  長さ(0x0010 : 16byte)


使用方法は M5Stack Community の M5Stack Russia
_ Урок 13. FACES. Запуск игр от Dendy (NES) に記載されています。
_ 内容を お読み下さい。( 参考になる 検索先が書かれています ) 。

データーの構成:以下の4つで構成されています。
_ M5Stack-nesemu-master の中にある firmware.zip を解凍した
_ ものと同じで 0x100000 は ゲームのデーター です。

0x1000   bootloader.bin
0x8000   partitions.bin
0x10000  nesemu.bin
0x100000 Baltron.nes

配置:それぞれの bin は バイナリー表示の番地へ配置されます。
例:0x1000 bootloader.bin:bootloader.bin は 0x1000番地へ配置されます。
注意:書き込み番地を間違えますと 動かなくなるかもしれません。
_  各自の責任で行ってください。


解説は ESP32 DOWNLOAD TOOL を使用し Windows の方法が書かれています。
ここでは Mac ( マック) での方法を解説します。
使用環境は iMac 27 MacOS Sierra を使用。古いOSでは出来ない場合があります。

Mac の Terminal (ターミナル) を使用する方法です。
Terminal は アプリケーション フォルダー /  ユーティリティフォルダーにあります。
ゲームのデーター「galaxian.nes」(購入したデーター等) を用意します。
Desktop に rom フォルダーを作り、この中に「galaxian.nes」を入れます。
FACES (又は M5STACK ) と マックを USB接続します。
Terminal を起動し、以下の様に入力(1行です) しますと
esptool.py –port /dev/tty.SLAB_USBtoUART write_flash 0x100000 ~/Desktop/rom/galaxian.nes

esptool.py v2.2
Connecting........_____....._____.
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 40976 bytes to 10231...
Wrote 40976 bytes (10231 compressed) at 0x00100000 in 0.9 seconds (effective 363.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...

と表示され「galaxian」が動きます。


Windows の方法:MY氏から方法を教えて頂きました。感謝致します。
_ Windowsの場合は、以下の内容を “flash.cmd” という名前で各FWファイルを
_ 同じ場所に保存し、同じフォルダに “esptool.exe”を置けば、あとは NES
_ ファイルをドラッグ ドロップすると書き込めます。
—–
@echo off
SET COM_PORT=COM3
SET NES_IMAGE=%1
esptool.exe –chip esp32 –port %COM_PORT% –baud 921600 –before default_reset –after hard_reset write_flash -z –flash_mode dio –flash_freq 40m –flash_size detect 0x1000 bootloader.bin 0x10000 nesemu.bin 0x8000 partitions.bin 0x100000 %NES_IMAGE%
—–


自作データー集:
NES ROM は 購入した物や 怪しい所とか 幾つか方法があります。
ゲームを自作したデーターが公開されてます。
1. NES研究室 – 自作ゲーム
_ 「tkrpg100」、「tkshoot100」があります。
2. ど~もeagle0wlです:正規公開されているゲーム専用機のROMイメージ
_ 「2048」、「ブレイドバスター」があります。

3. 野うさぎ亭 – NESプログラミング
_ 「RevolvingGems」があります。


感想:
Terminal 操作:解りにくさや 難さがありますが 今回の方法で 出来ると
_ 便利かと思います。
自作ゲーム: asm で書かれており 開発時の熱意を感じます。
期待する機能:M5Stack-SD-Updater の様に SD に NES-EMU, NES DATA を
_ 入れ M5STACK のメニューリストから LOAD 出来ると便利かと思います。
_ 私の力量では無理ですので どなたか よろしくお願い致します。
掘り出し物:ファミコン時代にゲームを遊び、購入したゲームのROMを
_ 読み出して勉強した人もいるかと思います。M5STACKで再び再現でき
_ 保存したデーターが生き返る事になったかと思います。
_ NES EMULATOR を公開された M5STACK TEAM に感謝致します。


広告

Written by macsbug

5月 7, 2018 at 12:00 pm

カテゴリー: ESP32

M5STACK WiFiScan

leave a comment »

ESP8266 WiFi Scan を M5STACK に移植しました。     2018.05.03

ORIGINALは oaquimorg/esp8266_wifi_scan です。
joaquim.org : joaquimorg氏の記事:ESP8266 WiFi Scan
joaquimorg氏 に感謝致します。

オリジナルのディスプレーは 2.4 inch 320×240 です。
M5STACK も 320×200 ですが 2.0 inch の為 文字が小さく見づらいですが 良しとします。

Free_Fonts.h は M5STACK Library の中にあります。

SD にアプリを入れて起動する為に SD Update のスケッチが入っています。


スケッチ:WiFiScan:
_ WiFiScan のフォルダーの構成は以下の3つです。
_ icons.h は esp8266_wifi_scan から使用すると良いです。
_ WiFiScan Folder : [ WiFiScan.ino, icons.h, Free_Fonts.h ]

// Scan WiFi networks. (c)joaquim.org
// https://github.com/joaquimorg/ESP8266/tree/master/esp8266_wifi_scan
// https://www.joaquim.org/esp8266-wifi-scan/
// Github:https://macsbug.wordpress.com/2018/05/03/m5stack-wifiscan/
#include "WiFi.h"
#include <M5Stack.h>
#include "M5StackUpdater.h"                          // SD Update
#include "icons.h"
//#include "Free_Fonts.h"

typedef struct {
  String SSID;
  uint8_t encryptionType,Active,Update;
  int32_t RSSI,Channel;
} NetInfo;
NetInfo networkInfo[30];
typedef struct {
  int32_t Total,RSSI;
}ChannelInfo;
ChannelInfo totalChannel[14],totalChannelOld[14];
#define TEXT_SIZE 10
int initclear = 1;

void setup() {
  Serial.begin(115200);delay(500);
  M5.begin();
  Wire.begin(); 
  if(digitalRead(BUTTON_A_PIN) == 0){                // SD Update
     updateFromFS(SD); ESP.restart();                // SD Update
  }                                                  // SD Update
  M5.Lcd.setTextColor(TFT_BLACK, TFT_WHITE);
  M5.Lcd.fillScreen(TFT_WHITE);
  //M5.Lcd.setFreeFont(FSSB12);
  //M5.Lcd.setFreeFont(FSS9);
  M5.Lcd.fillScreen(ILI9341_BLACK);
  M5.Lcd.drawBitmap(110, 10, wifiBitmap, 100, 70, ILI9341_WHITE);
  //M5.Lcd.setFont(&FreeMono9pt7b);
  M5.Lcd.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
  M5.Lcd.setCursor(105, 100);
  M5.Lcd.print("Wifi Scan");
  M5.Lcd.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
  M5.Lcd.setCursor(95, 130);
  M5.Lcd.print("joaquim.org");
  //M5.Lcd.displayUpdate();
  M5.Lcd.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
  Serial.println("esp8266 Wifi Scan ... ");
  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(5000);
  Serial.println("running... ");
  //M5.Lcd.fillScreen(ILI9341_BLACK);
  M5.Lcd.setCursor(75, 200);
  M5.Lcd.println("Scanning WiFi...");
  //M5.Lcd.displayUpdate();
  memset( networkInfo,     0x0, sizeof(networkInfo) );
  memset( totalChannel,    0x0, sizeof(totalChannel) );
  memset( totalChannelOld, 0x0, sizeof(totalChannelOld) );
  M5.Lcd.setTextSize(1);
}

void showScreen1( int num ) {
  int pos = 0, col = 0, total = 0;  
  for (int i = 0; i < num; ++i) {
    if (networkInfo[i].Active == 1) {     
      M5.Lcd.fillRect(col, 2 + (TEXT_SIZE * pos),160,TEXT_SIZE,BLACK);      
      M5.Lcd.setCursor(col, 2 + (TEXT_SIZE * pos));       
      /*if (networkInfo[i].encryptionType == ENC_TYPE_NONE) {
        M5.Lcd.drawBitmap(col,(TEXT_SIZE * pos),unlockBitmap10,10,10,GREEN);
      } else {
        M5.Lcd.drawBitmap(col,(TEXT_SIZE * pos),lockBitmap10,10,10,RED);
      }*/    
      M5.Lcd.setCursor(col + 14, 2 + (TEXT_SIZE * pos)); 
      M5.Lcd.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
      if (networkInfo[i].RSSI <= -80) {
        M5.Lcd.setTextColor(ILI9341_RED, ILI9341_BLACK);
      } else if (networkInfo[i].RSSI >= -80 && networkInfo[i].RSSI < -70){
        M5.Lcd.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
      } else {
        M5.Lcd.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
      }   
      M5.Lcd.print(networkInfo[i].SSID);
      //Serial.print(networkInfo[i].SSID);Serial.print(" : ");
      //Serial.println(networkInfo[i].RSSI);*/
      
      //M5.Lcd.fillRect(0, (TEXT_SIZE * pos), 240, TEXT_SIZE, ILI9341_BLACK);
      /*if (networkInfo[i].RSSI <= -80) {
        M5.Lcd.drawBitmap(120,20 + (TEXT_SIZE * pos),level1Bitmap, 8, 8,RED);
      } else if (networkInfo[i].RSSI >= -80 && networkInfo[i].RSSI < -70){
        M5.Lcd.drawBitmap(120,20 + (TEXT_SIZE * pos),level2Bitmap,8,8,YELLOW);  
      } else {
        M5.Lcd.drawBitmap(120,20 + (TEXT_SIZE * pos),level3Bitmap,8,8,GREEN);
      }*/
      pos++;
      total++;
      if ( total > 21) break;
      if ( total == 11 ) {
        col = 160;
        pos = 0;
      }
    }
  }
}

void BubbleSort(NetInfo netInfo[], int numLength) {
  uint8_t i, j, flag = 1;    // set flag to 1 to start first pass
  NetInfo temp;              // holding variable
  for (i = 1; (i <= numLength) && flag; i++){
    flag = 0;
    for (j = 0; j < (numLength - 1);j++){// ascending order simply changes to
      if (abs(netInfo[j + 1].RSSI) < abs(netInfo[j].RSSI)){ 
        temp = netInfo[j];             // swap elements
        netInfo[j] = netInfo[j + 1];
        netInfo[j + 1] = temp;
        flag = 1;                      // indicates that a swap occurred.
      }
    }
  }
  return;   //arrays are passed to functions by address; nothing is returned
}

void addToArray( NetInfo netInfo ) {
  uint8_t total = 0;
  for (int i = 0; i < 30; ++i) {
   if (networkInfo[i].Active == 1 && (networkInfo[i].SSID == netInfo.SSID)){
     networkInfo[i] = netInfo;
     //Serial.print("Found :" + netInfo.SSID + " ");Serial.println(i);
     return;
   } 
  }
  for (int i = 0; i < 30; ++i) {    
    /*Serial.print(i);Serial.print(" ");    
    Serial.print(networkInfo[i].Active);
    Serial.println(" " + networkInfo[i].SSID + " ");*/      
    if ( networkInfo[i].Active == 1 ) {
      total++;
    } 
  } 
  if ( total < 30 ) {
    networkInfo[total] = netInfo;
    //Serial.print("New :" + netInfo.SSID + " ");Serial.println(total);
  }
}

void drawGraphScreen() {
  M5.Lcd.drawRect(1, 120, 319, 105, ILI9341_DARKGREY);
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); 
  M5.Lcd.drawString("01 02 03 04 05 06 07 08 09 10 11 12 13 14",50,210);
  M5.Lcd.drawFastHLine(40, 205, 265, ILI9341_ORANGE); 
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); 
  M5.Lcd.drawString("-99", 15, 195);
  M5.Lcd.drawString("-80", 15, 185);
  M5.Lcd.drawString("-70", 15, 175);
  M5.Lcd.drawString("-60", 15, 165);
  M5.Lcd.drawString("-50", 15, 155);
  M5.Lcd.drawString("-40", 15, 145);
  M5.Lcd.drawString("-30", 15, 135);
  M5.Lcd.drawString("-20", 15, 125);
  M5.Lcd.drawFastVLine(40, 125, 80, ILI9341_ORANGE);
}

void drawGraph() {
  for (int i = 0; i < 14; ++i) {
    M5.Lcd.drawFastVLine(55 + (i * 18), 125, 75, ILI9341_BLACK);
    if ( totalChannelOld[i].Total > 0) {
      M5.Lcd.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
      M5.Lcd.setCursor(60 + (i * 18), 200 - totalChannelOld[i].RSSI);
      M5.Lcd.print("  ");
    }  
    if ( totalChannel[i].Total > 0) {
      M5.Lcd.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
      M5.Lcd.setCursor(60 + (i * 18), 200 - totalChannel[i].RSSI);
      M5.Lcd.print(totalChannel[i].Total);     
      M5.Lcd.drawFastVLine(55 + (i * 18), 200 - totalChannel[i].RSSI,
                          totalChannel[i].RSSI, ILI9341_GREEN);
    } 
    totalChannelOld[i] = totalChannel[i];
  }
}

void loop() {
  int n = WiFi.scanNetworks();
  int m = n;
  NetInfo netInfo;
  for (int i = 0; i < 30; ++i) {
    networkInfo[i].Update = 0;
  }
  for (int i = 0; i < 14; ++i) {
   totalChannel[i].Total = 0;
   totalChannel[i].RSSI = 0;
  }
  if ( initclear == 1 ) {
    initclear = 0;
    M5.Lcd.fillScreen(ILI9341_BLACK);
    drawGraphScreen();    
  }
  if (n == 0) {
    //M5.Lcd.setTextSize(2);
    M5.Lcd.fillScreen(ILI9341_BLACK);
    M5.Lcd.setTextColor(ILI9341_BLUE, ILI9341_BLACK);
    M5.Lcd.setCursor(0, 10);
    M5.Lcd.println();M5.Lcd.println();
    M5.Lcd.print("No networks found...");M5.Lcd.println();
    M5.Lcd.println("Scanning...");
    //M5.Lcd.setTextSize(1);
  } else {
    if ( m > 30 ) m = 30;
    for (int i = 0; i < m; ++i) {
      netInfo.SSID = WiFi.SSID(i);
      netInfo.encryptionType = WiFi.encryptionType(i);
      netInfo.RSSI = WiFi.RSSI(i);
      netInfo.Channel = WiFi.channel(i);
      netInfo.Active = 1;
      netInfo.Update = 1;
      addToArray(netInfo);
      totalChannel[netInfo.Channel - 1].Total = 
      totalChannel[netInfo.Channel - 1].Total + 1;
      if ((netInfo.RSSI + 100) > totalChannel[netInfo.Channel - 1].RSSI){
        totalChannel[netInfo.Channel - 1].RSSI = (netInfo.RSSI + 100);
      }
    }
    for (int i = 0; i < 30; ++i) {
      if ( networkInfo[i].Update == 0 ) {
           networkInfo[i].SSID   = "";
           networkInfo[i].RSSI   = 255;
           networkInfo[i].Active = 0;
      }
    }
    BubbleSort(networkInfo, 30);
    M5.Lcd.setCursor(5, 230);
    M5.Lcd.setTextColor(ILI9341_CYAN, ILI9341_BLACK);
    M5.Lcd.print(n);
    M5.Lcd.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
    M5.Lcd.print(" networks found");   
    //M5.Lcd.fillRect(0, 20, 240, 320, ILI9341_BLACK);
    showScreen1(30);
    drawGraph();   
  }
}

//icons.h
const unsigned char wifiBitmap [] PROGMEM = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
3, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 255, 255, 248, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 31, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 
255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 128, 0, 0, 0, 0, 
0, 0, 0, 1, 255, 255, 255, 255, 192, 0, 0, 0, 0, 0, 0, 0, 3, 255, 255, 
255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 255, 255, 240, 0, 0, 0, 
0, 0, 0, 0, 15, 255, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 15, 255, 
255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 7, 255, 255, 255, 255, 255, 255, 
248, 0, 0, 0, 0, 0, 127, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 
0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 0, 0, 0, 3, 255, 255, 
255, 255, 255, 255, 255, 255, 224, 0, 0, 0, 7, 255, 255, 255, 255, 255, 
128, 0, 1, 240, 0, 0, 0, 7, 255, 255, 255, 255, 255, 0, 0, 0, 120, 0, 0,
0, 15, 255, 255, 255, 255, 254, 0, 0, 0, 60, 0, 0, 0, 31, 255,255, 255, 
255, 252, 0, 0, 0, 28, 0, 0, 0, 31, 255,255, 255, 255, 248, 0, 0, 0, 30, 
0, 0, 0, 63, 255,255, 255, 31, 240, 0, 0, 30, 14, 0, 0, 0, 63, 7, 7, 6, 
15, 240, 255, 255, 62, 14, 0, 0, 0, 63, 7, 7, 6, 15, 224, 255, 255, 62, 
7, 0, 0, 0, 127, 7, 7, 14, 15, 224, 255, 255, 62, 7, 0, 0, 0, 127, 135, 
7, 15, 31, 224, 255, 255, 30, 7, 0, 0, 0, 127, 135, 7, 15, 255, 224, 
255, 255, 0, 3, 0, 0, 0, 127, 134, 6, 15, 255, 224, 252, 0, 30, 3, 0, 0, 
0, 127, 130, 2, 14, 31, 224, 252, 0, 62, 3, 0, 0, 0, 127, 130, 2, 30, 
31, 224, 252, 0, 62, 3, 0, 0, 0, 127, 194, 34, 30, 31, 224, 252, 0, 62, 
3, 0, 0, 0, 127, 194, 34, 30, 31, 224, 255, 254, 62, 3, 0, 0, 0, 127, 
194, 34, 30, 31, 224, 255, 254, 62, 3, 0, 0, 0, 127, 194, 34, 30, 31, 
224, 255, 254, 62, 3, 0, 0, 0, 127, 192, 32, 62, 31, 224, 255, 254, 62, 
3, 0, 0, 0, 127, 224, 32, 62, 31, 224, 255, 254, 62, 3, 0, 0, 0, 127, 
224, 96, 62, 31, 224, 255, 254, 62, 3, 0, 0, 0, 127, 224, 112, 62, 31, 
224, 252, 0, 62, 3, 0, 0, 0, 127, 224, 112, 62, 31, 224, 252, 0, 62, 3, 
0, 0, 0, 127, 224, 112, 126, 31, 224, 252, 0, 62, 3, 0, 0, 0, 127, 240, 
112, 126, 31, 192, 252, 0, 62, 7, 0, 0, 0, 127, 240, 240, 126, 31, 192, 
252, 0, 62, 7, 0, 0, 0, 63, 255, 255, 255, 255, 192, 248, 0, 62, 7, 0, 
0, 0, 63, 255, 255, 255, 255, 192, 0, 0, 0, 14, 0, 0, 0, 63, 255, 255, 
255, 255, 128, 0, 0, 0, 14, 0, 0, 0, 31, 255, 255, 255, 255, 128, 0, 0, 
0, 30, 0, 0, 0, 31, 255, 255, 255, 255, 0, 0, 0, 0, 28, 0, 0, 0, 15, 255, 
255, 255, 255, 0, 0, 0, 0, 56, 0, 0, 0, 7, 255, 255, 255, 254, 0, 0, 0, 
0, 248, 0, 0, 0, 7, 255, 255, 255, 252, 0, 0, 0, 1, 240, 0, 0, 0, 1, 255, 
255, 255, 255, 255, 255, 255, 255, 224, 0, 0, 0, 0, 255, 255, 255, 255, 
255, 255, 255, 255, 192, 0, 0, 0, 0, 63, 255, 255, 255, 255, 255, 255, 
255, 0, 0, 0, 0, 0, 7, 255, 255, 255, 255, 255, 255, 240, 0, 0, 0, 0, 0, 
0, 7, 255, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 3, 255, 255, 255, 255, 
240, 0, 0, 0, 0, 0, 0, 0, 3, 255, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 
0, 1, 255, 255, 255, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 
128, 0, 0, 0, 0, 0, 0, 0, 0, 63, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
31, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 248, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 3, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

const unsigned char battBitmap10 [] PROGMEM = {
0, 0, 0, 0, 0, 0, 127, 255, 0, 127, 193, 192, 127, 129, 192, 127, 1, 192, 
126, 1, 192, 127, 255, 0, 0, 0, 0, 0, 0, 0 };
 
const unsigned char lockBitmap10 [] PROGMEM = {
0, 0, 30, 0, 51, 0, 33, 0, 33, 0, 127, 128, 115, 128, 115, 128, 63, 0, 0, 
0 };
        
const unsigned char unlockBitmap10 [] PROGMEM = {
0, 0, 30, 0, 51, 0, 1, 0, 1, 0, 127, 128, 127, 128, 127, 128, 63, 0, 0, 0 };

const unsigned char level1Bitmap [] PROGMEM = {
7, 128, 63, 240, 240, 60, 199, 140, 31, 224, 48, 48, 7, 128, 12, 192, 0, 
0, 3, 0, 3, 0 };

const unsigned char level2Bitmap [] PROGMEM = {
0x00, 0x00, 0x00, 0x18, 0x18, 0xd8, 0xd8, 0x00 };

const unsigned char level3Bitmap [] PROGMEM = {
0x00, 0x03, 0x03, 0x1b, 0x1b, 0xdb, 0xdb, 0x00 };

const unsigned char openBitmap [] PROGMEM = {
0x00, 0x18, 0x24, 0x42, 0x42, 0x24, 0x18, 0x00 };

const unsigned char closeBitmap [] PROGMEM = {
0x00, 0x18, 0x3C, 0x7E, 0x7E, 0x3C, 0x18, 0x00 };

Written by macsbug

5月 3, 2018 at 7:00 pm

カテゴリー: ESP32

M5STACK WiFiAnalyzer

leave a comment »

ESP8266WiFiAnalyzer を M5STACK に移植しました。     2018.04.30

ORIGINALは moononournation/ESP8266WiFiAnalyzer です。
instructables : 陳亮氏の記事:ESP8266WiFiAnalyzer
moononournation、陳亮氏 に感謝致します。

オリジナルのディスプレーは 2.4 inch 320×240 です。
M5STACK も 320×200 ですが 2.0 inch の為 文字が小さく見づらいですが 良しとします。

Free_Fonts.h は M5STACK Library の中にあります。

SD にアプリを入れて起動する為に SD Update のスケッチが入っています。


スケッチ:

// ESP8266 WiFi Analyzer
// Revise from ESP8266WiFi WiFiScan example.
// Require ESP8266 board support, Adafruit GFX and ILI9341 library.
// http://www.instructables.com/id/ESP8266-WiFi-Analyzer/
// moononournation/ESP8266WiFiAnalyzer
// https://github.com/moononournation/ESP8266WiFiAnalyzer
// Github:https://macsbug.wordpress.com/2018/04/30/m5stack-wifianalyzer/
#include "WiFi.h"
#include <M5Stack.h>
#include "M5StackUpdater.h"                          // SD Update
#include "Free_Fonts.h"
#define RSSI_CEILING -40                             // Graph constant
#define RSSI_FLOOR -100
#define GRAPH_BASELINE 222
#define GRAPH_HEIGHT 188
#define CHANNEL_WIDTH 20
#define NEAR_CHANNEL_RSSI_ALLOW -70
// Channel color mapping from channel 1 to 14
uint16_t channel_color[] = {RED,ORANGE,YELLOW,GREEN,CYAN,
  MAGENTA,RED,ORANGE,YELLOW,GREEN,CYAN,MAGENTA,RED,ORANGE
};

void setup() {
  Serial.begin(115200);delay(500);
  M5.begin();
  Wire.begin(); 
  if(digitalRead(BUTTON_A_PIN) == 0){                // SD Update
     updateFromFS(SD); ESP.restart();                // SD Update
  }                                                  // SD Update
  M5.Lcd.setTextColor(TFT_BLACK, TFT_WHITE);
  M5.Lcd.fillScreen(TFT_WHITE);
  //M5.Lcd.setFreeFont(FSSB12);                      // FreeMono18pt7b
  //M5.Lcd.setFreeFont(FSS9);                        // FreeSans9pt7b
  M5.Lcd.fillScreen(BLUE);                           // init banner
  //M5.Lcd.setTextSize(1);
  M5.Lcd.setTextColor(WHITE, RED);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.print("  M5");
  M5.Lcd.setTextColor(WHITE, ORANGE);
  M5.Lcd.print("STACK ");
  M5.Lcd.setTextColor(WHITE, GREEN);
  M5.Lcd.print(" WiFi ");
  M5.Lcd.setTextColor(WHITE, BLUE);
  M5.Lcd.print(" Analyzer");
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
}

void loop() { 
  uint8_t ap_count[] = {0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0};
  int32_t max_rssi[] = {-100,-100,-100,-100,-100,-100,-100,
                        -100,-100,-100,-100,-100,-100,-100};
  int n = WiFi.scanNetworks();
  M5.Lcd.fillRect(0, 16, 320, 224, BLACK);           // clear old graph
  M5.Lcd.setTextSize(1);
  if (n == 0) {
    M5.Lcd.setTextColor(BLACK);
    M5.Lcd.setCursor(0, 16);
    M5.Lcd.println("no networks found");
  } else {
    for (int i = 0; i < n; i++) {                    // plot found WiFi info
      int32_t channel = WiFi.channel(i);
      int32_t rssi = WiFi.RSSI(i);
      uint16_t color = channel_color[channel - 1];
      int height = constrain(map(rssi, RSSI_FLOOR, 
                   RSSI_CEILING, 1, GRAPH_HEIGHT), 
                   1, GRAPH_HEIGHT);
      ap_count[channel - 1]++;                       // channel stat
      if (rssi > max_rssi[channel - 1]) {
        max_rssi[channel - 1] = rssi;
      }
      M5.Lcd.drawLine(channel * CHANNEL_WIDTH, GRAPH_BASELINE - height, 
             (channel - 1) * CHANNEL_WIDTH, GRAPH_BASELINE + 1, color);
      M5.Lcd.drawLine(channel * CHANNEL_WIDTH, GRAPH_BASELINE - height, 
             (channel + 1) * CHANNEL_WIDTH, GRAPH_BASELINE + 1, color);
      M5.Lcd.setTextColor(color); // SSID, signal strengh and if not encrypted
      M5.Lcd.setCursor((channel - 1) * CHANNEL_WIDTH, GRAPH_BASELINE - 10 - height);
      M5.Lcd.print(WiFi.SSID(i));
      M5.Lcd.print('(');
      M5.Lcd.print(rssi);
      M5.Lcd.print(')');
      //if (WiFi.encryptionType(i) == ENC_TYPE_NONE) {
      //  M5.Lcd.print('*');
      //}
      delay(10);
    }
  }
  M5.Lcd.setTextColor(WHITE);                         // print WiFi stat
  M5.Lcd.setCursor(0, 16);
  M5.Lcd.print(n);
  M5.Lcd.print(" networks found, suggested channels: ");
  bool listed_first_channel = false;
  for (int i = 1; i <= 11; i++) { // channels 12-14 may not available
    // check previous channel signal strengh
    if ((i == 1) || (max_rssi[i - 2] < NEAR_CHANNEL_RSSI_ALLOW)) {
      // check next channel signal strengh
      if ((i == sizeof(channel_color)) || (max_rssi[i] < 
                              NEAR_CHANNEL_RSSI_ALLOW)) {
        if (ap_count[i - 1] == 0) { // check no AP exists in same channel
          if (!listed_first_channel) {
            listed_first_channel = true;
          } else {M5.Lcd.print(", ");}
          M5.Lcd.print(i);
        }
      }
    }
  }
  // draw graph base axle
  M5.Lcd.drawFastHLine(0, GRAPH_BASELINE, 320, WHITE);
  for (int i = 1; i <= 14; i++) {
    M5.Lcd.setTextColor(channel_color[i - 1]);
    M5.Lcd.setCursor((i * CHANNEL_WIDTH) - 
            ((i < 10)?3:6), GRAPH_BASELINE + 2);
    M5.Lcd.print(i);
    if (ap_count[i - 1] > 0) {
      M5.Lcd.setCursor((i * CHANNEL_WIDTH) - 
           ((ap_count[i - 1] < 10)?9:12), GRAPH_BASELINE + 11);
      M5.Lcd.print('(');
      M5.Lcd.print(ap_count[i - 1]);
      M5.Lcd.print(')');
    }
  }
  delay(5000);  // Wait a bit before scanning again
}

Written by macsbug

4月 30, 2018 at 6:00 pm

カテゴリー: ESP32

TFT_eSPI Library supports M5STACK

with 3 comments

TFT_eSPI Library は M5STACK の Display をサポートしました。   2018.04.17


TFT Display と Library:
_ TFT Display の Library は 幾つかありますが その中で
_ TFT_eSPI Library は 速度、機能、多種対応 で ナンバーワンとも言えます。
_ M5STACK(Custom ILI9341), Raspberry Pi用TFT(ILI9486) を含めて8種の
_ SPI TFT や Parallel interface TFT, ePaper の多種対応、高速化、スプライト、
_ アンチエイリアスフォント機能が実施されています。
_ 詳細は eSPI Library に記載されており 読み応えがあります。


主題の前に M5STACKの解説を致します。( 少し長いです )

M5STACK の TFT Display:
TFT  Driver は 320×240 ILI9341 です。ただし「Custom ILI9341」です。
m5stack/M5Stack_TFT_ILI9341 には 「Custom ILI9341」 と書かれています。
低価格で販売されている 2.4 inch TFT SPI 320×240 ILI9341 とは 異なる点が
あります。MISOの配線は無し。 2 inch で 人によっては小さいです。

 2 inch M5STACK Display 2.4 inch  320×240 TFT Display Module

1. 色の配置:BGR
_ ハード的に異なります。RGB ( ILI9341 Data Sheet ) が BGR に
_ なっています。つまり R(赤) と B(青) が 逆になっています。
_ これは RGB Color Codes Chart が使用できない事を示しています。
_ bin タイプの画像やデーターは互換性が無くなります。


2. 表示の向き:鏡面反転表示
_ 鏡面反転表示 (左右反転)します。これもハードの構成による物と思われます。


M5STACK の現象:
1. M5STACK の Display Library で 外部に接続した市販の TFT を表示すると
_ 色ずれと鏡面反転し正常に表示しません。
2. 従来の TFT Library で M5STACK の TFT を表示すると同様に色ずれと
_ 鏡面反転し正常に表示しません。
理由は 解りませんが 私はプロテクションと判断しています。
_ 昔 aitendo の TFT で この方法を使用した TFT Display があり 不便でした。


M5STACK の 現状と対策:
_ TFT Driver IC に対し カスタムの配線は 従来の TFT Library を使用した
_ スケッチの活用が出来なくなります。
_ スケッチの移植が困難になり 先人の資産を有効活用できません。
_ 従来の TFT とは異なる設計は 大変不便です。
_ その中で、 Tetris, spaceShooter, Pacman 等の移植を実施しました。
_ 例として Tetris は これまでの画像を使用できず 新たにM5STACK用の
_ 画像を作りました。調査と作成に大変時間を要しました。

_ SOKOBAN を移植された robo8080氏も 左右反転に気がつき スケッチの
_ サブプログラムで処理をされ 動作しています。
_ robo8080氏の対応策は素晴らしく、感謝致します。

robo8080氏のプログラム:左右反転。

void fillImage(void *image, int x, int y, int w, int h) {
 uint16_t* p = (uint16_t*)image;
 M5.Lcd.startWrite(); // Requires start/end transaction now
 M5.Lcd.setAddrWindow(x, y, x+w-1, y+h-1);
 for ( int i = 0; i < h; i++) {
   for (int j = 0; j < w; j++) {
     M5.Lcd.writePixel(p[i*w+j]);
   }
 }
 M5.Lcd.endWrite(); // End last TFT transaction 
}
robo8080氏のプログラムを 基に

FACES version of M5Stack_sokoban

を作らせて頂きました。


色の対策: RGB -> GBR
_ Kongduino / M5-Colors-Demo:デモは RGBを BGR に変換しています。
_ Kongduino氏は Colours.h  で RGB の定義をし void demoColour で
_ GBR に変換した 5-Colors-Demo を作成しています。

_ M5CheatSheet にも Color の 定義が記載されています。

例:Tetris:make_block( 3, 0xFF00);       // D__,DDD  BLUE
_ Colours.h:TFT_BLUE 0x001F /* 0, 0, 255 */ : Color の定義
_ void demoColour(char *colourName, uint16_t clr) {
_  uint16_t reverse = clr ^ 0xFFFF; // Color の反転


M5STACK Display Library の詳細:
TFT 左右表示:アドレスは 0x36 で 名称は ILI9341_MADCTL です。
_ M5 Display.h に定義されています。
_ Memory Access Control : MADCTL : 左右表示
_ M5 Display.h:#define ILI9341_MADCTL 0x36

設定:M5 Display.cpp で 以下の様に 0x08 です。
_   本来は 0x48 で行われています。

writecommand(ILI9341_MADCTL); // Memory Access Control
writedata(0x08);  // writedata(0x48);

追記:2018.05.02
M5STACK Community :メモ:transparency 。
_ M5STACK の TFT LCD の呼び出しにはアルファ値
_ (透明性:transparent)がありません。
_ 透明色を渡すには TFT_eSPI Library のスプライト関数を使用します。
_ 例:pushSprite(int32_t x, int32_t y, uint16_t transparent);


.
=== [ 主題 ] SUBJECT  ===   eSPI Library supports M5STACK   =========

eSPI Library の M5STACK対応:
M5STACK 販売当初、eSPI Library は M5 に正しく表示できませんでしたが
2018.04  (Update 2nd April 2018)  にて M5STACK 対応が実施され
表示が可能になりました。 Bodmer氏に感謝致します。


対応ディスプレー:8種類のTFT と ePaper 対応。
_ ILI9341, ILI9163, ST7735, S6D02A1, ILI9481, ILI9488,ILI9486, HX8357
_ ePaper display


eSPI Library と 多種TFTの記述方法:User_Setups
TFTの設定は 通常 スケッチの宣言部と setup で行いますが eSPI Library は
User_Setups に記載された内容で 行なわれます。
TFT_eSPI/User_Setups/Setup12_M5Stack.h

TFTの宣言と設定を User_Setups に集約する事で便利になっています。
既に 対応する TFT の User_Setups も用意されています。
多種類の TFT 対応が可能である事と プログラムが簡単です。

これにより 従来の eSPI のスケッチがそのまま動作します。
SPI FREQUENCY は 40MHz で 動作します。

例:User_Setups:M5STACK の 設定:

#define ILI9341_DRIVER
#define M5STACK
#define TFT_MISO  -1
#define TFT_MOSI  23
#define TFT_SCLK  18
#define TFT_CS    14  // Chip select control pin
#define TFT_DC    27  // Data Command control pin
#define TFT_RST   33  // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL    32  // LED back-light
#define SPI_FREQUENCY  40000000

鏡面反転表示 (左右反転) から 正しい表示:


サンプル:多数のサンプルがあります。
_ 具体的な画像は  TFT display for Raspberry pi with ESP32 を参照ください。


注目する機能:
1. Sprite :スプライト
_ 複雑なグラフィックにて フリッカーの無い表示が可能です。
_ スクロール機能のサンプルもあり参考になります。

2. ESP32_PARALLEL
_ User_Setups の中に #define ESP32_PARALLEL の設定があります。
_ Control pin 3つ、R/W 2つ、DATA 8つ 計 13本で パラレル操作が可能です。
_ TFT は ILI9481 and ILI9341 で PARALLEL 方式の TFT を入手できますと
_ ESP32 で PARALLEL 操作が可能になり 高速表示を期待する事が出来ます。
_ 対応するボードは 8 bit parallel interface TFT ILI9341 が販売されています。
3. M5STACK 内蔵の Display や M5STACKに外部接続した Display も表示が
_ 可能です。


M5STACK TFT Driver ILI9341:
更に詳しい TFT Driver の中味は TFT_Driver Folder の中に
_ ILI9341_Defines.h, ILI9341_init.h, ILI9341_Rotation.h があります。

ILI9341_init.h には M5STACK用の設定が宣言されています。

#ifdef M5STACK
  writedata(0xA8); // Rotation 0 (portrait mode)
#else
  writedata(0x48); // Rotation 0 (portrait mode)
#endif

#ifdef M5STACK
  // Turn on the back-light LED
  digitalWrite(TFT_BL, HIGH);
  pinMode(TFT_BL, OUTPUT);
#endif

ILI9341_Rotation.h にも M5STACK の設定が多数宣言されています。

 
#ifdef M5STACK 
  writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_BGR); 
#else 
  writedata(TFT_MAD_MX | TFT_MAD_BGR); 
#endif 

この内容を見ると eSPI Library の著者である Bodmer氏は M5STACK を解析し
丁寧に作られており 驚くばかりです。


速度:
M5STACK での M5 Display Library と eSPI Library の速度を比較しました。
速度は ほぼ同じです。恐らく内部の CODE は 同じ構成だと想像します。


eSPI の bug:バグと修正方法。
3.5 ” 480×320 SPI TFT ILI9486 RPi touch Display を使用する場合、ここに
示されたVersion では表示しません。ブログにコメントされた ohno氏 が
発見し解析により解決方法が判明致しました。
詳細は TFT display for Raspberry pi with ESP32 を参照ください。
ohno氏 に感謝致します。
変更内容:以下の eSPI.cpp を eSPI.h の先頭に移動。

#ifdef RPI_ILI9486_DRIVER
  #define CMD_BITS 16-1
#else
  #define CMD_BITS 8-1
#endif

他、Parallel interface TFT に於いて TFT_CS が出力されない不具合があり、
eSPI.h の TFT_CS の変更が必要です。


参考:
mgo-tec電子工作:mgo-tec氏 が解析され RGB -> BGR の詳細が記載されています。
_ M5stack(ESP32搭載)の液晶ディスプレイ ILI9341 をちょっと解明してみた
_ M5STACK発売当時からの疑問が 同様である事が解りました。
_ 詳細な分析と解説をありがとうございました。mgo-tec 氏に感謝致します。
TFT display for Raspberry pi with ESP32:ラズベリーパイ用 3.5 inch 480×320
Mini Grafx Library : Daniel Eichhorn:高度な命令がある TFT Library
Arduino Library List:ライブラリー集
instructable:ARDUINO TFT DISPLAY AND FONT LIBRARY:Arduino by Bodmer


感想:
eSPI Library ( version 0.20.10 ) 2018.04 Version:
_ M5STACK で使用できなく困っていましたが 使用できる様になり便利に
_ なりました。M5STACK や e-Paper に対する 対応をされ Bodmer氏に
_ 感謝致します。

eSPI Library:
_ rev : 0.20.10
_ rev : 0.20.13 : 2013.04.21 : TFT_DC , TFT_CS
_ rev : 0.20.14 : 2013.04.24 : ePaper, SD, drawXBitmap, Fix111(not font)
_ Bug : TST_CS does not output in ESP32_PARALLEL : 2018.04.24

M5STACK のサンプル:
_ M5STACK発売後に M5の全サンプルを画像表示しようかと思いましたが
_ 既にある eSPI Library と同じである為 M5の紹介では表示しませんでした。
_ 時期的に eSPI Library の方が早く M5のサンプルは eSPI Library の
_ サンプルを使用した物と思われます。


.

Written by macsbug

4月 17, 2018 at 3:00 pm

カテゴリー: ESP32

Make a battery module for M5STACK

leave a comment »

M5STACK の バッテリーモジュール を作りました。         2018.04.12

容量は 1050mAh,  1300mAh,  2600mAh です。
費用は 567円,  567円,  786円 です。

Li-IONバッテリーは 使用方法により火災の原因になりますので注意してください。
使用するLi-IONバッテリーに合わせた充電回路を設計する必要があります。
又 並列接続してはいけません。

 1050 mAh ( 567円 )  1300 mAh ( 567円 )
 2600 mAh ( 786円 ) 要注意! Connector Side

 

M5STACK OscilloScope へ 2600 mAh を装備。
重要な注意
_ Li-IONバッテリーは 並列接続してはいけません。火災の原因になります。
_ 2600mA 並列接続は 単にレイアウトの件で表示しました。
_ 並列接続の場合は 適切な回路を搭載する事が必要です。
_ 今回、この適切な回路は掲示していません。


.
準備:

No NOMEN 販売店 価格 Note
1  PROT Frame   ( height   6.5 mm )  自作(31分)    11円 OBJET
2  PROT Frame   ( height 15.0 mm )  自作(59分)    19円 OBJET
3  Rear Cover     ( height   4.0 mm )  自作(31分)    11円 OBJET
4  0.3mm厚基板 C Type  72x47mm  秋月電子通商  120円 0.3mm厚
5  BATTERY NP-70  3.7V 1050mA ( height 7 mm )  杉元ガレージ  200円 秋葉原
6  BATTERY NP-40  3.7V 1300mA ( height 9 mm )  杉元ガレージ  200円 秋葉原
7  ピンソケット 2×22 44P  秋月電子通商  150円 秋葉原
8  JST 1.25mm 2-Pin Wire and connector  ebay    22円 20ea 425円
9  M2 Hex Head Tapping Screw ( 4 ea )  ebay    28円
10  M3 Stainless Steel Hex Screws ( 2ea )  ebay    25円
11  ワイヤー等  在庫品     0円
 —————————————  —————-  ——-  ———–
1050 mAh TOTAL   567円
1300 mAh TOTAL   567円
2600 mAh TOTAL   786円

 

注意:電源は 極性に注意が必要です。接続前に必ずテスターで極性を確認します。
_ JST 1.25mm Battery Connector Pin は 通常 [ + RED ], [- BLACK ] Wire です。
_ M5STACK 本体の Baterry Connector は この逆の並びで 要注意です。

秋葉原の杉元ガレージ(日曜日)では NP-40 が沢山あり 10個購入して おまけで
1500円 + 2個でした。1個 125円です。2018.04.15


.
工作:
_ 参照:Make a case of M5STACK ( 2018.03.10 )
_ 参照:Make M5STACK’s PROT Module ( 2018.03.15 )
_ 参照:Make a case of M5STACK ESP32 Oscilloscope ( 2018.04.03 )
_ バッテリーの接続は JST 1.25mm 2-Pin で 行うと便利です。
_ 重要事項:配線後 及び 接続前に必ずテスターで極性を確認してください。


.
感想:
_ 販売品:M5STACK Store の Battery Module は 850mAh ( $16.90 )です。
_     作ると M5STACK の設計の良さを体験できます。
_ 携帯:M5STACK を 携帯で使用する時は バッテリー接続が便利です。
_  装備する フレームによっては M5STACK Store に無いサイズの物が必要に
_  なり 今回の様な 使用方法も便利かと思います。
_ 並列接続:Li-IONバッテリーは 並列接続してはいけません。火災の原因になります。
_  理由は、リチウムイオン電池が破損し内部抵抗が小さくなる場合、
_   並列で繋げた他の電池から電気が流れ込むことがあります。
_   この時に電流が大きくなるとその分、熱を持ちます。並列で繋がった
_   リチウムイオン電池は、1つが壊れると一気に壊れた電池に電流が流れ
_   込み、触れないぐらいの熱をもったり、燃えたりする可能性があります。
_  参考:瀧/TAKI’s Blog:
_   「知っておくべきモバイルバッテリーの12の法則(改訂版:2014/12/23)
_
_ 費用:秋葉原の中古屋にある 200円の Battery と 3D Printer の 材料代です。
_ メモ:オシロスコープは 1KHz 程度の性能ですから あまり期待しない事。


 

Written by macsbug

4月 12, 2018 at 7:00 pm

カテゴリー: ESP32, Make

Make a case of M5STACK ESP32 Oscilloscope

with 4 comments

M5STACK ESP32 Oscilloscope のケースを作りました。       2018.04.03

botofan calin氏 作成の「M5Stack-ESP32-Oscilloscope」が
2018年3月31日に公開されました。待ち望んだアプリの公開です。
botofan calin氏 に 感謝致します。

費用:1196円。大きな費用は BNC コネクター 4個で400円です。

Input は 2CH ( GPIO 35, 36) で Output は 2CH ( GPIO 2, 5 )です。

仕様:メニューは 以下の項目があり SELECT で 詳細な設定ができます。

  1. Run/Stop
  2. Channel 1 range : 1, 0.5, 0.2, 0.1V, 50mV
  3. Channel 2 range : 1, 0.5, 0.2, 0.1V, 50mV
  4. Channel 1 and 2 rate : 5, 10, 20ms/DIV
  5. Channel 1 mode (Normal, Inverted, Off)
  6. Channel 2 mode (Normal, Inverted, Off)
  7. Channel 1 Offset
  8. Channel 2 Offset
  9. Trigger Channel : 1 or 2
  10. Trigger mode Auto, Normal, Scan
  11. Trigger Level
  12. Trigger Edge: Rising (UP) or Falling (DN)

追記:2018.04.06 「M5Stack-ESP32-Oscilloscope」のアップデートがありました。
_   MENU が追加され 操作しやすくなりました。
_  

使用例:左は INPUT。右下は OUTPUT です。


準備:

No NOMEN 販売店 価格 Note
1  OscilloScope PROT Frame (高さ 15mm)  自作(59分)    19円 OBJET
1  OscilloScope PROT Frame (高さ 15mm)  自作(73分)    11円 uPrint
1  OscilloScope PROT Frame (高さ 15mm)  自作(48分)      0円 Replicator
2  Battery PROT Frame          (高さ 6.5mm)  自作(31分)    11円 OBJET
3  Rear Cover PROT Frame   (高さ 4mm)  自作(42分)    55円 OBJET
4   0.3mm厚基板 C Type  72x47mm  秋月電子通商  120円 0.3mm厚
5   1.0mm厚基板 C Type  72x47mm  秋月電子通商  120円 1.0mm厚
6  ピンヘッダ (オス) 2×30 (60P)  秋月電子通商    25円
7  ロープロファイルピンソケット 2×15, 30P  秋月電子通商    40円
8  ピンソケット 2×20 40P  秋月電子通商   150円
9  BNC コネクタ ( 1個 100円) 4 個  秋月電子通商  400円
10  M2 Hex Head Tapping Screw (8 ea )  ebay    56円
11  BATTERY NP-40  3.7V 1300mA  杉元ガレージ  200円  秋葉原
12  RF ケーブル, ワイヤー等  在庫品       0円
 —————————————  —————-  ——-  ———–
TOTAL  1196円 OBJET

他の部品:

No NOMEN 販売店 価格 Note
1  オシロスコープ ケーブル  CompuAce 秋葉原
1  BNC コネクター  ラジオストアー2F 山本電機  150円 秋葉原
1  BNC SMA 変換コネクター  ラジオストアー2F 山本電機  250円 秋葉原
1  BNC SMA 変換コネクター  CompuAce  124円 秋葉原
2  RFコネクターケーブル  CompuAce 秋葉原

 

部品の入手方法:
コネクター:
_ 一番安い店は 地下鉄「末広町駅」近く、秋葉原の「CompuAce」です。
バッテリー:
_ カメラ用の四角いものが最適です。ただし 通常は高いです。
_ 秋葉原の杉元ビル杉元ガレージ (中古品)で 200〜300円で入手できます。
_ このバッテリーは M5STACK の PROT Module の大きさに入ります。
_ 容量のあるバッテリーを使用すると便利になります。バッテリーは 価格が高い為
_  事前に品質良く、安い製品を探しておくと良いです。新品で購入しやすい製品は
_  ロワ・ジャパン ROWA @ JAPAN の NP-70 1250mAh Li-ion です。


組み立て:
_ INPUT は GPIO 35, 36 へ配線します。OUTPUT は GPIO 2, 5 へ配線します。

   
   

 

メモ:
コネクターの高さ:
_ スタック構造ですので コネクターの高さが重要です。
_ 接続コネクターによって 高さが異なることや インターフェースの高さも影響します。
_ これらを考慮して 幾つかの FRAME や コネクターを用意して 高さを調整します。
_ 基板の厚さも重要です。 使用しているのは 1mm厚と 0.3mm厚の基板です。

_ SG = 1KHz の例:twitter: 周波数範囲を理解して使用します。
_ 


感想:
botofan calin氏 作成の「M5Stack-ESP32-Oscilloscope」は 多数の項目があり
_ それぞれの項目で電圧やレンジを変更できます。操作して その出来具合に
_ 感心しています。
_ M5SATCK の目的の1つにオシロスコープの製作がありますが
_ botofan calin氏により 作成されました。 私の自作案より 遥かに完成度が高く
_ 感激しています。botofan calin氏に感謝致します。
_ 公開当初、スピーカーから異音がでる不具合がありましたが その後 他の件
_ も含め Revision が実施されています。commit には 多数の Revision があり
_ 敬服致します。
_ M5STACK は ケースに入っているので使用しています。それに合わせて
_  綺麗なケースを作りたくなります。


Written by macsbug

4月 3, 2018 at 11:38 am

カテゴリー: ESP32, Make

Make M5STACK’s PROT Module

leave a comment »

M5STACK の PROT Module を作りました。         2018.03.15

M5STACK Store:PROT Module


.
準備:
_ DIY : M5STACK PROT Module:合計:215円。
_ ebay の Screw を除き 国内の部品で製作しました。
_ PROT Frame は 3D Printer OBJET で製作しました。
_ 3D Printer : MakerBot Replicator の場合は 2.35g ( 7円 ) で 合計 180円です。
_ M5STACK の PROT Module ($9.9) には 叶いませんが 自由な物が作れます。
_ 基板は 0.3mm厚 と 1.0mm厚があります。

No NOMEN 販売店 価格 Note
1  PROT Frame  自作    42円 OBJET
1  PROT Frame  自作     7円 Replicator
2   0.3mm厚基板 C Type  72x47mm  秋月電子通商  120円 0.3mm厚
2   1.0mm厚基板 C Type  72x47mm  秋月電子通商  120円 1.0mm厚
3  ピンヘッダ (オス) 2×30 (60P)  秋月電子通商    25円
4  M2 Hex Head Tapping Screw (4 ea )  ebay    28円
 —————————————  —————-  ——-
TOTAL  215円 OBJET
TOTAL  180円 Replicator

 

廉価版部品リスト:追記 2013.03.16

No NOMEN 販売店 価格 Note
1  PROT Frame  自作     7円 Replicator
2   1.0mm厚基板 C Type  72x47mm  秋月電子通商  120円 1.0mm厚
3  ピンヘッダ (オス) 2×30 (60P)  秋月電子通商    25円
4  Screw : 2×5 タッピン A ナベ ( 4 ea )  西川電子部品      6円 100個150円
 —————————————  —————-  ——-
TOTAL  158円 Replicator

 
コネクター:
_ 2 x 30 Pin ストレートを 2 x 15 Pin にして使用します。
_ M5STACK のピンは オスとメスの2つを装着しますが 手間や部品費を
_ 考慮して ストレートのピンを使用しました。
_ 出力側のピンは ハンダ後に 10mm の長さがあり ピンソケットタイプで
_ 接続が可能です。

 
Screw:M2 Size の Hex Head Tapping Screw は 秋葉原で入手できず ebay から
_   購入しました。
_   国内では 秋葉原 西川電子部品にある 「タッピンAナベ」「 2 x 5 」
_   のプラスネジが使用できます。( 1袋 100個 150円 )
_   M2 に対するネジ穴は 1.8mm では少し固く 2.0mm では 程よく軽く
_   ねじ込めます。ただし 何度もねじ混みますと 緩めになってきます。


.
工作:

1. PROT Frame:3D Printer で作ります。
_ Screw を止めるネジ穴の場所は 基板の穴の位置に合わせます。
_ 後日談:検討を重ねると ネジ穴は M5STACK の PROT と同じにした方が良いです。

2. 基板カット:赤線部分を切ります。M2 Screw用の穴も空けます。M-BUS側。

基板とコネクターの位置。M-BUS側。
___

3. PCB と コネクター:
0.3mm厚の基板:ハサミで切れる基板で加工が楽です。
_ 2 x 30 Pin コネクターは 半分 ( 2 x 15 ) にします。
_ 短いピンは M-BUS 側にします。
_ M-BUS とコネクターの高さ調整は PC Board 2枚(0.6mm)を入れます。
_ この高さにより PROT Board コネクター と M5STACK M-BUS
_ との距離と接触が最良になります。
_ 注意:M-BUS と PROT Module コネクターの位置は微妙です。
_    ハンダ付け時は M-BUS との位置も確認してハンダ付けします。
_    位置決めは コネクターをフレームに取り付け、M-BUS にコネクター
_    を差し込んで 数カ所ハンダ付けし 残りは外してハンダ付けします。
_    M5STACK の メスのコネクターに負担を与えないようにします。
1.0mm厚の基板:万能ハサミなら切れます。
_ 1.0mm厚基板 CType(72x47mm) の場合、Spacer は不要です。

4. PROT Frame に取り付け:画像の向きに Screw で止めます。

OBJET + 0.3mm PCB + M2 Hex Head Tapping Screw:215円。

Replicator 2X + 1.0mm PCB + 2×5 Tapping Screw:158円。


.
感想:
M5STACK を綺麗に仕上げるにはケースが必要です。3D Printer での基本のデーター
_ が出来ましたので 短時間に低価格で応用ができるかと思います。
M5STACK で使用している オスとメスのコネクター(少し長め) を ebay から
_ 購入しましたが 基板の表と裏にハンダ付けするのが面倒ですので やめました。
_ M5STACK に使用しているコネクターは L型で 基板上に乗せてハンダ付け
_ してあります。製作時にコネクターの位置が ずれないかと感心しています。
スタック:M5STACKは スタックする為に同じ場所に コネクターをそろえています。
_ 製作時には基板両面にコネクターを付ける事になります。
_ 基板に余裕があれば オスとメスのコネクターの位置は 別な場所でも可能かと
_ 思っています。


 

Written by macsbug

3月 15, 2018 at 10:42 am

カテゴリー: ESP32, Uncategorized