インドにガンダムという地名が多い理由

ツイッターに疑問が出ていたのでちらっと調べてみた。

昔の言葉で湧き水かな? https://en.wikipedia.org/wiki/Ramagundam

多分、印欧祖語の *wed- (今残っている単語で似たものだとwet)

ラテン語のunda(湧き水、水から派生して波)が同じ雰囲気残っているかな。

ちなみに、サンスクリット語のudaが水で、井戸の昔の音wi(ウィスキーのイ)や、袖ケ浦の浦(ura)につながったという説もあるらしい。(参考

関連して、earthやteraの語源は印欧祖語の *ters- らしい。

インドラとundoちょっと似ていない?と思ったけど最初の「イ」の部分が語源かもぐらいの温度感かな?(参考:5.2. ヤースカの解釈)

ヒドラとかは同じところからきているらしい。(参考

おばけくるましーんのメモ

寝ない幼児を脅すために、リモコン操作で扉とかをガタガタさせたい。

通信はそこそこ距離が届きそうなESPNow使う。(ESPNow調べた時の記事)

揺らす道具は130モーターに何かつけて自作した振動モーター+ESP32-DevKit。DevKit高いけどとりあえず。

リモコンはM5StickC。こいつも高いけどどんな機能必要になるかわからないので手軽にいじれるやつで。

電池と手持ちの部品で動かすには突入電流が大きい(参考)のでコンデンサが足りなかった。コンデンサ100uFぐらいだとパチモンのDCDCでは2.7vぐらいまで、パチモン及び正規品レギュレーターでも2.8vぐらいまでおちる。レギュレーターだと半々の確率でESP起動まではいけることが多いけどモーターを回すとまあだめ。とりあえずコンデンサ大き目ぽちって待機。

今のプログラムはこれ

ハードは

電源の3.3VからESPの3.3vピン、電源グランドからGND

GPIO2-抵抗 – 動作確認用のLED -GND

GPIO15-抵抗 – 2SK4017のBase -GND

電源ライン – モーター – 2SK4017

あとはコンデンサやら帰還ダイオードやらざっくり

USBコンセント電源から5vでとったら動作するので追加コンデンサでも厳しかったら揺れるとこ(モーター)だけ扉につけるように半分離するとよいかも。(電池動作の動作確認機を兼ねているので極力電池で頑張る)

ESP-Nowの公式サンプルが動かなかったので調査

環境

  • ESP32-DevKitC V4 × 2個(MasterとSlave)
  • Arduino IDE (Windows Store 1.8.57.0)
  • ボード ESP32 Dev Module(ESP32 Espressif Systems v 1.0.6)

使用サンプル

ESP32 Dev Moduleの「スケッチ例」->「ESP32」->「ESPNow」->「Basic」のMaster/Slaveのセット

\ArduinoData\packages\esp32\hardware\esp32\1.0.6\libraries\ESP32\examples\ESPNow\Basic の MasterとSlave

発生エラー

Slaveのpeerにデータを送るタイミング(esp_now_send)で「違うチャンネルには送れないよ!」と怒られる。

E (838684) ESPNOW: Peer channel is not equal to the home channel, send fail!
Send Status: Invalid Argument

原因

文字通り違うチャンネルには送れないみたい。公式サイトになんとなくそれを前提としていそうなことは書いてあるけど明示してある箇所は見つけていない。(メッセージがそのままなのでまぁ間違いはないんだろう。)ここらみると2020年の冬ぐらいの1.0.5-rc2で変わったのかな?

For example, the destination device doesn’t exist; the channels of the devices are not the same

Masterは自分がDefaultの1チャンネルになっていて送信想定が3チャンネルになっているので引っかかっている。(それはそれとしてサンプルのSlaveはチャンネルが1になっているのにMasterのソースでは3を指定しているのでそこでも不整合が生じている)

対処

チャンネルを合わせればよい。

1chで上げる場合

Slaveは1チャンネルで上がっているので、送信想定を1にしてやればよい

define CHANNEL 1

slave.channel = CHANNEL;

その他チャンネルで上げる場合

Master/Slaveのチャンネルを任意(使用可能は1~13)に指定してやればよい。

Slave(APモード)のチャンネル指定

Slaveは(違和感あるけど)APモードになっていてSoftAP立ち上げの際に指定できる。

define CHANNEL 1 // からの
 bool result = WiFi.softAP(SSID, "Slave_1_Password", CHANNEL, 0);

Master(STAモード)のチャンネル指定

MasterはSTAモードになってる。ここをみるとSTAモードのときはsoft-APもstationモードと一致するらしい。(で。ドキュメントで確認できていないけどESPNowもsoft-APの設定使って動いているみたい。Espressif だとソース見れないみたいだけどM5Stackの方では派生したもの?みれるようなのでそっち追えばわかるかも)

3. ESP32 is limited to only one channel, so when in the soft-AP+station mode, the soft-AP will adjust its channel automatically to be the same as the channel of the ESP32 station.

指定方法の正しい作法はわからなかった。動いたのは以下の操作。

#include <esp_wifi.h>// して

void setup() {
 //の
  WiFi.mode(WIFI_STA);
 // した後に
  esp_wifi_set_channel(CHANNEL, WIFI_SECOND_CHAN_NONE); // チャンネルを指定してあげる

その他

チャンネルについて

2.4 GHz 帯の中で微妙に周波数変えて周波数ごとにデータ送るやつ。こことかわかりやすい。日本だと1-13チャンネル使えてESPも1-13指定できる。(多分同じ奴だと思うけど調べてない)チャンネル近いと干渉するので、既存の機器と重なったりしたら変えてみると幸せかもしれない。

少し上のWIFI_SECOND_CHAN_NONEについて

「チャンネル2つ使うとデータが倍の勢いで送受信できる」ってやつを使うかどうかの選択パラメータで使わない(HT20)を指定している。使う(HT40)指定のWIFI_SECOND_CHAN_ABOVEとWIFI_SECOND_CHAN_BELOWもあるけどESPNowには多分反映されないでWifiの方だけにかかわると思う。(とりあえず速さいらんと思うのでちゃんと調べてはいない)

仕事をさぼりやすいように人が来たら画面をコマンドプロンプトに切り替えてみる

やりたいこと

仕事さぼっているのがばれないように、人が近づいたらゲーム画面をコマンドプロンプト等(なんとなく黒くてそれっぽい画面)に切り替えられるようにする

必要要素

  • 人が近づいたことを検知する
  • コマンドプロンプト画面でゲーム画面を隠す

実装方針

人が近づいたことを検知する

何かのセンサーで人が近づいたことを検知すればOK。手持ちセンサーでそこそこの距離を測れる超音波距離センサー(HC-SR04)があったのでそいつを利用。角度は15度とほぼ正面しか測れないけどとりあえずこいつで。

コマンドプロンプト画面でゲーム画面を隠す

キーボード入力をマイコン(Raspberry Pi PICO)で自動化する。ライブラリを使ったら簡単にできるらしいできた。

実装技術

Circuit PythonだとAdafruitのライブラリで超音波距離センサーとキーボード入力もそろっていたのでCircuit Pythonを使った。

開発環境(エディタ?)

最初はVS Codeで開発しようとしたけどPICO開発用のPICO-goが新しいVSCodeだと使えないのでメジャーどころのThonnyにした。

なお、こちらにあるようにVSCodeのバージョンを1.65.2に落としたら動くはず。(いったんうごいていたけど油断していたらVSCodeのバージョンアップ走っていて使えなくなっていたので面倒になった。)

また、こちらにあるようにForkされたPico-goをビルドしてもよい模様。

実装

Circuit Pythonのインストール

公式からダウンロードしてインストール。(参考

コマンドプロンプト画面でゲーム画面を隠す

(ライブラリのインストール説明の都合でコマンドプロントから説明)

こちらを参考にHIDのライブラリをインストール。

Windowsでコマンドプロンプトを全画面起動するキー操作は以下。ついでになにかそれっぽい情報を出すためにDir結果も表示(実際に打つとわかりやすい)

  1. Windowsボタン(プログラムの検索画面を開く)
  2. “cmd”キー入力後 Enter (コマンドプロンプト起動)
  3. “dir” キー入力後Enter(Dir実行。ぱっとみそれっぽい情報を表示するため。)
  4. Alt押しながらEnter(コマンドプロンプト全画面か)

Windowsの反応時間を見なくてはいけないかもしれないのでちょいちょいスリープを入れているけど待ちが必要かはわからない。

なお、キーボードの種類指定できるけど日本語はなさげなので必要なら自分で書くか探さないといけない。

人が近づいたことを検知する

こちらからadafruit_hcsr04ライブラリをインストール。HIDの時と同じようにPICOのlibディレクトリにいれればよい。(adafruit_hcsr04.pyで最低限動くはず)

ハードとしてはPICOとhcsr04をジャンパーでつなぐ。

GP5とGP6はプログラムでGPIOピンなら任意指定に変更可能。ピンの役割はこちら

PICOHCSR04
VBUSvcc
GNDgnd
GP5trig
GP6echo

以下で値はとれる

import adafruit_hcsr04
sonar = adafruit_hcsr04.HCSR04(trigger_pin=board.GP5, echo_pin=board.GP6)
distance = sonar.distance

取り急ぎプログラムべたばり

何個もコマンドプロンプト立ち上げたり荒いけど使いながら調整する。プログラムもおもむろに書き直す。(HIDの試験用だったのでこのまま解体されるかもかも)

import microcontroller

import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS

from adafruit_hid.keycode import Keycode

import time
import board
import adafruit_hcsr04

keyboard = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(keyboard)

sonar = adafruit_hcsr04.HCSR04(trigger_pin=board.GP5, echo_pin=board.GP6)
time.sleep(1)

while True:
    try:
        distance = sonar.distance
        if distance < 150:
            print('かくせ')
            
            keyboard.send(Keycode.WINDOWS)
            time.sleep(0.2)
            
            layout.write('cmd')
            time.sleep(0.1)
            keyboard.send(Keycode.ENTER)
            time.sleep(0.2)
            
            layout.write('dir\n')
            
            time.sleep(0.2)
            keyboard.send(Keycode.ALT,Keycode.ENTER)
            
        else:
            print("OK")
        
    except RuntimeError:
        print("Retrying!")
    time.sleep(2)

Pico-Goが新しいVS Codeだと動かない模様

暫定対処

取り急ぎVS Codeを動くバージョンの1.65.2にダウン。Windows64はこちら 他はこちらみてバージョンを1.65.2にて適宜。

(2022/05/30追記)

また、こちらにあるようにForkされたPico-goをビルドしてもよい模様。

起きていたエラー

VS Codeの拡張機能エラーに下のが出ていた。

 → c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\node_modules\@serialport\bindings\lib\binding\node-v101-win32-x64\bindings.node
	at bindings (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\node_modules\bindings\bindings.js:126:9)
	at Object.<anonymous> (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\node_modules\@serialport\bindings\lib\win32.js:1:98)
	at Module.u._compile (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:1313)
	at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
	at Module.load (node:internal/modules/cjs/loader:1035:32)
	at Module._load (node:internal/modules/cjs/loader:876:12)
	at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
	at Function.i._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:32156)
	at Function.E._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:28749)
	at Function.g._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:99:61429)
	at Module.require (node:internal/modules/cjs/loader:1059:19)
	at h (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:699)
	at Object.<anonymous> (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\node_modules\@serialport\bindings\lib\index.js:6:22)
	at Module.u._compile (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:1313)
	at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
	at Module.load (node:internal/modules/cjs/loader:1035:32)
	at Module._load (node:internal/modules/cjs/loader:876:12)
	at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
	at Function.i._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:32156)
	at Function.E._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:28749)
	at Function.g._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:99:61429)
	at Module.require (node:internal/modules/cjs/loader:1059:19)
	at h (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:699)
	at Object.<anonymous> (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\node_modules\serialport\lib\index.js:2:17)
	at Module.u._compile (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:1313)
	at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
	at Module.load (node:internal/modules/cjs/loader:1035:32)
	at Module._load (node:internal/modules/cjs/loader:876:12)
	at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
	at Function.i._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:32156)
	at Function.E._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:28749)
	at Function.g._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:99:61429)
	at Module.require (node:internal/modules/cjs/loader:1059:19)
	at h (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:699)
	at Object.<anonymous> (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\lib\connections\pyserial.js:20:19)
	at Module.u._compile (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:1313)
	at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
	at Module.load (node:internal/modules/cjs/loader:1035:32)
	at Module._load (node:internal/modules/cjs/loader:876:12)
	at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
	at Function.i._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:32156)
	at Function.E._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:28749)
	at Function.g._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:99:61429)
	at Module.require (node:internal/modules/cjs/loader:1059:19)
	at h (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:699)
	at Object.<anonymous> (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\lib\pymakr.js:18:17)
	at Module.u._compile (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:1313)
	at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
	at Module.load (node:internal/modules/cjs/loader:1035:32)
	at Module._load (node:internal/modules/cjs/loader:876:12)
	at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
	at Function.i._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:32156)
	at Function.E._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:28749)
	at Function.g._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:99:61429)
	at Module.require (node:internal/modules/cjs/loader:1059:19)
	at h (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:699)
	at Object.<anonymous> (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\lib\activator.js:28:15)
	at Module.u._compile (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:1313)
	at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
	at Module.load (node:internal/modules/cjs/loader:1035:32)
	at Module._load (node:internal/modules/cjs/loader:876:12)
	at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
	at Function.i._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:32156)
	at Function.E._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:28749)
	at Function.g._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:99:61429)
	at Module.require (node:internal/modules/cjs/loader:1059:19)
	at h (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:699)
	at Object.<anonymous> (c:\Users\kitam\.vscode\extensions\chriswood.pico-go-1.4.3\pymakr.js:1:81)
	at Module.u._compile (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:4:1313)
	at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
	at Module.load (node:internal/modules/cjs/loader:1035:32)
	at Module._load (node:internal/modules/cjs/loader:876:12)
	at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
	at Function.i._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:32156)
	at Function.E._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:28749)
	at Function.g._load (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:99:61429)
	at Module.require (node:internal/modules/cjs/loader:1059:19)
	at require (node:internal/modules/cjs/helpers:102:18)
	at Function.r [as __$__nodeRequire] (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\loader.js:5:101)
	at u._loadCommonJSModule (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:104:30318)
	at u._doActivateExtension (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:90:13361)
	at u._activateExtension (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:90:12313)
	at processTicksAndRejections (node:internal/process/task_queues:96:5)
	at async g._activate (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:85:8154)
	at async g._waitForDepsThenActivate (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:85:8096)
	at async g._initialize (c:\Users\kitam\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\workbench\api\node\extensionHostProcess.js:85:7460)

