macsbug

Just another WordPress.com site

Archive for the ‘ESP32’ Category

M5Stack Thermal Camera Part 2

leave a comment »

M5Stack Thermal Camera Part 2                    2018.09.09

Thermal Camera を 製作しました。
費用:4408円

前回製作記事:M5Stack Thermal Camera with AMG8833

AMG8833:赤外線アレイセンサ Grid-EYE 説明
1. パナソニックのセンサーです。
2. 8 x 8赤外線グリッドアレイ(64ピクセル)。
3. 0℃〜80℃ の 範囲の温度を+ 2.5℃ の精度で測定します。
4. 最大7メートル の距離から人間を検出することができます。
5. 最大フレームレート10Hzで、独自の人感センサーやミニサーマルカメラ作成に最適です。
6. センサーはI2Cを介して通信します。
7. 人の活動を検知して、エアコンや照明を制御。 自動ドアやエレベータで人を検知に最適です。


M5Stack と SD Card Loader(SD Update) 機能を含めた 全体の構成と費用。
構成1:M5Stack BASIC + Thermal Camera + 2400mAh Battery + SD:
費用1:9062円:

構成2:M5Stack GRAY + Thermal Camera + 2400mAh Battery + SD:
費用2:10116円:

SD Card Loader(SD Update) :
_ コンパイルされた bin を SDに複数保存し実行する事が可能です。
_ つまり 1台の M5Stack で 多数のスケッチが動作します。
_ 電子工作やプログラム未経験者でも使用する事が可能になります。
_ 相手に bin をネットで送るか SD を渡す事により即動作します。
_ github には SD Update の bin を置いて頂けると助かります。

費用:2万円程度で 既製品がありますので 最大1万円程度なら
_ 製作する事にしました。AMG8833 以外にもセンサーはありますが
_ 既製品の価格より高くなるため採用しません。

既製品:20,449円:IR0001, 1024 画素の赤外線熱画像 可視光カメラ:-20~300°C,32x32pixels


基記事:hkoffer / M5Stack-Thermal-Camera-:AMG8833 8×8 を補完し 24×24 で実現。

前回製作記事:M5Stack Thermal Camera with AMG8833:基記事の製作例。

機能アップ記事:m600x / M5Stack-Thermal-Camera:基記事の機能アップ版。Anthony氏に感謝!


準備:Thermal Camera Module:部品表

No Nomen Purchase Price
1  AMG8833  Aliexpress : Your Cee Store : $34.19 3942円
2  ピンヘッダー ( male, H=7.7mm )  秋月電子通商:低オス 2 x 40     25円
3  ピンヘッダー ( female, H=5.25mm)  廣杉計器:FSM-42052-15     60円
4  ユニバーサル基板(tomorrow56)  自作:PROTO module of M5Stack Part 2   222円
4  ユニバーサル基板(aitendo)  自作:Make PROTO Mudule of aitendo   119円
5  M2 5mm ナベ Tapping Screw(4ea)  秋葉原・西川電子部品株式会社       6円
6  PROTO FLAME:H=8.3mm  自作:PROTO module of M5Stack Part 2      7円
7  Thermal Camera Rear Cover  自作:材料費 FDM 14.6g  146円
====================== ========================= ======
 費用総計 Thermal Camera Module tomorrow56 基板 4408円
 費用総計 Thermal Camera Module 参考:aitendo 基板 4305円

費用の 90% が AMG8833 センサーです。如何に安く入手するかに かかっています。
AMG8833:価格高く 円レートで変化しますので 4000円以内の時を目指すと良いです。
tomorrow56 基板は thousandiy / M5Stack用USB Host Shield で使用されています。
Adafruit AMG8833 IR Thermal Camera Breakout

AMG8833 dealer:
1. Sincere Company Store
2. Your Cee
3. FYD Open Source Hardware
4. Hong Kong feng tai co., LTD
5. Sean_Wang Electronics

全体の部品表:

No Nomen Purchase Price
1  Thermal Camera Module  自作:Thermal Camera Module   4408円
2  2400 mAh Battery Module  自作:2400 mAh Battery Module     633円
3  M3 Hex Screw 30mm 2pcs  ebay:fknzhan Store         9円
4  Micro SD 16MB  秋葉原:浜田電機 PC USEFULL     550円
5  M5Stack BASIC  Aliexpress:$30.03   3462円
5  M5Stack GRAY  Aliexpress:$39.17   4516円
6  SoftWare  m600x / M5Stack-Thermal-Camera
6  SoftWare:SD Card Loader  macsbug:M5Stack-SD-Updater
7  SoftWare:Adafruit_AMG88xx  adafruit:Adafruit_AMG88xx Library
====================== ========================= ======
費用総計 M5Stack BASIC   9062円
費用総計 M5Stack GRAY 10116円

M5Stack BASIC, GRAY:Aliexpress 内を検索し円レートも含め 最安値をお探し下さい。
_ 検索するだけで安くなり、輸送期間は 8日で届く所もあります。
_ 今回の GRAY は 8日。BASIC は 9日 で届きました。
_ 国内価格は 1000円程度高くなります。
例:M5Stack BASIC:EC-Buying Ali Store:$32.52
例:M5Stack GRAY :EC-Buying Ali Store:$38.95
日本アマゾン:M5Stack BASIC:3504円。購入未調査ですが低価格です。
_ China Murtagh Shop, FashionableGNJPyoung Shop


製作:
AMG8833 を基板に配線:4本配線します。
M-BUS 3V3 = AMG8833 VIN, M-BUS GND = AMG8833 GND,
M-BUS__22 = AMG8833 SCL, M-BUS__21 = AMG8833 SDA。

Thermal Camera Rear Cover:


スケッチ:準備
m600x / M5Stack-Thermal-Camera を ダウンロード します。
Anthony氏が オリジナルに 新たな機能を追加されました。Anthony氏に感謝致します。

修正が必要です:
_ 理由1:SD Card Loader of M5Stack ( M5Stack SD Updater ) の追加。
_ 理由2:左右の画像反転の為の変更。

_ スケッチに 以下の 追加 と 変更 を実施します。
1. 追加 1:初期設定:
#include “M5StackUpdater.h”

2. 追加 2:SD Updater を組み込みます。赤文字を追加します。
void setup();
M5.begin();
Wire.begin();
if(digitalRead(BUTTON_A_PIN) == 0){updateFromFS(SD);ESP.restart();}

3. 変更:左右の画像が反転の為 左右を変更します。赤文字を追加します。
変更サブルーチン:void drawImage(void)
基本:float pixel = get_point(sensor.arrayInt, INT_ROWS, INT_COLS, x, y);
変更:float pixel = get_point(sensor.arrayInt, INT_ROWS, INT_COLS, INT_COLS-x, INT_ROWS-y);

void drawImage(void) {
 for (int y = 0; y < INT_ROWS; y++) {
  for (int x = 0; x < INT_COLS; x++) { //float pixel = get_point(sensor.arrayInt, INT_ROWS, INT_COLS, x, y); float pixel = get_point(sensor.arrayInt, INT_ROWS, INT_COLS, INT_COLS-x, INT_ROWS-y); // modification pixel = (pixel >= sensor.maxScale) ? sensor.maxScale : (pixel <= sensor.minScale) ? sensor.minScale : pixel;
   uint8_t colorIndex = constrain(map((int)pixel, sensor.minScale, sensor.maxScale, 0, 255), 0, 255);
   if ((pixelSize * y) < 220)
   M5.Lcd.fillRect(40 + pixelSize * x, pixelSize * y, pixelSize, pixelSize, camColors[colorIndex]);
  }
 }
}

スケッチと表示:
左:hkoffer / M5Stack-Thermal-Camera-:基記事です。
右:m600x / M5Stack-Thermal-Camera:  機能拡張板です。機能の詳細は 左記を参照下さい。


SD Card Loader ( M5Stack SD Updater ):
bin を出力する方法:
_ 参考:macsbug:M5Stack-SD-Updater
_ 参考:tobozo / M5Stack-SD-Updater:原作者 tobozo 氏の github です。
_ Arduino IDE の プルダウンメニュー:スケッチ / コンパイルしたバイナリを出力。

bin File 名の修正:
_ SD Updater のバージョンによって出力される ファイル名が変更になりました。
_ 旧 のファイル名の場合は 以下の 新 に変更します。
_ 旧:Thermal_Camera_2.ino.m5stack_core_esp32
_ 新:Thermal_Camera_2.ino.esp32:M5Stack には Thermal_Camera_2 を表示。


