macsbug

検索結果

M5Stack SD Stopper

leave a comment »

M5Stack SD Stopper:SD 落下防止シール。         2019.04.28

SDカードが中に落下する場合は M5Stackに同封されているシールをご使用下さい。

費用:0円。
ケースの SD SLOT の穴の位置は ほんのわずかずれています。
同封されたシールを 使用すれば SD の落下を防げます。


ケースとSD SLOT の位置:

_ SD SLOT に対し ケースの穴は 左上にずれています。


感想:
アクリルの板を張ろうかと思いましたが 既に シールが用意されてありました。

Written by macsbug

4月 28, 2019 at 12:50 am

カテゴリー: M5STACK

M5Stack-SD-Updater

leave a comment »

Micro SD にアプリを入れ メニューから ロードすると アプリが動作します。 2018.03.12
. rev 1. 2019.02.11

使用方法:
ボタン: INFO = 名前とサイズ , LOAD = アプリをロード , > = アプリ選択。
M5STACKを起動すると メニューにアプリが表示されます。
> ボタン:アプリを選択します。
LOAD ボタン:選択したアプリをロードして アプリが起動します。
メニューに戻す:電源ボタン+Aボタン -> 電源ボタンを離す -> Aボタンを離す。
INFOボタン:アプリの名前とサイズを表示します。

効果:
M5STACK 1台で複数のアプリの動作が可能になります。
M5STACK へのアプリの書込みは不要になります。
他の M5STACK や 他の人に渡して直ぐ使用する事ができます。
Micro SD に 沢山のアプリを入れて持ち歩く事ができます。

作成者はフランス パリ在住の tobozo 氏です。tobozo 氏 からは
当ブログ Audio Spectrum Display with M5STACK ( 2017.12.31 ) で
ESP32_Spectrum_Display_03.ino」を M5STACK に移植させて頂きました。
この原型となる 「M5Stack-SAM」は Github Tomáš Suchan の tomsuch 氏の作品です。
そして「ArduinoJson」は  Github Benoît Blanchon の bblanchon 氏による 作品です。
tobozo 氏 , tomsuch 氏 , bblanchon 氏 に感謝致します。

YouTube:M5Stack Apps loaded from SD Card


構成:追記:2019.02.11


.
準備と手順:tobozo の M5Stack-SD-Updater に 説明があります。
_ memu.bin の作成と アプリを bin タイプにコンパイルし Micro SD に保存します。
_ メニューのアプリ(M5Stack-SD-Menu.ino) を M5STACKへ書き込みます。

Micro SD の用意:
01.  FAT32 Formatの Micro SD を用意します。(通常の市販品です)

Library の DownLoad:
02.  tobozo から M5Stack-SD-Updater を DL します。
03.  M5StackSAM を DL します。
04.  ArduinoJSON を DL します。
05.  上記の3つのフォルダーを Arduino IDE の Library へ入れます。

「menu.bin」を作成:
06.  M5Stack-SD-Updater 内の example 「M5Stack-SD-Menu.ino」を
_ 「コンパイルしたバイナリーを出力」します。
_ 出力先は 「M5Stack-SD-Menu.ino」と 同じ場所に
_ 「M5Stack-SD-Menu.bin」と言う名前で作られます。
_ 

07.  名前「M5Stack-SD-Menu.bin」を 「menu.bin」に変更します。
08.  「menu.bin」を Micro SD に保存します。

アプリをコンパイルし bin を作成:
09. Arduino IDE で 使用する アプリ を用意します。
10. #include <M5Stack.h> の下に #include “M5StackUpdater.h” を追加します。

#include <M5Stack.h>
#include "M5StackUpdater.h" 

11. setup() 内の

M5.begin(); 
Wire.begin(); 

の下に

if(digitalRead(BUTTON_A_PIN) == 0) {
   Serial.println("Will Load menu binary");
   updateFromFS(SD);
   ESP.restart();
}

を追加します。
この定型文は 「M5Stack-SDLoader-Snippet.ino」 に書かれています。
12. アプリを「コンパイルしたバイナリーを出力」で 「xxx.bin」 を出力します。
13. 「xxx.bin」 アプリを Micro SD に保存します。
14. 同様に 必要なアプリを bin にして Micro SD に保存します。

M5Stack-SD-Menu.ino を書き込む:
15. 「M5Stack-SD-Menu.ino」 を M5STACKへ書き込みます。
_  M5STACK は Micro SD 内にあるアプリを表示します。

以上で Micro SD と M5STACKの準備は終了です。


.
表示機能:
リストのアイコンに jpg画像を表示できます。最大200 x 100 です。
jsonファイルを記載します。{“width”:xxx, “height”:yyy}

SD ファイルの最大サイズは 255 の様です。
_ M5Stack-SD-Menu.ino:
_ #define MAX_FILES 255 // this affects memory


.
感想:
M5STACKの発売時から 待ち望んでいた機能が実現し 衝撃的な日となりました。
Micro SD内にアプリを複数保存し 希望のアプリを起動できます。
INFO に メモなどを表示できると便利かと思います。
M5STACKの機能が強化され、再度 tobozo 氏 に感謝致します。

Micro SDへアプリを収集し どの M5STACKでも 即動作する事と Micro SD を
必要な人へ渡す事ができ 簡単に使用する事が出来ます。とても便利になります。
この事から ESP32ボードの設計は SD SLOT の装備が必要条件になります。

アプリの bin タイプが動作する事、setup 内で updateFromFS(SD); と ESP.restart();
でメニューに戻す方法に感心致しました。

メモ:3/12 M5StackUpdater.h 内にバグがありましたが 直ぐ訂正が実施されました。
_ 変更内容:114行目:”menu.bin” -> “/menu.bin”
_  Arduino での SDファイル操作 “/” は不要ですが ESP32 では “/” が必要です。

M5STACK 一口メモ:
スピーカーのノイズを消す方法:
_ 方法:setup() に dacWrite(25, 0); // Speaker OFF // を入れます。
_ 現象:ADC:analogRead() 時に Speaker (GPIO25) からノイズがでます。

画像の方向を正しく表示する方法:
_ 方法:画像横:tft.setRotation(6);
_    画像縦:tft.setRotation(7);
_ 現象:これまでの ILI9341 Library ( TFT_eSPI.h 等 ) を使用すると
_    画像横:tft.setRotation(0); は 画像がが左右反転する。
_    背景:恐らく M5STACK の TFT の配線は従来と異なると思われます。
_     その為に robo8080氏の M5Stack_SokobanfillImage ルーチン
_     作成されたと思われます。
_ 他の画像問題:
_  現象:これまでの ILI9341 Library ( TFT_eSPI.h 等 ) を使用すると
_     画像表示の範囲が 320×240 で表示せず 240×240 程度の範囲にしか
_     表示しません。


 