isuueとか見るとVS Codeが1.66になったときにNodeのバージョンも変わって不整合でテイルっぽい。

Aliで買ったToF距離センサ(Vl53l0x)の動作確認

結果、動いた。ものはこちらで買った。

確認環境

Arduino UNO

多分ほかでも大丈夫。

Adafruit_VL53L0X

Arduino IDEのライブラリを管理からVL53L0Xで検索したらでてきたライブラリ。

vl53l0x.ino

ライブラリ に入っていたサンプルスケッチ

配線

ArduinoVL53L0X
3.3VVIN
GNDGND
SCLSCL
SDASDA
未接続xshutdown (reset)
未接続gpio (interrupt)

何作ろう。

MHZ19ターミナルタイプのコネクター

MHZ19をはじめとするMHZ14やその他Winsen社製のターミナルタイプですがコネクターがかなり固いです。

また、19はコネクターのメスとセンサー本体の間が折り取れるようになっているのでコネクター部分をしっかり押さえて差し込まないと折れてしまうことがあります。

向きは以下の写真の通りです。

Aliで買った1.3インチのOLEDの動作確認

alieで買ったOLEDの動作確認のメモ。

買ったのもはこちら。商品のレビューが星一個だったけどストアの全般的な評価は悪くない。

秋月で売っているこれの一回り大きいものだと思う。(持っていないので多分)