SD:bin File の用意:
以下の bin ファイルを用意し SD へ保存しました。
SDにより 電子工作やプログラム未経験者でも可能になります。
例:
3D_Cube.ino.esp32.bin
ESP32_Chip_info.ino.esp32.bin
Graphicstest_PDQ.ino.esp32.bin
IFS_fractals_1.ino.esp32.bin
IFS_fractals_2.ino.esp32.bin
M5Stack_Oscilloscope.ino.esp32.bin
Maze_generator.ino.esp32.bin
menu.bin
Pacman.ino.esp32.bin
PacketMonitor.ino.esp32.bin
Raytrace.ino.esp32.bin
Reversi.ino.esp32.bin
SOKOBAN.ino.esp32.bin
SpaceShooter.ino.esp32.bin
TETRIS_new.ino.esp32.bin
TFT_graphicstest_PDQ.ino.esp32.bin
Thermal_Camera.ino.esp32.bin
Thermal_Camera_2.ino.esp32.bin
WiFi_Analyzer.ino.esp32.bin
WiFi_Scan.ino.esp32.bin


参考:
adafruit/Adafruit_AMG88xx:Adafruit AMG88xx Library
Adafruit AMG8833 8×8 Thermal Camera Sensor:ミニサーマルカメラを製作する。
adafruit:Thermal Camera with Display:ディスプレイ付き熱感知カメラ:ESP32 + AMG8833 + TFT
YouTube:DIY Arduino Thermal Camera:上記の VIDEO
dtomyy/M5Stack-Cam-Remix:AMG8833
dtomyy/M5Stack-MLX90640-Thermal-Camera:MLX90640 , 32×24
YouTube:M5Stack with MLX90640 thermal cam 32×24 test:MLX90640


感想:
電子工作未経験 もしくは Arduino IDE 未経験の友人に 前回製作の
M5Stack Thermal Camera をお見せした所 画素数と価格の検討に
より 製作依頼があり M5Stack 本体も含め再検討しました。
低費用、バッテリー内蔵、ケース、SD Loader の条件で行いました。

既製品:
_ 2万円を超えると 既製品を購入でき 製作する意味が無くなります。
_ 約1万程度でできましたが デザインや機能と1万位の差を考えると
_ 既製品の方が良いかなとも思ってしまいます。


 

広告

Written by macsbug

9月 8, 2018 at 4:00 pm

カテゴリー: ESP32, M5STACK

Low cost PROTO Module of M5STACK

with 4 comments

400円で出来る
M5STACK PROTO Module を作りました。            2018.07.26

製作した PROTO Module の高さは 7.5mm と 8.5mm です。
M5STACK や 他のモジュールとスタック出来る互換性があります。

M5STACK PROTO Module のコネクターは 小型化の為 高さの低い特注品です。
価格が高い事と 入手しにくい為に 不便です。
コネクター代替品として 株式会社 廣杉計器 (ひろすぎ) の製品があります。
日本国内で調達出来る事と 価格が安く 輸送も2日で速く便利です。
価格安く沢山あると気楽に電子工作ができます。

費用:
プロトモジュール:廣杉計器のコネクターによる 合計は 381円 です。
プロトモジュール:スイッチサイエンスのプロトモジュールは 1420円 です。
コネクター:廣杉計器のコネクターは 1組 138円 です。
コネクター:スイッチサイエンスの ピンヘッダ・ソケット 1組は 362円です。


7.5mm PROTO Module

準備1:部品

No Nomen Purchase Price
1  ピンヘッダー ( male,    H=5.3mm )  廣杉計器:PSM-4200233-15   76円
2  ピンヘッダー ( female, H=3.5mm )  廣杉計器:FSS-42035-15   62円
3  ユニバーサル基板(95x72x1.1mm)  秋月:H=1.1mm [ AE-B2 TH 1.2t ] 200円
4  M2 5mm Hex Tapping Screw(4ea)  ebay : M2-5mm-Hex-Tap-Screw   28円
5  ケース:H=7.5mm  自作:材料費 FDM   15円
=  ========================  ==================== =====
費用総計 381円
参考:格安基板の費用総計  基板:60円 241円

ピンヘッダー:Aliexpress には M5STACK PROTO のピンより長いですが
_ male, female Connector が 販売されています。注:ボス無し。
ピンヘッダー:1個 129円。10pcs $11.59 1287円。注:ボスの位置が2.54mmズレ有。
_ HitMart Chinese Store : M5Stack 2×15 Pin Headers Socket 2.54mm Male Connector

廣杉計器:注文方法は ネットで 注文フォームを利用 に記入します。
購入数:製品によりミニマムオーダー数があります。
支払い:着払い を使用しました。
輸送期間:2日。対応が速く大変便利です。
代引手数料:2千円以上の場合は無料です。
価格は 税抜きです。

基板:
_ 秋月の 厚さ 1.1mm のユニバーサル基板を使用します。
_ M5STACK PROTO の厚さ:1.0mm。
_ 価格:200円。
_ 参考:格安の基板作りでは 1枚 60円です。費用総計は 241円です。

詳細:
1.  廣杉計器 の male Connector:M5STACK PROTO Module に使用できます
_ 部品番号:PSM-420233-15:価格:76円。ハンダ部は L型ピン。
_ M5STACKの male Connector の高さは 5.0mmです。
_ 廣杉計器  の male Connector の高さは 5.2mm ( 2.3 + 3 )で ほぼ同じです。
_ 補足:基板固定の ボトムポスト無し。ハンダ付け時に位置の確認が必要。
_ 価格:スイッチサイエンスや千石電商より遥かに安いです。
_    SS = 181円(単純計算) に対し 76円です。

2.  廣杉計器 の female Connector:
_ 部品番号:FSS-42035-15:価格:62円。ストレートピン。
_ M5STACKの female Connector の高さは 2.3mmです。
_ 廣杉計器  の female Connector の高さは 3.5mm です。
_ M5STACK との ピンの高さの差は 1.3mm。
_ ケース:M5STACK の PROTO CASE の高さは 6.5mm です。
_ ケース:FSS-42035-15 を使用する時の高さは 7.5mm になります。
_     7.5mmの高さにより スタックが可能になります。
_ 補足:基板固定の ボトムポスト無し。ハンダ付け時に位置の確認が必要。
_ 結果:コネクター接続時の PROTO Moduleの高さ:
_    M5STACK:11.8mm。廣杉計器:12.8mm。


8.5mm PROTO Module

準備2:部品

No Nomen Purchase Price
1  ピンヘッダー ( male,    H=5.3mm )  廣杉計器:PSM-4200233-15   76円
2  ピンヘッダー ( female, H=5.25mm )  廣杉計器:FSM-42052-15   60円
3  ユニバーサル基板(95x72x1.1mm)  秋月:H=1.1mm [ AE-B2 TH 1.2t ] 200円
4  M2 5mm Hex Tapping Screw(4ea)  ebay : M2-5mm-Hex-Tap-Screw   28円
5  ケース:H=8.5mm  自作:材料費 FDM   17円
=  ========================  ==================== =====
費用総計 381円
参考:格安基板の費用総計  基板:60円 241円

詳細:
1.  廣杉計器 の male Connector:準備1と同じです。

2.  廣杉計器 の female Connector:
_ 部品番号:FSS-42052-15:価格:60円。ハンダ部は L型ピンです。
_ M5STACKの female Connector の高さは 2.3mmです。
_ 廣杉計器  の female Connector の高さは 5.2mm です。
_ M5STACK との ピンの高さの差は 3.0mm。
_ ケース:M5STACK の PROTO CASE の高さは 6.5mm です。
_ ケース:FSS-42052-15 を使用する時の高さは 8.5mm になります。
_      8.5mmの高さにより スタックが可能になります。
_ 補足:基板固定用の ボトムポストは無し。( 注意 )
_ 結果:コネクター接続時のPROTO BOARDの厚さ:
_    M5STACK:11.8mm。廣杉計器:13.8mm。

メモ:ピンの高さ
_ ピン単体の高さで計算した値と実際は少し異なります。
_ 理由は 接続したコネクター間に隙間が出来る為です。
_ M5STACK の MALE と FEMALE のピンは短い事と 接続すると 隙間が
_ あり、短いピンに加え 隙間の分で接触面積が少なくなっています。


PROTO CASE:
下記の手順で 高さ7.5mm, 8.5mm を作成します。
参照:Make M5STACK PROTO CASE:3D CAD で PROTO CASE を作るポイント。

FLAME の高さ:
_ 使用する Female Connector の高さで FLAME の高さが決まります。
_ 条件:Male Connector :高さ 5mm です。
_ FLAME の高さ = Female Connectorの高さ +  4.2 mm
_ 例1:3.5 + 4.2 = 7.7 ( 約 7.5mm )
_ 例2:3.5 + 5.2 = 8.7 ( 約 8.5mm )


工作:
1.  PROTO 基板製作
_ 秋月の厚さ 1.1mm ユニバーサル基板を M5STACK PROTO PCB と同じ
_ サイズと穴を開けます。万能ハサミ、ドリルとヤスリを使用しました。
_ 角の幅が狭い為、慎重に削ります。

