macsbug

M5Stack speaker noise reduction

leave a comment »

M5Stack の スピーカーノイズを 低減する方法。       2019.09.27

M5Stack の スピーカー は ノイズがでます。

Noiseless PROTO Module を 製作しました。


課題:
_ M5Stack の 課題に スピーカーの「ノイズ」と「歪み」があります。
_ 今回は ノイズの原因と対策が主題ですが、歪みの件も含めて記載しています。


方法:
_ 1. PROTO基板の製作時に GPIO25 Pin ( DAC ) を外します。
_ 2. もしくは PROTO基板の GPIO25ピンをカットします。この場合
_   ピンのカット面と M-BUS 側ピンの距離が近くならない事。


ノイズレス PROTO基板 の 接続方法と効果:
_ GPIO25ピン無しのPROTO基板 だけか 他のPROTO基板へ接続すると
_ スピーカーノイズは 無くなります。最も効果のある方法です。
_ ただし、M5Stackの基板で発生するノイズはそのままです。
_ M5Stackの基板上で発生するノイズは 機種やバージョンで異なります。
_ ディスプレーに表示する画像によっても異なります。


原因:以下、1と2に分類して述べます。
_ 1. PROTO Module と BOTTOM Module。
_ 2. M5Stack の設計 と レイアウト。


1. PROTO Module と BOTTOM Module。
_ 原因:MOSI (GPIO23) の 輻射ノイズ
_ 理由:接続したPROTO基板の GPIO23,25がアンテナになり GPIO25に乗る。

_ MOSI信号はディスプレー信号に使用しています。
_ 画像によっては MOSI の周波数成分が多くなりノイズが増えます。
_  M5Stack Electronic Animated Eyes でノイズ増加が解ります。
_ スケッチによっては 周波数が 80MHz に高くなる場合があります。
_ PROTO基板上に GPIO25のパターンがあるとノイズを拾います。
_  基板の長さ 50mm等の長い場合は かなり大きなノイズになります。
_  60mmのパターンの基板を作成しノイズが増加するのを確認しました。
_ M-BUS の GPIO25 ( DAC ) は ピン有るだけでも 隣のGPIO23( MOSI )
_  から輻射ノイズを拾います 。
_ M-BUSの設計:GPIO25は D級アンプの入力に使用している為、
_  GPIO23の隣 もしくは M-BUSにピンを立てるべきではない。

_ ノイズがでる要素:( してはいけない設計 )。
_  GPIO23 と GPIO25 の配置を 2.54mm 以内。
_  GPIO25 の長い配線。
_  M-BUSに GPIO25ピンを立てる。
_  BOTTOM Module を接続する。
_  GPIO25 のパターンが長い PROTO基板を接続する。
_  M5Stack Electronic Animated Eyes の様な複雑な画像を表示する。

_ 確認:テスターで誘導電圧を確認できます。
_  23と25間にワイヤーを近接すると誘導される事が解ります。
_  周波数成分の大きいMOSI信号時も同様です。

_ 原則:M-BUS MOSI と M-BUS DAC は 隣に配置してはいけない。
_  レイアウトミスと判断しています。


2. M5Stack の設計 と レイアウト。図は M5Stack BASIC の回路図。

_ 

_ 基本:M5Stack BASIC
_  基板のバージョンによってノイズの大きさが異なる。
_   BASIC:2017.6。BASIC:2018.3 NOIS 大。GRAY:2017.6。
_  液晶バックライトのPWM制御10KHz の影響(可視聴)がノイズになる。
_   10KHzの周波数を可視聴外に変更する案:
_   参考に記載した lovyan03氏の #142#147。lovyan03氏に感謝致します。

_  PGND:回路図は ANALOG GND だが 現物の配線はなし。
_   調査:PCB は基板 BAT Connector 横の日付(DATE CODE)です。
_   BASIC(PCB=2017.6 ) ;NS4150B_4 – C44 – open。
_   BASIC(PCB=2018.3 ) ;NS4150B_4 – C44 – open:*openをGNDでノイズ大。
_   GRAY (PCB=2017.6 ) ;NS4150B_4 – C44 – open。
_   GRAY (PCB=2017.11 );NS4150B_4 – C44 – GND。
_   FIRE (PCB=2018.2A) ;NS4150B_4 – none – GND。BASICより音質は良い。

_   図面通りの GND(DC) にすると 基板のバージョンによっては多少改善
_   されるが ノイズは解決しない。
_   理由1:
_    IC:回路図は NS4148 だが 現物は NS4150 ( NS4150B )。
_    NS4150 Data Sheet V1.0 の Typical Application Circuit には
_    入力( INP, INN ) に 30KΩが接続されているが M5Stack は無し。
_    内部抵抗 30KΩ内蔵のNS4148 を取り付けてみましたが 動作不可。
_    mはげ氏は NS4150Bの入力に 30KΩを接続したが 結果得られず。

_    歪み:アンプの入力範囲が狭い設計になっている。
_    mはげ氏の情報:この件でハードとソフトで多大な調査と努力を
_     されています。mはげ氏に感謝致します。
_    @Tw_Mhage:M5Stackのスピーカーの音質が悪い原因と対策
_    以下は 上記の記事、mはげ氏の記事と画像を記載させて頂きます。
_    「M5StackのD級アンプNS4150の出力測定結果。テスト信号は
_     800Hz 正弦波。NS4150推奨回路の入力抵抗はなくても入出力
_     はほぼ比例し ゲインは約2.94。出力は±1.6Vでクリップされる。
_     音が割れないようにするためにはDAC出力の振幅を0.54V以内
_     に抑えればいい。」
_    結論:プログラミング:
_     NS4150B をプログラムで使用する場合、入力は 最大 0.54Vac
_     に押さえる必要があります。これを超える入力をすると出力が
_     歪みます。つまり M5StackのDAC出力の振幅は0.54V以内
_     ある事。
_     
_     

_   理由2:GND電位がゼロにならず 不安定になり ノイズが発生する。
_    レイアウト設計の不足。
_    NS4150 の入出力から M-BUS への配線は ノイズ対策が不足。
_    ただし、回路としてはこの程度かと判断しています。

_    他社の製品:
_    理由は 他の ODROID-GO ( ESP32 + PAM8304Aアンプ) の回路では
_     入力抵抗を付け 特別なノイズ対策無くとも ノイズ無く動作している。

_      以下の図は ODROID-GO の回路図。
_    

_   TTGO製品(ESP32)の場合:TTGO製品は多数のバージョンがある。
_    TTGO T4_v1.3 は NS4150 4pin PGND は OPEN。パラメーターは異なる。
_    
_    TTGO T10_v1.8 は PCM5102Aを採用している。
_    
_    結果、TTGO の AMPは変更され NS4150 は問題である事を示しています。

_   M5Stack Fire は C44 を除去しノイズが低下している。
_    対策:M5Stack Team はノイズ問題を認識し C44 Remove を考案した
_       事を示しています。
_    理由:部品からノイズを拾う事を防止している。

_   M5StickC Speaker AMP:
_    D CLASS AMP は PAM8303 を使用しています。
_    これは NS4150 でなく PAM8303 が正解である事を示しています。

_  電源:USB電源使用せず EA3036(LDO)の入力に バッテリー入力
_     (DC電池)のみでもスピーカーノイズは出る。

_  NS4150B の電源停止方法:
_   EA3036 LDO にある T1 端子をショートします。
_   ショートにより EA3036-19 ( sw3 ) がオフになり AMP PWR が無くなります。

_ ソフトによるノイズの低減:
_  以下を記載し DAC をオフにし スピーカーを無音にします。

dac_output_disable(DAC_CHANNEL_1);  // Sound OFF

_   dacWrite(25, 0); で AMP を OFF にし 効果がでる場合もあります。

_  結論:本体基板のハードの改善は無理がある。
_     パターン幅が小さく 素人では パターンが剥がれる。
_     ハードの改修も可能ですが 改造は多くの人には無理です。

 


❌ ノイズ対策の無い製品:
スイッチサイエンス販売 委託品:幾つかの製品を見かけます。
_ 1. 使用しないにもかかわらず、GPIO25 のパターンを配線している。
_ 2. M-BUS GPIO23, 25 で 1.27mm ハーフピッッチでスルーホール
_  を作り配線している。距離が短くなり さらにノイズがでます。
_ 3. M-BUS の延長と称してフラットケーブルで延長するボード。
_  これは確実にノイズが出ます。
_ どうも 設計ミスの製品が多い事と 不完全な商品を販売しています。

⭕ ノイズ対策をしている基板:
_ この情報を得てか M5Stack で開発している ある基板は
_ GPIO25 ピンは配線していません。

◯ ノイズ対策の回答:対症療法
_ M5Stack Community での ノイズの質問は 「BOTTOM を外して見てください」
_ と言う対症療法の回答があります。 これは BOTTOMの配線で GPIO25が
_ 延長され ノイズが発生する事を示しています。


参考:
NS4148:NS4148 Data Sheet V1.1
NS4150:NS4150 Data Sheet V1.0
Odroid-GO:
_ 回路図:Hardware tunning for silent the sound volume of ODROID-GO
_ Odroid PAM8304A:Odroid-GO support #10
_ PAM8304 pdf
mはげ氏の M5Stack D級AMPの調査
@Tw_Mhage:M5Stackのスピーカーの音質が悪い原因と対策
M5Stack Community:So much noise!:dacWrite(25, 0); でも消えない。
M5Stack Community:Noise on speaker
_ オーディオラインが適切に設計およびシールドされていない。
_ ledcDetachPin(SPEAKER_PIN); pinMode(SPEAKER_PIN,INPUT);
ESPRESSIF:M5Stack to be Relaunched with ESP32
lovyan03:PWM control of the backlight emits unpleasant 10 kHz noise #142
_   バックライトのPWM制御は10KHzで聞こえる周波数。これを44.1KHzに
_   すると不快な10KHzノイズをオフにできる。
lovyan03:Modify: Suppress the mosquito noise that LCD backlight PWM emits. #147
BLOG:M5stack tetris with sound:無音にするメモ。
BLOG:Low cost PROTO Module of M5STACK:国内製品のコネクターを使用できます。
BLOG:Low cost PROTO module of M5STACK Part 2:国内製品のコネクターを使用。
_ 国内製品のコネクターを使用すると M-BUS との接触が良くなります。
_ 理由は オリジナルは M-BUS コネクター下 0.1mm, コネクター間の隙間 0.1mm
_  があり 接触が低下。国内製品のコネクターを使用すると 合計 0.2 mm
_  分の接触を得る事が出来 良くなります。


感想:
1. NS4150:NS4148 や NS4150 は既存のスマホに使用され 動作的に完成
_ されていますが M5Stack は ノイズがでます。
_ アンプの設計とレイアウトの 作り込みが少ないと判断します。

2. 実験による数値:
_ 実験も踏まえ電圧値も取得しましたが 対策がある為 数値は記載しません。

3. 設計:
_ レイアウトの重要性:Display 信号のMOSI (23) と SCK (18) が 逆の配置
_           ならば ノイズは発生しません。
_ M5Stack のバージョン:
_  ATMEGA328P, ESP8266, ESP32 の多数のバージョンがあります。
_  バージョンによって M-BUS の配置が異なっています。
_  例として ESP32版でも幾つかあります。
_  ESP32 M5Stack は 2017年3月28日に ESPRESSIF と契約。
_  この時の M5の内部レイアウトと M-BUS(M5-BUS) は現在とは異なる配置。
_  ESPRESSIF:M5Stack to be Relaunched with ESP32
_ 
_  この時の MOSI(9)とDAC 1(16) の配置は離れています。
_  つまり あるバージョンでは M-BUSの配置が異なる為に ノイズの発生は
_  無いが 何かの理由で 現在の配置になり 輻射波の問題が発生した。
_  と言う経過です。
_  M5Stack Store からの販売は 2017.10.23 (BASIC $35.00) からです。
_ 原因を踏まえ  M5Stack で基板を開発している人に 参考になればと
_ 思います。是非、素晴らしい基板を設計、製作する事を期待しています。

4. 投稿:かなり以前に下書きをしていましたが 投稿が遅れました。

5. 使用している基板は tomorrow56氏に 製作して頂きました。
_ 低価格で沢山あると 今回の様な 実験や使用が簡単にできます。
_ M5Stack の PROTO基板とは異なる「ある工夫」がしてあります。
_ 精度によりますが 個人の3D Printer でケースを製作する事が可能です。
_ この PROTO Module は 私と都内で合える場合はお渡し出来ると思います。
_ tomorrow56氏に販売をリクエストすると 答えてくれるかと思います。
_ tomorrow56氏は thousandiy で 幾つかの開発製品を販売しています。
_ 基板を見ると解るかと思いますが 氏の技術レベルは高く信頼性があります。

 

