電子工作」カテゴリーアーカイブ

picoprobeの環境構築で手間取ったのでメモ

Interface7月号のラズパイPicoでゼロから作るOSを試そうとしたら環境構築で手間取ったのでメモ。

先に結論

Interface記載の各ダウンロード先最新のもので環境構築をするとpicoprobeのデバックが動かない。対処としてxpmで入れたopenocdを使用すると動いた。

インストール方法

node/npm/xpmが入っている環境で

cd my-project
xpm init # Only at first use.

xpm install @xpack-dev-tools/openocd@latest --verbose

事象

手順通りだとエラー。エラーメッセージを取り損ねているけどlocalhost:3333がtimeoutとかの類だったはず。

cmsis-dap.cfgを修正しadapter speed 5000を追記するという手順をしても以下エラー。

Error: Sequence 4 not supported. 
Info : DAP init failed


Error: Sequence 3 not supported.
Error: Sequence 4 not supported.

原因

Interface記載のopenocdだと今のpicoprobeの処理に対応していない。こちらのリンク先のパッチが未適用。(公式だと取り込まれていた。)Interface記載の段階では動いたようなのでおそらくpicoprobeのバージョンアップで動作が変わったと思う。(が、picoprobe側の変更履歴は確認していない。)

各バージョン

多分直接関係するのはopenocdとpicoprobeだけだと思う

C:\Users\kitam>node -v
v18.17.1

C:\Users\kitam>npm -v
9.6.7