2.  7.5mm PROTO Module ( PSM-4200233-15 + FSS-42035-15 )
_ スルーホールの内側は female connector、外側は male connector です。
_ 最終的に 2つのコネクターが垂直に接続する様にハンダ付けします。
_ ピンの位置は重要ですので正確に位置決めします。
_ female connector   FSS-42035-15 は ピンを最大限外側に広げます。
_ female connector   FSS-42035-15 を 正確に位置決めし ハンダ付けします。
_ male connector PSM-4200233-15 を 正確に位置決めし ハンダ付けします。
_ ハンダ付け後にテスターで導通とショートしていないかを確認します。

3.  8.5mm PROTO Module ( PSM-4200233-15 + FSM-42052-15 )
_ 最終的に 2つのコネクターが垂直に接続する様にハンダ付けします。
_ ピンの位置は重要ですので正確に位置決めします。
_ female connector  FSM-42052-15 を正確に位置決めしハンダ付けします。
_ male connector PSM-4200233-15 を正確に位置決めしハンダ付けします。
_ ハンダ付け後にテスターで導通とショートしていないかを確認します。


PROTO MODULE の自由度:
_ 制限:M5STACK PROTO MODULE は female connector のサイズ
_    によりケースの高さに制限があり自由度が少なく不便です。
_ 方法:Female側は自由なサイズを選べる事が出来ます。
_ 対策:female connector にストレートピンを採用し
_    基板にスルーホールを設けます。
_ 部品:秋月電子通商で部品を調達し好きなサイズで使用する事ができます。
_ 計算:ケースの高さ = Female Connectorの高さ +  4.2 mm
_ 効果:Female側で自由なサイズを選べる事により多様なサイズの回路を
_    組み込む事が可能になります。
_    ネットの記事では 大きなサイズの回路は スタックが不可能の為に
_    M5 後段に接続しています。これは 上記の対策で M5 の上段や
_    中断にスタックが可能になります。


M-BUS:HPWR
_ HPWR は 12V以上のドライバ電源として使用されており
_ モータードライバ/ PLCなどの新しいモジュールで使用されます。


感想:
M5STACK PROTO:
_ フレームとコネクターの入手が面倒である事と価格が高いです。

廣杉計器のピン:接続すると 緩み無く しっかりとした感触です。
_ 抜く時は ピンの噛み合わせが良く ゆっくり時間をかけて抜きます。
_ ピンの接触具合は 動作に多大な影響を与えます。
_ 特にデジタル信号に於ける接触不良は 再現性が低い事や不可解な
_ 現象を起こしますので 接触の良い コネクター構成が重要です。
_ このピンで 低価格で沢山でき 気楽で楽しくなります。
_ 秋月電子通商で販売して頂けると便利ですね。

自作基板:私は基板設計はできませんが 希望する配置があります。
_ 1. 基板角の上側(横) 9mm の長さで 0.3mm削る。縦は 7mm の長さで 0.3mm削る。
_ 2. M-BUS ケース外側の端子を コネクター内側にスルーホール。
_ 3. M-BUS端子にストレートピンを使用できるスルーホール。
_  秋月等で販売されている通常のストレートピンが使用できます。
_ 4. 裏側(ハンダ面) M-BUSに端子番号のシルク印刷。
_ 5. 基板の上1列は 3.3V 、下1列は GND を連結したスルーホール。
_ 6. 基板上のスペースが小さい為 上記が良い訳でもない点があります。

新基板;現在 T氏が企画中です。


Written by macsbug

7月 26, 2018 at 11:00 am

カテゴリー: ESP32, M5STACK

Simple Battery Monitor of M5STACK

leave a comment »

160円で出来る
M5STACK用 Simple Battery Monitor を作りました。        2018.07.12
M5STACKのバッテリー電圧をLEDでモニター出来ます。

使用方法:
Battery Monitor を M5STACK の 左下 又は 右下 のピンに差し込みます。
スイッチを押すと LED が点灯します。3秒表示後、自動的に電源はオフになります。


表示:


準備:
購入リスト:

No Nomen Purchase Price
1  1-4S Lithium Battery Panel
­ Power Tester Capacity Indicator
LED Display Board
 ebay : czb6721960 Store : $0.99
1$ 109.34円換算。
輸送期間 14日。
1-4S ( 1S Battery )を使用。
113円
2  PIN SOCKET 1 x 5 ( 5P ) 10mm  秋月電子電商:ピンソケット 1x5
2個
  40円
3  Wire  –
=  =======================  ======================= =====
1 費用総計 153円

詳細:
1S Battery :
_ LED 赤 1:  25%:電圧:3.4 V
_ LED 緑 1:  50%:電圧:3.6 V
_ LED 緑 2:  75%:電圧:3.8 V
_ LED 緑 3:100%:電圧:4.0 V


配線:2本配線します。


感想:
バッテリーの残量は気になります。
M5STACKを改造する事無く バッテリー電圧をモニター出来ます。
簡単さを求めて 外部ハードを挿すだけで見れる様にしました。


 

Written by macsbug

7月 12, 2018 at 6:00 am

カテゴリー: ESP32, M5STACK

Battery module for Bottom of M5STACK

with 2 comments

M5STACK BOTTOM用 バッテリーモジュールを作りました。                          2018.07.08

費用は 700円 。容量は 公称 1800mAh 。電源スイッチ付きです。
公称 1800mAh:記載されている値が 正しいかどうかは 疑問の余地があります。

M5STACK BOTTOMに装備されている 150mAh の 12倍の容量です。

上は 光造形 半透明材料 OBJET 出力。下は 積層 FDM Uprint 出力です。

参照:
1.  Make a battery module for M5STACK :M5STACK の バッテリーモジュール製作。
2.  Low price Battery Module of M5STACK
_  340円で出来る M5STACK用 電源スイッチ付 1300mAh Battery Module 製作。


準備:
購入リスト:

No Nomen Purchase Price
1  3.7V 1800mAh Li-ion Battery
 ebay : inmyeyes20 Store : $4.68
703048 3.7V 1800mAh Rechargeable Li-ion Battery
420円
2  SLIDE SWITCH
 Aliexpress:100pcs 3 Pin PCB 2 Position 1P2T Vertical Slide Switch   11円
3  M2 12mm Hex Socket Cap
Head Tapping Screw
 ebay : regan0331 Store : $2.89/50ea
M2 Hex Socket Cap Head Tapping Screw Black 304SS
 24円
4  26AWG 7.8cm Wire  Aliexpress:50pcs pcb solder cable
26AWG 7.8cm Fly jumper wire cable
    3円
5  BATTERY MODULE CASE  自作・材料費 熱溶解式/FDM 133円
5  BATTERY MODULE CASE  自作・材料費 光造形 240円
=  ========================  =========================== ======
1 費用総計  熱溶解式/FDM 591円
2 費用総計  光造形 698円

詳細:
1. Battery 輸送期間:
_ ebay の inmyeyes20 Store の輸送期間は 8〜9日です。
_ 最大販売個数は 6個です。輸送の都合と思われます。

1. Battery 公称値:
_ 現品表示は 1800mAh と書かれていますが、実測すると 1030mAh です。
_ Product Size: 4 * 3 * 0.5cm と書かれていますが 4.8 * 3.0 * 0.68cm です。

1. BATTERY SIZE と CASE:
_ M5STACK の Battery Module は 850mAh で US $21.10 です。国内は 2190円。
_ 850mAh Battery のサイズは 48 x 30 mm で 高さは 5mm です。
_ PROTO CASE の高さは 6.5mm で 内蔵出来る高さは 最大 5.7 mm です。
_ 703048 1800mAh の サイズは 同じく 48 x 30 mm で 高さは 6.8mm です。
_ 1.1mm 厚く( 6.8 – 5.7 = 1.1 ) PROTO CASE には収まりません。
_ 高さ 7mm が必要なため ケースを製作しました。

_ メモ:M5STACK に使用されている Model No. 503048 850mAh は
_    Aliexpress の ここ の製品と思われます。( $2.99 / piece : 341円 )

2. SLIDE SWITCH:1個 ¥11  (  $0.10 ):電源スイッチです。
_ WEMOS LOLIN32 に使用されている 基板用スイッチです。

3. M2 12mm Tapping Screw:4個
_ 輸送期間;ebay の regan0331 Store は 13日です。
_ BOTTOM 基板用の 5mm HEX Screw 4個 を 12mm に変更して止めます。
_ メモ:秋葉原・西川電子部品では M2 12mm Tapping Screw は 10mm まで
_    で 12mm はありません。西川電子部品の方は丁寧に教えてくれます。