Written by macsbug

3月 12, 2018 at 3:00 pm

カテゴリー: ESP32, M5STACK

Modification of SSD1306 library to be used for I2C OLED

leave a comment »

ESP8266 で I2C OLED 128×64 SSD1306 を動かす方法の備忘録。     2016.03.21
 
ESP8266 で OLED を動かす代表的なライブラリは 2つあります。今回は の方法です。
. squix78:esp8266-oled-ssd1306 ( SSD1306 + SSD1306Ui ):squix78氏に感謝。
 
2. cmmakerclub:ESP_Adafruit_SSD1306:cmmakerclubに感謝。
_  adafruit:Adafruit-GFX-Library:adafruitに感謝。
 


 
前回は 2. の ESP_Adafruit_SSD1306 と Adafruit-GFX-Library のコンパイルエラーを修正。
_    内容は「Adafruit-GFX.h」ライブラリーを追加修正しました。
 
今回は . で 線を描画できない無い為 ライブラリーに「drawLine」命令を追加しました。
_  線の描画が可能になり 文字と線を混在して表示でき いろいろな物が出来る様になる。
_  例: display.drawLine(x0,y0,x1,y1);



 
準備:
Mac OSX Mountain Lion
Arduino IDE 1.6.5_r5
_ Library Manager:Adafuruit GFX Library by Adafuruit Version 1.1.5 INSTALLED
_ Boards Manager:esp8266 by ESP8266 Community version 2.0.0 INSTALLED
 
前回の Adafruit-GFX.h:
squix78/esp8266-oled-ssd1306:SSD1306.h
squix78/esp8266-oled-ssd1306:SSD1306.cpp
 
ESP8266 (ESP-WROOM-02):AliExpress=1個435円(TELEC 技適済)。
I2C OLED 128×64 SSD1306:ebay=1個613円。


 
手順:SSD1306.h と SSD1306.cpp に「drawLine」を追加します。( 計3つ)


 
1. SSD1306.h へ追加:「void drawLine」をリストの最後に追加します。

// Draw the border of a drawLine at the given location          // add drawLine
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1);  // add drawLine

 
2. SSD1306.cpp へ追加:drawLine 内で使用する _swap_ の処理。
_  リストの冒頭にある(#include “SSD1306.h”、#include )の下に以下を追加します。

#ifndef _swap_int16_t                                           // add drawLine
#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }    // add drawLine
#endif 

 
3. SSD1306.cpp へ追加:以下の「drawLine」をリストの最後に追加します。

// add drawLine
void SSD1306::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1) {
  int steep = abs(y1 - y0) > abs(x1 - x0);
  if (steep) {
    _swap_int16_t(x0, y0);
    _swap_int16_t(x1, y1);
  }

  if (x0 > x1) {
    _swap_int16_t(x0, x1);
    _swap_int16_t(y0, y1);
  }

  int dx, dy;
  dx = x1 - x0;
  dy = abs(y1 - y0);

  int err = dx / 2;
  int ystep;

  if (y0 < y1) {
    ystep = 1;
  } else {
    ystep = -1;
  }

  for (; x0<=x1; x0++) {
    if (steep) {
      setPixel(y0, x0);
    } else {
      setPixel(x0, y0);
    }
    err -= dy;
    if (err < 0) {
      y0 += ystep;
      err += dx;
    }
  }
}


 
詳細:
以下、基本も無く用語も適当かも知れませんので ご了承ください。
ライブラリーなど到底出来ないレベルで諦めていましたが なんとなくトライ。
ヒントは 「Adafruit-GFX」ライブラリーは「線」が引けると言う事。
この「線」の中味を「移植」すれば良いのではないかと 無い脳味噌で考えてみました。

「線」を描画する「drawLine」命令がある本体は「Adafruit-GFX」らしい。
そしてプログラムは cpp に書いてあるらしい。

移植を開始:
1.「Adafruit-GFX.cpp」 を「drawLine」で検索すると 196行目に「drawLine」命令がある。
_ この「drawLine」ルーチンをコピーします。(196-234行目)
_ 「drawLine」ルーチンを「SSD1306.cpp」の一番下に追加します。

2. 上記ルーチンの違いを修正します。
_ 理由は 「SSD1306.cpp」では「color」関数を使用しない為です。
_ 「,uint16_t color」「,color」「,color」 の3つを削除します。

3.「SSD1306.cpp」の定数の定義を設定します。
_ 「Adafruit-GFX.cpp」で追加した以下をコピーします。_swap_関数を宣言している所。
_ 3行を前回の Adafruit-GFX.cpp と同様に「SSD1306.cpp」の冒頭に追加します。

#ifndef _swap_int16_t 
#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
#endif 


4.「SSD1306.h」には 関数の定義があり この中へ関数を記述します。
_ 中程にある drawRect 関数と同様に「void drawLine」を記述します。

void drawRect(int x, int y, int width, int height);
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1);


5. 補足:
_ cmmakerclub の記述方式は「int16_t」を使用し squix78氏は「int」を使用しています。
_ squix78氏に会わせるならば「int16_t」を「int」にするとリストが奇麗になります。
_ どちらの記述でも動き 私は「int」形式にしました。

void drawLine(int x0, int y0, int x1, int y1);

 
感想:
ESP8266でトップレベルに入る squix78氏が何故 線を描画する命令を入れなかったか
わかりません。もしかすると、既にライブラリーの中に入っているかも知れません。
それでしたら取り越し苦労ですね。それとも 必要ないよ とかでしょうか。
デモプログラムには 線を描画する場面はありませんでした。
結果 squix78氏のライブラリーで drawLine により「3D Cube」が動いたので良しとします。
それにしても display.drawLine の後に delay(1) を入れなければならないのは何故なんだ。

drawLine:「Adafruit-GFX」の drawLine は とても参考になります。2点間の線の描画は
_  x0,y0,x1,y1 の + – を考慮する必要があり _swap_int16_t(x0, y0); で処理しています。
_ 2点間の増分と余りを計算する為に微分を使用しています。dx,dy,err の様です。
_ 解りやすい記述ですので 独自のルーチンが記述できるかもしれません。
_ こういう記述を見ていると これを作る人がいて 凄いな〜と実に関心致します。

素人がライブラリーに手を加えて 後で作者が新バージョンを出すと 手も足も
出なくなる恐れがありますね。
 


 
サンプル:3D Cube by macsbug


