「AKBONE2022 で LED パネルを使ったオープンソーストレーニングキットを考える」
https://qiita.com/nanbuwks/items/5271dedf196623d452a0
のその後、Beta1 版に改良してイベントで頒布したりはんだづけしたりしました。組み立てや楽しみ方を説明します。
キットのラインナップ
基本キット
これとLEDパネルを組み合わせて使います。
¥2000
LEDパネル(安)
P3 ( ピッチ3mm )、192mm x 96mm 、64x32 pixel のパネルです。
なお、P4 ( ピッチ4mm )、256mm x 64mm 、64x32 pixel のパネルも選択できます。
¥2000
LEDパネル(高)
P2 ( ピッチ2mm )、 256mm x 128mm 、128x64 pixel のパネルです。
¥5000
電源キット 2600mAH (PSE)
通常の利用シーンはUSB電源につなげて使う想定ですが、AVTOKYOイベントにおいて首から下げてバッジとして使うためにモバイルバッテリーをオプションで用意しました。
¥1000
電源キット 3100mAH (BASEN)
ちょっと高性能なモバイルバッテリーキットです。
¥1500
ブースターパック
センサなどをつなげて、いろんな機能を使えるようにするパーツです。
¥2000
Linuxオプション
Linux が動作する、Lichee Pi Nano モジュールをつなげることができます。
128x64 Pixel のパネルとつなげて、 6x8 フォントを使うと 21文字 x 8 列のコンソールを実現するためのオプションです。
Lichee Pi Nano の F1C100S コア を使った Linux ブート開発のトレーニングに使うことを想定しています。
¥1000
原価の計算
ううむ、売価原価3倍の法則はキビシイぞ。
売価は原価の1.7倍ぐらいにしてみました。
組み立て方
用意する道具
- はんだごて
- ピンセット
- ニッパー
基本キット
内容の一覧です。
- 基板 x 1
- ターミナル x 2
- 0.1μF 1206メトリック表面実装コンデンサ x 2 (多めに入っています)
- ピンソケット 一列 (切って使います)
- ESP32ボード x 1
Beta1の基板です
Beta1 のPCBは ESP32 Devkit のいくつかのタイプに対応しています。
キットに入っている ESP32 ボードに合わせてピンソケットをカットします。
このように取り付けます。基板の表裏に注意! 注意! 注意!
一列をはんだづけします。終わったら反対側のもう一列も。ちなみに、ESP32はまだ接続しないのが無難です。アース処理ができていない機材の場合は、パーツを壊す可能性があります。
ボックスヘッダをはんだづけ。
表面実装のコンデンサ、予備で1つ入ってますが2つをはんだづけします。
C1 は ESP32 への書き込みの安定化のためのコンデンサです。
C2 はロータリーエンコーダーの安定化のためのコンデンサで、ロータリーエンコーダーはブースターキットに含まれるパーツですが、ここで一緒に取り付けます。
片側にはんだを盛ります
※ ブースターパックの組み立ては更に下にあります。
ソフトウェア
開発環境をセットアップ、サンプルプログラムを書いてみます。
「LEDパネルキット AKBONE2022 の環境構築を自分でやってみる」
https://qiita.com/nanbuwks/items/d4523ebfb9cabdae90c5
ESP32のソフトが書き込みできるかどうかテストしましょう。
ESP32 ボードを接続し、シリアルポートとボードを合わせます。
動作確認プログラムは
「スケッチ例」-「ESP32」-「ChipID」-「GetChipID」を試してみました。
ここまで確認できたら、ケーブルをつなげて光らせてみましょう!
パネルと接続して光らせてみる
基板とパネルの配線はこのようになります。
パネル側のフラットケーブルのコネクタは2箇所あるので左側に取付てください。
パネルに基板を固定
うまく動いたら、基板をパネルに取付けます。
AVTOKYO では、低レベル勉強会のロゴを併せて頒布しました。かっこよく貼り付けましょう。
マグネットを使って、貼り付けもできます。工夫してください。
この、AVTOKYO のロゴは、次の作業で表示することができます。
SPIFFS を使えるようにする
画像ファイルを表示してみましょう。
https://github.com/nanbuwks/AKBONE2022
こちらからレポジトリをクローンしてローカルに保存します。
クローンしたファイルのうちの
AKBONE2022/Arduino/sketchbook/avtokyo2022demo を開きます。
AVTOKYOでは、パネルを3種類頒布しました。
左から、P4パネル、P3パネル、P2パネルです。
- P4(ピッチ4mm) 256mmx128mm 64x32pixel
- P3(ピッチ3mm) 192mmx96mm 64x32pixel
- P2(ピッチ2mm) 256mmx128mm 128x64pixel
パネルの種類に応じて、該当箇所を書き換えます。書き換えは5箇所です。
AVTOKYO で頒布した、 256x128mm の P4 パネルの場合
サイズを指定。
#define PANEL_64x32
//#define PANEL_128x64
次の箇所を丸々無効にします。
struct LGFX_HUB75 : public lgfx::LGFX_Device
{
struct Panel_Custom_HUB75 : public lgfx::Panel_HUB75
{
/*/ X 座標が8ドット単位で逆順になる場合の対策が必要な場合はこのoverrideを有効にする
void _draw_pixel_inner(uint_fast16_t x, uint_fast16_t y, uint32_t rawcolor) override
{
Panel_HUB75::_draw_pixel_inner((x & 8) ? x : (x ^ 7), y, rawcolor);
// Panel_HUB75::_draw_pixel_inner((x & 8) ? (x ^ 7) : x, y, rawcolor);
}
//*/
};
行デコード方法をバイナリとします。
// パネルの行選択の仕様に応じて指定する
//cfg.address_mode = cfg.address_shiftreg;
cfg.address_mode = cfg.address_binary;
列ドライバの初期化コマンドを送らないようにします。
// LEDドライバの初期化コマンドを指定する
cfg.initialize_mode = cfg.initialize_none;
//cfg.initialize_mode = cfg.initialize_fm6124;
パネルの縦横ピクセル数を指定します。
// ここでパネルサイズを指定する
// 複数枚並べる場合は全体の縦横サイズを指定
cfg.memory_width = cfg.panel_width = 64;
cfg.memory_height = cfg.panel_height = 32;
AVTOKYO で頒布した、 192x96mm の P3 パネルの場合
サイズを指定。
#define PANEL_64x32
//#define PANEL_128x64
次の箇所を丸々有効にします。
struct LGFX_HUB75 : public lgfx::LGFX_Device
{
struct Panel_Custom_HUB75 : public lgfx::Panel_HUB75
{
// X 座標が8ドット単位で逆順になる場合の対策が必要な場合はこのoverrideを有効にする
void _draw_pixel_inner(uint_fast16_t x, uint_fast16_t y, uint32_t rawcolor) override
{
Panel_HUB75::_draw_pixel_inner((x & 8) ? x : (x ^ 7), y, rawcolor);
// Panel_HUB75::_draw_pixel_inner((x & 8) ? (x ^ 7) : x, y, rawcolor);
}
//*/
};
行デコード方法をバイナリとします。
// パネルの行選択の仕様に応じて指定する
//cfg.address_mode = cfg.address_shiftreg;
cfg.address_mode = cfg.address_binary;
列ドライバの初期化コマンドを送らないようにします。
// LEDドライバの初期化コマンドを指定する
cfg.initialize_mode = cfg.initialize_none;
//cfg.initialize_mode = cfg.initialize_fm6124;
パネルの縦横ピクセル数を指定します。
// ここでパネルサイズを指定する
// 複数枚並べる場合は全体の縦横サイズを指定
cfg.memory_width = cfg.panel_width = 64;
cfg.memory_height = cfg.panel_height = 32;
AVTOKYO で頒布した、 256x128mm の P2 パネルの場合
サイズを指定。
//#define PANEL_64x32
#define PANEL_128x64
次の箇所を丸々無効にします。
struct LGFX_HUB75 : public lgfx::LGFX_Device
{
struct Panel_Custom_HUB75 : public lgfx::Panel_HUB75
{
//* X 座標が8ドット単位で逆順になる場合の対策が必要な場合はこのoverrideを有効にする
void _draw_pixel_inner(uint_fast16_t x, uint_fast16_t y, uint32_t rawcolor) override
{
Panel_HUB75::_draw_pixel_inner((x & 8) ? x : (x ^ 7), y, rawcolor);
// Panel_HUB75::_draw_pixel_inner((x & 8) ? (x ^ 7) : x, y, rawcolor);
}
//*/
};
行デコード方法をシフトレジスタ形式とします。
// パネルの行選択の仕様に応じて指定する
//cfg.address_mode = cfg.address_shiftreg;
cfg.address_mode = cfg.address_binary;
列ドライバの初期化コマンドで輝度指定を送るようにします。
// LEDドライバの初期化コマンドを指定する
// cfg.initialize_mode = cfg.initialize_none;
cfg.initialize_mode = cfg.initialize_fm6124;
パネルの縦横ピクセル数を指定します。
// ここでパネルサイズを指定する
// 複数枚並べる場合は全体の縦横サイズを指定
cfg.memory_width = cfg.panel_width = 128;
cfg.memory_height = cfg.panel_height = 64;
ファイルアップロード
「LEDパネルキット AKBONE2022 の環境構築を自分でやってみる」
https://qiita.com/nanbuwks/items/d4523ebfb9cabdae90c5#spiffs-%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
の「SPIFFSを使えるようにする」の設定を行っておきます。
「ツール」 - 「ESP32 Sketch Data Upload」で、アップロードし、スケッチも登録すると以下のように画面が出ます。
ブースターパック
内容物一覧です
- ロータリーエンコーダ
- ツマミ
- ブザー
- LED
- 330Ω抵抗 1206メトリック
- 10kΩ抵抗 1206メトリック
- SDカードソケットアダプタ
- MPU6500ジャイロモジュール
- GY-BME280-3.3 温湿度気圧センサ
- GROVEコネクタ
- PCF8563 RTCモジュール
- CR1220 電池
- ピンソケット(約30pin分)
- ピンヘッダ
- ジャンパー
ブースターパック搭載の拡張モジュール詳細
中華製の市場で安く購入できるものをつなげられるようにしています。
ジャイロ
このほか、ロータリーエンコーダー、GROVE端子などなど。
ブースターパック組み立て
再度基板にはんだ付けします。まずはESP32のモジュールを外しておきましょう。
330Ωの抵抗を取り付けます。331と書いてある抵抗です。なくしてもいいように余分に入っています。
4.7kΩの抵抗を取り付けます。シルクには 10kΩ(104) x4 と書いていますが、今回は4.7kΩ(472)を5個取付ます。
LEDを取付ます。ピンの長い方が下です。
裏側の足は余分を切りましょう。
6P ピンソケットを取り付け
ピンソケットを必要な長さで切り、写真の箇所にはんだづけします。マスキングテープで止めてはんだ付けしましょう。
補助電源コネクタを取付ます。ピンヘッダを6つ分切って取付てください。
圧電ブザーと、ジャンパーコネクタを取付ます。
ジャンパーを取り付けておきましょう。
中華モジュールにピンをはんだづけします。microSDカードモジュールのみ部品面にピンを立てるのに注意。
モジュールを装着します。RTCモジュールに電池を入れます。microSDカードモジュールは裏返して装着してください。
モジュールを活用したサンプルプログラム
Beta1 の注意点
I2Cの設定ですが、Beta1 の割当が次のようになっています。
- SDA 22
- SCL 21
通常は以下のようになっています。
- SDA 21
- SCL 22
なのでI2Cのピンマッピングを変更する必要があります。 Arduino 開発環境の場合、以下のようにしてI2Cの初期化をします。
Wire.begin(22,21);
モジュールがつながっているか確認する
「ESP32 を使って I2C スキャナ」
https://qiita.com/nanbuwks/items/c235f7f867f6139b6c8b
を使って、I2Cに接続したアドレスを確認します。先のI2Cの初期化部分を書き換えて実行します。
Scanning...
I2C device found at address 0x51 !
I2C device found at address 0x68 !
I2C device found at address 0x76 !
done
と出ればOKです。
アドレスは以下のように割当となります。
- 0x51 PCF8563 RTCモジュール
- 0x68 MPU6500ジャイロモジュール
- 0x76 GY-BME280-3.3 温湿度気圧センサ
温湿度気圧センサBME280を使ってみる
サンプルプログラムの BME280demo を使ってみます。
「LEDパネルキット AKBONE2022 の環境構築を自分でやってみる」
https://qiita.com/nanbuwks/items/d4523ebfb9cabdae90c5#bme280%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B
の「BME280ライブラリを導入する」を行うと、温度湿度気圧が表示できます。
カレンダモジュール RTC PCF8563 を使ってみる
「LEDパネルキット AKBONE2022 の環境構築を自分でやってみる」
https://qiita.com/nanbuwks/items/d4523ebfb9cabdae90c5#rtc-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B
の「RTC ライブラリを導入する」を行うと、カレンダ機能が使えるようになります。
ジャイロモジュール MPU6500 を使ってみる
「LEDパネルキット AKBONE2022 の環境構築を自分でやってみる」
の
「ジャイロセンサライブラリを導入する」を行うと、6軸加速度が取得できるようになります。
https://qiita.com/nanbuwks/items/d4523ebfb9cabdae90c5#%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AD%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B
https://twitter.com/i/status/1589277896434397184
その他のモジュールのサンプルソフトウェア
後ほど公開します! 乞期待!
ピン配置
#define R1PIN 33
#define G1PIN 32
#define B1PIN 25
#define R2PIN 18
#define G2PIN 19
#define B2PIN 5
#define A0PIN 12
#define A1PIN 14
#define A2PIN 27
#define A3PIN 26
// #define A4PIN 4 // GND
#define CLKPIN 4
#define LATPIN 17
#define OEPIN 16
#define LEDPANEL_X 64
#define LEDPANEL_Y 32
その他
ESP32 | Linuxボード | 信号名 | 説明 |
---|---|---|---|
VP(GPIO36) | SW_B | ロータリーエンコーダーB相 | |
VN(GPIO39) | SW_ANALOG | ロータリーエンコーダーSWとESCスイッチのマルチプレックス | |
GPIO34 | SW_A | ロータリーエンコーダーA相 | |
GPIO35 | MOSI/RX | SDMISO_SMOSI_RX2 | microSDソケットMISO/LinuxボードSPI0_MOSI/ジャンパー選択でLinuxボードRX |
GPIO23 | MISO/TX | SDMOSI_SMISO_TX2 | microSDソケットMOSI/LinuxボードSPI0_MISO/ジャンパー選択でLinuxボードTX |
GPIO13 | SCLK | SCLK | microSDソケットCLK/LinuxボードSPI0_CLK |
GPIO22 | I2C_SDA | センサやGrove端子のSDA | |
GPIO21 | I2C_SCL | センサやGrove端子のSCL | |
GPIO2 | BUZZER | 圧電ブザー | |
GPIO15 | CS | CS | microSDソケットCS/LinuxボードSPI0_CS |
TX | RX | TX | ESP32ボード上でUSBシリアルとして接続/ジャンパー選択でLinuxボードRX |
RX | TX | RX | ESP32ボード上でUSBシリアルとして接続/ジャンパー選択でLinuxボードTX |
SW_ANALOGは、10kでプルアップされていて、ロータリーエンコーダーSWを押すとGND,ESCを押すと電圧が中点となります。両方押すとGND。