製作:
1. BOTTOM BATTERY Module の 150mAh Battery と Wire を半田ごてで外します。
_ ⭕ 重要:外した 150mAh Battery は + (赤) Wire に 絶縁テープ等を貼り絶縁
_      します。ショートすると発熱や焼損の原因になります。
2. Battery, Switch, Wire を以下の様に配線します。
_ [ Battery + ] −> [ Switch ] –> [ Bottom BAT Pin ]。
_ [ Battery –  ] –> [ Bottom G ( GND ) Pin ]。
_ ⭕ 重要:Battery の + と GND を確認する事。
_ ⭕ 重要:テスターで極性を確認する事。
_ + – が 逆ですと 高価な M5STACK が壊れます。自己責任でお願い致します。

3. BATTERY MODULE CASE:3D Printer で作りました。
_ 右のアダプターは Switch と Battery を固定する為です。

3. ケースに組み立てます。
_ ケースに力が加わる配置をすると ケースが変形します。
_ 力が加わらない様に 設計時にアダプターや部品配置を考慮します。
_ 例:Battery の両サイドは ほんの僅か隙間を開けています。

4. 組み上げ後の外観。


BATTERY MODULE CASE の CAD 画像。

メモ:3D Printer の 精度:
_ PROTO CASE を固定する為に 噛み合わせの突起 (凸) の幅は 0.5mm です。
_ 3D Printer は 0.5mm 幅を出力出来る 精度が必要になります。
_ MakerBot 3D Printer:HEAD幅が4mm で 1LINE の積層しか作れません。
_  結果、強度が無く 力が加わると折れてしまいます。
_ Uprint 3D Printer:精度は良いですが HEAD幅が5mmで 現実は 8mm 出力幅です。
_  結果、5mm 幅が出来ません。
_ OBJET 3D Printer:精度は全く問題ありませんが 材料の強度弱く 変形する場合があります。
_ 公開されている幾つかのデーターは 突起 (凸)が無く 固定する事が出来ません。


Battery の公称値について
_ 表示には 1800mAh と書かれています。実測すると 1030mAh でした。
_ 実測方法は 18650 Battery Capacity と同じ方法で行いました。
_ 詳細:1回目   653mAh  (未充電)。2回目  1014mAh ( 満充電)
_    3回目  1030mAh (満充電) でした。
_    構成は定電流負荷でないため放電電流は250mA~200mA 程度です。
_ この電池の性能は比較的良い方だと思います。
_ 性能の明確なPANASONICの電池でも実測を行うと約20%程度少なく
_ 計測される前例があります。
_ 放電終了電圧が計測だと3.0V, 公称では2.9Vの違いがある事も要因です。


感想:
Battery module for Bottom:
_ 裏側のバッテリーも必要で製作しました。
_ ピッタリ収まった感触が良く 1800mAh の容量は 安心感があります。
_ さらに 電源スイッチは なかなか便利です。

BATTERY 容量:
_ 今回の Battery容量は疑問が多いです。
_ 高さが 6.8mm ですが 1800mAh と書かれています。⭕ 表示は偽かもしれません。
_ Model 703048 1000mAh は 7*30*48 と記載されたリストがあります。
_ Model 503450   850mAh , 5 * 30 * 48。
_ Model 703048 1000mAh , 7 * 30 * 48。
_ Model 853048 1200mAh , 8.5 * 30 * 48。
_ Model 103048 1500mAh , 10 * 30 * 48。
_ Model 103450 2500mAh , 10 * 34 * 53。保護回路(5mm)を移動し48mmにする。価格が$16.65で高い。
_ 公称値と実測値の違いに戸惑いますが 今回は この程度にしておきます。

費用:
_ 製作費用は光造形で 698円です。M5STACK 850mAh Battery Module の
_ 国内販売価格は 2190円 ですから 3個以上作る事ができます。


Written by macsbug

7月 8, 2018 at 8:00 am

カテゴリー: ESP32, M5STACK

Low price Battery Module of M5STACK

with 4 comments

340円で出来る
M5STACK用 電源スイッチ付 1300mAh Battery Module を作りました。 2018.06.23

容量のあるバッテリーが 常に装備されると 何かと便利になります。
電源スイッチ付き ですので 未使用時でもバッテリーは消耗しません。
M5STACK 本体側に接続し 後部にセンサー等の配置が自由に行えます。
M5STACK Store で販売されている PROT Module をスタックする事ができます。


費用について:

中古バッテリー総計:333円 = 80 + 19 + 3 + 11 + 120 + 100。

新品バッテリー総計:883円 = 80 + 19 + 3 + 11 + 120 + 660。


バッテリーについて:

使用する バッテリは CASIO NP-40 (生産終了品)です。
規格:3.7V、 1300mAh ( or 1230mAh )、 縦 38.2 x 横 37.8 mm 。
中古のバッテリーは 100円から200円で 総計 333円 です。
新品のバッテリーは ロワジャパン製で 660円で 総計 883円 です。
_ ロワジャパン : CASIO カシオ NP-40 互換 バッテリー CNP-40 : 1300mAh
注意:バッテリーは 並列接続しては いけません。
_ M5 の Battery Module や 裏蓋内にある バッテリー との並列接続は
_ してはいけません。理由:片側のバッテリーが消耗している場合
_ バッテリーからバッテリーへ電流が流れ 発熱や焼損の原因になります。

参考:Make a battery module for M5STACK:前回の Battery Module 製作記事です。


購入リスト:

No Nomen Purchase Price
1  ロープロファイルピンソケット
(低メス) 2×15 (30P) 5.7mm
 秋月電子通商:
ロープロファイルピンソケット
(低メス) 2×15 (30P) 5.7mm
80円
2  JST 1.25mm Connector  Aliexpress:Micro JST 1.25mm 2P 2-Pin Male Connector with Wire +Female Plug 20sets 19円
3  26AWG 7.8cm Wire  Aliexpress:50pcs pcb solder cable 26AWG 7.8cm Fly jumper wire cable   3円
4  SLIDE SWITCH  Aliexpress:100pcs 3 Pin PCB 2 Position DPDT 1P2T SMD SMT Vertical Slide Switch 11円
5  BATTERY MODULE CASE  自作・材料費 120円
6  BATTERY  秋葉原:杉本ビル ガレージショップ 100円
=  =======================  ============================== ======
. 費用総計  NP-40 中古品使用 333円
. 参考  NP-40 新品使用 883円

 


部品詳細:

1. ロープロファイルピンソケット (低メス) 2×15 (30P) 5.7mm:2個 ¥80 ( 1個 ¥40 )
秋月電子通商。


_ M-BUS コネクターの高さについて:
_  M5STACK は 小型化する為に 低いコネクターを採用しました。
_  この為 他のコネクターを接続し スタック出来ない事になります。
_  M5STACK の M-BUS コネクターの高さに合わせる 方法は
_  秋月電子通商で販売の ロープロファイルピンソケット (低メス) 2×15 (30P) 5.7mm
_  を 縦に2個接続 ( 5.7 x 2 = 11.4 mm ) する方法です。
_  M5 PROT CASE の高さは 6.5mm ですが 11mm になります。

2. JST 1.25mm Connector:1個 ¥19  ( $0.17 ):M5 BAT端子へ接続するコネクターです。
Aliexpress:Micro JST 1.25mm 2P 2-Pin Male Connector with Wire +Female Plug 20sets
_ 規格:Micro JST 1.25mm。

3. 26AWG 7.8cm Wire:1個 ¥3  ( $0.0194 )
Aliexpress:50pcs pcb solder cable 26AWG 7.8cm Fly jumper wire cable

4. SLIDE SWITCH:1個 ¥11  (  $0.10 ):電源スイッチです。
Aliexpress:100pcs 3 Pin PCB 2 Position DPDT 1P2T SMD SMT Vertical Slide Switch
_ このスイッチは WEMOS LOLIN32 に使用されている 基板用スイッチです。

5. BATTERY MODULE CASE:1個 120円  ( 12g ):材料代のみ。
_ CAD 及び 3D PRINTER で製作しました。高さは 11mm です。
_ 左の隙間は M-BUS用です。右上の 凹 は スイッチを取り付けます。
_ ケースを希望される方は Yahoo LODGE や Arduino 、M5STACK 等の
_ 集まり時に お渡し出来るかと思っています。

6. BATTERY:1個 100円。
NP-40 BATTERY : 秋葉原 杉本ビル ガレージショップ:中古カメラバッテリー
_ 通常1個 ¥200 ですが 10個とか まとめ買いで お姉さんに頼むと安くなります。
_ 他にバッテリーは沢山ありますが NP-40 だけを箱にまとめて 頂いています。
_ 新品は ロワジャパン CNP-40 があります。1個 660円。


配線:配線は3本のみです。
_ ⭕ 重要 :JST 1.25mm コネクターピンの + と – を入れ替えます。
_       ピンは細いピンセットの先でコネクターのロックを外して取ります。