// Add drawLine to SSD1306.h and SSD1306.cpp : by macsbug
// https://github.com/squix78/esp8266-oled-ssd1306
#include <Wire.h>                                           // with mod SSD1306.cpp
#include "SSD1306.h"                                        // with mod SSD1306.h
#include "SSD1306Ui.h"                                      // OLED
extern "C" {
  #include "user_interface.h" 
}
SSD1306 display(0x3c,12,13);                                // OLED Initialize
float r, x1, z1, y2;                                        //
int f[8][2];                                                // Draw box
int x = 64;                                                 // 64=128/2
int y = 32;                                                 // 32= 64/2
int c[8][3] = {                                             // Cube
    {-20,-20, 20},{20,-20, 20},{20,20, 20},{-20,20, 20},    //
    {-20,-20,-20},{20,-20,-20},{20,20,-20},{-20,20,-20} };  //

void setup() {                                              //
  Wire.begin(12,13);                                        // SDA=GPIO012,SCL=13
  display.init();                                           // OLED
  display.setFont(ArialMT_Plain_16);                        //
  display.setTextAlignment(TEXT_ALIGN_LEFT);                //
  display.flipScreenVertically();                           // OLED
  display.displayOn();                                      // OLED
  display.clear();                                          // OLED
}                                                           //

void loop() {                                               //
  for (int a = 0; a <= 360; a = a + 3 ) {                   // 0-360 degree step 3
   for (int i = 0; i < 8; i++) {                            //
    r       = a * 0.0174532;                                // 1 degree
    x1      = c[i][2] * sin(r) + c[i][0] * cos(r);          // rotate X
    z1      = c[i][2] * cos(r) - c[i][0] * sin(r);          // rotate Z
    y2      = c[i][1] * cos(r) - z1      * sin(r);          // rotate Y
    f[i][0] = x1      * cos(r) - y2      * sin(r)  + x;     // X
    f[i][1] = x1      * sin(r) + y2      * cos(r)  + y;     // Y
    f[i][2] = c[i][1] * sin(r) + z1      * cos(r);          // Z
   }                                                        //
   display.clear();                                         //
   display.drawString(0,0,"3D Cube");                       //
   display.drawLine(f[0][0],f[0][1],f[1][0],f[1][1]);       //
   display.drawLine(f[1][0],f[1][1],f[2][0],f[2][1]);       //
   display.drawLine(f[2][0],f[2][1],f[3][0],f[3][1]);       //
   display.drawLine(f[3][0],f[3][1],f[0][0],f[0][1]);       //
   display.drawLine(f[4][0],f[4][1],f[5][0],f[5][1]);       //
   display.drawLine(f[5][0],f[5][1],f[6][0],f[6][1]);       //
   display.drawLine(f[6][0],f[6][1],f[7][0],f[7][1]);       //
   display.drawLine(f[7][0],f[7][1],f[4][0],f[4][1]);       //
   display.drawLine(f[0][0],f[0][1],f[4][0],f[4][1]);       //
   display.drawLine(f[1][0],f[1][1],f[5][0],f[5][1]);       //
   display.drawLine(f[2][0],f[2][1],f[6][0],f[6][1]);       //
   display.drawLine(f[3][0],f[3][1],f[7][0],f[7][1]);       //
   display.drawLine(f[1][0],f[1][1],f[3][0],f[3][1]);       // cross
   display.drawLine(f[0][0],f[0][1],f[2][0],f[2][1]);       // cross
   display.display();                                       //
  }                                                         //
  delay(1);                                                 //
}                                                           //


Written by macsbug

3月 20, 2016 at 6:34 am

カテゴリー: ESP8266

I2C OLED 128×64 SSD1306 in ESP8266

with 2 comments

ESP8266 で I2C OLED 128×64 SSD1306 を動かす方法の備忘録。       2016.03.20

ESP8266 で OLED を動かす代表的なライブラリは以下の2つがあります。今回は の方法です。
1. squix78:esp8266-oled-ssd1306 ( SSD1306 + SSD1306Ui ):squix78氏に感謝。

. cmmakerclub:ESP_Adafruit_SSD1306:cmmakerclubに感謝。
_  adafruit:Adafruit-GFX-Library:adafruitに感謝。



1. squix78氏 による SSD1306,SSD1306Ui ライブラリは多くの機能を持ち最高傑作です。
_  文字の奇麗さや表示方法により見やすい画面を作る事ができます。
_  使用したいフォントを作成して組み込むことができるウエブサイトは素晴らしいです。
_  文字の表示は X,Y の位置に表示する方式で表示レイアウトがしやすいです。
_  右揃え 左揃えの機能により位置合わせができる為 奇麗に表示できます。
_  WiFi受け待ち時の進行状況やページめくりの画像処理機能は見事です。
_  気になる点は「drawLine 命令」が無い為に 線を引く事ができません。
_  この件は ライブラリの解析を実施し drawLineルーチンを追加して動作しました。
_  詳細は Modification of SSD1306 library to be used for I2C OLED です。

2. ESP_Adafruit_SSD1306Adafruit-GFX Library は drawLine 命令で線を引く事が可能。
_  Arduino IDEのLibraryやBoardのバージョンにより 動く場合と動かない場合があります。
_  3D CUBE with ESP8266 and OLED(2016.01.16)の時点では動いていましたが 何かを
_  バージョンアップした為かコンパイルエラーが発生し使用できなくなりました。
_  恐らく最新のArduino IDE のバージョンで始められた方はエラーが出ると思われます。
_  使用する為に、備忘録も兼ねて解説を致します。
_  文字表示はX,Yの位置指定でなくプリント文方式で改行が行われます。
_  文字は拡大すると奇麗ではありません。フォント機能を調べる必要があります。
_  よって ライブラリーは用途によって使い分けしたほうが良いかと思います。


開発環境:
Mac OSX Mountain Lion
Arduino IDE 1.6.5_r5
_ Library Manager:Adafuruit GFX Library by Adafuruit Version 1.1.5 INSTALLED
_ Boards Manager:esp8266 by ESP8266 Community version 2.0.0 INSTALLED
LIbrary:ESP_Adafruit_SSD1306
LIbrary:Adafruit-GFX-Library
ESP8266(ESP-WROOM-02):ebayで1個435円(TELEC 技適済)。
I2C OLED 128×64 SSD1306:ebayで1個631円。


サンプルや今回のスケッチをコンパイルすると以下のエラーを表示します。
又、コンパイルエラー修正後には 128×32 の低い解像度で表示されます。