.


M5Stack ,  スピーカー , ノイズ , NS4148 , NS4150 , NS4150B , FIRE , DAC ,
MOSI , EA306 , T1 ,

Written by macsbug

9月 27, 2019 at 3:00 pm

カテゴリー: M5STACK

Operate M5 Whell (moio) with RCWControll

leave a comment »

M5 Whell ( moio ) を RCWController アプリ で操作しました。 2019.08.26

RCWController アプリは ゲームパッドのインターフェイス を持ち、
iPhone や iPad で 操作する事ができます。

 M5 Wheel ( moio ) RCWController

RCWController の機能:UDP通信でWi-Fi機器と接続でき、ジョイスティク や ボタン
_ などを タップすることで、操作に対応するデータが送信されます。

RCWController ダウンロード:App Store RCWController。micutil氏に感謝致します。

robo8080氏のブログに RCWController アプリを使用した記事、
ESP32-DevKitCに、RCWControllerを接続してみた。」があります。
その github に ESP32とRCWControllerを接続するテストプログラム
ESP32_RCWController_Test」があり 設定、操作、データの仕様が書かれています。
上記からダウンロードして RCWController.h を入手します。robo8080氏に感謝致します。

以上から RCWController.h を使用し、M5 Whell ( moio ) のスケッチを作成しました。

仕様:今回のスケッチは Right Joystick 操作のみです。
_  必要に応じて 他の操作を追加します。
_  追加機能は Loop内の x , y に 操作の値を入れます。


.
データフォーマット表: Operation と buffer[ 0 to 9 ]
_ 縦軸は Operation、横軸は 0 – 9 で buffer[ 0 to 9 ] の配列です。
_ 例:Right Joystick の UP / DN は 配列5の値が UP は 255 , DN は 1 です。
_ 例:Right Joystick の Right/Left は 配列4の値が Right は 255 , Left で 1 です。

Operation \ buffer 0 1 2 3 4 5 6 7 8 9
 ……………………………. ……… ……… ……… ……… ……… ……… ……… ……… ……… ………
 R JOY CENTER 128 128 9
 R JOY UP 255 9
 R JOY DN 1 9
 R JOY R 255 9
 R JOY L  1 9
 R PUSH SW Y 16 1
 R PUSH SW A 32 1
 R PUSH SW B 64 1
 R PUSH SW X 1 1
 R1 8 1
 R2 16 1
 L1 2 1
 L2 4 1
 SELECT 12 1
 START 3 1
 L JOY CENTER  128 128 18
 L JOY UP 255 18
 L JOY DN  1 18
 L JOY R 255 18
 L JOY L 1 18
 L TOGGLE UP 1 1
 L TOGGLE DN  2 1
 L TOGGLE R  4 1
 L TOGGLE L  8 1
 R ACCEL CENTER 128 128 1 97
 R ACCEL UP 1 1 97
 R ACCEL DN 255 255 97
 R ACCEL R 255 255 97
 R ACCEL L 1 1 97
 L ACCEL CENTER 128 128 1 65
 L ACCEL UP 1 1 65
 L ACCEL DN 255 255 65
 L ACCEL R 255 255 65
 L ACCEL L 1 1 65
 ……………………………. ……… ……… ……… ……… ……… ……… ……… ……… ……… ………
Operation \ buffer 0 1 2 3 4 5 6 7 8 9

.
作成:
_ RCWController と Blynk 、Servo のスケッチを合体しました。
_ iOS RCWController アプリからの値は データフォーマット表に示す 1 〜 255 です。
_ M5の Blynk servo ルーチンでは この値を 255 〜 -255 で使用します。
_ これにより void loop内で map命令にて 以下の様に変換しています。
_ 例:x = map(buffer[4], 1, 255, 255, -255); // R JOYSTICK X
_ 後に Blynk servo ルーチンは 見やすくする為に while文から if文に変更しました。

接続方法:
_ 1. iPad の WiFi設定 は ESP32-RCWC を選択します。 Password は esp32pass です。
_ 2. RCWController アプリを動かし 中央の ON ボタンで WiFi接続します。
_  もしくは接続時に IP が表示されます。
_ 3. 右下側の ANALOG ( pink ) を選択し Joystick にします。
_ 4. Joystick で操作が出来ます。


.
参考:
M5 Wheel Module ( moio )
Make M5Stack Servo Module
robo8080のブログ:ESP32-DevKitCに、RCWControllerを接続してみた。
ESP32_RCWController_Test


.
感想:
身近な iPhone や iPad で操作出来ると簡単です。
Blynk:前回記事の Blynk は ネット接続が必要で 不便です。
RCWController の 接続は iPad と M5 moio 間で接続する時に便利です。
PS4 等の専用コントローラーで操作出来るとさらに便利になります。
コントローラー以外に、自動操縦の機能が出来ると良いかと思っています。

BeetleC:操作性の良く無い BeetleC のコントローラーに使用出来ます。


.
スケッチの構成:
_ 

スケッチ:M5 moio RCWControll :
_ ORG : : 2019.08.26 : macsbug
_ rev.1 : battery, motor : 2019.09.01 : macsbug
_ rev.2 : UDP, Operability of x : 2019.09.05 : macsbug
仕様:Right Joystick のみのスケッチです。
.

// M5Stack moio + RWCController JoyStick: org 2019.08.26 : macsbug
// rev.1 : battery, motor                   : 2019.09.01 : macsbug
// rev.2 : UDP, Operability of x            : 2019.09.05 : macsbug  
// https://macsbug.wordpress.com/2019/08/26/operate-m5-whell-mono-with-rcwcontroll/
// RCWController Test Program for ESP-WROOM-32 2017/4/3 by robo8080
// https://github.com/robo8080/ESP32_RCWController_Test
// https://macsbug.wordpress.com/2019/08/21/m5-wheel-module-moio/
// https://homemadegarbage.com/esp32_minirobot01
// https://mvdlande.wordpress.com/2019/06/02/drv8833-motor-driver-module/
// DRV8833 + M5Stack + DC MOTOR
// INx  :GPIO:  OUTx : MOTOR   :CH : 
// IN1  :  5 :  OUT1 : RIGHT - : 1 : 
// IN2  : 17 :  OUT2 : RIGHT + : 2 : 
// IN3  : 13 :  OUT3 : LEFT  + : 3 : 
// IN4  :  0 :  OUT4 : LEFT  - : 4 : 
// DRV8833 H-BRIDGE
// IN1 = PWM, IN2 = 0   : Foword  PWM, fast decay
// IN1 = 1  , IN2 = PWM : Foword  PWM, slow decay
// IN1 = 0  , IN2 = PWM : Reverse PWM, fast decay
// IN1 = PWM, IN2 = 1   : Reverse PWM, slow decay
// Controll/buffer:   0   1   2   3   4   5   6   7   8   9
// ---------------: --- --- --- --- --- --- --- --- --- ---
// R JOY CENTER   :                 128 128               9
// R JOY UP       :                     255               9 
// R JOY DN       :                       1               9
// R JOY R        :                 255                   9
// R JOY L        :                   1                   9
// R PUSH SW Y    :      16                               1
// R PUSH SW A    :      32                               1
// R PUSH SW B    :      64                               1
// R PUSH SW X    :   1                                   1
// R1             :   8                                   1
// R2             :  16                                   1
// L1             :   2                                   1
// L2             :   4                                   1
// SELECT         :      12                               1
// START          :       3                               1
// L JOY CENTER   :         128 128                      18
// L JOY UP       :             255                      18
// L JOY DN       :               1                      18
// L JOY R        :         255                          18
// L JOY L        :           1                          18
// L TOGGLE UP    :       1                               1
// L TOGGLE DN    :       2                               1
// L TOGGLE R     :       4                               1
// L TOGGLE L     :       8                               1
// R ACCEL CENTER :   0   0 128 128 128 128 128 128   1  97
// R ACCEL UP     :   0   0 128 128 128   1 128   1 128  97
// R ACCEL DN     :   0   0 128 128 128 255 128 255 128  97
// R ACCEL R      :   0   0 128 128 255 128 255 128 128  97
// R ACCEL L      :   0   0 128 128   1 128   1 128 128  97
// L ACCEL CENTER :   0   0 128 128 128 128 128 128   1  65
// L ACCEL UP     :   0   0 128   1 128 128 128 255 128  65
// L ACCEL DN     :   0   0 128 255 128 255 128 255 128  65
// L ACCEL R      :   0   0 255 128 128 128 255 128 128  65
// L ACCEL L      :   0   0   1 128 128 128   1 128 128  65
// ---------------: --- --- --- --- --- --- --- --- --- ---
// Controll/buffer:   0   1   2   3   4   5   6   7   8   9

#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include "RCWController.h"
const char ssid[] = "ESP32-RCWC";
const char pass[] = "esp32pass";
WiFiUDP udp;
unsigned int localPort = 10000;
const int PACKET_SIZE = 256;
char packetBuffer[PACKET_SIZE];
long S, L, R, c1, c2, c3, c4, x = 0, y = 0;
char buff[32]; // UDP buffer

int8_t getBatteryLevel(){
  Wire.beginTransmission(0x75);
  Wire.write(0x78);
  if (Wire.endTransmission(false) == 0
    && Wire.requestFrom(0x75, 1)) {
    switch (Wire.read() & 0xF0) {
    case 0xE0: return 25;
    case 0xC0: return 50;
    case 0x80: return 75;
    case 0x00: return 100;
    default: return 0;
    }
  }
  return -1;
}

void battery_level(){
  M5.Lcd.setCursor(0, 200);
  M5.Lcd.print("Battery Level: ");
  M5.Lcd.print(getBatteryLevel());
  M5.Lcd.print("%");
  M5.Lcd.setCursor(0, 220);
  if (getBatteryLevel() == -1){M5.Lcd.print(" or Not USB IP5306");}
}

void motor() {
  S = sqrt( x * x + y * y );
  if ( S > 255 ){ S = 255;}
  M5.Lcd.clear(BLACK);
  M5.Lcd.setCursor(5, 25);M5.Lcd.print("speed: ");M5.Lcd.print(S);
  M5.Lcd.setCursor(5, 65);M5.Lcd.print("x: ");M5.Lcd.print(x);
  M5.Lcd.setCursor(5,105);M5.Lcd.print("y: ");M5.Lcd.print(y);
  R  = 0 ; if (x >= 0){ R = abs(x);}
  L  = 0 ; if (x <  0){ L = abs(x);}
  c1 = c3 = 1 ; if ( y >= 0 ){ c1 = S - R; c3 = S - L;}
  c2 = c4 = 1 ; if ( y <  0 ){ c2 = S - R; c4 = S - L;}
  ledcWrite(1, c1); // ch1, Phase,  5, IN1, RIGHT MOTOR-
  ledcWrite(2, c2); // ch2, PWM  , 17, IN2, RIGHT MOTOR+
  ledcWrite(3, c3); // ch3, Phase, 13, IN3, LEFT  MOTOR+
  ledcWrite(4, c4); // ch4, PWM  ,  0, IN4, LEFT  MOTOR-
}

void setup() {
  M5.begin();
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.setTextSize(2);
  ledcSetup(1,5000,8);ledcSetup(2,5000,8); // channel,freq,resolution_bits
  ledcSetup(3,5000,8);ledcSetup(4,5000,8); // channel,freq,resolution_bits
  ledcAttachPin( 5, 1); // GPIO 5 , ch1, IN1, OUT1, RIGHT MOTOR-
  ledcAttachPin(17, 2); // GPIO17 , ch2, IN2, OUT2, RIGHT MOTOR+
  ledcAttachPin(13, 3); // GPIO13 , ch3, IN3, OUT3, LEFT  MOTOR+
  ledcAttachPin( 0, 4); // GPIO 0 , ch4, IN4, OUT4, LEFT  MOTOR-
  ledcWrite(1,0);ledcWrite(2,0);ledcWrite(3,0);ledcWrite(4,0);// STOP
  battery_level();delay(3000);
  WiFi.softAP(ssid, pass);
  IPAddress myIP = WiFi.softAPIP();
  M5.Lcd.setCursor(5, 15);M5.Lcd.print("AP IP address: ");M5.Lcd.println(myIP);
  M5.Lcd.setCursor(5, 35);M5.Lcd.print("Starting UDP");
  udp.begin(localPort);
  M5.Lcd.setCursor(5, 55);M5.Lcd.print("Local port: ");M5.Lcd.println(localPort);
  M5.Lcd.setCursor(5, 75);M5.Lcd.print("wifi ssid = ESP32-RCWC");
  M5.Lcd.setCursor(5, 95);M5.Lcd.print("password  = esp32pass");
  M5.Lcd.setCursor(5,115);M5.Lcd.print("Operate RCWController");delay(5000);
  M5.Lcd.fillScreen(BLUE);delay(1000);M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(5,25);M5.Lcd.print("START");
}