_ 🔴 要注意:M5STACK の BATコネクターの極性は M-BUS 側が + ( Plus ) です。
_       市販されているワイヤー付き JST 1.25mmコネクターは M5STACK
_       とは 逆の配置です。何度も確認してください。

_ JST 1.25mm Connector + の 赤線 を SLIDE SWITCHへ ハンダ付けします。
_  + 赤線は そのままの長さで配線します。
_ JST 1.25mm Connector –  の 黒線 を BATTERY – へ ハンダ付けします。
_  GND線は 適した長さに切ります。
_ 26AWG 7.8cm Wire を SLIDE SWITCH と BATTERY + に ハンダ付けします。
_  ワイヤー は そのままの長さで 配線します。


組み立て:

重要な確認事項:
_ JSTコネクター を M5 BAT コネクターに 接続する前に 必ず テスターで
_ 電圧の極性を確認してください。再確認は電源接続の基本です。
_ M5STACK 側の BAT コネクターの + と – の位置を確認してください。
_ 下の画像にある M5 BAT コネクターの左側が + ( plus ) です。
_ + – が 逆ですと 高価な M5STACK が壊れます。
_ くれぐれも 自己責任でお願い致します。

_ M5STACK M-BUS に ロープロファイルピンソケット(低メス)
_  2×15 (30P) 5.7mm を 縦に2個接続します。

_ BATTERY の取り付けは SWITCH 側に寄せて SWITCH を固定します。
_  両面テープでケースに止めます。


HEX SCREW SIZE:上記の製作では 六角スクリューの長さは 30mm となります。
_  六角スクリューが 無い場合は 秋葉原・西川電子部品に + 30mm ネジがあります。


感想:

バッテリー容量:
_ M5の裏蓋にあるバッテリーは 150mAh で容量は少ないです。
_ Battery Module ( $18.90 ) は 850mAh で これも不足気味です。
_ PROT CASE の内部で試用できる厚さは 5.7mm ( 6.5 – 0.8 mm:PCB) です。
_ このサイズに入る BATTERY は 850mAh になります。

_ 同じ縦横サイズで 1800mAh の物がありますが、厚さが 6.6mm で
_ PROT CASE には 入りません。
_ 1800mAh は ebay にて 365円で販売されています。輸送期間は 8日です。
_ このバッテリーを使用した製作は 後日 行う予定です。

国内価格:
_ スイッチサイエンスの M5Stack用電池モジュール は 2190円 と高いです。
_ 約340円で出来ますので 6個程作れる事になります。

バッテリーと配線方法:
_ バッテリーは ワイヤーをハンダ付けしました。
_ 他の方法として POD PIN を使用する方法があり、バッテリーを抜き差し
_ する事ができます。この方法は 課題として検討中です。

CAD データー:
_ CAD のデーターは 使用するプリンターによって異なります。
_ 特に M5STACK は 小型の為に 精度の低いプリンターでは 作る事が
_ 出来ない部分があります。
_ そのノウハウを踏まえ 今回のケースを作りました。


Written by macsbug

6月 23, 2018 at 7:00 pm

カテゴリー: ESP32, M5STACK

M5Stack Thermal Camera with AMG8833

leave a comment »

M5STACK で AMG8833 Thermal sensor を 動かしました。         2018.06.08

AMG8833 Thermal sensor は 3942円で高価です。
AMG8833 熱センサーは 画素数 8×8ピクセルで(24×8)x(24×8)に補間されています。
hkoffer氏作成の M5Stack-Thermal-Camera- を使用しました。
ただし このリストでは 表示の向きが正しく表示しない為、スケッチを修正致しました。

機能:
1 . AMG8833 Thermal sensor 8×8 pixel を(24×8)x(24×8)に補間しています。
2 . Sight added & temperature
3 . Auto max temperature
4 . Auto min temperature
5. センスする距離は約30cm です。(仕様は 人検知が可能な距離:最長7m )

Adafruit AMG88xx Library:
1. AMG88xx GridEYE 8×8 IRカメラ用のライブラリです。
2. AMG8833 I2C 接続。address = 0x69
3. TFT FeatherWing – 2.4″ 320×240 Touchscreen For All Feathers
4. Adafruit AMG8833 Featherwingで動作します。

補足:
_ 現在、テスト領域全体の最高温度のみが示されており、最初は最大温度と
_ 最小温度の自動調整を追加し、中心視界の温度を表示することを意図しています。


.
準備:

No Nomen Link Price Transport
1 AMG8833 Matrice IR 8*8
Thermal Imager Module
Aliexpress :
Your Cee Store    $35.99
3942円 9day
2 adafruit Library Adafruit_AMG88xx  –
3 hoofer sketch & Library M5Stack-Thermal-Camera-

Your Cee Store の輸送期間は 9日 で速いです。

2018.06.08 現在:3942円 ( 1$ 109.5 円換算) $35.99

追記:2018.08.12
Aliexpress : Sean_Wang Electronics Store:$38.30, 4247円(1$ 111円換算)

MOUSER : Pansonic AMG8833 単体1個2582円。

追記:2018.09.06
Aliexpress:Your Cee Store:$34.19, 3942円。輸送期間=15日。

Panasonic 赤外線アレイセンサ Grid-EYE(AMG88)
用途:高機能家電(電子レンジ・エアコン),オフィス省エネ(空調・照明制御),
_  デジタルサイネージ,自動ドア・エレベータ。
AMG8833 : 3.3V, 高性能タイプ ハイゲイン: 0 °C ~ 80 °C
AMG8834 : 3.3V, 高性能タイプ ローゲイン:−20 °C ~ 80 °C
AMG8853 : 5.0V, 高性能タイプ ハイゲイン: 0 °C ~ 80 °C
AMG8854 : 5.0V, 高性能タイプ ローゲイン:−20 °C ~ 80 °C

スケッチ構成:
thermal_cam_interpolate
_ thermal_cam_interpolate.ino
_ interpolation.cpp


.
配線:

PROT Board に 以下の4本を配線します。

組み立て:
裏蓋ケースを作り組み上げました。


.
参考:

Adafruit:AMG88xx thermal sensor
Adafruit AMG8833 8×8 Thermal Camera Sensor:pdf
YouTube:M5Stack Thermal Imaging Camera
twitter : Offer DIYER
Thingiverse : M5Stack Thermal Imaging Camera Case:3Dプリントケース
HACKADAY:WHO SAID THERMAL CAMERAS WEREN’T ACCESSIBLE TO THE MASSES?
Pansonic 赤外線アレイセンサ Grid=EYE (AMG88)
Infrared array sensor “Grid-EYE” AMG88 * *:参考仕様書


.
スケッチ修正:現象と対策。
May 12, 2018 の M5Stack-Thermal-Camera- は 修正が必要です。
1. 画像が横向き:M5.Lcd.setRotation(0) を M5.Lcd.setRotation(1)に変更します。
2. 文字と画像の縦が逆、画像の左右が逆:
_ void drawpixels の float val = get_point(p, rows, cols, x, y); を
_ float val = get_point(p, rows, cols, cols-x, rows-y); にし 縦を逆にします。
_ これにより正常に表示しました。


.
感想:

AMG8833 の画素数は 8×8 です。そして価格は高価です。
_ 8×8 のサイズでは 荒すぎ、価格が高くて意味がありませんでした。
_ そこへ hkoffer氏 により 24×24 が可能となり 見やすくなりました。
_ 高価ですが 24×24 なら体験したく購入しました。

_ 国内 スイッチサイエンスでの価格は 今回の業者より千円程高く購入対象にならず。
_ Aliexpress の Your Cee Store からは なんと 9日で届くと言う速さでした。

_ 温度分布の表示は まずまずの感じでした。


.
スケッチ:

thermal_cam_interpolate
_ thermal_cam_interpolate.ino
_ interpolation.cpp