かったとこにデータ乗っていないけどたぶん同じ物あつかっているとこ(こことか)みると3v-5vでSH1106ドライバで動くとのこと。

接続はしたな感じ

LED-Arduinoで

  • VDD-5V(または3.3VでもOK)
  • GND-GND
  • SCK-SCL
  • SDA-SDA

ライブラリはこいつを使ってExampleのsh1106_128x64_i2c.inoで動作。

既存のCO2センサー(EPEA-CO2-NDIR-04)の画面を変えたバージョンを作りつつちょっと触ってみる。(といってもtextでればよいのでさらっと)

M5Stack+MHZ19B/Cキット組み立て方法

わかりにくい場合、画像等を追加します。購入モールのメッセージ、twitter等でご連絡ください。(本ブログは数週間に1度程度しかチェックしていません)

半田付け

半田付けは「MHZ19用基板にMHZ19及びピンヘッダーを付けつ手順」と「LEDと抵抗をつける手順」の2ステップです。

MHZ19用基板

ピンヘッダーを10+5個分基盤につけます。上面側にピンも来るようにつけてください。水平が狂うとM5Stackに差し込んだ時の接触が悪くなります。(ある程度は付属のワッシャ等で調整可能)

LED

抵抗をLEDの足につけます。アノード/カソード好みで大丈夫です。長さはケースにおさまる程度に修正してください。付け終わったらビニテ等でそれぞれ接触しないように絶縁してください。