void loop() {
  int rx = udp.parsePacket();              // UDP packet size
  if (rx) {                                // UDP recive
    int len = udp.read(buff,rx);           // recive lengs
      if (len > 0){                        // recive action
         buff[len] = '\0';                 // Termination clear
         x = map(buff[4],1,255,  50,-50);  // R JOYSTICK X:  50 to -50
         y = map(buff[5],1,255,-255,255);  // R JOYSTICK Y:-255 to 255
         if ( abs(y) < 100 ){ x = x * 2;}  // Operability of x 
         motor();                          // move motor
      }
  } 
}

moio , M5Stack , M5 Wheel Module , RCWController , wifi , UDP ,

Written by macsbug

8月 26, 2019 at 6:00 pm

カテゴリー: M5STACK

M5 Wheel Module ( moio )

with 2 comments

M5 Wheel Module を製作しました。               2019.08.21
全体の名称は moio と言います。

moio moio


.
M5 Wheel Module の Metal Gear Type:費用 1500円

M5 Whell Module ( Metal gear ) M5 Whell Module ( Metal gear )

.
M5 Wheel Module の Plastic Gear Type:費用 760円。

M5 Whell Module ( Plastic gear ) M5 Whell Module ( Plastic gear )

.
M5Stackを除く 2400mA Battery + Servo + Metal  Gear Type:費用 2500円
M5Stackを除く 2400mA Battery + Servo + Plastic Gear Type:費用 1800円。

M5Stack + 2400mA Battery  (640円) Servo Module DRV8833  (330円)
M5 Wheel Module (Metal Gear) (1500円) M5 Wheel Module (Plastic Gear)(760円)

.
構成とサイズ:


.
準備:
1. M5Stack:
2. M5STACK Strongest 2400 mAh Battery Module:633円。
3. Make M5Stack Servo Module:329円。
4. M5 Wheel Module: Metal Gear Type:1492円。
5. M5 Wheel Module:Plastic Gear Type:  752円。


.
費用詳細:
全体 ( moio )
_ 以前の記事にある  2400 mAh Battery ModuleServo Module を組み合わせます。

No Nomen Purchase Price
1  M5Stack
2  2400mA Battery Module  2400 mAh Battery Module     633円
3  Servo Module  M5Stack Servo Module     329円
4  Wheel Module:Metal  Gear  以下の部品表に記載   1492円
4  Wheel Module:Plastic Gear 以下の部品表に記載     752円
= ==================== ================ ======
1 費用総計: Metal Gear   2454円
2 費用総計:Plastic Gear   1714円

 


.
部品表:
⭕ M5 Wheel Module:Metal Gear Type:Gear は金属製です。
_ 価格は円レートにより変化します。

No Nomen Purchase Price
1  3V DC Micro U-Typ Gear Box
. Motor N20 5-4000RPM
. Voltage:3V, Speed:200RPM
.
 ebay:xyfs-us Store
. 輸送期間:7-11日。
. 557円 x 2個(pcs)
 1114円
1 3V DC Micro U-Typ Gear Box
. Motor N20 5-4000RPM
. Voltage:3V, Speed:200RPM
.
 Aliexpress:miniyard Store
. 輸送期間:16day, 9day
. 469円 x 2個(pcs)
.
.追記:2019.08.22:$4.41
  938円
2  Oring 18mm :
. Thickness: 1.9mm
. Outside Dia: 18mm
 ebay:mnsmoresell
. 輸送期間:25日
      12円
3  Screw:8ea
. M2 5mm ナベTapping Screw
 西川電子部品株式会社       12円
4  pcb:0.3mm厚ユニバーサル基板  秋月電子通商:Cタイプ     120円
5  ピンヘッダー 1×6 (6P)  秋月電子通商:6P       20円
6  シングルピンソケット(低メス)14p  秋月電子通商:低メス14P       50円
7  CASE  3D Printer 自作:材料費     340円
8
= ==================== ================ ======
費用総計 ( Total cost )  Motor : xyfs-us Store   1668円
費用総計 ( Total cost )  Motor : miniyard Store   1492円

メモ:Motor の No-load speed(RPM) は  50 から 1000 までの種類があります。
_  50 や 100 は 進む速度が遅いです。
_  150 か 200, 300 が良いかと思います。
_  (計算:150=11cm/s, 200=16cm/s, 300=21cm/s)
_  最初は 150 を使用してましたが その後は 200 又は 300 を使用しています。
_   200 は 適度に速く細かな動作が出来ます。
_   300 は 速度は速く傾く程でなく 機敏な動作をします。
_  追記:2019.08.22 Aliexpress の miniyard Store をリストに追加しました。
メモ:O-Ring は 千石電商で ゴムベルト15mm (163円)が販売されています。
.

⭕ M5 Wheel Module:Plastic Gear Type:赤いケースの中にPlastic Gear内臓。

No Nomen Purchase Price
1  Micro 412 Coreless
. Gear Motor DC 3V
.
 ebay:supersinostore
.  輸送期間:13日. 93円 x 2個(pcs)
 186円
2  Oring 18mm :
. Thickness: 1.9mm
. Outside Dia: 18mm
 ebay:mnsmoresell
.  輸送期間:25日
     12円
3  Screw:4ea
. M2 5mm ナベTapping Screw
 西川電子部品株式会社      12円
4  pcb:0.3mm厚ユニバーサル基板  秋月電子通商:Cタイプ    120円
5  ピンヘッダー 1×6 (6P)  秋月電子通商:6P      20円
6  シングルピンソケット(低メス)14p  秋月電子通商:低メス14P      50円
7  CASE  3D Printer 自作:材料費    352円
8
= ==================== ================ ======
費用総計    752円

 


.
仕様:全重量とタイヤ直径、ギヤー比から速度を計算する。
1. Metal Gear:速度は 1秒間11cm。
_ 全体の重さ:125g :Rorted Torque=63g (2綸の片側)。
_      :補助 2400mA Battery 追加 = 170g
_ タイヤ直径:18mm
_ トルク表から計算:販売店 xyfs-us Store に記載あり。
_ 1. Voltage:3VDC 。( 他に 6V, 12V がある )
_ 2. Speed:150RPM ( 他に 200RPM, 300RPM がある)
_ 3. トルク:3V:NO LOAD SPEED=150, Rorted Torque=63g (2綸の片側)
_ 4. LOAD SPEED:120rpm
_ 5. Roted Torque:100g.cm:Rorted Torque=63g に対し 100g/cm で動く。
_ 計算値:18×3.14=56mm。120/56=2rpm/sec。56×2=112mm/sec
_  結果:11cm/sec

_ メモ:
_ NO LOAD SPEED=150 の場合は 11cm/sec
_ NO LOAD SPEED=200 の場合は 16cm/sec
_ NO LOAD SPEED=300 の場合は 21cm/sec
_

2. Plastic Gear:
_ 1. Voltage:DC3V-3.7V。
_ 2. Speed:300RPM
_ 全体の重さ 125g でも動きます。


.
諸元:
1. Metal Gear:全体の価格の半分を占め、高めになります。
_ 騒音は モーター音 ぐらいで静かです。
_ 価格は高めですが 騒音や複数の稼働環境を考慮すると Metal Gear が良い。
2. Plastic Gear:価格は低価格です。Gearの音が大きいです。
_ 低価格で気楽ですし、少しだけ試すのに良いかと思います。


.
製作:3D Printer で製作しました。白色の6つが Printer の出力です。
.

_ CAD図面:

Metal Gear Plastic Gear

.
_ 配線:Make M5Stack Servo Module を参照ください。
_  注意: Motor回転方向:Motor の + – は Motorにより回転方向が異なります。
_      回転方向が異なる場合は + – の配線を逆にします。

 M5Stack 3V3 GND GPIO 5 GPIO 17 GPIO 13 GPIO 0
 DRV8833 VCC GND IN1 IN2 IN3 IN4
 DRV8833 ULT GND OUT1 OUT2 OUT3 OUT4
 DC Motor L Motor – L Motor + R Motor + R Motor –

.
_ 組み立て完成:Metal Gear Type + Motor

.
_ Motor + Servo Module 組立。+ M5Stack + 2400mA 組立後の裏側。
_ 車輪を含めた高さは 43mmです。
_ 車輪は2個で球体の支えは1個の3本足です。
_ 転倒防止の為に補助の球体の支えがあり 位置は 1mm 低く通常は設置されていません。

.
_ Servo専用 2400mA Battery Module :
_ 画像左 の 2400mA専用バッテリー追加により 長時間動作が可能になります。
_ 高さは 11mm 追加。全体は 45 + 11 = 56mm の高さになります。
_ M5Stackの幅(54mm)より高く見えると デザイン的に綺麗で無くなります。

Added 2400mA Battery ( H=56mm ) moio STANDARD  ( H = 45mm )

.
メモ:
_ 車輪:直径 18mm、幅 2.6mm で 設置面に半円の溝を設け O-Ringを填めます。
_    構造的に横からの力に弱い点が考えられます。
_    強度が足りない場合は 再設計する必要があります。
_ 強度:全体の強度は通常の玩具と比べるとかなり弱いと思われます。
_ 価格:ケースの材料費は 340円 (SCL)。
_    調査:DMM.makeの価格は高く 作る意味が無い為、使用しません。
_    M5サイズで凸凹のかみ合わせ形状に捕らわれずに製作すれば低価格が可能。
_ 接続:M5Stack Proto Board は横にコネクターを出す物が多く見た目が綺麗でない。
_    綺麗さを出す為に コネクター接続は 内部で縦に接続するデザインです。

ABS版(左) と スケルトン版(右):


.
スケッチ作成:
1. BLYNKで操作する。以下を参照に GPIO を設定するとJoystickで操作が可能です。
_ blynkkk/blynk-library:Blynk Library
_ App Store:Blynk – IoT for Arduino, ESP32:iOSアプリ
_ 参考:ホームメイドガービッジ:ESP32 と BLYNK と円形ロボットシャーシーキットと
_ 上記スケッチを参照し M5 Wheel Module ( moio ) 版を作成。
_ リストは この記事の最下位に記載します。
_ 参考:お父ちゃん:M5Stick-Car:I made Blynk-controlled mini Car using M5Stick-C.
_ 
_ ⭕追記:2019.08.27
_  Operate M5 Whell (moio) with RCWControllRCWController アプリ操作方法。
_  iPhone (iPad) と M5 moio 間で直接 WiFi 接続するので便利です。
_  
.
以下、他の方法を示します。
2. JoaoLopesF氏の ESP32MotorControl Library を使用する。
_ 例:MotorControl.motorForward(0, speed); にて制御出来ます。
3. M5StckCのBeetleCを使用する。m5stack/M5-ProductExampleCodes
4. iOSアプリの RCWController を使用する。
_ robo8080/ESP32_RCWController_Test


.
参考:
_ JoaoLopesF/ESP32MotorControl:ライブラリー
_ jkb-git/ESP32Servo:ライブラリー
_ blynkkk/blynk-library:Blynk ライブラリー
_ App Store:Blynk – IoT for Arduino, ESP32:iOSアプリ
_ ホームメイドガービッジ:ESP32 と BLYNK と円形ロボットシャーシーキットと
_ BeetleC (W/O M5StickC) $11.95:
_ M5StickC+BeetleC M5StickC+BeetleC+M5StickVで自動運転する
_ m5stack/M5-ProductExampleCodes:BeetleC:UDP通信による WEBコントロール。
_ iOSアプリの:RCWController
_ robo8080/ESP32_RCWController_Test:RVWControllerの使用例。
_ ホームメイドガービッジ:M5StickC で倒立振子 PID制御編 ー倒立振子への道 3
_ ごじ:ESP-WROOM-02で動かす小型 (50x50x50mm) のラジコンカー
_ 


.
感想:
M5サイズの車輪製作:
_ M5Stack 発売時より M5サイズの車輪を望んでいました。
_ 多くの車は 車輪が大きく本体より外にあり、動作範囲も大きく綺麗でないです。
_ 製作する内に 何故か 限りなく SONYの「toio」に近づいてきました。
_ 比べれば比べる程 天と地の差を ひしひしと感じます。今回の製作物は
_ おもちゃにもならないレベルです。
_ センサー等を駆使すると多機能な物ができますが 今回は基本の駆動部分のみです。