// M5Stack Thermal Camera with AMG8833 : 2018.06.08 Modified by macsbug
/***************************************************************************
  This is a library for the AMG88xx GridEYE 8x8 IR camera
  This sketch makes an inetrpolated pixel thermal camera with the
  GridEYE sensor and a 2.4" tft featherwing:
	 https://www.adafruit.com/product/3315
  Designed specifically to work with the Adafruit AMG8833 Featherwing
          https://www.adafruit.com/product/3622
  These sensors use I2C to communicate. The device's I2C address is 0x69
  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!
  Written by Dean Miller, James DeVito & ladyada for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/
// AMG8833 thermal sensor : https://github.com/adafruit/Adafruit_AMG88xx
// https://github.com/hkoffer/M5Stack-Thermal-Camera-/blob/master/thermal_cam_interpolate.ino
// Github : https://macsbug.wordpress.com/2018/06/08/m5stack-thermal-camera-with-amg8833/
//==========================================================================
#include <M5Stack.h>
#include "M5StackUpdater.h"  // SD UPDATER
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_AMG88xx.h>
byte MINTEMP = 20; //low range of the sensor (this will be blue on the screen)
byte MAXTEMP = 32; //high range of the sensor (this will be red on the screen)
const uint16_t camColors[] = { 0x480F,   //the colors we will be using
 0x400F,0x400F,0x400F,0x4010,0x3810,0x3810,0x3810,0x3810,0x3010,0x3010,
 0x3010,0x2810,0x2810,0x2810,0x2810,0x2010,0x2010,0x2010,0x1810,0x1810,
 0x1811,0x1811,0x1011,0x1011,0x1011,0x0811,0x0811,0x0811,0x0011,0x0011,
 0x0011,0x0011,0x0011,0x0031,0x0031,0x0051,0x0072,0x0072,0x0092,0x00B2,
 0x00B2,0x00D2,0x00F2,0x00F2,0x0112,0x0132,0x0152,0x0152,0x0172,0x0192,
 0x0192,0x01B2,0x01D2,0x01F3,0x01F3,0x0213,0x0233,0x0253,0x0253,0x0273,
 0x0293,0x02B3,0x02D3,0x02D3,0x02F3,0x0313,0x0333,0x0333,0x0353,0x0373,
 0x0394,0x03B4,0x03D4,0x03D4,0x03F4,0x0414,0x0434,0x0454,0x0474,0x0474,
 0x0494,0x04B4,0x04D4,0x04F4,0x0514,0x0534,0x0534,0x0554,0x0554,0x0574,
 0x0574,0x0573,0x0573,0x0573,0x0572,0x0572,0x0572,0x0571,0x0591,0x0591,
 0x0590,0x0590,0x058F,0x058F,0x058F,0x058E,0x05AE,0x05AE,0x05AD,0x05AD,
 0x05AD,0x05AC,0x05AC,0x05AB,0x05CB,0x05CB,0x05CA,0x05CA,0x05CA,0x05C9,
 0x05C9,0x05C8,0x05E8,0x05E8,0x05E7,0x05E7,0x05E6,0x05E6,0x05E6,0x05E5,
 0x05E5,0x0604,0x0604,0x0604,0x0603,0x0603,0x0602,0x0602,0x0601,0x0621,
 0x0621,0x0620,0x0620,0x0620,0x0620,0x0E20,0x0E20,0x0E40,0x1640,0x1640,
 0x1E40,0x1E40,0x2640,0x2640,0x2E40,0x2E60,0x3660,0x3660,0x3E60,0x3E60,
 0x3E60,0x4660,0x4660,0x4E60,0x4E80,0x5680,0x5680,0x5E80,0x5E80,0x6680,
 0x6680,0x6E80,0x6EA0,0x76A0,0x76A0,0x7EA0,0x7EA0,0x86A0,0x86A0,0x8EA0,
 0x8EC0,0x96C0,0x96C0,0x9EC0,0x9EC0,0xA6C0,0xAEC0,0xAEC0,0xB6E0,0xB6E0,
 0xBEE0,0xBEE0,0xC6E0,0xC6E0,0xCEE0,0xCEE0,0xD6E0,0xD700,0xDF00,0xDEE0,
 0xDEC0,0xDEA0,0xDE80,0xDE80,0xE660,0xE640,0xE620,0xE600,0xE5E0,0xE5C0,
 0xE5A0,0xE580,0xE560,0xE540,0xE520,0xE500,0xE4E0,0xE4C0,0xE4A0,0xE480,
 0xE460,0xEC40,0xEC20,0xEC00,0xEBE0,0xEBC0,0xEBA0,0xEB80,0xEB60,0xEB40,
 0xEB20,0xEB00,0xEAE0,0xEAC0,0xEAA0,0xEA80,0xEA60,0xEA40,0xF220,0xF200,
 0xF1E0,0xF1C0,0xF1A0,0xF180,0xF160,0xF140,0xF100,0xF0E0,0xF0C0,0xF0A0,
 0xF080,0xF060,0xF040,0xF020,0xF800,
};
Adafruit_AMG88xx amg;
#define AMG_COLS 8
#define AMG_ROWS 8
float pixels[AMG_COLS * AMG_ROWS];
#define INTERPOLATED_COLS 24
#define INTERPOLATED_ROWS 24
int max_v =  0;
int min_v = 80;
float get_point(float *p,uint8_t rows,uint8_t cols,int8_t x,int8_t y);
void set_point(float *p,uint8_t rows,uint8_t cols,int8_t x,int8_t y,float f);
void get_adjacents_1d(float *src, float *dest, uint8_t rows, uint8_t cols, 
                      int8_t x, int8_t y);
void get_adjacents_2d(float *src, float *dest, uint8_t rows, uint8_t cols,
                      int8_t x, int8_t y);
float cubicInterpolate(float p[], float x);
float bicubicInterpolate(float p[], float x, float y);
//==========================================================================
void interpolate_image(float *src, uint8_t src_rows, uint8_t src_cols, 
                       float *dest, uint8_t dest_rows, uint8_t dest_cols);
//==========================================================================
void setup(){
  M5.begin();
  Wire.begin(); 
  if(digitalRead(BUTTON_A_PIN) == 0){updateFromFS(SD);ESP.restart();} // SD
  M5.setWakeupButton(BUTTON_B_PIN);
  M5.Lcd.begin();
  M5.Lcd.setRotation(1);  // 0 to 1 :Modified
  M5.Lcd.fillScreen(TFT_BLACK);
  int icolor = 255;
  for (int irow = 16; irow <= 223;  irow++){
    M5.Lcd.drawRect(0, 0, 35, irow, camColors[icolor]);
    icolor--;
  }
  infodisplay();
  if (!amg.begin()){ while (1){delay(1);}}
}
//==========================================================================
void loop() {
  if (M5.BtnA.pressedFor(1000)){MINTEMP = min_v;min_v = 80;infodisplay();}
  if (M5.BtnA.wasPressed()) {
    if (MINTEMP <= 0){MINTEMP = MAXTEMP - 1;infodisplay();
    }else{MINTEMP--;infodisplay();
    }
  }
  if (M5.BtnB.pressedFor(1000)){ M5.powerOFF();}
  if (M5.BtnC.pressedFor(1000)){MAXTEMP = max_v;max_v = 0;infodisplay();}
  if (M5.BtnC.wasPressed()) {
    if (MAXTEMP >= 80){MAXTEMP = MINTEMP + 1;infodisplay();
    }else{MAXTEMP++;infodisplay();
    }
  }
  M5.update();
  amg.readPixels(pixels);   //read all the pixels
  for (int i = 1; i <= AMG88xx_PIXEL_ARRAY_SIZE; i++){}
  float dest_2d[INTERPOLATED_ROWS * INTERPOLATED_COLS];
  interpolate_image(pixels, AMG_ROWS, AMG_COLS, dest_2d, 
    INTERPOLATED_ROWS, INTERPOLATED_COLS);
  uint16_t boxsize = min(M5.Lcd.width() / INTERPOLATED_COLS, 
    M5.Lcd.height() / INTERPOLATED_COLS);
  drawpixels(dest_2d, INTERPOLATED_ROWS, INTERPOLATED_COLS, 
    boxsize, boxsize, false);
  max_v = INT_MIN;
  //  int max_i = 0;
  int spot_v = pixels[28];
  for (int itemp = 0;itemp < sizeof(pixels) / sizeof(pixels[0]);itemp++){
    if ( pixels[itemp] > max_v ){max_v = pixels[itemp];//max_i = itemp;
    }
    if ( pixels[itemp] < min_v ){min_v = pixels[itemp];//max_i = itemp;
    }
  }
  M5.Lcd.setTextSize(2);
  M5.Lcd.fillRect (284,  18, 36, 16, TFT_BLACK);
  M5.Lcd.fillRect (284, 130, 36, 16, TFT_BLACK);
  M5.Lcd.setCursor(284,  18);
  M5.Lcd.setTextColor(TFT_WHITE);
  if ((max_v > 80) | (max_v < 0)) {
    M5.Lcd.setTextColor(TFT_RED);
    M5.Lcd.printf("Err");
  }else{
    M5.Lcd.printf("%dC",max_v);
    M5.Lcd.setCursor(284, 130);
    M5.Lcd.printf("%dC",spot_v);
    M5.Lcd.drawCircle(160, 120,   6, TFT_WHITE);
    M5.Lcd.drawLine  (160, 110, 160, 130, TFT_WHITE);
    M5.Lcd.drawLine  (150, 120, 170, 120, TFT_WHITE);
  }
}
//==========================================================================
void infodisplay(void) {  /***infodisplay()*****/
  M5.Lcd.setTextColor(TFT_WHITE);
  // M5.Lcd.setCursor(288, 230);
  // M5.Lcd.printf("Power");
  M5.Lcd.fillRect(0, 0, 36, 16, TFT_BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0, 1);
  M5.Lcd.printf("%dC",MAXTEMP);
  M5.Lcd.setCursor(0, 225);
  M5.Lcd.fillRect(0, 225, 36, 16, TFT_BLACK);
  M5.Lcd.printf("%dC",MINTEMP);
  M5.Lcd.setCursor(284, 0);
  M5.Lcd.printf("Max");
  M5.Lcd.setCursor(284, 100);
  //  M5.Lcd.printf("Spot");
  M5.Lcd.drawCircle(300, 120, 6, TFT_WHITE);
  M5.Lcd.drawLine(300, 110, 300, 130, TFT_WHITE);
  M5.Lcd.drawLine(290, 120, 310, 120, TFT_WHITE);
}
//==========================================================================
void drawpixels(float *p, uint8_t rows, uint8_t cols, uint8_t boxWidth, 
                uint8_t boxHeight, boolean showVal) {
  int colorTemp;
  for (int y = 0; y < rows; y++) {
    for (int x = 0; x < cols; x++) {
      float val = get_point(p, rows, cols, cols-x, rows-y); // Modified
      if (val >= MAXTEMP) colorTemp = MAXTEMP;
      else if (val <= MINTEMP) colorTemp = MINTEMP;
      else colorTemp = val;
      uint8_t colorIndex = map(colorTemp, MINTEMP, MAXTEMP, 0, 255);
      colorIndex = constrain(colorIndex, 0, 255);
      uint16_t color;  //draw the pixels!
      color = val * 2;
      M5.Lcd.fillRect(40 + boxWidth * x, boxHeight * y,
                      boxWidth, boxHeight, camColors[colorIndex]);
    }
  }
}
//==========================================================================