LEDはAliexpresで購入したこれを使っています。

組み立て

M5Stack

底面(アクリルの板)、ナット、M5StackのM3ボルト取り付け穴の順になるように取り付けます。ボルト/底面/ナットを手で大体しめた後にM5Stackの背面取りつけ穴に合わせてドライバーでしめるとやりやすいです。

MHZ19

ワッシャ、底面(アクリルの板)、ナット(及び必要であれば高さ調整ワッシャ)、基板、ナットの順に取り付けます。使用するのは短めのプラスチックボルトです。

ナットを少しゆるめてピンヘッダーをスライドさせてM5Stackに差し込みます。差し込んだ後に改めて締め直してください。

LED

M5Stack上面の22番にアノード、Gにカソードを差し込みます。

ケースカバー

それぞれ上からはめてボルトとナットで固定します。

M5Stack+MHZ19Bで通信機能詰め込みCO2センサー

キットの組み立て方はこちらから(MHZ19Cも同一手順)

M5StackとCO2センサーモジュールMHZ19Bを使って通信機能を詰め込んだCO2センサーを作成した。一応1000ppm警告のLEDも付いている。使える通信(と表示)は以下。

  • もとから付いている画面
  • シリアルでのPC等へのUSB経由出力
  • Wifi経由の出力(サーバになる、2.4G回線のみ)
  • bluetooth出力