_ 拡張性:センサー等を PROTO Module で Stack する予定です。
_ スケッチ:制御用アプリは重要で 今回は Blynk を試しました。Blynk は 目の前の
_  物をネット経由で操作する為、好みではありません。他に 距離センサー や
_  光センサー、accelerator 等を駆使し 操作性の良い スケッチが必要です。
_ Motor:No load Speed(RMP) は 50,100,150,200 を試しました。
_    結果、50,100 は速度が遅く 使い道に難があります。当初 150 を試し
_    使用できていますが 200 の方が速度対応が広く 200 を追加発注しました。
_    250以上は試していませんが 速度が速くなると本体が傾くか 全体を高く
_    すると、倒れる事が起きるかと思います。動画は 200 を使用しています。
_    調査の為に 300 を Order中です。
_ Gear:Gear 未使用の作品や製品を見かけますが Gear が無いと 速度が速く
_    Controll しにくい事や トルク不足になるかと判断しています。

メモ:追記:2019.08.24
_ CAD データーと出力について:
_ 1. ブログの WordPress は 圧縮データーを投稿出来ない為に 残念ながら
_   CAD データー を公開する事ができません。GitHubは使用方法が解りません。
_ 2. データーは プロ用の3D Printer (300万クラス)を使用した CADデーターです。
_   通常のプリンターは 精度(X,Y軸)が低く正しく出力しません。
_   理由は 凸部分(幅が狭い)を出力する事ができないからです。
_   M5Stackは 射出成型でX,Y軸が 0.6mm幅(凸部)で 材質も強く
_   通常のプリンターでは 出力出来ない精度と強度になっています。
_   この条件をクリヤーする為に 他の工作では Expansion方式を記載しています。
_ 3. Wheel Module のような M5Stack の後部の場合は 凸部の工夫により低精度
_   でも可能です。低精度用の図面は 作成しておらず 低精度に合わせた現物合わせ
_   も 0.2mm 単位で必要になります。
_ 4. 都内や M5Stack 等の集まりで出力品をお渡しする事は可能です。

.
_ toio と moio の比較:toioの機能と超小型サイズは見事です。

SONY toio:技術と努力の集大成から学ぶ物が多いです。
_ ロボットや玩具の中で1番の製品で、他に toio にまさる製品はありません。
_ 参考:toio 分解図
_ 現物や分解画像から想像すると、見れば見る程 検討に検討を重ねた内容に驚きます。
_ 外観や素材の安全性があり 投げても壊れない設計。
_ 車輪は縦横の力に強い材料と構造になっている。不思議な素材で出来ています。
_ Motor は今回使用している Motor より小さく強力(速度が速い)。
_ このサイズのMotorは素人では秋葉原やebay、Aliespress では手に入らない。特注品?
_ Gear は プラスチック製で騒音は殆ど無く SONYらしい高精度な設計。これは凄い!
_ ケース事態のネジ止めはない。
_ 車輪は2つで 支えは 1つ。4輪だと浮く場所ができるからだろう。
_ 2つ目の支えは 転倒を防ぐことが出来る様です。高速の時に必要。
_ 支えはスイッチにもなっている。ここまでアイデアが入っている。
_ シートの微細な画像を読む為に、画像を認識出来るセンサーが下に搭載されている。
_ この画像認識出来るセンサーは 素人には手に入らない。
_ シートのアイデアは素晴らしい。シートから情報を得る事ができる。
_ シートでプログラムも出来る高度な内容。このアイデアは他にも使用できる。
_ 速度は 30cm/sec 位かと思われます。
_ 小さい為に小回りが出来て 遊べる範囲が広いです。
_ 小さなバッテリーが内蔵され 2時間以上持つと公表されています。凄い省エネ技術。
_ このサイズに入る程 各部のチューニングが素晴らしい。
_ ハードとソフトの作り込みが凄いです。
_ 圧倒され 他に、私には解らない事も含まれていると思います。
_ APIが公開され M5StackやESP32で操作する事が可能です。
_ 今回のWheelの製作が面倒な場合は toio を購入された方が良いです。
_ 長年の開発期間と内容から 価格は理解出来ますが 遊ぶには高い。
_  低価格で 車輪部分だけの販売があれば良いなと思っています。

 


.
スケッチ:M5Stack moio + BLINK : 2019.08.21 macsbug

// M5Stack moio + BLINK : 2019.08.21 macsbug
// https://macsbug.wordpress.com/2019/08/21/m5-wheel-module-moio/
// https://homemadegarbage.com/esp32_minirobot01
// https://mvdlande.wordpress.com/2019/06/02/drv8833-motor-driver-module/
// DRV8833 + M5Stack + DC MOTOR
// INx  :GPIO:  OUTx : MOTOR   :CH : 
// IN1  :  5 :  OUT1 : RIGHT - : 1 : 
// IN2  : 17 :  OUT2 : RIGHT + : 2 : 
// IN3  : 13 :  OUT3 : LEFT  + : 3 : 
// IN4  :  0 :  OUT4 : LEFT  - : 4 : 
// DRV8833 H-BRIDGE
// IN1 = PWM, IN2 = 0   : Foword  PWM, fast decay
// IN1 = 1  , IN2 = PWM : Foword  PWM, slow decay
// IN1 = 0  , IN2 = PWM : Reverse PWM, fast decay
// IN1 = PWM, IN2 = 1   : Reverse PWM, slow decay 

#include <M5Stack.h>
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "frss_BKbeyBIIehKeBK2hAEp78NCB-Ym"; // BLINK
char ssid[] = "your ssid";
char pass[] = "your password";
long S, L, R;

BLYNK_WRITE(V0) {   // V0 ( Joystick ) 
  long x = param[0].asInt();
  long y = param[1].asInt();

  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setCursor(5,25);M5.Lcd.print("x: ");M5.Lcd.print(x);
  M5.Lcd.setCursor(5,65);M5.Lcd.print("y: ");M5.Lcd.print(y);

  S = sqrt( x * x + y * y );
  if( S > 255 ){ S = 255;}
  M5.Lcd.setCursor(5,105);M5.Lcd.print("speed: ");
  M5.Lcd.print(S);M5.Lcd.print("  ");

  if( y >= 0 ){ M5.Lcd.println("FOWARD");    // FOWARD
    if( x >= 0 ){ L = 0;        R = abs(x/2);
    }else{        L = abs(x/2); R = 0;
    }
    ledcWrite(1, S - R); // ch1, PWM  ,  5, IN1, RIGHT MOTOR-
    ledcWrite(2, 1);     // ch2, Phase, 17, IN2, RIGHT MOTOR+
    ledcWrite(3, S - L); // ch3, PWM  , 13, IN3, LEFT  MOTOR+
    ledcWrite(4, 1);     // ch4, Phase,  0, IN4, LEFT  MOTOR-
  }else{      M5.Lcd.println("BACK");        // BACK
    if( x >= 0 ){ L = 0;        R = abs(x/2);
    }else{        L = abs(x/2); R = 0;
    }
    ledcWrite(1, 1    ); // ch1, Phase,  5, IN1, RIGHT MOTOR-
    ledcWrite(2, S - R); // ch2, PWM  , 17, IN2, RIGHT MOTOR+
    ledcWrite(3, 1    ); // ch3, Phase, 13, IN3, LEFT  MOTOR+
    ledcWrite(4, S - L); // ch4, PWM  ,  0, IN4, LEFT  MOTOR-
  }
}

void setup(){
  M5.begin();
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.setTextSize(3);
  
  ledcSetup(1, 5000, 8); // channel, freq, resolution_bits
  ledcSetup(2, 5000, 8);
  ledcSetup(3, 5000, 8);
  ledcSetup(4, 5000, 8);
                        //GPIO,Ch, INx, OUTx, MOTOR
  ledcAttachPin( 5, 1); //  5 , 1, IN1, OUT1, RIGHT MOTOR-
  ledcAttachPin(17, 2); // 17 , 2, IN2, OUT2, RIGHT MOTOR+
  ledcAttachPin(13, 3); // 13 , 3, IN3, OUT3, LEFT  MOTOR+
  ledcAttachPin( 0, 4); //  0 , 4, IN4, OUT4, LEFT  MOTOR-
  
  M5.Lcd.setCursor(1,25);M5.Lcd.print("SSID=" + String(ssid));
  Blynk.begin(auth, ssid, pass);
  delay(3000);
}

void loop(){
  Blynk.run();
}

M5Stack , M5 Wheel Module , moio , DRV8833 , Wheel , SONY , toio , Blynk , BeetleC ,

Written by macsbug

8月 21, 2019 at 2:00 pm

カテゴリー: M5STACK

Make M5Stack Servo Module

leave a comment »

M5Stack Servo Module を製作しました。            2019.08.10

Servo Module は DC Motor 又は Stepper Motor を ドライブします。
Driver tip は DRV8833 (90円) を使用し 費用は 400円です。

調査チップは 左上から L9110, DRV8833, MX1508, DRV8835 の4種類です。


.
Drive IC と Module 表:

 

 

Name price Size mm Store Transport Operation
 L9110     83円 29×23   yang-sell584  22 day X
 DRV8833     90円 19×16   shoptongs  15 day
 MX1508   267円 25×21   sweetsale07  16 day
 DRV8835   300円 15×10   秋月電子通商
 L297     80円 25×21   picturesqre-
 L298N     40円 25×21   Glintdeer
 DRV8833     59円 19×16   SAMIORE

_ 評価:価格, 輸送期間, サイズ, 工作容易, 動作 調査の結果 DRV8833 を採用。
_   仕様:Output Current=1.5A, e Power Supply Voltage Range=2.7 to 10.8 V

_ L9110:基板に組む為のコネクターの取り外しが手間と動作が不安定で非採用。
_ DRV8833:ebay の shoptongs Store は 2個180円と安く、輸送期間は15日で短い。
_      小型の為、複数個の搭載が可能。
_ DRV8833国内価格:スイッチサイエンスは 733円で8倍の高価格。購入は非採用。
_ MX1508 は L298N と同等品の様です。低価格重視の為に非採用。
_ DRV8835:超小型で組み込み便利。優秀な基板です。低価格重視の為に非採用。
_       入力電源と出力電源は別系統の設計になっています。
_ 追記:2019.08.27:L297, L298N , DRV8833 調査中


.
部品準備:

No Nomen Purchase Price
1  DRV8833  ebay;shoptongs    90円
2  ピンヘッダー ( male, H=7.7mm )  秋月電子通商:

  低オス 2 x 40

   90円
3  ピンヘッダー 1×6 (6P)  秋月電子通商:ピンヘッダ    20円
4  M5Stack PROTO Board  tomorrow氏設計製作 基板  100円
5  M2 5mm ナベTapping Screw(4ea)  西川電子部品株式会社      6円
6  ケース:H=8.3mm  自作:材料費 FDM
  Low cost PROTO module
  of M5STACK Part 2
   14円
7  ショットキーバリアダイオード
. RSX101VAM-30, 30V1A
 秋月電子通商:
  RSX101VAM-30
     9円
=  ====================  ================ ======
費用総計 329円

.
配線:
_ M5Stack 配線例:配線は 10本です。
_ DRV8833 の 入力(GPIO)電源はVCC、出力 (Motor)電源は ULT(VM) です。
_  電源は 共に M-BUS の 3.3Vを使用します。
_  ULT – VCC間のショットキーバリアダイオードは VCC から ULT へ供給します。
_   補足:補助バッテリ未接続時に ULT へ電源を供給します。
_  外部もしくは補助バッテリーを使用する時は ULT(VM) へ接続します。
_ DRV8833 の IN 1,2,3,4 に M5Stack の GPIO を接続します。
_ DRV8833 の OUT 1,2,3,4 に DC Motor を接続します。
_ メモ : IN, OUT は基板上の名前、IC の名前は AIN, BIN, AOUT,BOUT です。
_ メモ:MOTORの回転方向:+, – 表示と回転方向は MOTORにより異なります。

 M5Stack 3V3 GND GPIO 5 GPIO 17 GPIO 13 GPIO 0
 DRV8833 VCC GND IN1 IN2 IN3 IN4
 DRV8833 ULT GND OUT1 OUT2 OUT3 OUT4
 DC Motor L Motor – L Motor + R Motor + R Motor –

.
_ 各端子と動作表: 1つの Motor の動作を示します。

INx IN1 IN2 DRV8833 Input
GPIO 5 7 M5Stack M-BUS
Motor RIGHT – RIGHT + DC Motor
1 PWM 0 Foward fast
2 1 PWM Foward slow
3 0 PWM Reverse fast
4 PWM 1 Reverse slow

.
_ スケッチの基本:

ledc Channel 1 2 3 4
    M-BUS GPIO 5 17 13 0
    DRV8833 IN 1 2 3 4
    DRV8833 OUT 1 2 3 4
    Motor Right – Right + Left  + Left  –

 

ledWrite ( ch , PWM or Phase );
ledWrite ( 1 , PWM);  // PWM   : Foward slow
ledWrite ( 1 , 1 );   // Phase : Foward slow

_ 基板レイアウトと回路図、配線。

.
_ DRV8833 Module Schematic

.
Servo Module Layout:

.
_ Solder side wiring

メモ:
_ Motorの電源は M5Stack USB 又は 2400mA Battery の 3.3v を使用します。
_ Motorの電源は 外部バッテリーを使用する事も可能です。
_ 配線面の右上のコネクターは 外部バッテリー接続時の予備のコネクターです。
_ 綺麗なデザインにする為に 接続コネクターは横から出さず 縦に接続します。


.
資料:
L9110:L9110 Datasheet
DRV8833:DRV8833 Dual H-Bridge Motor Driver
MX1508:Using the MX1508 Brushed DC Motor Driver , pdf
DRV8835:DRV8835 Dual Low-Voltage H-Bridge IC
H-BRIDGE:どの Module (tip) も H-BRIDGE 接続 ( Motor の正逆転) が可能です。
_ H-Bridge DC Motor Applications
Adafruit DRV8833 DC/Stepper Motor Driver Breakout Board
My Tech notes:DRV8833 motor driver module:回路動作と回路図。
Pololu:DRV8833 Dual Motor Driver Carrier:基板と動作の詳細。
HACKADAY.IO:Low level DC motor driver:H-bridge circuit の説明。
コーヒーとチョコレート:ESP32でローバーの基板を作ったお話:ESP32+DRV8833


.
感想:
今回の記事は DC Motor を低価格で動作させる為の Servo Drive です。
格安で動作する Servo Module を調査 及び 動作試験を実施しました。
Module を使用するとCR部品も装備されている為、便利です。
結果、DRV8833 は 格安で輸送期間も短くリーズナブルです。

次回は DC Motor Module の製作記事を予定です。


M5Stack , Servo , H-bridge , DRV8833, DRV8835 , MAX1508 , L9110 , L298N ,

Written by macsbug

8月 10, 2019 at 12:41 pm

カテゴリー: M5STACK

M5StickC Start Adapter

leave a comment »

M5StickC Start Adapter を製作しました。         2019.07.09

M5StickC は 条件によって起動しない時があります。故障ではありません。
Start Adapter を GPIO コネクターに接続する事により起動が可能です。
費用は 50円程度です。
原因は 詳細を省きますが バッテリー電圧の低下と電源管理ICとの兼ね合いです。


.
準備:
1. 2.54mm 4Pin header
2. 680Ω ( 690Ω = 470Ω + 220Ω ) tip resistor
_ 簡単には 1KΩでも可能です。
上記により 余った部品でもできるかと思います。


.
製作:
1. 4Pin header の 3V3 と G0 間の BAT端子を外します。
2. Pin header の先端を平らに切ります。
3. M5StickC GPIO 端子の 3V3 と G0 間に 470Ω と 220Ω を接続します。
_ 合計 1KΩでも可能です。
4. M5StickC に接続する時は 向きに注意してください。
5. 面倒な場合:簡単な方法は 3V3 と G0 間に 通常(1/4W)の1KΩを接続します。


.
感想:
初回購入時より 時々 起動せず 分解して調べましたが異常なし。
バッテリ電圧が低下すると 電源管理ICの動作で停止する様になっています。
電源管理チップの設定の件もありますが、抵抗接続で出来るので簡単です。


M5StickC, 起動しない、680Ω、

Written by macsbug

7月 9, 2019 at 6:25 pm

カテゴリー: M5STACK

M5Stack Nixie tube Clock

leave a comment »

M5Stack で ニキシー管時計を製作しました。                 2019.06.16

M5Stack に 130円の リアルタイムクロックボード(RTC)を追加し 表示は ニキシー管画像 を使用しました。
ネット接続ができない場所でも RTCボード があると動作します。
RTCボード が無くても ネット接続 ( NTP ) できると動作します。

.

機能:Cボタン スイッチで 表示を切り換えます。
_  時計機能:130円の リアルタイムクロックボード(RTC)を追加しました。
_        RTCが無くとも動作します。
_  NTP設定:起動時に ネット接続が可能であれば RTCにNTPを保存します。
_  時間調整:ネット接続が可能であれば 決められた時間にNTP時間を調整(保存)します。

動作:ネットのNTPへ接続し 日付と時間のデーターを入手します。
_  日付と時間を RTC へ保存します。
_  ネット環境が無いか 接続出来ない場合は 上記のNTPをパスします。
_  RTC から 日付と時間を取得し ディスプレーのニキシー管に表示します。
_  RTC が無い場合は NTP の時間を使用します。
_  時間の更新は ESP32内の Timer を使用します。( 理由は 製作メモ を参照ください) 

DS3231 ボード:M5Stackは 時計機能が無い為、DS3231 リアルタイムクロック (RTC) を追加します。
_ 使用する DS3231 は ラズベリーパイ用の RTC Module で 130円と低価格で小型です。
_ Raspberry Pi RTC Module With Battery:回路図参照の事。
_ DS3231 の使用事例、価格、販売店 は 「DS3231 RTC in ESP8266」を参照ください。
_ 日本国内は高いですので ebay か Aliexpress で入手します。
_ 


.
部品の準備:DS3231 Precision RTC Clock Memory Module For Arduino Raspberry Pi
販売:ebay の worldchips Store は 製品管理は良いです。輸送期間は8日〜16日を経験しています。 
注意:Aliexpress や ebay は 販売画像と異なる物が来る事があります。
_  DS3231 Module は 電池付きであるかを確かめてください。
_  以下の worldchips Store を再調査すると Battery 付きではありませんでした。2019.06.29
_  最近、中◯からのバッテリの輸送は出来ない話を聞いています。2019.07.07
_  CR1025:3V 10.0 x 2.5mm。2019.07.07
_  ボタン電池一覧表で 電圧とサイズを確認して購入してください。2019.07.07

Store price memo    
 ebay : worldchips  127円  1個    
 ebay : worldchips  118円  10個 1184円    
 ebay : lincx  116円  1個    
 ebay : 3c_topstore  214円  1個 調査済(追記)  ⭕ 

.
追記:2019.07.23。3c_topstore Store の調査結果:
_  価格:1個 215円 ( 10個 $19.9 )。バッテリー付。輸送期間=19日。
追記:2019.07.04。DS3231 価格:
_  その後の調査で スイッチサイエンスの DS3231 は 1個 2104円です。約17倍の価格。
.


.
M5Stack 改造:DS3231 BOARD の取り付け。

1. DS3231 BOARD の BATTERY が 3.0V ある事を確認します。
2. BATTERY の位置を移動します。移動とハンダ付け時に向きに注意してください。
_ 
3. DS3231 BOARD をカプトンテープで保護します。
4. ハンダ付け時に周囲を溶かさない様にテープ等でケースを保護します。
5. M5Stackの基板にある小さな部品に接触や負担を与えない配置を考えます。
6. 回路図に従い 配線します。
7. M-BUS 3.3V と GROVE PIN にハンダ付けする時は 短時間(0.5秒)に実施します。
8, 注意:M5Stackには 小さな部品があり 接触, 衝撃, 熱 を加えないでください。


.
ニキシー管 画像のHex データー製作:元画像 70×134 pixel ( png ):

_ 12枚の画像 70×134 から vfd_70x134.c を作成します。

1.  vfd_18x34.c と vfd_35x67.c は 「M5StickC Nixie tube Clock」から入手します。

2.  vfd_70x134_0, , , , vfd_70x134_9, vfd_70x134_n.png, vfd_70x134_q.png
_ 以下の画像を DL ( ドラッグ アンド ドロップ ) し
_ 「M5StickC Nixie tube Clock」を参照し
_ 「lcd-image-converter 20180211-beta」で vfd_70x134.c を作成します。
_ 少し手間かもしれませんが マスターすると 綺麗な作品を自由に作る事が可能になります。

3. apple_35x41.png:Apple icon が好きな方へ。 apple_35x41.c は リストに記載しました。
_ 

4. vfd_70x134_0 〜 vfd_70x134_9, vfd_70x134_n.png, vfd_70x134_q.png

.

5. スケッチ:
_ 下の様に スケッチを用意します。
_ ライブラリー:RTClib : スケッチ内に入れるか ライブラリーにいれます。
_ フォルダーは以下の様になります。
_  


.
製作メモ:Production note
1. 時間の更新は ESP32内の Timer を使用します:
_ RTC の データーを 1秒毎に取得すると なぜか 飛び飛びの値しか取得出来ません。
_ いろいろ試しましたが 技術力が無い為か 1秒毎に取得する事はできませんでした。
_ 対策:その為に 1秒毎の動作は ESP32 の Timer を使用しています。
_ ネットでのサンプルを見ると 3秒毎に取得する例が殆どで 1秒単位の表示ができません。
_ M5Stack のサンプルは Timer を使用しています。
_ Timer を使用する場合は 適切な 単位の宣言(unsigned long)が必要です。
2. RTC は CS が無きため GPIO は D(SDA)=5, C(SCK)=13 としました。

maffucci氏の M5Stack Fire Robottillo:Stack Case を製作しました。
ロボチックな感じがなかなか良いです。

3. トラブルシュート:
_ シリアルモニター:「RTC is NOT running!」が表示される:DS3231 の配線を確認します。
_ ディスプレーの表示:「2165/165/165 165:165:85」になる:DS3231 の配線を確認します。
_ ディスプレーの表示:「2010 ,,,, 」になる:DS3231 のバッテリー不足です。交換します。
_ バッテリー交換:電圧をチェックしてください。


.
追記:青いニキシー管:2019.07.04
_ ニキシー管イメージは 微妙で 数字周りのニキシー管イメージが少ない感じです。
_ 


.
参考:
M5StickC Nixie tube Clock:2019.06.15
DS3231 RTC in ESP8266:2016.10.07:
ESP8266 + RTC + NTP デジタル時計:2015.12.05:
+DEVICE PLUS:ESP32とRTCで「二度寝防止アラーム時計」を作ろう!
Raspberry Pi RTC Module With Battery:回路図があります。


.
感想:
_ 前回 M5StickC Nixie tube Clock:これに基づき M5Stack も製作しました。
_ 小型化:PROTO Board か Expansion Board は大きくなりますので本体に収めました。
_ 本体未改造方法:Expansion Board か Expansion Adapter で行なう方法があります。
_ Nixie 画像 70×134 pixel :M5Stack の画面に合わせ作成しました。
_ DS3231のバッテリー:ハンダ付けです。電圧が無い場合は交換する必要があります。
_ DS3231 モジュールが無い場合:NTPやPC TIME を使用し電源を切らなければ使用できます。
_ 表示:ニキシー数値のサイズや位置を変更すると 好みのデザインができます。

_ 追記:2019.06.30。
_  facebook:関氏の情報:「電池は省略し本体のBATT端子に接続しました。」
_   配線は使い慣れた0.2mmのホルマル線を使用。
_   GROVEのGNDは付けにくいのでUSBフレームのGNDに強引にはんだ付け。


.
スケッチ:M5Stack nixie tube clock : 2019.06.16 macsbug

// M5Stack nixie tube clock : 2019.06.16 macsbug
// https://macsbug.wordpress.com/2019/06/16/m5stack-nixie-tube-clock/
// RTC DS3231 : https://wiki.52pi.com/index.php/Raspberry_Pi_Super_Capacitor_RTC(English)
// RTClib : https://www.arduinolibraries.info/libraries/rt-clib
#include <M5Stack.h>
#include "M5StackUpdater.h"
#include <WiFi.h>
#include <SPI.h> 
#include "RTClib.h"
RTC_DS3231 rtc;
#include "vfd_18x34.c"   // font 18px34
#include "vfd_35x67.c"   // font 35x67
#include "vfd_70x134.c"  // font 70px134
#include "apple_35x41.c" // icon 35px41 
const uint8_t rtc_sda = 5, rtc_sck = 13;
const char *ssid = "your ssid";
const char *pass = "your password";
uint32_t targetTime = 0; // for next 1 second timeout
const uint8_t*n[] = { // vfd font 18x34
  vfd_18x34_0,vfd_18x34_1,vfd_18x34_2,vfd_18x34_3,vfd_18x34_4,
  vfd_18x34_5,vfd_18x34_6,vfd_18x34_7,vfd_18x34_8,vfd_18x34_9 };