Written by macsbug

6月 8, 2018 at 11:55 pm

カテゴリー: ESP32, M5STACK

Easy M5STACK JOYSTICK

leave a comment »

200円でできる 超安価な M5STACK JOYSTICK を作りました。 2018.06.06

テトリスをジョイスティックで操作できるようになります。
ケースに収まった感触と JOYSTICK の操作は とても使いやすいです。

左:M5STACK BASIC。 右:M5STAC BASIC + BATTERY:縦のサイズがピッタリです。


準備:

No  Nomen  Link   Price
 1  JoyStick Controller  whemyqong5 Store (C$1.01)   90円
 1  JoyStick Controller  cbincnm Store (C$1.01)   90円
 2  ピンヘッダ 1×40 (40P)  秋月電子通商   85円
 3  M5STACK BASIC  –     0円
 4  M5STACK BASIC CASE  –     0円
 5  ワイヤー  –   –
 6  穴あけ用カッター  –   –
 7  両面テープ  –   –
 ——————————-  ————————————  ——
 合計      175円
 スケッチ:macsbug  TETRIS with M5STACK
 8  スケッチ:しかるのち  M5Stack:テトリス改造

JoyStick Hots PS2 Two-axis Lever Joystick Game Sensor Controller

端子:[ GND, 5V, VRX, VRY, SW ]


ケース加工:
Joystick と USB-C, Power Swicth 場所にカッターで穴を空けます。
マルは 丸穴専用カッターが便利です。


回路図:配線は 5本のみです。


配線:直接配線。
_ ケースの穴と JOYSTICK KNOB の高さは重要です。
_ ケースの穴に対して JOYSTICK の高さと動きを事前に調べておきます。
_ 15ピン ピンヘッダー と JOYSTICK を 配線します。
_ 配線後 M5STACK に取り付け、JOYSTICK の高さと動きをチョックします。
_ 必要に応じて両面テープで固定してください。


配線:基板配線。
_ ケースの穴と JOYSTICK KNOB の高さは重要です。
_ ケースの穴に対して JOYSTICK の高さと動きを事前に調べておきます。
_ 基板に 15ピン ピンヘッダー と JOYSTICK を 配線します。
_ 配線後 M5STACK に取り付け、JOYSTICK の高さと動きをチョックします。
_ 必要に応じて両面テープで固定してください。
_ メモ:JOYSTICKは基板に取り付ける位置で高さを調整できます。


M5STACK 取り付け:JOYSTICKの高さ調整。
_ M5STACK と JOYSTICK は 以下の接続になります。
_ ケースの穴に対し JOYSTICKのKNOBが 自由に動く事が大切です。
_ JOYSTICKのKNOBが 穴に接触しない様に両面テープ等で高さを調整します。


Joystick 機能:

 
bool KeyPadLoop(){ 
 uint16_t joyX = analogRead(JOY_X);
 uint16_t joyY = analogRead(JOY_Y);
 if(digitalRead(sw) == 0){ClearKeys();but_A=true;delay(300);return true;}
 if( joyY >= 3500 ){ ClearKeys();but_DOWN =true;delay(250);return true;}
 if( joyX <= 1500 ){ ClearKeys();but_LEFT =true;delay(250);return true;}
 if( joyX >= 2500 ){ ClearKeys();but_RIGHT=true;delay(250);return true;}
 return false; }

参考:
How to connect the joystick to Arduino:JOYSICKの回路図と使用方法。


感想:
購入時の M5STACKケースが使用できないものかと考え、
超安価な 90円のジョイスティックを組み合わせてみました。
2つ作りましたが 基板にピンとJOYSITCK を取り付ける方法が楽でした。
ケースをカッターで切るのは 綺麗に出来ず なかなか難しいです。
1つの箱の中に収まる感じはスッキリして 握った感じがとても良いです。

 


スケッチ:

macsbug テトリス移植版オリジナル: TETRIS with M5STACK
しかるのち氏のテトリス改造版:M5Stack:テトリス改造 を DL します。
改造された しかるのち氏に感謝致し 使用させて頂きます。
M5Stack:テトリス改造 の [  bool KeyPadLoop ] を 以下の様に変更します。
_ これは Joystick の機能を追加する為です。