C:\Users\kitam>xpm --version
0.16.3
picoprobe-cmsis-v1.0.3
  "xpack": {
    "minimumXpmRequired": "0.16.3",
    "dependencies": {},
    "devDependencies": {
      "@xpack-dev-tools/arm-none-eabi-gcc": {
        "specifier": "12.3.1-1.1.1",
        "local": "link",
        "platforms": "all"
      },
      "@xpack-dev-tools/windows-build-tools": {
        "specifier": "4.4.0-1.1",
        "local": "link",
        "platforms": "all"
      },
      "@xpack-dev-tools/openocd": {
        "specifier": "0.12.0-2.1",
        "local": "link",
        "platforms": "all"
      }
    },
Eclipse IDE for Embedded C/C++ Developers (includes Incubating components)

Version: 2023-06 (4.28.0)
Build id: 20230608-1333

CH32V003とWCH-LinkEでLチカ

秋月で販売開始になったCH32V003J4M6(マイコン本体)とWCH-LinkEエミュレーター(書き込み/デバック装置)で書き込みができたのでそこまでのメモ。

基本的にはこちらの記事をトレースしてわからなかったことを追記した感じ

必要だったのもの

ハード

  • CH32V003J4M6 1個
  • WCH-LinkEエミュレーター 1個
  • ピッチ変換基盤 1個(これの同等品)
  • LED 1個(3mm使った)
  • 抵抗 1個(1 KΩ 大体で)
  • ブレッドボード 1個
  • コンデンサ 0.1uF 1個
  • ジャンパーケーブル 5本ぐらい
  • 書き込み用PC Windows11(1台)

ソフト

元記事と違った箇所、または追加したとこ

「いつも通り Workspace の場所を決めて Launch をクリックします。」は出なかった。後で選べる。

File⇒Open Procets from File System をクリックします。」は「Open Procets from File System」のとこが微妙に名前変わっていた

「コンパイル」のトンカチアイコンは見当たらず、ビルドアイコンがツールバーの左寄りにあった。ダウンロードアイコンもツールバーの左寄り。

サンプルソースはGPIO_Pin_0でLチカしているけどSOP8のだとPD0は出ていないのでGPIO_Pin_6(PD6の1番ピン)に変更

書き込みのたびに、MounRiver Studioにて以下操作

  1. メニューバーからFlash選択
  2. configration選択
  3. target modeにあるqueryボタンクリック
  4. プルダウンに出てくるWCH-LinkRV選択
  5. 少し下のErase Code FlashでBy power off を選択してApplyクリック

接続

PCのUSBにPCのUSBにWCH-LinkEエミュレーター接続

WCH-LinkEエミュレーターCH32V003
GND2番ピン(VSS)
3V34番ピン(VDD)
SWDIZO8番ピン()

CH32V003の1番ピン – Lチカ用のLED – 1KΩ抵抗 – CH32V003の2番ピン(VSS)

CH32V003の2番ピン(VSS) – 0.1uFコンデンサ – CH32V003の4番ピン(VDD)

ソース

ほぼそのままだけど下の

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2022/08/08
 * Description        : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for 
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/

/*
 *@Note
 GPIO routine:
 PD0 push-pull output.

*/

#include "debug.h"

/* Global define */

/* Global Variable */

/*********************************************************************
 * @fn      GPIO_Toggle_INIT
 *
 * @brief   Initializes GPIOA.0
 *
 * @return  none
 */
void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    u8 i = 0;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf("GPIO Toggle TEST\r\n");
    GPIO_Toggle_INIT();

    while(1)
    {
        Delay_Ms(250);
        GPIO_WriteBit(GPIOD, GPIO_Pin_6, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
    }
}

Aliで買ったLEDシリコンチューブ届いた

ここのやつ。

5mのオレンジで12Vで約1.2A。

明るさとしては室内の照明だと十分目立つけど昼の屋外だとほぼわからないぐらい。屋外で使うならやや日が傾きだしたぐらいからかな。晴れた6月の京都で18時ぐらいで見えるぐらい。

なお開封直後はゴム臭がけっこうした。

チューブに黒い点がついていてそこから切り離せるはずだけど試していない。

看板に使用したいので曲げてみた。折り目はつかないのでターンのきついところでは接着剤等で角度保持してやらなくてはならない。

ちなみに看板は最初トリマーで掘り込もうと思ったけど丁寧にやるのは時間がかかるのであきらめた。大きいCNCがあったら楽そうだけどCNC事態を持っていないのでレーザーカッターでアクリルを切り抜いたやつで作る予定。

サーボモーターSG90が半分の角度しか回らないので調査

環境

  • VSCode
  • PlatformIO
  • ESP-WROOM-02(自作基盤)
  • SG90(のAliexpressで買った互換品?)
  • Windows11

事象

SG90をPlatformIOで入れたライブラリで0,90,180度で動かそうとしたところそれぞれ0,45,90度ぐらいしか動かなかった

ソースは以下

#include <Arduino.h>
#include <Servo.h>


#define SERVO_PIN   12


Servo servoMotor; 

void setup() {
  Serial.begin(115200);
  delay(100);
  digitalWrite(LED_PIN, HIGH);
  servoMotor.attach(SERVO_PIN);
}

int count = 0;
int angle[] = {0,90,180};
void loop() {
  
  servoMotor.write(angle[count%3]);

  Serial.printf("%s - run %d %d \n",__func__,count,servoMotor.readMicroseconds());
  count++;
  delay(1000);
}
[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
monitor_speed = 115200
upload_port = COM9

servoMotor.readMicroseconds()でみてみると本来500,1450,2400(ms)ぐらいであってほしい数値が1000,1500,2000ぐらいになっていた。

対応

サーボモーターの初期化をするときに以下のように明示的に0度と180度(データシート的には-90度と90度)の値を指定してやったら動いた。

servoMotor.attach(SERVO_PIN,500,2400);

原因

PlatformIOだとplatform を切り替えるとそれぞれのマイコンに応じたライブラリが読み込まれるみたい。そしてそこ(Servo.h)にあるデフォルト値が欲しい値じゃなかった

#define DEFAULT_MIN_PULSE_WIDTH      1000 // uncalibrated default, the shortest duty cycle sent to a servo
#define DEFAULT_MAX_PULSE_WIDTH      2000 // uncalibrated default, the longest duty cycle sent to a servo 
#define DEFAULT_NEUTRAL_PULSE_WIDTH  1500 // default duty cycle when servo is attached

読み込まれているライブラリはPIOホーム -> Libraries -> Built-inから(必要なら検索で絞って)Servoを選んでRevealを押すと確認可能。

ATTiny85でI2CしたデータをUARTシリアル通信

概要

ATTiny85にてスレーブからI2Cで取得(readのみwriteしてない)したデータをPCにUARTで連携してみたメモ。

流れとしては「Masterとして使うATTinyの準備/設定」「Slaveとして使うArduinoNanoの設定」「動作確認」。

全体ソース

環境

開発環境

Windows11(64bit)

ArduinoIDE 1.8.19 (多分Microsoft Storeからインストール)

Arduino UNO ( 後で出てくるArduino as ISPとして使う。使えればほかでもOK)

試験用ハード

PC

開発環境と同じWindows

ATTiny85-20PU

秋月で買った純正品 これ

USBシリアル変換モジュール

CH340が搭載されているやつを使用。(リンクこれから準備)

最近のWindowsだったら元からドライバーは入っているはず。

Arduino Nano 互換機

I2Cのスレーブとして。手持ちのI2Cなセンサーとかでもよいけど動かない時の切り分けが大変。

その他

  • ジャンパー必要数
  • コンデンサー 計100uFほど(書き込み時のリセット操作用なのでなければジャンパー手操作でも)
  • LEDと1Kほどの抵抗(動作しているかチェック用。なければないで)

Masterとして使うATTinyの準備/設定

ATTinyのブートローダー書き込み及びプログラム書き込み方法

このままこちら参照

書き込むプログラム

UART周り

ATTiny85にはハードウェアシリアルがないのでソフトウェアシリアルを使う必要がある。

pinout(参照)のPBnnで使うピンを指定するけれど(PB)0,(PB)2はI2Cで使うので利用できるのは残り。とりあえずRXを(PB)3,TXを(PB)4に指定する。

なお、(PB)5はプログラム書き込みの時に使うので他用途で使うと試験中は面倒。

ざっくり雰囲気は以下。

#include <SoftwareSerial.h>


#define RX_PIN 3 // PB3はUSBシリアル変換モジュールのTXにつなぐ
#define TX_PIN 4 // PB4はUSBシリアル変換モジュールのRXにつなぐ

SoftwareSerial softSerial =  SoftwareSerial(RX_PIN, TX_PIN); 

void setup() {
  softSerial.begin(9600);
  softSerial.println("Master start");

}

注意事項

  • TX,RXを入れ子でつなぐの間違えがち。
  • softSerialなので通信速度はあんまり頑張れない(まだまだいけるだろうけど必要なければ無理はしない)
  • 間違えてSerial.print~としてもエラーは出ない。(softSerial.println)

I2C周り

よく使うWireは使えないらしい。マイコンごとに実装分かれていて実装されていないとかどっかで見た。(ソース1分斜め読みで見つからなかったけどまぁ信じる)

かわりにArduinoIDEのライブラリ管理から入れられるTinyWireMが使える。

先ほど見たpinoutにあるようにPB0がSDA,PB2がSCL。

ざっくりプログラムは以下

#include <TinyWireM.h>

#define SLAVE_ADDR   0x08 // Slaveのアドレス。

void setup() {
  TinyWireM.begin(); // 開始
}

void loop() {
  int code = TinyWireM.requestFrom(SLAVE_ADDR, 1); // スレーブのアドレスから1バイト(第二引数)読み込み。
   if ( code == 0){
    softSerial.println(TinyWireM.read()); // 読み込んだものを一括取得(そして書き出し)

   } else {
// エラーコードはここにしかなさそうhttps://github.com/adafruit/TinyWireM/blob/master/USI_TWI_Master.h
    softSerial.printf("error with code[%d]\n",code);
   }
  delay(500);
}

注意事項としてTinyWireM.requestFromの戻り値は要確認。エラーがあった場合チェックしないでreadを呼ぶと初期値の0がそのまま取得される。(ライブラリのExampleはチェックしていないけど大事)

Slaveとして使うArduinoNanoの設定

呼ばれたら返すだけ。アドレスは0x08に設定している。(予約アドレス以外任意可のはず)

#include <Wire.h>

byte b=0;

void setup() {
    Serial.begin(9600);
  Serial.println("slave START");
  Wire.begin(0x08);// Slave ID #8
  Wire.onRequest(requestEvent);
}

void loop() {
}

void requestEvent() {
  Serial.print("event call current data[");
   Serial.print(b);
   Serial.println("]");
  Wire.write(b++);
}

動作確認

結線

ATTinyの番号はピン番号(PBnのnじゃない)

役割USBシリアル変換ATTinyNano
5v5Vのピン85v
GNDGNDのピン4GND
(Attinyからみて)TXRXのピン3
(Attinyからみて)RXTXのピン2
SCL7A5
SDA5A4

(全体ソースでは動作確認用のLEDがありATTinyの6番から1K抵抗経由でグランドにつながっている。)

動作ログ

同時につなげるとNanoの準備ができるまで見つからない旨のエラーが返るけど準備できたら取得できるようになる。

Loop [1]
by available
error with code[3]
Loop [2]
by available
error with code[3]
Loop [3]
by available
0
Loop [4]
by available
1
Loop [5]
by available
2
Loop [6]
by available
3

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

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

通信はそこそこ距離が届きそうな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)

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にカソードを差し込みます。

ケースカバー

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