const uint8_t*m[] = { // vfd font 35x67
  vfd_35x67_0,vfd_35x67_1,vfd_35x67_2,vfd_35x67_3,vfd_35x67_4,
  vfd_35x67_5,vfd_35x67_6,vfd_35x67_7,vfd_35x67_8,vfd_35x67_9,
  vfd_35x67_q,vfd_35x67_n };
  const uint8_t*b[] = { // vfd font 70x134
  vfd_70x134_0,vfd_70x134_1,vfd_70x134_2,vfd_70x134_3,vfd_70x134_4,
  vfd_70x134_5,vfd_70x134_6,vfd_70x134_7,vfd_70x134_8,vfd_70x134_9,
  vfd_70x134_q,vfd_70x134_n };
const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
uint16_t yy;
uint8_t mn, dd, hh, mm, ss;
uint8_t md = 2; // mode 1(yyyy_mmdd_hhmmss),2(mmdd_hh_mmss),3(mmdd_ss_hhmm)
 
void setup() { 
  M5.begin();
  Wire.begin(rtc_sda,rtc_sck);delay(10); //GLOVE A : SDA,SCL
  if(digitalRead(39)==0){updateFromFS(SD);ESP.restart();}
  rtc.begin(); 
  M5.Lcd.setBrightness(255);
  M5.Lcd.setRotation(1);
  M5.Lcd.fillRect(0, 0, 319, 239, ORANGE);
  M5.Lcd.fillRect(1, 1, 317, 236, BLACK);
  M5.Lcd.setTextSize(2);
  esp_timer_init();
  wifi_setup(); // wifi conection, NTP read, Save NTP to RTC
  rtc_setup();  // Read the value of RTC
}

void loop() {
  M5.update();
  if (targetTime < esp_timer_get_time()/1000 ){
    targetTime = esp_timer_get_time()/1000 + 1000;
    ss++; if (ss == 60) { ss = 0; mm++;
           if (mm == 60) { mm = 0; hh++;
            if (hh == 24) { hh = 0; dd++; //
   }}}}
  if(M5.BtnC.wasPressed()){            // mode change
   if (md == 3){md = 1;M5.Lcd.fillRect(1,1,317,236,BLACK);return;}
   if (md == 2){md = 3;M5.Lcd.fillRect(1,1,317,236,BLACK);return;}
   if (md == 1){md = 2;M5.Lcd.fillRect(1,1,317,236,BLACK);return;}
  }
  if ( md == 3 ){ hhmm();}             // yyyy,mm,dd,ss,hh,mm
  if ( md == 2 ){ yyyy_mmdd_hhmmss();} // yyyy,mm,dd,hh,mm,ss
  if ( md == 1 ){ mmss();}             // mm,ss
  periodic_ntp();                      // Set the time by periodic NTP
  delay(500);
}

void wifi_setup(){
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  M5.Lcd.setCursor(20,40);M5.Lcd.setTextColor(WHITE);
  M5.Lcd.print("Connecting to wifi");
  WiFi.begin(ssid,pass);
  int wifi_check = 10; // WiFi count
  M5.Lcd.setCursor(20,80);M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.print("wifi check in progress");
  while (WiFi.status() != WL_CONNECTED){ // WiFI Status
    delay(500); wifi_check--; if (wifi_check < 0){break;}
  }
  if (wifi_check > 0){  // when there is wifi
    M5.Lcd.setCursor(20,120);M5.Lcd.setTextColor(GREEN);
    M5.Lcd.print("wifi connection complete");delay(2000);
    struct tm t;
    configTime(9*3600L,0,"ntp.nict.jp",
      "time.google.com","ntp.jst.mfeed.ad.jp");
    getLocalTime(&t);
    yy = t.tm_year + 1900; mn = t.tm_mon + 1; dd = t.tm_mday;
    hh = t.tm_hour; mm = t.tm_min; ss = t.tm_sec;
    //Serial.printf("%d %d %d %d %d %d\n",yy,mn,dd,hh,mm,ss);
    rtc.adjust(DateTime(yy,mn,dd,hh,mm,ss));//save ntp to rtc
    M5.Lcd.setCursor(20,160);M5.Lcd.setTextColor(GREEN);
    M5.Lcd.print("SET UP NTP");delay(2000); 
  }
  if (wifi_check < 0){   // When there is no wifi
    M5.Lcd.setCursor(20,120);M5.Lcd.setTextColor(ORANGE);
    M5.Lcd.print("without wifi connection");delay(2000);
  }
}

void rtc_setup(){
  DateTime now = rtc.now(); // time geting from RTC
  if (now.year() == 2165){  // rtc check
    M5.Lcd.setCursor(20,200);M5.Lcd.setTextColor(RED);
    M5.Lcd.print("RTC FAIL");delay(2000);
    M5.Lcd.fillRect(1, 1, 317, 236, BLACK);
    }else{
    yy = now.year(); mn = now.month(); dd = now.day();
    hh = now.hour(); mm = now.minute(); ss = now.second();
    //Serial.printf("%d %d %d %d %d %d\n",yy,mn,dd,hh,mm,ss);
    M5.Lcd.setCursor(20,200);M5.Lcd.setTextColor(BLUE);
    M5.Lcd.print("SET UP RTC");delay(2000);
    M5.Lcd.fillRect(1, 1, 317, 236, BLACK);
  }
}

void yyyy_mmdd_hhmmss(){
  int y1 = (yy / 1000) % 10; int y2 = (yy / 100) % 10;
  int y3 = (yy /   10) % 10; int y4 = yy % 10;
  int ma = (mn /   10) % 10; int mb = mn % 10;
  int d1 = (dd /   10) % 10; int d2 = dd % 10;
  int h1 = (hh /   10) % 10; int h2 = hh % 10;
  int m1 = (mm /   10) % 10; int m2 = mm % 10;
  int s1 = (ss /   10) % 10; int s2 = ss % 10;

  //int p0 = 8; int x0 = 40; int t0 = 22; // icon
  //M5.Lcd.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41);

  int p1 = 80; int px1 = 40; int py1 = 5;
  M5.Lcd.pushImage( p1 + 0*px1, py1, 35,67, (uint16_t *)m[y1]); 
  M5.Lcd.pushImage( p1 + 1*px1, py1, 35,67, (uint16_t *)m[y2]);
  M5.Lcd.pushImage( p1 + 2*px1, py1, 35,67, (uint16_t *)m[y3]);
  M5.Lcd.pushImage( p1 + 3*px1, py1, 35,67, (uint16_t *)m[y4]);
  
  int p2 = 80; int px2 = 40; int py2 = 76;
  M5.Lcd.pushImage( p2 + 0*px2, py2, 35,67, (uint16_t *)m[ma]);
  M5.Lcd.pushImage( p2 + 1*px2, py2, 35,67, (uint16_t *)m[mb]);
  //M5.Lcd.drawPixel(118,13, ORANGE); M5.Lcd.drawPixel(119,23,ORANGE);
  M5.Lcd.pushImage( p2 + 2*px2, py2, 35,67, (uint16_t *)m[d1]);
  M5.Lcd.pushImage( p2 + 3*px2, py2, 35,67, (uint16_t *)m[d2]);

  int p3 = 2; int px3 = 40; int py3 = 150;
  M5.Lcd.pushImage( p3 + 0*px3, py3, 35,67, (uint16_t *)m[h1]);
  M5.Lcd.pushImage( p3 + 1*px3, py3, 35,67, (uint16_t *)m[h2]);
  M5.Lcd.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[10]);
  M5.Lcd.pushImage( p3 + 3*px3, py3, 35,67, (uint16_t *)m[m1]);
  M5.Lcd.pushImage( p3 + 4*px3, py3, 35,67, (uint16_t *)m[m2]);
  M5.Lcd.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[10]);
  M5.Lcd.pushImage( p3 + 6*px3, py3, 35,67, (uint16_t *)m[s1]);
  M5.Lcd.pushImage( p3 + 7*px3, py3, 35,67, (uint16_t *)m[s2]);
  
  if ( s1 == 0 && s2 == 0 ){ fade1();}
}

void mmss(){
  int ma = (mn / 10) % 10; int mb = mn % 10;
  int d1 = (dd / 10) % 10; int d2 = dd % 10;
  int h1 = (hh / 10) % 10; int h2 = hh % 10;
  int m1 = (mm / 10) % 10; int m2 = mm % 10;
  int s1 = (ss / 10) % 10; int s2 = ss % 10;

  int p0 = 8; int x0 = 40; int t0 = 22; // icon
  M5.Lcd.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41);

  int p2 = 65; int px2 = 40; int py2 = 10;
  M5.Lcd.pushImage( p2 + 0*px2, py2, 35,67, (uint16_t *)m[ma]);
  M5.Lcd.pushImage( p2 + 1*px2, py2, 35,67, (uint16_t *)m[mb]);
  //M5.Lcd.drawPixel(118,13, ORANGE); M5.Lcd.drawPixel(119,23,ORANGE);
  M5.Lcd.pushImage( p2 + 2*px2, py2, 35,67, (uint16_t *)m[d1]);
  M5.Lcd.pushImage( p2 + 3*px2, py2, 35,67, (uint16_t *)m[d2]);
  
  int p3 = 240; int px3 = 40; int py3 = 10;
  M5.Lcd.pushImage( p3 + 0*px3, py3, 35,67, (uint16_t *)m[h1]);
  M5.Lcd.pushImage( p3 + 1*px3, py3, 35,67, (uint16_t *)m[h2]);
  
  int p4 = 2; int px4 = 80; int py4 = 100;
  M5.Lcd.pushImage( p4 + 0*px4   , py4, 70,134, (uint16_t *)b[m1]);
  M5.Lcd.pushImage( p4 + 1*px4 -4, py4, 70,134, (uint16_t *)b[m2]);
  //M5.Lcd.drawPixel(155,150, ORANGE); M5.Lcd.drawPixel(155,190,ORANGE);
  M5.Lcd.fillCircle(156,151,3,ORANGE);M5.Lcd.fillCircle(156,191,3,ORANGE);
  M5.Lcd.fillCircle(156,151,1,YELLOW);M5.Lcd.fillCircle(156,191,1,YELLOW);
  M5.Lcd.pushImage( p4 + 2*px4 +4, py4, 70,134, (uint16_t *)b[s1]);
  M5.Lcd.pushImage( p4 + 3*px4   , py4, 70,134, (uint16_t *)b[s2]);

  if ( m1 == 0 && m2 == 0 ){ fade2();}
}

void hhmm(){
  int ma = (mn / 10) % 10; int mb = mn % 10;
  int d1 = (dd / 10) % 10; int d2 = dd % 10;
  int h1 = (hh / 10) % 10; int h2 = hh % 10;
  int m1 = (mm / 10) % 10; int m2 = mm % 10;
  int s1 = (ss / 10) % 10; int s2 = ss % 10;

  //int p0 = 8; int x0 = 40; int t0 = 22; // icon
  //M5.Lcd.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41);

  int p2 = 65; int px2 = 40; int py2 = 10;
  M5.Lcd.pushImage( p2 + 0*px2, py2, 35,67, (uint16_t *)m[ma]);
  M5.Lcd.pushImage( p2 + 1*px2, py2, 35,67, (uint16_t *)m[mb]);
  //M5.Lcd.drawPixel(118,13, ORANGE); M5.Lcd.drawPixel(119,23,ORANGE);
  M5.Lcd.pushImage( p2 + 2*px2, py2, 35,67, (uint16_t *)m[d1]);
  M5.Lcd.pushImage( p2 + 3*px2, py2, 35,67, (uint16_t *)m[d2]);
  
  int p3 = 240; int px3 = 40; int py3 = 10;
  M5.Lcd.pushImage( p3 + 0*px3, py3, 35,67, (uint16_t *)m[s1]);
  M5.Lcd.pushImage( p3 + 1*px3, py3, 35,67, (uint16_t *)m[s2]);
  
  int p4 = 2; int px4 = 80; int py4 = 100;
  M5.Lcd.pushImage( p4 + 0*px4   , py4, 70,134, (uint16_t *)b[h1]);
  M5.Lcd.pushImage( p4 + 1*px4 -4, py4, 70,134, (uint16_t *)b[h2]);
  //M5.Lcd.drawPixel( 155,150, ORANGE); M5.Lcd.drawPixel(155,190,ORANGE);
  M5.Lcd.fillCircle(156,151,3,ORANGE);M5.Lcd.fillCircle(156,191,3,ORANGE);
  M5.Lcd.fillCircle(156,151,1,YELLOW);M5.Lcd.fillCircle(156,191,1,YELLOW);
  M5.Lcd.pushImage( p4 + 2*px4 +4, py4, 70,134, (uint16_t *)b[m1]);
  M5.Lcd.pushImage( p4 + 3*px4   , py4, 70,134, (uint16_t *)b[m2]);

  if ( h1 == 0 && h2 == 0 ){ fade2();}
}