//========================================================================
// TETRIS with M5STACK : 2018.01.20 Transplant by macsbug
//                       2018.05.03 Modified by @shiakrunochi
//                       2018.06.06 Modified by macsbug
// Controller : Buttons A = LEFT, B = RIGHT, C = START, ROTATE
// Display    : Left = 100x240, Center = 120x240, Right = 100x240
// Block      : 8ea, 12x12 pixel
// SD         : tetris.jpg : BackGround Image : R.G.B 320x240 pixel
// Github     : (Original) https://macsbug.wordpress.com/2018/01/20/tetris-with-m5stack/
// Github     : (revision) http://shikarunochi.matrix.jp/?p=2296
// Github     : (joystick) https://macsbug.wordpress.com/2018/06/06/easy-m5stack-joystick/
//========================================================================
#include <M5Stack.h>                                       // M5STACK
#include "M5StackUpdater.h"                                // SD UPDATE
uint16_t BlockImage[8][12][12];                            // Block
uint16_t backBuffer[240][120];                             // GAME AREA
uint16_t nextBlockBuffer[60][48];                          // NEXT BLOCK AREA
const int Length = 12;     // the number of pixels for a side of a block
const int Width  = 10;     // the number of horizontal blocks
const int Height = 20;     // the number of vertical blocks
int screen[Width][Height] = {0}; //it shows color-numbers of all positions
struct Point {int X, Y;};
struct Block {Point square[4][4]; int numRotate, color;};
Point pos; Block block;
int nextBlockType = -1;
long score = 0;
Block nextBlock;
int rot, fall_cnt = 0;
bool started = false, gameover = false;
boolean but_A = false, but_LEFT = false, but_RIGHT = false, but_DOWN = false;
boolean but_UP = false;
int game_speed = 25; // 25msec
Block blocks[7] = {
  {{{{-1,0},{0,0},{1,0},{2,0}},{{0,-1},{0,0},{0,1},{0,2}},
  {{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0}}},2,1},
  {{{{0,-1},{1,-1},{0,0},{1,0}},{{0,0},{0,0},{0,0},{0,0}},
  {{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0}}},1,2},
  {{{{-1,-1},{-1,0},{0,0},{1,0}},{{-1,1},{0,1},{0,0},{0,-1}},
  {{-1,0},{0,0},{1,0},{1,1}},{{1,-1},{0,-1},{0,0},{0,1}}},4,3},
  {{{{-1,0},{0,0},{0,1},{1,1}},{{0,-1},{0,0},{-1,0},{-1,1}},
  {{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0}}},2,4},
  {{{{-1,0},{0,0},{1,0},{1,-1}},{{-1,-1},{0,-1},{0,0},{0,1}},
  {{-1,1},{-1,0},{0,0},{1,0}},{{0,-1},{0,0},{0,1},{1,1}}},4,5},
  {{{{-1,1},{0,1},{0,0},{1,0}},{{0,-1},{0,0},{1,0},{1,1}},
  {{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0}}},2,6},
  {{{{-1,0},{0,0},{1,0},{0,-1}},{{0,-1},{0,0},{0,1},{-1,0}},
  {{-1,0},{0,0},{1,0},{0,1}},{{0,-1},{0,0},{0,1},{1,0}}},4,7}
};
extern uint8_t tetris_img[];
#define JOY_X  2
#define JOY_Y 26
#define sw     5
//========================================================================
void setup(void) {
  Serial.begin(115200);         // SERIAL
  M5.begin();                   // M5STACK INITIALIZE
  Wire.begin();
  if(digitalRead(BUTTON_A_PIN) == 0){updateFromFS(SD);ESP.restart();}
  M5.Lcd.setBrightness(200);    // BRIGHTNESS = MAX 255
  M5.Lcd.fillScreen(BLACK);     // CLEAR SCREEN
  M5.Lcd.setRotation(1);        // SCREEN ROTATION = 0
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(2);
  //----------------------------// Make Block ----------------------------
  pinMode(sw,    INPUT_PULLUP);
  pinMode(JOY_X, INPUT);
  pinMode(JOY_Y, INPUT);
  //----------------------------// Make Block ----------------------------
  make_block( 0, BLACK);        // Type No, Color
  make_block( 1, 0x00F0);       // DDDD     RED
  make_block( 2, 0xFBE4);       // DD,DD    PUPLE 
  make_block( 3, 0xFF00);       // D__,DDD  BLUE
  make_block( 4, 0xFF87);       // DD_,_DD  GREEN 
  make_block( 5, 0x87FF);       // __D,DDD  YELLO
  make_block( 6, 0xF00F);       // _DD,DD_  LIGHT GREEN
  make_block( 7, 0xF8FC);       // _D_,DDD  PINK
  //----------------------------------------------------------------------
  // M5.Lcd.drawJpgFile(SD, "/tetris.jpg");     // Load background from SD
  M5.Lcd.drawJpg(tetris_img, 34215);     // Load background from file data
  PutStartPos();                                // Start Position
  for (int i = 0; i < 4; ++i) screen[pos.X + 
   block.square[rot][i].X][pos.Y + block.square[rot][i].Y] = block.color;
  Draw();                                       // Draw block
  DrawNextBlock();
}
//========================================================================
void loop() {
  if (gameover) return;
  Point next_pos;
  int next_rot = rot;
  GetNextPosRot(&next_pos, &next_rot);
  ReviseScreen(next_pos, next_rot);
  M5.update();
  delay(game_speed);                                      // SPEED ADJUST
}
//========================================================================
void Draw() {                               // Draw 120x240 in the center
  for (int i = 0; i < Width; ++i) for (int j = 0; j < Height; ++j)
   for (int k = 0; k < Length; ++k) for (int l = 0; l < Length; ++l)
    backBuffer[j * Length + l][i * Length + k] = BlockImage[screen[i][j]][k][l];
    M5.Lcd.pushImage(100, 0, 120, 240, (uint16_t *)backBuffer);
}
//========================================================================
void DrawNextBlock() {  
  for(int x = 0; x < 48;x++) {
    for(int y = 0; y < 60;y++){
      nextBlockBuffer[y][x]=0;
    }
  }
  nextBlock = blocks[nextBlockType];
  int offset = 6 + 12;
  for (int i = 0; i < 4; ++i) {
      for (int k = 0; k < Length; ++k) for (int l = 0; l < Length; ++l){
        nextBlockBuffer[60 - (nextBlock.square[0][i].X * Length + l + 
        offset)][nextBlock.square[0][i].Y * Length + k + offset] = 
        BlockImage[nextBlockType + 1][k][l];
      }
  }
  M5.Lcd.pushImage(26, 100, 48, 60, (uint16_t *)nextBlockBuffer);
  M5.Lcd.fillRect(2, 76, 96, 19, BLACK);
  M5.Lcd.setCursor(10, 78);
  M5.Lcd.print(score);//M5.Lcd.printf("%7d",score);
}
//========================================================================
void PutStartPos() {
  pos.X = 4; pos.Y = 1;
  if (nextBlockType == -1){
    block = blocks[random(7)];
  }else{
    block = blocks[nextBlockType];
  }
  nextBlockType = random(7);
  rot = random(block.numRotate);
}
//========================================================================
bool GetSquares(Block block, Point pos, int rot, Point* squares) {
  bool overlap = false;
  for (int i = 0; i < 4; ++i) {
    Point p;
    p.X = pos.X + block.square[rot][i].X;
    p.Y = pos.Y + block.square[rot][i].Y;
    overlap |= p.X < 0 || p.X >= Width || p.Y < 0 || p.Y >= 
      Height || screen[p.X][p.Y] != 0;
    squares[i] = p;
  }
  return !overlap;
}
//========================================================================
void ClearKeys(){but_A=false;but_LEFT=false;but_RIGHT=false;but_DOWN=false;}
//========================================================================
void GameOver() {
  for (int i = 0; i < Width; ++i) for (int j = 0; j < Height; ++j) if (screen[i][j] != 0) screen[i][j] = 4; gameover = true; } //======================================================================== bool KeyPadLoop(){ uint16_t joyX = analogRead(JOY_X); uint16_t joyY = analogRead(JOY_Y); if(digitalRead(sw) == 0){ClearKeys();but_A=true;delay(300);return true;} if( joyY >= 3500 ){ ClearKeys();but_DOWN =true;delay(250); return true;}
  if( joyX <= 1500 ){ ClearKeys();but_LEFT =true;delay(250); return true;} if( joyX >= 2500 ){ ClearKeys();but_RIGHT=true;delay(250); return true;}
  return false;
}
//========================================================================
void GetNextPosRot(Point* pnext_pos, int* pnext_rot) {
  bool received = KeyPadLoop();
  if (but_A) started = true;
  if (!started) return;
  pnext_pos->X = pos.X;
  pnext_pos->Y = pos.Y;
  if ((fall_cnt = (fall_cnt + 1) % 10) == 0) pnext_pos->Y += 1;
  else if (received) {
    if (but_LEFT) { but_LEFT = false; pnext_pos->X -= 1;}
    else if (but_RIGHT) { but_RIGHT = false; pnext_pos->X += 1;}
    else if (but_DOWN) { but_DOWN = false; pnext_pos->Y += 1;}
    else if (but_A) { but_A = false;
      *pnext_rot = (*pnext_rot + block.numRotate - 1)%block.numRotate; 
    }
  }
}
//========================================================================
void DeleteLine() {
  int deleteCount = 0;
  for (int j = 0; j < Height; ++j) {
    bool Delete = true;
    for (int i = 0; i < Width; ++i) if (screen[i][j] == 0) Delete = false; if (Delete) { for (int k = j; k >= 1; --k) {
        for (int i = 0; i < Width; ++i) { screen[i][k] = screen[i][k - 1]; } } deleteCount++; } } switch (deleteCount){ case 1:score = score + 40;break; case 2:score = score + 100;break; case 3:score = score + 300;break; case 4:score = score + 1200;break; } if(score > 9999999){score = 9999999;}
}
//========================================================================
void ReviseScreen(Point next_pos, int next_rot) {
  if (!started) return;
  Point next_squares[4];
  for (int i = 0; i < 4; ++i) screen[pos.X + 
    block.square[rot][i].X][pos.Y + block.square[rot][i].Y] = 0;
  if (GetSquares(block, next_pos, next_rot, next_squares)) {
   for (int i = 0; i < 4; ++i){
     screen[next_squares[i].X][next_squares[i].Y] = block.color;
   }
   pos = next_pos; rot = next_rot;
  }
  else {
   for (int i = 0; i < 4; ++i) screen[pos.X + 
    block.square[rot][i].X][pos.Y + block.square[rot][i].Y] = block.color;
   if (next_pos.Y == pos.Y + 1) {
    DeleteLine(); PutStartPos();DrawNextBlock();
    if (!GetSquares(block, pos, rot, next_squares)) {
     for (int i = 0; i < 4; ++i) screen[pos.X + 
      block.square[rot][i].X][pos.Y + block.square[rot][i].Y] = block.color;
      GameOver();
    }
   }
  }
  Draw();
}
//========================================================================
void make_block( int n , uint16_t color ){            // Make Block color       
  for ( int i =0 ; i < 12; i++ ) for ( int j =0 ; j < 12; j++ ){
    BlockImage[n][i][j] = color;                      // Block color
    if ( i == 0 || j == 0 ) BlockImage[n][i][j] = 0;  // BLACK Line
  } 
}
//========================================================================

Written by macsbug

6月 6, 2018 at 8:50 pm

カテゴリー: ESP32, M5STACK