画面とシリアル出力は常に起動。Wifiとbluetoothは起動時に選択した場合のみ。

画面はこんな感じ。

シリアル出力はこんな感じ。teraterm等で確認するのが楽かも。転送速度は9600。Windows用のCO2閲覧ソフトでも(これに限らずJSONできたら)みられる用にする予定。

[yoshitake@localhost ~]$ stty -F /dev/ttyUSB0 raw 9600
[yoshitake@localhost ~]$ sudo  cat /dev/ttyUSB0
{"CO2":402}
{"CO2":401}

WifiはM5Stack起動時にAボタン(画面向かって左側)が押されていたら起動。繋がった際に画面にipアドレスが出力されるのでそのアドレスにアクセスするとJSONが返ってくる。192.168.1.15がM5StackのIPだとするとhttp://192.168.1.15/で値がJSONで返却される。呼び出し元のページがあるとIoTなこといろいろできる。なお、Wifiに10秒以上つながらなかったら設定モードに入る。設定はスマホアプリのESPTouchというものを使用。英語だけれどもパスワード入れさえすれば動く。注意点はスマホのWIFIが2.4Gのアクセスポイントに繋がっていないといけない。

bluetoothは起動時にBボタン(画面真ん中)が押されていたら起動。CO2Sensorという名前のデバイスが現れるのでそちらに接続すると数値のみが定期的(いまは6秒)で送られる。AndroidであればSerial Bluetooth Terminalというもので取り敢えず値がとれる。

なお、起動後にAボタンとCボタン(画面向かって右側)を長押しするとキャリブレーション(今の濃度を400とみなして基準値のリセット)を実行する。「日光の当たらない場所(できれば夜間)」で「20分以上きれいな外気」にあててから実行する。補正する為の比較対照が無い状態でも通常±50ppm以内には収まる。

ソースはこちら

ハードはM5StackBasicとこちらのキット