/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp: In member function ‘virtual void Adafruit_SSD1306::drawPixel(int16_t, int16_t, uint16_t)’:
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp:215:14: error: ‘swap’ was not declared in this scope
swap(x, y);
^
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp: In member function ‘virtual void Adafruit_SSD1306::drawFastHLine(int16_t, int16_t, int16_t, uint16_t)’:
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp:558:16: error: ‘swap’ was not declared in this scope
swap(x, y);
^
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp: In member function ‘virtual void Adafruit_SSD1306::drawFastVLine(int16_t, int16_t, int16_t, uint16_t)’:
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp:626:16: error: ‘swap’ was not declared in this scope
swap(x, y);
^
コンパイル時にエラーが発生しました。


コンパイルエラーと解像度の修正は、ESP_Adafruit_SSD1306 への追加と
_ Adafruit-GFX-Library への変更を実施します。

1. コンパイルエラーを取り除く。理由:_swap_ の定義がされていない為。
_  Adafruit_GFX.h に以下を追加します。
_  場所は #define の定義してあるリストの12行目あたりに入れます。
_  #define swap(a, b) { int16_t t = a; a = b; b = t; }

2. OLED 128×64 を使用する為の変更。理由:デフォルトの設定は 128×32 の為。
_  ESP_Adafruit_SSD1306.h を以下のように変更します。
_  場所は リストの55行目あたりにあります。
_  #define SSD1306_128_64
_  // #define SSD1306_128_32
_  // #define SSD1306_96_16


メモ:
ESP_Adafruit_SSD1306 LIbrary:ESP8266用 の LIbrary で Adafruit_SSD1306 LIbrary を
_ ESP8266用に最適化したものです。Adafruit_SSD1306 LIbrary でも動作しますが
_ 速度は Arduino と同じく遅いです。ESP8266に最適化された ESP_Adafruit_SSD1306
_ は Arduinoの5倍の速度で動き ESP8266のパワーを発揮する事ができます。


OLED情報:OLEDには以下の3種類がある。
左:GNDが左端にある。中央:VCCが左端にある。右:VCCが左端にある赤い基板。
このOLEDで注意する所は、I2Cの配列が規格化されていないのも原因ですが、
端子の配列が2種類あり、正面左側の端子がVCCかGNDになっている。
交換する時に電源が逆になる場合があるので注意する事。
業者によっては
2種類の画像が同時に掲載されており どちらがくるか到着するまで解らない。
他に発光色として白と黄色+青(黄色は一番上の1行分)がある。

ebayで1個631円程度。業者としては、ebayの「gc_supremarket」という所が
画像通りの「VCCが左端にある」ものを出荷し一番安全である。

赤いタイプに注意:赤いタイプは他にも種類があるようです。
販売先の画面には、Power supply voltage: 2.8-5.0V DC とかかれている。
しかし、LDOのU2が無く3.3V以上はレギュレートされないと思われます。
その為 想像ですが5Vを接続した場合は破損する可能性があります。
左:16個の部品が使用されている。(U2,D1,R1,5,6,7,RDRS,C1,2,3,4,5,6,7,8,9)
右:10個の部品が使用されている。(R1,2,3,4,C1,2,3,4,5,6):U2,D1,ADRS なし。


感想:
よくある何かの後に起きるトラブル:ライブラリーのアップデートか何かの後に スケッチが
_ コンパイルできなくなり調べました私の脳味噌では解るまで結構時間を使いましたので
_ 自分の備忘録として書き置きしました。又、友人の所でOLEDが不明なエラーの為に
_ 動かす事が出来なかった件がこの方法で動かす事が出来る様になります。
ディスプレー環境の現状:ESP8266における見やすいディスプレーはこのOLED位しか無い。
_ Arduino IDEで開発できるTFTは1件ほどしか無く環境が整っていない。
delay(1):スケッチの終わりにある delay(1)は 必要です。これが無いとグラフックが途中で
_ 停止します。この方法は理由が解らず入れていますので対症療法的です。
_ ESP.wdtDisable(); では効果がありません。


スケッチ:以下のスケッチが動けば幸いです。OLEDのチェックにも使えます。


// 3D Cube in The ESP8266 and I2C OLED 128x64 SSD1306
// There is change in the two libraries
// 1:ESP_Adafruit_SSD1306.h Libraries:
//   https://github.com/cmmakerclub/ESP_Adafruit_SSD1306
//   change : #define SSD1306_128_64
// 2:Adafruit_GFX.h:
//   https://github.com/adafruit/Adafruit-GFX-Library
//   add to : #define swap(a, b) { int16_t t = a; a = b; b = t; }
// Library Manager:Adafuruit GFX Library by Adafuruit Version 1.1.5 INSTALLED
// Boards  Manager:esp8266 by ESP8266 Community version 2.0.0 INSTALLED
// I2C : SDA=GPIO04,SCL=GPIO05
#include <SPI.h>                                            //
#include <Wire.h>                                           //
#include <Adafruit_GFX.h>                                   // with mod
#include <ESP_Adafruit_SSD1306.h>                           // with mod
Adafruit_SSD1306 display(4);                                // OLED Reset
float r, x1, z1, y2;                                        //
int f[8][2];                                                // Draw box
int x = 64;                                                 // 64=128/2
int y = 32;                                                 // 32= 64/2
int c[8][3] = {                                             // Cube
    {-20,-20, 20},{20,-20, 20},{20,20, 20},{-20,20, 20},    //
    {-20,-20,-20},{20,-20,-20},{20,20,-20},{-20,20,-20} };  //

void setup() {                                              //
  Wire.begin(4,5);                                          // SDA=GPIO04,SCL=5
  display.begin(SSD1306_SWITCHCAPVCC, 0x3c);                // 0x78:011110+SA0+RW 
  display.clearDisplay();                                   //
  display.display();                                        //
}                                                           //