void fade1(){
  int p3 = 2; int px3 = 40; int py3 = 150;
  for ( int i = 0; i < 2; i++ ){
  M5.Lcd.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[11]);
  M5.Lcd.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[11]);
  delay(25);
  M5.Lcd.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[10]);
  M5.Lcd.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[10]);
  delay(25);
  }
}

void fade2(){
  int p3 = 2; int px3 = 40; int py3 = 150;
  for ( int i = 0; i < 2; i++ ){
  M5.Lcd.fillCircle(156,151,3,BLACK);M5.Lcd.fillCircle(156,191,3,BLACK);
  delay(25);
  M5.Lcd.fillCircle(156,151,3,ORANGE);M5.Lcd.fillCircle(156,191,3,ORANGE);
  delay(25);
  }
}

void periodic_ntp(){ // Adjust to ntp at hh mm ss
  if ( (hh == 1) & (mm == 0) & (ss == 0)){ // AM 1:00:00
    wifi_setup();
    rtc_setup();
  }
}

.
apple_35x41.c
.

/*******************************************************************************
* generated by lcd-image-converter rev.c6da9ce from 2018-02-11 00:03:45 +0500
* image
* filename: unsaved
* name: apple_35x41
* macsbug
* preset name: Color R5G6B5
* data block size: 8 bit(s), uint8_t
* RLE compression enabled: no
* conversion type: Color, not_used not_used
* split to rows: yes
* bits per pixel: 16
*
* preprocess:
*  main scan direction: top_to_bottom
*  line scan direction: forward
*  inverse: no
*******************************************************************************/

/*
 typedef struct {
     const uint8_t *data;
     uint16_t width;
     uint16_t height;
     uint8_t dataSize;
     } tImage;
*/
#include <stdint.h>

static const uint8_t apple_35x41[2870] = {
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙░▒∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▒▓▓▓∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▓▓▒▒▓∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▓▒▒▒▒▒∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▓▒▒▒▒▓░∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙░▓▒▒▒▒▓∙∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▒▒▒▒▒▓░∙∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▓▒▒▒▓▒∙∙∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▓▒▓▓░∙∙∙∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙▓▓░∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
    // ∙∙∙∙∙∙░▒▓▓▓▓▓▒░∙∙∙∙∙∙∙▒▓▓▓▓▓▓▒∙∙∙∙∙
    // ∙∙∙∙∙▓▓▒▒▒▒▒▒▒▓▓▒░░░▒▓▓▒▒▒▒▒▒▓▓░∙∙∙
    // ∙∙∙∙▓▓▒▒▒▒▒▒▒▒▒▒▒▓▓▓▒▒▒▒▒▒▒▒▒▒▒▓░∙∙
    // ∙∙∙▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓░∙
    // ∙∙▒▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▒∙∙
    // ∙∙█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▒∙∙∙
    // ∙▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒∙∙∙∙
    // ∙█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█∙∙∙∙∙
    // ░█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒∙∙∙∙∙
    // ▒█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█░∙∙∙∙∙
    // ▒▓▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▓∙∙∙∙∙∙
    // ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓∙∙∙∙∙∙
    // ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓∙∙∙∙∙∙
    // ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░∙∙∙∙∙
    // ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓∙∙∙∙∙
    // ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙∙∙∙∙
    // ∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙∙∙∙
    // ∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░∙∙∙
    // ∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░∙∙
    // ∙∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙
    // ∙∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    // ∙∙░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙
    // ∙∙∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙
    // ∙∙∙░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙∙
    // ∙∙∙∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙∙
    // ∙∙∙∙░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙∙∙
    // ∙∙∙∙∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓░∙∙∙
    // ∙∙∙∙∙∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░∙∙∙∙
    // ∙∙∙∙∙∙∙▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙▒▒▒▒▒▒▒░∙∙∙∙∙▒▒▒▒▒▒▒░∙∙∙∙∙∙
    // ∙∙∙∙∙∙∙∙∙∙░▒░∙∙∙∙∙∙∙∙∙∙░░▒░∙∙∙∙∙∙∙∙
    0x21, 0x24, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x21, 0x64, 0x43, 0x87, 0x6d, 0xc9, 0x19, 0x03, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x21, 0x24, 
    0x08, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xc9, 0x7f, 0xaa, 0x6e, 0xe9, 0x87, 0xea, 0x10, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x61, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x62, 0x87, 0xeb, 0x6e, 0xc9, 0x65, 0xe8, 0x65, 0xe8, 0x77, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xe1, 0x87, 0xeb, 0x66, 0x08, 0x65, 0xe8, 0x65, 0xe8, 0x66, 0x08, 0x6e, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x0a, 0x66, 0x48, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x77, 0x49, 0x44, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x45, 0x77, 0x6a, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x7f, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x49, 0x66, 0x28, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x87, 0xea, 0x32, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x77, 0x2a, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x87, 0xea, 0x4c, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xe1, 0x7f, 0x6a, 0x66, 0x08, 0x6f, 0x09, 0x87, 0xcb, 0x33, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc1, 0x08, 0xe1, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xe1, 0x8f, 0xec, 0x76, 0xea, 0x44, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc1, 0x21, 0xe3, 0x19, 0xa2, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x04, 0x66, 0x29, 0x77, 0x0a, 0x7f, 0x4a, 0x7f, 0x4a, 0x7f, 0x2a, 0x76, 0xc9, 0x66, 0x29, 0x44, 0x26, 0x11, 0x42, 0x00, 0x00, 0x08, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xc2, 0x5d, 0x68, 0x76, 0xea, 0x7f, 0x4a, 0x77, 0x4a, 0x77, 0x4a, 0x7f, 0x4a, 0x6e, 0xaa, 0x4c, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x8a, 0x7f, 0x8a, 0x66, 0x48, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x66, 0x28, 0x6f, 0x09, 0x7f, 0x6a, 0x5d, 0xc8, 0x3b, 0x45, 0x2a, 0x83, 0x44, 0x26, 0x66, 0x49, 0x7f, 0x6a, 0x66, 0xa9, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x66, 0x08, 0x6f, 0x29, 0x7f, 0x8b, 0x2a, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x87, 0xab, 0x66, 0xa9, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x66, 0x29, 0x6e, 0xe9, 0x6f, 0x29, 0x6e, 0xc9, 0x66, 0x08, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x65, 0xe8, 0x66, 0x08, 0x87, 0xea, 0x3b, 0x85, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x67, 0x2b, 0x5e, 0x89, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x55, 0xe8, 0x97, 0xec, 0x3b, 0x45, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x5c, 0x86, 0x87, 0x48, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0x6d, 0xc8, 0xa7, 0x89, 0x4c, 0x66, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x21, 0xff, 0x85, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xff, 0x85, 0xab, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0xc4, 0x63, 0xfe, 0xc5, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfe, 0xc5, 0xc4, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0xff, 0x05, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x49, 0xe4, 0xff, 0x65, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xc4, 0xfe, 0xa5, 0xc4, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x93, 0xa5, 0xfe, 0xe5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xff, 0x25, 0x51, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0xb3, 0x45, 0xfc, 0x64, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xf3, 0xe4, 0xfc, 0xc4, 0x28, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0xdb, 0xe5, 0xfc, 0x24, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xfc, 0x04, 0xfc, 0xe4, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0xdb, 0xe5, 0xfc, 0x24, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xf4, 0x04, 0xfd, 0x04, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0xcb, 0xc6, 0xfc, 0x44, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xf4, 0x24, 0xfc, 0xa4, 0x9a, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x92, 0xe5, 0xfd, 0x24, 0xf4, 0x64, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x84, 0xf4, 0x64, 0xfc, 0x84, 0xfc, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x61, 0x25, 0xfa, 0x28, 0xe1, 0xa7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xfa, 0x68, 0x28, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x30, 0xe4, 0xf9, 0xe8, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xd9, 0xc7, 0xe9, 0xc7, 0xf9, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0xa2, 0xfa, 0x08, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xfa, 0x08, 0x99, 0x45, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0xe1, 0xc7, 0xf1, 0xe7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xe1, 0xc7, 0xfa, 0x08, 0x89, 0x45, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x58, 0xc3, 0xfa, 0x07, 0xe9, 0xc4, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xe9, 0xc5, 0xfa, 0x07, 0xd9, 0x84, 0x30, 0xe2, 
    0x10, 0x82, 0x00, 0x00, 0xd2, 0x34, 0xa9, 0xf0, 0xa1, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa9, 0xf0, 0xa1, 0xef, 0xe2, 0x34, 0xa1, 0xed, 
    0x10, 0x82, 0x00, 0x00, 0x71, 0xb1, 0xa2, 0x16, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x91, 0xf3, 0x89, 0xf3, 0xb2, 0x59, 0x18, 0xe5, 
    0x10, 0x82, 0x00, 0x00, 0x08, 0x20, 0xc2, 0x58, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0xa2, 0x13, 0xa2, 0x13, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x81, 0xaf, 0xaa, 0x15, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0x91, 0xf2, 0xc2, 0x58, 0x20, 0x64, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x58, 0xb9, 0x71, 0xb9, 0x51, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x71, 0xb9, 0x51, 0xb1, 0x51, 0xc9, 0xb3, 0x9a, 0x12, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x0d, 0x4c, 0xff, 0x3b, 0x97, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x3b, 0xb8, 0x54, 0xff, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x05, 0xff, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x5c, 0x05, 0x3c, 0x07, 0x3f, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x05, 0x7e, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x05, 0x1c, 0x05, 0x1c, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x06, 0x5f, 0x04, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x5f, 0x05, 0xbf, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x05, 0x1c, 0x05, 0xff, 0x06, 0x1f, 0x05, 0xbf, 0x05, 0xbf, 0x05, 0xff, 0x06, 0x1f, 0x05, 0x7f, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x04, 0xfb, 0x05, 0x1b, 0x06, 0x9f, 0x04, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 
    0x08, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x06, 0x9f, 0x05, 0x9f, 0x05, 0x3d, 0x05, 0x7f, 0x06, 0x5f, 0x05, 0xbf, 0x02, 0xcf, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa8, 0x04, 0x99, 0x06, 0x5f, 0x06, 0x1f, 0x05, 0x5e, 0x05, 0x3d, 0x06, 0x1f, 0x06, 0x9f, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x61, 
    0x21, 0x24, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x11, 0xa8, 0x1b, 0xd4, 0x14, 0x98, 0x13, 0xd4, 0x11, 0xc9, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0xa3, 0x12, 0xad, 0x1c, 0x15, 0x1c, 0x77, 0x1a, 0xef, 0x10, 0xc3, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x21, 0x24
};

.
M5Stack nixie tube clock , DS3231 , RTC , VFD , Nixie tube , ニキシー管 , Hex File

Written by macsbug

6月 16, 2019 at 11:00 am

カテゴリー: M5STACK

M5StickC Nixie tube Clock

with 2 comments

M5StickC で ニキシー管時計を製作しました。    2019.06.06, rev 2019.06.15

ニキシー管は 高電圧が必要である事や 高価である為 製作する機会がありません。
見たい気持ちは大きく ソフトで製作しました。

費用:M5StickC以外の材料費は0円です。
外観:M5StickC の IPS Display は 80×160 で表示サイズは小さいですが
_  明るく綺麗で見やすいです。
機能:M5のスイッチで YYYY,MM,DD, HH,MM,SS 表示と
_  MM,SS 表示に切り換える事ができます。

追記:2019.06.15
Carlos Orts に スケッチがパクられました。
McOrts/M5StickC_Nixie_tube_Clock: Jun 14, 2019
原作者(macsbug) や URLリンク が削除されています。
M5Stack Community / PROJECTS にMcOrts/M5StickC_Nixie_tube_Clockを記載しました。
その中で 3箇所に 原作者(macsbug) や URLリンク削除されている事を記載しました。


.
準備:以下の画像をドラック&ドロップし 画像を入手します。

ニキシー管 画像の製作:元画像 18×34 pixel

.

ニキシー管 画像の製作:元画像 35×67 pixel

.
参考:画像から Hex.c の作成方法は M5Stack CoinMarketCap:2019.05.30 を参照下さい。