void loop() {                                               //
  for (int a = 0; a <= 360; a = a + 3 ) {                   // 0 to 360 degree
   for (int i = 0; i < 8; i++) {                            //
    r       = a * 0.0174532;                                // 1 degree
    x1      = c[i][2] * sin(r) + c[i][0] * cos(r);          // rotate X
    z1      = c[i][2] * cos(r) - c[i][0] * sin(r);          // rotate Z                                            //
    y2      = c[i][1] * cos(r) - z1      * sin(r);          // rotate Y
    f[i][0] = x1      * cos(r) - y2      * sin(r)  + x;     // X
    f[i][1] = x1      * sin(r) + y2      * cos(r)  + y;     // Y
    f[i][2] = c[i][1] * sin(r) + z1      * cos(r);          // Z
   }                                                        //
   display.clearDisplay();                                  //
   display.drawLine(f[0][0],f[0][1],f[1][0],f[1][1],WHITE); //
   display.drawLine(f[1][0],f[1][1],f[2][0],f[2][1],WHITE); //
   display.drawLine(f[2][0],f[2][1],f[3][0],f[3][1],WHITE); //
   display.drawLine(f[3][0],f[3][1],f[0][0],f[0][1],WHITE); //
   display.drawLine(f[4][0],f[4][1],f[5][0],f[5][1],WHITE); //
   display.drawLine(f[5][0],f[5][1],f[6][0],f[6][1],WHITE); //
   display.drawLine(f[6][0],f[6][1],f[7][0],f[7][1],WHITE); //
   display.drawLine(f[7][0],f[7][1],f[4][0],f[4][1],WHITE); //
   display.drawLine(f[0][0],f[0][1],f[4][0],f[4][1],WHITE); //
   display.drawLine(f[1][0],f[1][1],f[5][0],f[5][1],WHITE); //
   display.drawLine(f[2][0],f[2][1],f[6][0],f[6][1],WHITE); //
   display.drawLine(f[3][0],f[3][1],f[7][0],f[7][1],WHITE); //
   display.drawLine(f[1][0],f[1][1],f[3][0],f[3][1],WHITE); // cross
   display.drawLine(f[0][0],f[0][1],f[2][0],f[2][1],WHITE); // cross
   display.display();                                       //
  }                                                         //
  yield();                                  // delay(1);   rev 2018.05.11
}                                                           //

Written by macsbug

3月 19, 2016 at 2:52 am

カテゴリー: ESP8266

SSD RAID 0

leave a comment »

iMac 27インチ 2010 Mid Core i7 の SSD RAID 0 化を実施しました。       2015.12.18

内蔵HDの不調を抱えている中、地域の電気が一瞬消え、iMac が起動しなくなる。
いつからか、iMac は、コンセントを抜くとかなりの時間を置かないと起動しない持病持ち。
分解して電源のコンデンサーを目視点検して異常なし。各部の埃を掃除。
HD を外し SSD 2個を取り付けました。
HD温度センサーのケーブルは、念のために延長して外に出す。(抵抗値は2MΩ)


DISK速度(Xbench):外付けHDD=70、SSD 1個=382、SSD RAID 0=442 でした。
Blackmagic Disk Speed Test:左から、外付HD、内蔵SSD1個、内蔵SSD2個でRAID 0。


SSDは、500GB 500MB/s 2個で4万位。
iMac 27 2010 Mid の HD を SSD 2個に交換し、速度重視の RAID 0 にする。
ストライピングで容量は1TBとなる。
OSは、アプリの関係で、Mountain Lion にした。
SSD の TRIM 有効化の為に、Trim Enabler を動かしました。
ファンのコントロール:HDの温度センサーを外した為に、HDファンが高速に回転する場合があります。
_ Macs Fan Control for Mac OS X を使用しHDのファンをコントロールします。
_ 温度と回転数の状況はメニューバーに表示する事が出来ます。
_ 参考:TAKEN:Macを冷やす!空冷ファンを制御するソフトウエア “Macs Fan Control”


感想:
速度:画面は新型とも思えるほど速く快調! スピードメーターを見るだけでも楽しい。
_ 起動はアップルマークがでてから、瞬き1つで起動完了。
_ VMware Fusionの立ち上がりはジャンプ1回で起動する速さ。
発熱:発熱多きこの機種の上部温度は、32度から26度に低下。(HDによる温度上昇は大きい)
Macs Fan Control 温度管理:CPUは、センサー温度による制御で、CPU Core 0 を選択。
Time Machine:RADO 0 は、故障率が倍の為に、外部HDを用意して設定しました。
容量:SSD 500GB+500GB で 1TB となる。こうなるとSSD+HDの構成はいらない感じです。


参考:
Wikipedia:RAID
スピログ:iMac (Mid 2010) 27inch のSSD追加作業:スピログさん、助かります。
スピログ:iMac Corei7 でSSDを2個積みする!(RAID 0)
スピログ:惚れてまう、その性能。 〜 intelだらけのCore i7 iMac 〜
_ ファン:ケーブルコネクタ側のピンをショートすることでファンを低速回転出来る。
_ 
Mac Person:Mac のシステムデータ移行
project92:MacBook ProにHDD 2台を内蔵し、RAID 0化したら快適すぎる件
マイナビニュース:Samsung SSD 840 EVO×2台でRAID入門 – 爆速環境を手に入れる
MacとiPhone備忘録:僕が使っている熱対策アプリFan ControlとMacBookスタンド
Graphic well:IMACが熱さでヤバい!MACS FAN CONTROLで熱さ対策
Lifelog:iMac Mid 2010 27inchのHDDをSSDに交換しました
_ ホチキスの芯を取り付けて温度センサ部をショートさせ、HDD用ファンの回転を抑えました。
ファンコントロールアプリ:
_ Macs Fan Control for Mac OS X
_ iMac Fan Control
Vintage Computer:2.5インチ SATA SSDの選び方:STAT 2 と SATA 3 対応マシンについて


Written by macsbug

12月 18, 2015 at 7:25 am

カテゴリー: Apple

ソフトウエアラジオ(SDR)

leave a comment »

昔、ちょっとだけやったアマチュア無線をマックで再現。USBドングルで受信ができる進化に感激!!

mrx 361
362 airp

 
名称は、DVB-T+DAB+FM USB チューナー RTL2832U+R820T。
ebayに10月31に14個オーダーしchinaから11月15着。価格は1個1000円。
DVB-TドングルはRTL2832デコーダーチップとR820Tチューナーチップを使うワンセグチューナーで、
gqrxというソフトで広帯域受信機になる。受信周波数範囲は24MHz~1800MHz。航空機無線も聞く事ができる。
左はFMを受信。FMを聞くなんて久しぶりで感激ひとしお。右は羽田空港にて航空機無線を受信。
公式サイト:http://gqrx.dk/
OSX Snow Leopardは、gqrx-2.2.0で動作。Mavericksは、gqrx_8で動作。
DL先:http://sourceforge.net/projects/gqrx/
Windowsは、sdr_installで行う。
無線って直ぐ飽きたり、それほどまでお金を出費したくない人が多い。
捨ててもいい価格としてebayで1000円以下を探し共同購入。
価格詳細:13989円:$115.78=$8.27*14個+$5.18(Shiping)
参考:超かんたんSDR(ソフトウエアラジオ)入門受信記録のブログPlus RTL-SDRSHAFT CORPORATIONのblog

Written by macsbug

11月 16, 2014 at 4:07 am

カテゴリー: Radio

Introduction to Wio Terminal

leave a comment »

Wio Terminal 入門                2020.05.31

Wio Terminalをはじめよう
Arduino IDE の設定とサンプルの使用方法が記載されています。
上記の内容で 直ぐ動かす事ができました。

基本:Arduino IDE と プログラム

基本:Arduino IDE と プログラム
1 Get Started with Wio Terminal により以下を実行する
2 Arduino IDE / ファイル / 環境設定 / ボードマネージャー URL追加:
. https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
3 Arduino IDE / ツール / ツール / ボードマネージャー / Wio Terminal 検索:
. seeed SAMD Boards を インストール
4 Arduino IDE / ツール / ボード / :Wio Terminal 選択
5 プログラム
. Wio Terminal と PC USB に接続。
. プログラム転送:ブートローダーモード:電源ONからすばやく2回リセット
. シリアルポートの名前:電源投入時とブートローダーモードでは異なる。
. 注意:クラッシュしたりUSBシリアルがArduino IDEに表示されない場合がある
6 Wi-Fi:Realtek RTL8720のファームウェアを更新する
. 手順: Wio Terminal / Network / Overview (Seeed)

 


.
Wio Terminal の 詳細な情報:
SeeedStudio の Seeed Wiki に詳細な機能が記載されています。

詳細:

01. Get Started with Wio Terminal
Feature, Specification, HardWare Overview
, Pinout Diagram,Getting Started, Software
, FAQ ( Reset , Boot Mode ), Resouces
02. ArduPy Get Started with Wio Terminal : Arduino + MicroPython
03. LCD
Overview Seeed_Arduino_LCD と Adafruit Zero DMA Library
Basic of LCD ピクセル座標系, 8bit/16bit Color,初期化,バックライト
Graphics 基本的なグラフィック機能
Fonts Serif, Sans, Mono, 9, 12, 18, 24 point
Smooth Fonts 日本語,スムーズ,フォント作成, #define SMOOTH_FONT
Loading Image SDカードから画像を読み込んで表示
Line Charts 線グラフ描画。Library Seeed_Arduino_Linechart
Histogram ヒストグラム描画。Library Seeed_Arduino_Histogram
LCD API Examples TFT_Pie_Chart,TFT_ArcFill, TFT_ArcFillSpiral, TFT_Clock
,TFT_Clock_Digital, TFT_Terminal, AII_Free_Fonts_Demo
,RLE_Font_test, TFT_Starfield, TFT_Matrix
04. IO
Overview RPI pin配列, Grove(Default I2C, digital/Analog,PWM)
Analog RPI Analog pin , Grove A/D Port
Digital RPI Digital pin , Grove A/D Port
I2C RPI and Grove I2C, SDA1(2), SCL1(3), SDA2(0), SCL2(1)
SPI MOSI=PIN_SPI_MOSI(19), MISO=PIN_SPI_MISO(21)
,SCK=PIN_SPI_SCK(23), SS=PIN_SPI_SS(24)
05. Network
Overview RTL8720 FW更新方法, ワイヤレス接続方法
Wi-Fi Station (STA) Mode, Multi, Client, Https, AP Mode
06. IMU
Overview 3軸デジタル加速度計(LIS3DHTR) Library インストール
Getting Started IMU値を読み取る方法
Tapping Single, Double click のタップ動作を感知する
07. Configurable Buttons : 3つのボタン
Overview WIO_KEY_C (left), WIO_KEY_A (center), WIO_KEY_B (right)
08. 5 Way Switch
Overview WIO_5S_UP, WIO_5S_DOWN, WIO_5S_LEFT
,WIO_5S_RIGHT, WIO_5S_PRESS
09. Light Sensor : 照度センサー
Overview Analog, WIO_LIGHT (A13), 場所=背面SD SLOTの上
10. Infrared Emitterr : 赤外線エミッタ
Overview WIO_IR, 場所=背面のSD SLOTの左側
11. Microphone
Overview Analog, WIO_MIC, 場所=左下
12. Buzzer : ピエゾ
Overview WIO_BUZZER
13. File System
Overview SD Card : SPI Interface, FAT12,16,32,exFAT
Read and Write SDカードからの読み取り/書き込み
14. USB Host : USBホストとして使用する方法
Overview USBデバイスを接続して、PCと同じようにできます。
,USB OTGアダプターとUSB シリアルモジュール 必要
Keyboard USBキーボードを使用する方法
Mouse USBマウスを使用する方法
Xbox Xbox ONEコントローラーを使用する方法
15. USB Client
Overview HID(key,Mouse),MidiをUSB clientとして使用する方法
Keyboard Wio Termainalをキーボードとして使用する
Mouse Wio Termainalをマウスとして使用する
MIDI Wio TermainalをUSB MIDIデバイスとして使用する
16. TensorFlow Lite
Overview 機械学習モデルをテストできます
17. Grove
Overview TDS, Temp, GPS Sensor,OLED display 等を接続可
18. Demo
Wio Terminal Displaying Gyro
,アクセラレータの読み取り値を表示する : 折れ線グラフにプロット
Wio Terminal Storing Data
,アナログデータを表示, 保存 : 光センサー値の読み取りと折れ線グラフプロット
Wio Terminal Displaying Photos
写真を表示する : SDカードの画像をループで表示
Wio Terminal Interactive Faces Demo
,インタラクティブ絵文字 : SDから画像表示しボタンとジャイロでユーザーと対話
Build a IR Thermal Imaging Camera using Wio Terminal
,IRサーマルイメージングカメラを構築する : 赤外線温度センサアレイ(AMG8833)
Reading Raspberry Pi’s Info using Wio Terminal
,Raspberry Piのシステムステータスを読み取る : USBシリアル通信
Accessing to GitHub using Wio Terminal
,Githubリポジトリ統計の読み取り : Githubからデータを取得
,インターネットからライブデータを取得
,APIを実装して, 気象情報, YouTube統計などを取得できる
Gesture Recognition with Wio Terminal
,機械学習-ジェスチャー認識 :
Reading Coronavirus Live Data using Wio Terminal
,コロナウイルスCOVID-19ライブデータの読み取り
Wio Terminal Initial Firmware (Retro Gaming)
,つまらない レトロゲーム

 



.
参考:
Seeed K.K. Wiki:Wio Terminalドキュメントガイド:🍎 情報がタイムリーにまとめられています。
Seeed株式会社:日本国内総代理店