⭕ HEX File 変換の準備:
_ png画像を「LCD image Converter 」アプリで hex ( .c ) に変換します。
_ 「LCD image Converter 」は Windowsアプリです。
_ 「lcd-image-converter 20180211-beta」を使用します。
_  メモ:投稿時 最新の20190317 は エラーで動作しません。
_ Mac では「Wine.app」を使用しWindows アプリケーションを動かすことができます。
_ Wine.app Downloads:例 Wine 2.0 を 選択し Download を押します。
_ 約5sec後に「Continue」が表示されますので「Continue」を選択します。
_ 約4sec後に 右上(のアイコン) を選択します。Wine_2.0.dmg 175.6MB が DLされます。
_ 解凍すると Wine.app ができます。
_

⭕ HEX File 変換方法:
1. Wine.app を起動し LCD image Converter を動作させます。
_ 事前に Wine.app や LCD image Converter の動かし方や 配置を把握しておきます。
_ 初めての場合は Winの配置等に慣れない為に時間を要するかと思います。

2. LCD image Converter:
_ File Menu から png 又は Jpg を読み込みます。読み込まれると画像が表示されます。
_ Option Menu を選択します。一番上の Preset: は「Color R5G6B5」を選択します。
_ Image を選択し Block size: は「8 bit」を選択します。「OK」を押します。
_ File Menu にある 「Convert… 」 で 例「vfd_35x67_8.c」が出力されます。
_  事前に読み込み先 ong や 出力先を把握しておきます。
_  全ての画像を読み込み 「Convert… all」で 全部の出力もできます。
_ 

3. .c の編集:そのままではエラーが出ますので ご使用のエディターで修正します。
_ 上位にある 「static const uint8_t image_data_vfd_35x67[4690] = {」は
_  解りやすくする為に名前を編集します。
_ ⭕ 「image_data_ 」を削除し「static const uint8_t vfd_35x67_8[4690] = {」にします。
_ ⭕最下位にある「const tImage vfd_35x67 = { image_data_vfd_35x67, 35, 67, 8 };」は
_   削除します。
_ 例「vfd_35x67_8」を保存します。
_ 同様に 0 から 9 まで実施し 保存します。
_ ⭕ 0 から 9 までのファイルは1つにした方が便利です。「0」の行末の後に
_   1 から 9 までの名前とデーター部を全て「0」の下に追加し 1つのファイルにします。

4. スケッチの作成。
_ 最下位にあるスケッチをコピーして 以下の画像の様に準備し
_ 画像フォント「vfd_18x34.c」 と 「vfd_35x67.c」 もフォルダーに入れます。
_ 
_ 以上で完了です。


.
M5StickC 開発環境:
Arduino IDE 1.8.9

_ 1. Upload Speed : “115200”
_ 1. シリアルモニター:115200 baud:OPEN 又は CLOSE で可能。

_ 2. Upload Speed : “500000”
_ 2. シリアルモニター:500000 baud:OPEN である事。

_ 書込み時に「A fatal error occurred: Timed out waiting for packet header」
_ が発生する場合があります。
_ 速度を速くしたく board.txt を書き換える方法もありますが、
_ 手順の簡単な 115200 baud が無難かと思います。


.
参考:
RTC: I2C BM8563:RTC機能を実現する。アドレス:0x15。
_  M5.Rtc.GetBm8563Time(); : ASCII形式で Rtc.Hour / Rtc.Minute / Rtc.Second
m5stack/m5-docs / system_m5stickc:M5stickC システム。
m5stack/m5-docs / axp192_m5stickc:AXP192 電源管理IC。
m5stack/m5-docs / lcd_m5stickc: IPS Display。
m5stack/m5-docs / sh200q_m5stickc:SH200Q 6 axis inertial sensor。
Virtual nixie tube (digitron) display – DHTML component library:nixie tube の画像データーがあります。
Long-ship:M5Stick-CのRTCをNTPサーバーからセットする:NTPが可能です。


.
感想:
画像の製作:画像処理により飽和したり綺麗でない場合がありますので
_ 手間ですが綺麗な表示になるように編集します。
_ 発光文字部分とニキシー管の背景とのバランスが重要です。
_ ニキシー管の背景が無いと雰囲気出ませんし強調すると全体が白く飽和します。
_ hex.c の編集が面倒でしたら「M5Stack CoinMarketCap」での
_ microSD 方式で 画像を使用する方法も良いかとも思います。
時刻:書込み時に PC の時刻を読み込み ESP内部の RTCに設定しています。
_  NTPは使用していません。
ニキシー管:ニキシー管をなんとか見る事ができて ほっとしています。
_     私もそうですが ニキシー管を好きな人が多い様です。
_     光る数値は前後に配置され数値の部分が重なる所があります。
_     細かく見るとフィラメントが重なる部分は綺麗に表示されないのですね。
github:使用していませんので大きなデータやリストを載せられず申し訳有りません。
M5StickC 価格:M5Stack Official Store = 1799円。$16.64。輸送期間 8日。
_ スイッチサイエンス = 2444円。
_ 10個購入する場合 M5Stack Official Store は 国内販売よりも 6450円お得になります。
M5Stack版:同様に M5Stack FIRE でも表示可能です。
_ M5Stack FIRE Nixie tube Clock:


.
スケッチ:M5StickC Nixie tube Clock: 2019.06.06 macsbug

// M5StickC Nixie tube Clock: 2019.06.06 macsbug
// https://macsbug.wordpress.com/2019/06/06/m5stickc-nixie-tube-clock/
#include <M5StickC.h>
#include "vfd_18x34.c"
#include "vfd_35x67.c"
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
int mode_ = 2; // 2: 2line, 1:1line
const uint8_t*n[] = { // vfd font 18x34
  vfd_18x34_0,vfd_18x34_1,vfd_18x34_2,vfd_18x34_3,vfd_18x34_4,
  vfd_18x34_5,vfd_18x34_6,vfd_18x34_7,vfd_18x34_8,vfd_18x34_9
  };
const uint8_t*m[] = { // vfd font 35x67
  vfd_35x67_0,vfd_35x67_1,vfd_35x67_2,vfd_35x67_3,vfd_35x67_4,
  vfd_35x67_5,vfd_35x67_6,vfd_35x67_7,vfd_35x67_8,vfd_35x67_9
  };
const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

void setup(void){ 
  M5.begin();
  pinMode(M5_BUTTON_HOME, INPUT);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setRotation(1);
  M5.Axp.ScreenBreath(10);             // 7-15
  // rtc setup start ---------------------------------------------
  String pt = (__DATE__ " " __TIME__); // PC DATE TIME READ
  //000000000011111111112  Read data
  //012345678901234567890
  //Jun  6 2019 07:20:41
  char m1[3]; int  m2; // Month conversion ( Jun to 6 )
  (pt.substring(0,3)).toCharArray(m1,4);
  for (int mx = 0; mx < 12; mx ++) {
    if (strcmp(m1, monthName[mx]) == 0){m2 = mx + 1; break;}
  }
  RTC_DateTypeDef DateStruct;         // Month, Date, Year 
  DateStruct.Month   = m2;
  DateStruct.Date    = (pt.substring(4, 6)).toInt();
  DateStruct.Year    = (pt.substring(7,11)).toInt();
  M5.Rtc.SetData(&DateStruct);
  RTC_TimeTypeDef TimeStruct;         // Hours, Minutes, Seconds 
  TimeStruct.Hours   = (pt.substring(12,14)).toInt();
  TimeStruct.Minutes = (pt.substring(15,17)).toInt();
  TimeStruct.Seconds = (pt.substring(18,20)).toInt();
  M5.Rtc.SetTime(&TimeStruct);
  // rtc setup end -----------------------------------------------
}

void loop(void){ 
  if(digitalRead(M5_BUTTON_HOME) == LOW){
    if (mode_ == 2){mode_ = 1;M5.Lcd.fillScreen(BLACK);return;}
    if (mode_ == 1){mode_ = 2;M5.Lcd.fillScreen(BLACK);return;}
  }
  if ( mode_ == 2 ){ vfd_2_line();}   // yyyy,mm,dd,hh,mm,ss
  if ( mode_ == 1 ){ vfd_1_line();}   // mm,ss
  delay(500);
}

void vfd_2_line(){
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  //Serial.printf("Data: %04d-%02d-%02d\n",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
  //Serial.printf("Week: %d\n",RTC_DateStruct.WeekDay);
  //Serial.printf("Time: %02d : %02d : %02d\n",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
  // Data: 2019-06-06
  // Week: 0
  // Time: 09 : 55 : 26
  int y1 = int(RTC_DateStruct.Year    / 1000 );
  int y2 = int((RTC_DateStruct.Year   - y1*1000 ) / 100 );
  int y3 = int((RTC_DateStruct.Year   - y1*1000 - y2*100 ) / 10 );
  int y4 = int(RTC_DateStruct.Year    - y1*1000 - y2*100 - y3*10 );
  int j1 = int(RTC_DateStruct.Month   / 10);
  int j2 = int(RTC_DateStruct.Month   - j1*10 );
  int d1 = int(RTC_DateStruct.Date    / 10 );
  int d2 = int(RTC_DateStruct.Date    - d1*10 );
  int h1 = int(RTC_TimeStruct.Hours   / 10) ;
  int h2 = int(RTC_TimeStruct.Hours   - h1*10 );
  int i1 = int(RTC_TimeStruct.Minutes / 10 );
  int i2 = int(RTC_TimeStruct.Minutes - i1*10 );
  int s1 = int(RTC_TimeStruct.Seconds / 10 );
  int s2 = int(RTC_TimeStruct.Seconds - s1*10 );
  
  M5.Lcd.pushImage(  0, 0,18,34, (uint16_t *)n[y1]); 
  M5.Lcd.pushImage( 19, 0,18,34, (uint16_t *)n[y2]);
  M5.Lcd.pushImage( 38, 0,18,34, (uint16_t *)n[y3]);
  M5.Lcd.pushImage( 57, 0,18,34, (uint16_t *)n[y4]);
  M5.Lcd.drawPixel( 77,13, ORANGE); M5.Lcd.drawPixel( 77,23,ORANGE);
  M5.Lcd.pushImage( 80, 0,18,34, (uint16_t *)n[j1]);
  M5.Lcd.pushImage( 99, 0,18,34, (uint16_t *)n[j2]);
  M5.Lcd.drawPixel(118,13, ORANGE); M5.Lcd.drawPixel(119,23,ORANGE);
  M5.Lcd.pushImage(120, 0,18,34, (uint16_t *)n[d1]);
  M5.Lcd.pushImage(140, 0,18,34, (uint16_t *)n[d2]);
                                                   
  M5.Lcd.pushImage( 00,40,18,34, (uint16_t *)n[h1]);
  M5.Lcd.pushImage( 20,40,18,34, (uint16_t *)n[h2]);
  M5.Lcd.drawPixel( 48,54, ORANGE); M5.Lcd.drawPixel( 48,64,ORANGE); 
  M5.Lcd.pushImage( 60,40,18,34, (uint16_t *)n[i1]);
  M5.Lcd.pushImage( 80,40,18,34, (uint16_t *)n[i2]);
  M5.Lcd.drawPixel(108,54, ORANGE); M5.Lcd.drawPixel(108,64,ORANGE);
  M5.Lcd.pushImage(120,40,18,34, (uint16_t *)n[s1]);
  M5.Lcd.pushImage(140,40,18,34, (uint16_t *)n[s2]);

  if ( i1 == 0 && i2 == 0 ){ fade();}
}

void vfd_1_line(){
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  int i1 = int(RTC_TimeStruct.Minutes / 10 );
  int i2 = int(RTC_TimeStruct.Minutes - i1*10 );
  int s1 = int(RTC_TimeStruct.Seconds / 10 );
  int s2 = int(RTC_TimeStruct.Seconds - s1*10 );
 
  //M5.Lcd.drawPixel( 48,54, ORANGE); M5.Lcd.drawPixel( 48,64,ORANGE); 
  M5.Lcd.pushImage(  2,6,35,67, (uint16_t *)m[i1]);
  M5.Lcd.pushImage( 41,6,35,67, (uint16_t *)m[i2]);
  //M5.Lcd.drawPixel(108,54, ORANGE); M5.Lcd.drawPixel(108,64,ORANGE);
  M5.Lcd.pushImage( 83,6,35,67, (uint16_t *)m[s1]);
  M5.Lcd.pushImage(121,6,35,67, (uint16_t *)m[s2]);

  if ( s1 == 0 && s2 == 0 ){ fade();}
}

void fade(){
  for (int i=7;i<16;i++){M5.Axp.ScreenBreath(i);delay(25);}
  for (int i=15;i>7;i--){M5.Axp.ScreenBreath(i);delay(25);}
  M5.Axp.ScreenBreath(12);
}

.
M5StickC , VFD , Nixie tube , ニキシー管 , IPS , clock , M5Stack Official Store , Hex File

Written by macsbug

6月 6, 2019 at 5:00 pm

カテゴリー: M5STACK