.
感想:
. Seeed SAMD Board のサンプルは特に問題無く動作しました。
. サンプル:TFT_espi のサンプルと同等で新しきものはなし。
_ 購入したくなる様なサンプルが無い。Arduino IDE 人口を吸収するものが欲しい。
_ それで Game : Torotes と Pocman を移植しましたが 商標にかかるかと、、。
_ ただし、上記 18 のサンプルは 注目の範囲です。
. SDから起動出来ない:M5STackで実現している SD_UPdate が無く超残念です。
_ SD から プログラムをインストールし起動するのは 大変重要な機能です。
_ 沢山のプログラム数は重要である事と 毎回Arduino IDEでインストールするのは面倒。
. 機能:M5Stack に無い機能があり注目の範囲です。
. デザイン:手の平に入る大きさは感触が良い。
_ USB接続が下側はワイヤーがはみ出て見た目が汚い。縦に置けない不安定感。
. Seeed の forum は 大変助かり注目しています。
. Seeed のハードと資料は 全部を知り尽くしてませんが良く出来ており 素晴らしいです。
. Seeed日本国内総代理店は 情報の発信と収集を 担当者が行なっており 素晴らしいです。

 


.
Wio Terminal , Wio Wiki , IO , I2C , D/A ,

Written by macsbug

5月 31, 2020 at 3:17 pm

カテゴリー: Wio Terminal

Wio Audio Spectrum Display

leave a comment »

Wio Terminal で Audio Spectrum Display を作りました。    2020.05.28

Wio Terminal 内蔵マイクの音を スペクトラム表示します。

操作:マイクのゲインを上下し感度を調整します。


.
スケッチ:
_ Wio_audio_spectrum_display.zip を DL します。
_ DL 後に Wio_audio_spectrum_display_.pdf の末尾 _.pdf を消します。
_ Wio_audio_spectrum_display.zip を解凍します。
_ フォルダーの中味は 以下です。
_ 


.
Spectrum Display について:
_ tobozo氏の「ESP32_Spectrum_Display_03.ino」を M5Stack に移植。
_ 2017.12.31:Audio Spectrum Display with M5STACK
_ tobozo氏のソースは G6EJD氏の「ESP32_Spectrum_Display_02.ino」です。
_ 謝辞:G6EJD氏 と tobozo氏に感謝致します。

_ tobozo氏の使用した ディスプレーは 128×64 OLED SSD1306
_ M5Stack と Wio Termonal のディスプレーは 320×240 ILI9341
_ 2020.05.28:Wio Terminal に移植。


.
マイク:
_ 基本:Getting Started with Microphone:マイク入力について書かれています。

void setup() {
  pinMode(WIO_MIC, INPUT);
}
 
void loop() {
  int val = analogRead(WIO_MIC);
}

マイク入力は 他のMicと異なり デフォルトに対し32倍にし
Key , 5Way Switchで可変にしています。
本来は eqBand audiospectrum[8] の配列で数値を設定する必要があります。

int gain = 32;

vReal[i] = analogRead(WIO_MIC) * gain;

調整:
_ 調整と変数:1 – 6 の値をマイクに合わせて設定します。
1. freqname
2. amplitude:感度
3. peak
4. lastpeak
5. lastval
6 lastmeasured

eqBand audiospectrum[8] = {
  //Adjust the amplitude values to fit your microphone
  { "125Hz", 500, 0, 0, 0, 0},
  { "250Hz", 200, 0, 0, 0, 0},
  { "500Hz", 200, 0, 0, 0, 0},
  { "1KHz",  200, 0, 0, 0, 0},
  { "2KHz",  200, 0, 0, 0, 0},
  { "4KHz",  100, 0, 0, 0, 0},
  { "8KHz",  100, 0, 0, 0, 0},
  { "16KHz",  50, 0, 0, 0, 0}
};

.
感想:
Wio のマイクは 全面左下のスリットの位置にあります。
M5Stack で使用したマイクと感度が異なりますので 設定が必要です。
今回は 単に 入力値を 32倍にし 可変できる様にしました。


Wio , Terminal , Audio Spectrum Display , MIC , WIO_MIC, INPUT , WIO_MIC ,

Written by macsbug

5月 28, 2020 at 1:45 pm

カテゴリー: Wio Terminal

Wio nixie tube clock

leave a comment »

Wio_nixie_tube_clock.zipWio Terminal で ニキシー管時計を製作しました。   2020.05.25

ニキシー管:高電圧が必要である事や 高価な為、購入するまでに至りません。
_     そこで 画像により 費用ゼロで 簡単に作る事ができます。

動作条件:DS3231 RTC Module が I2C1 に接続されている事。
_    ここでは Battery Module の中に RTC が装備されています。

機能:5 Way Switch により「YYYY,MM,DD」「HH,MM,SS」「MM,SS」
_  の3つの表示に切り換える事ができます。

スケッチ:
_ Wio_nixie_tube_clock.zip を DL してください。
_ DL 後に wio_nixie_tube_clock.zip_.pdf の末尾 _-4.pdf を消し
_ .zip を解凍します。
_ 


詳細:
時計機能:
_ 130円の リアルタイムクロックボード(RTC)を追加しました。
_ これが無いと動作しません。
_ 参考:2020.05.25:Wio Simple Battery

日時設定:今回の目的は ニキシー管表示が主で 時計機能は 低いです。
_ PCの値を使用し NTP は使用していません。
_ PC で書き込んだ日付が入ります。
_ 1度 Wio の電源を切り 再度電源を入れると RTCに保存された 日付を使用します。
_ この時 日付は更新されていませんので 電源を切った時の日付になります。
_
NTP設定:今回はパス
_ Wifi で NTPを活用すると機能ある時計が出来る様になります。
_ NTP を使用すれば、起動時に ネット接続が可能であれば RTCにNTPを保存や
_ 決められた時間にNTP時間を調整(保存)する事が可能になります。

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

製作の基本:以下を参照下さい。ニキシー管画像の作り方と変換方法。
_ Wio nixi tube clock の DL には ニキシー管画像の
_  vfd_18x34.c , vfd_35x67.c , vfd_70x134.c が 入っています。
_ 2019.06.16:M5Stack Nixie tube Clock
_ 2019.06.06:M5StickC Nixie tube Clock


感想:
ニキシー管を Wio Terminal の IPS Display で表示すると とても鮮やかで綺麗です。

 


スケッチ:

// Woi Terminal nixie tube clock : 2020.05.25 macsbug
//  https://macsbug.wordpress.com/2020/05/25/wio-nixie-tube-clock/
// M5Stack nixie tube clock      : 2019.06.16 macsbug
//  https://macsbug.wordpress.com/2019/06/16/m5stack-nixie-tube-clock/
// M5StickC Nixie tube Clock     : 2019.06.06 macsbug
//  https://macsbug.wordpress.com/2019/06/06/m5stickc-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
// mode controll : 5 way switch
// mode 1 : yyyy_mmdd_hhmmss
// mode 2 : mmdd_hh_mmss
// mode 3 : mmdd_ss_hhmm
// rtc    : DS3231, SDA1 = 2, SCL1= 3;
#include &lt;SPI.h&gt;
#include &lt;TFT_eSPI.h&gt;
TFT_eSPI tft = TFT_eSPI();
#include &lt;Wire.h&gt;
#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 
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, 2, 3
 
void setup() { 
  tft.init();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);
  pinMode(WIO_5S_PRESS, INPUT_PULLUP);
  Wire.begin(SDA1,SCL1); delay(10);
  rtc.begin(); 
  rtc.adjust(DateTime(__DATE__, __TIME__)); // Set the PC time
  // esp_timer_init();
  // wifi_setup();
  rtc_setup();  // Read the value of RTC
}

void loop() {
  // if (targetTime &lt; esp_timer_get_time()/1000 ){
  DateTime now = rtc.now();
  yy = now.year();
  mn = now.month();
  dd = now.day();
  hh = now.hour();
  mm = now.minute();
  ss = now.second();
  if(digitalRead(WIO_5S_PRESS) == LOW){         // mode change
   if (md == 3){md = 1;tft.fillRect(1,1,317,236,TFT_BLACK);return;}
   if (md == 2){md = 3;tft.fillRect(1,1,317,236,TFT_BLACK);return;}
   if (md == 1){md = 2;tft.fillRect(1,1,317,236,TFT_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(); 
  delay(500);
}

void rtc_setup(){
  DateTime now = rtc.now(); // time geting from RTC
  if (now.year() == 2165){  // rtc check
    tft.setCursor(20,200);tft.setTextColor(TFT_RED);
    tft.print("RTC not installed");delay(2000);
    tft.fillRect(1, 1, 317, 236, TFT_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);
    tft.setCursor(20,200);tft.setTextColor(TFT_BLUE);
    tft.print("SET UP RTC");delay(2000);
    tft.fillRect(1, 1, 317, 236, TFT_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
  //tft.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41);

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

  int p3 = 2; int px3 = 40; int py3 = 150;
  tft.pushImage( p3 + 0*px3, py3, 35,67, (uint16_t *)m[h1]);
  tft.pushImage( p3 + 1*px3, py3, 35,67, (uint16_t *)m[h2]);
  tft.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[10]);
  tft.pushImage( p3 + 3*px3, py3, 35,67, (uint16_t *)m[m1]);
  tft.pushImage( p3 + 4*px3, py3, 35,67, (uint16_t *)m[m2]);
  tft.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[10]);
  tft.pushImage( p3 + 6*px3, py3, 35,67, (uint16_t *)m[s1]);
  tft.pushImage( p3 + 7*px3, py3, 35,67, (uint16_t *)m[s2]);
  
  if ( s1 == 0 &amp;&amp; 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
  tft.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41);

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

  if ( m1 == 0 &amp;&amp; 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
  //tft.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41);

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

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

void fade1(){
  int p3 = 2; int px3 = 40; int py3 = 150;
  for ( int i = 0; i &lt; 2; i++ ){
  tft.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[11]);
  tft.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[11]);
  delay(25);
  tft.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[10]);
  tft.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 &lt; 2; i++ ){
  tft.fillCircle(156,151,3,TFT_BLACK);tft.fillCircle(156,191,3,TFT_BLACK);
  delay(25);
  tft.fillCircle(156,151,3,TFT_ORANGE);tft.fillCircle(156,191,3,TFT_ORANGE);
  delay(25);
  }
}

 


Wio , Wio Terminal , Wio nixie tube clock ,

Written by macsbug

5月 25, 2020 at 7:14 pm

カテゴリー: Wio Terminal

Wio Simple Battery

leave a comment »

Wio Battery Module を製作しました。                              2020.05.25

費用:500円
Battery capacity:2300mA

サイズは 少し大きくあまり綺麗ではありませんが USB Cable 不要で便利です。
センサー等を装備する事ができ DS3231 RTC Module を組み込みました。


部品表:

No Nomen Purchase Price
1 Meopad Battery Charger Kit
 現在 この中古屋はありません
100円
2 ユニバーサル基板 Cタイプ
72 x 47mm, 板厚:1.2mm
秋月電子通商:

ユニバーサル基板

120円
3 ピンヘッダ 2 x 20 ( 40P )

秋月電子通商:

ピンヘッダ 2 x 20

50円
4 基板用押ボタンスイッチ
オルタネート   PS-70S

秋月電子通商:

PS-70S

50円
5 Schottky Barrier Diode
RSX101VAM-30
秋月電子通商:
RSX101VAM-30
9円
6 DS3231 RTC Module
worldchips:
DS3231 RTC
126円
================== =================== ======
費用総計 455円

 


製作:

Wio Pin Assign

ケース加工:コネクターの位置が合う様に 穴を空けます。

配線:4本

_ 1. BAT+(RED) -> Chrger+
_ 2. BAT-(BLACK) -> Chrger-
_ 3. BAT+(RED) -> Switch -> Diode -> 5V ( pin 2 )
_ 4. BAT-(BLACK) -> Wio GND ( pin 6 )

追加部品:RTC:ラズパイ用の部品で ピンの配置が一致し そのまま接続出来ます。

 RTC NC C D +
 Wio Pin 9 7 5 3 1
 Wio Pin name GND I2C1_SCL I2C1_SDA 3V3
 Wio sketch SCL1 SDA1

 


メモ:
1. Battery の 3.7V は Switch を通し Wio の 5V 端子へ接続しています。
2. 5V端子は Wio 内の 5V 切り替え回路から 5V to 3.3V LDO で 3.3V になります。
3. Battery charger 時には 4V程度が Battery に加わります。
_ 同時に Wio の5V端子に加わり LDO で 3.3V になります。
4. Battery 3.7Vの後に dc to 5V regulator を入れても良いですが 現在 Wio 5V端子の必要な容量が
_ 不明の為、装備しませんでした。
5. Wio の5V端子は 通常 4V程度の電圧が Wio内部からでています。


RTC と nixie tube digital clock:

 


感想:

USB Connector は 手前に飛び出し 美観的に綺麗でない事と邪魔になります。
Wio Batery Module が まだ 販売されていない為に 製作しました。
USB Cable不要で 持ち運びができ、便利になりました。

 


Wio Terminal , Battery , DS3231 , RTC ,

Written by macsbug

5月 25, 2020 at 12:23 pm

カテゴリー: Wio Terminal