色相環で表示するテーブルランプ時計(ESP32+NeoPixelRing)

木工品の中に入れて光らせるテーブルランプを作ります。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

Wi-Fi経由でNTPサーバーから時刻を取得して、24時間でランプの色を色相環を一周させます。
8時:赤(あか)
10時:橙(だいだい)
12時:黄橙(きだいだい)
14時:黄(き)
16時:黄緑(きみどり)
18時:緑(みどり)
20時:青緑(あおみどり)
22時:緑青(みどりあお)
0時:青(あお)
2時:青紫(あおむらさき)
4時:紫(むらさき)
6時:赤紫(あかむらさき)
毎時3分間と1分ごとの10秒間は少し光り方を変化させることにしました。また、日中は明るく、夜間は暗く光るようにしています。

ESP32(MH-ET LIVE  ESP32 MiniKit)でシリアルフルカラーLEDを制御するのですが、暑い夏にハンダ付けをするのが面倒になったので、NeoPixelRing(12個)を使いました。VCC、GND、IO16だけ使います。コンパクトにするためにヘッダーピンは使わずに直接ハンダ付けをします。ケースは適当に3Dプリンターで出力しました。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

Arduinoプログラムは以下のものを使いました。WiFiのSSIDとパスワードが必要です。

 

 

 

ESP32と8x32LEDモジュールでNTP時計を作る(その2)

2019年8月に「ESP32と32×8フルカラーLEDでデジタル壁時計をつくる」という記事を書きましたが、そのデジタル壁時計は壊れずにいまも使い続けています。この時に使ったLEDモジュールは「Quimat Arduino用RGB LED パネル 5050 SMD WS2812B」というものでしたが、同じものは入手できなくなったようです。このパネルのLEDの配線は左右方向にジグザグでした。

新たに購入したパネルは「BTF-LIGHTING WS2812B ECO RGB合金ワイヤー 8X32cm 265ピクセル LEDマトリックスパネル 5050SMD」で価格は2799円と安くなっています。問題はLEDの配線が上下方向にジグザグなことです。これはプログラムを少し変更するだけで対応できます。前回の数字フォントは輝度を0から100の間で変化させて斜体を表現しましたが、今回はシンプルに0か100のON-OFFで作りました。

配線は前回と同様にVDD(5V)、GND、IO16を使いました。

筐体はLEDマトリクスを購入したときに付いてきた白い発泡ウレタンを使いました。ESP32用のケースは即席で3Dプリンターで作成しました。

 

変更したのはsetPosArray()とColonFont[FontHeight][ColWidth]とNumFont[10][FontHeight][FontWidth]、および、NTPへのアクセス間隔を1200秒ごとにしました。

 

 

 

 

ESP32でI2Sを使ってみる

ESP32はWiFiやBluetoothが使える高機能なボードです。I2S(Inter-IC Sound)というサウンドをデジタル通信できる機能も持っていて、I2S対応のマイクモジュールやアンプモジュールを接続してArduino IDEで制御することができます。

OLYMPUS DIGITAL CAMERA

ESP32のプログラムガイド」や「ESP32のI2Sマイク研究」、「I2Sマイク、ESP32、Arduino、SPH0645LM4H」などの記事を参考にしながら試してみました。

結論から書くと、マイクからの入力をイヤフォンで聞くことができましたが、音質がどうこうというレベルにはなっていません。タイムラグをまったく感じないのは今後に期待できるかもしれません。

興味のある方への参考と、自分のための備忘録

ESP32は「 MH-ET LIVE MiniKit」を使用しました。マイクは「Sipeed 1マイクモジュール」2個、アンプは「GY-PCM5102」を使用しました。

ESP32のI2Sは2本あり、入力か出力どちらかを選択できます。今回はI2S_0をマイク入力、I2S_1をアンプ出力に使います。それぞれバッファメモリが使えますので、マイクの入力バッファからデータを読んで、32ビット符号付整数に変換して、処理(たんなる掛け算)して、バイト配列に戻してから、アンプ出力のバッファに書き込みます。delay()を入れずに繰り返して呼び出していますが、アンプ出力を見る限りではバッファがうまく丸く収めてくれているようです。

OLYMPUS DIGITAL CAMERA

マイクモジュールの配線
DA — IO18(1kΩでGNDに接続)
CK — IO23
LR — L:3.3V, R:GND
WS — IO19
V — 3.3V
G — GND

OLYMPUS DIGITAL CAMERA

アンプモジュールの配線
SCK — GND
BCK — IO16
DIN — IO21
LCK — IO17
GND — GND
VIN — 3.3V

OLYMPUS DIGITAL CAMERA

 

フルカラーウェルカムボードの製作

OLYMPUS DIGITAL CAMERA

壁時計に使っているESP32と32×8 LEDパネルのスケッチを書き換えてSendai Micro Maker Faire用のウェルカムボードを作りました。

使用部品と配線はESP32と32×8フルカラーLEDでデジタル壁時計をつくるを参照してください。
外装についてはデジタル壁時計の組み立てを参照してください。

英数字の5×8フォントを作って表示させたのが新しい点です。フォントデータが96行あるので見苦しいですが、それ以外はシンプルに書いたつもりです。左端から右端に向かってLEDの色が変化していくプログラムに、”フォントピクセルだけ表示する”という条件をつけています。

フォントデータはAppleⅡeの資料を見かけたのでデータ化してみました。

 

 

 

 

 

 

FPGAベースのArduino互換機”XLR8″のアナログ入力について

<XLR8について>
Alorium Technologyの”XLR8″(写真下)はIntel MAX10 FPGAにATmega328互換機能を書き込んだArduino UNO互換ボードです。ユーザーがFPGAのXcelerator Blocksというエリアに機能を追加することができます。FPGAプログラムはライブラリとして提供されているものを使うこともできますし、独自のプログラムを作成することもできるそうです。

OLYMPUS DIGITAL CAMERA

<購入先の例>
https://www.digikey.jp/product-detail/ja/alorium-technology-llc/XLR8R22M08V5U0DI/2003-1000-ND/9607423

<はじめに>
XLR8のアナログ入力は12ビットで、しかも10ビットのArduino UNOよりも高いサンプリングレートで使うことができるということなので興味を持ちました。また、Arduino UNOは高いサンプリングレートで使用した時に誤差が大きくなるということですので、サンプリングレートと同時に測定データの誤差を視覚的に把握したいと思いました。
https://www.aloriumtech.com/adc-12/

<調査方法>
アナログ入力で得られたデータをいったん配列(500要素)に保存して、データがすべて書き込まれた後でシリアル出力でPCに出力するスケッチを作成しました。受け取ったデータはArduino IDEのシリアルプロッタでグラフに表示させます。
アナログ信号としてはファンクションジェネレータの三角波を入力しました。三角波の周波数を調整してシリアルプロッタに表示されたデータが目視で1周期となる周波数を求め、概略のサンプリングレートの値を計算しました。

<分かったこと>
私なりの結論ですが、XLR8のアナログ入力はUNOに比べて分解能が4倍で、サンプリング周波数が3.7倍程度高く(最大250KHz)まで使えそうなので一考に値すると思います。

 

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

<具体的な調査方法>
Arduino UNOのアナログ電圧のサンプリングレートは、ADCクロックの分周比で設定できます。下記スケッチのADCSRAの下位3ビットに”001″から”111″を書き込みます。デフォルトの分周比は128(“111”)で9.6kHzのサンプリングレートです。分周比が小さいほどサンプリングレートが高くなりますが、誤差も大きくなるそうです。三角波を入力することで誤差の程度を視覚的に判断したいと思います。三角波はおよそ0-3Vです。

Arduinoのスケッチは要素数500個の配列に測定データを記憶させて、測定が終了してからシリアルプロッタでデータをグラフに表示することにしました。

XLR8のデフォルトの分解能は10ビットなのでライブラリ”XLR8ADC”を使ってsetup関数の中で12ビットに変更します。
スケッチの”XLR8ADC.begin();  XLR8ADC.set12bitMode();”が12ビットに変更している箇所です。その他はUNOで使っているスケッチと同じです。

<UNOの結果>
Arduino UNOのデフォルトの状態(分周比128)です。シリアルプロッタのグラフには500個のデータが表示されます。データを見ながら周波数を調整して、三角波の1周期が表示されるようにしたところ18Hzでした。18Hzの1周期は55.5msecで、500データありますから、0.111msec間隔となり、サンプリング周波数は9kHzぐらいと見ることができます。グラフのピーク値は1024*3/5=614あたりになっています。

16分周

8分周から波形にギザギザが少し見え始めました。

4分周で誤差が目立ち始めました。

2分周はどこが1周期なのか判別ができません。
ということで、Arduino UNOでサンプリングレートを上げたい場合は16分周ぐらいを使うようです。

128分周—–18Hz–サンプリング周波数9KHz
64———測定せず
32———測定せず
16———133Hz–サンプリング周波数66.5KHz
8———-236Hz–サンプリング周波数118KHz
4———-385Hz–サンプリング周波数192.5KHz
2———-1周期の判断できず

<XLR8の結果>
XLR8の128分周のグラフです。18Hz、0-3Vの信号ですが、12bitなので縦軸が4096*3/5=2458付近の大きな数値になっています。

128分周—–18Hz–サンプリング周波数9KHz
64———測定せず
32———測定せず
16———133Hz–サンプリング周波数66.5KHz
8———-236Hz–サンプリング周波数118KHz
4———-385Hz–サンプリング周波数192.5KHz
2———-400Hz–サンプリング周波数200KHz

FPGAで忠実にATmega328互換の動作をしているようで、サンプリングレートは同じですが、ADCがMAX10のものなので分周比2でも綺麗な波形です。

4.8KHzの信号を入れてみても大丈夫そうです。

<XLR8倍速モードの結果>
さて、XLR8は倍速モードも持っていて、FPGAを書き換えることで16MHZのATmega328から32MHZのATmega328になります。

128分周—–36Hz–サンプリング周波数18KHz
64———測定せず
32———測定せず
16———267Hz–サンプリング周波数133.5KHz
8———-464Hz–サンプリング周波数232KHz
4———-500Hz–サンプリング周波数250KHz
2———-500Hz–サンプリング周波数250KHz

サンプリング周波数は250KHzで頭打ちですが、2分周のグラフも特に変ではありません。

<結果のまとめ>
XLR8のアナログ入力はUNOに比べて分解能が4倍で、サンプリング周波数が3.7倍程度高くまで使えそうなので一考に値すると思います。

デジタル壁時計の組み立て

前回の記事「ESP32と32×8フルカラーLEDでデジタル壁時計をつくる」では配線とプログラムについて説明しました。

ここではESP32とLEDマトリックスをケースに収めて和室の長押(なげし)の上に取り付けた例を紹介します。長押の隙間にACアダプター入れてESP32のUSBに給電しています。

OLYMPUS DIGITAL CAMERA

ケースは2mm厚のボール紙をレーザーカッターで加工して、5枚重ねの中にESP32とLEDマトリックスを埋め込みました。LEDとの配線はESP32に直接ハンダ付けをして最小限の高さにしています。

ESP32をはめ込む場所の周囲は熱を分散させる目的でアルミテープを貼っています(この写真撮影の後でWiFiアンテナの近傍はまずいだろうということでアンテナ付近のアルミテープを除去しました)

LED組み込みフレームの前面にはLED光を拡散させるために和紙を糊付けしました。チューブの先にスポンジキャップが付いた糊で手軽に塗ったらムラになってしまいました。ムラは使っている時にはまったく目立たないので良しとしました。ESP32組み込みフレームを白のマスキングテープで固定して完成です。

OLYMPUS DIGITAL CAMERA

プログラムは少し変更しました。分単位で時刻表示が変わりますので、切り変わる10秒前になると色相が左から右に変化します。0秒になった時にその時点の色で時刻を表示します。表示のためのループを高速で回すために1秒ごとの時刻更新はタイマー機能を使うことにしました。
また、寝ている時にはまぶしくないように23時から6時までは表示を暗くしています。

 

 

 

 

ESP32と32×8フルカラーLEDでデジタル壁時計をつくる

「夜中に目が覚めた時、もう一寝入りするか、そろそろ起きるか、知りたくなりますね。身動きせずにねぼけた目を開けるだけで時刻がわかる大きなデジタル時計が欲しいと思いました。日中は明るくカラフルで楽しい表示でも、暗くなったらまぶしくない明るさで落ち着いた色で表示してくれる時計があったらいいですね。」

2年前に作った「手作りの大型7セグメントフルカラー表示器を使った置き時計」はその後もブレッドボードのまま動作を続けています。壁に掛けられるようにリメークしようかと思いましたが、大きなサイズのフルカラーLEDマトリックスが3699円で売っていたので、これを使った方が楽にできると思って新しく作ることにしました。

OLYMPUS DIGITAL CAMERA

構成
(1) ESP32でWiFi LANに接続し、NTPで時刻を定期的に取得する。
(2) ESP32でTimeライブラリを使い、NTP時刻で定期的に校正しながら1秒ごとに時刻を得る。
(3) ESP32でFastLEDライブラリを使い、32×8 LEDマトリックスを制御する。
(4) 時刻表示用数字フォントはComic San MS Bold Italic 96pointをベースにして8×7のグレースケールフォントを自作する。

部品リスト
(1) ESP32(MH-ET LIVE ESP32 MiniKit):AliExpressで$6ぐらいで購入できます。
(2) フルカラーLEDマトリックス(32×8 10mmピッチ):Quimat Arduino用RGB LED パネル…..

配線
ESP32 MiniKit-J2-6pin(5V) —– LED Matrix 5V
ESP32 MiniKit-J2-8pin(GND) —– LED Matrix GND
ESP32 MiniKit-J2-10pin(IO16) —– LED Matrix Din

OLYMPUS DIGITAL CAMERA

Arduino IDEへの追加
ESP32ボードの追加 「Arduinoで遊ぶページ」などを調べてください。
FastLEDライブラリの追加 「ArduinoでNeopixel操作」などを調べてください。

Arduinoプログラム
青色で1秒ごとに時刻を表示するプログラムです。
– NTPサーバーに300秒ごとにアクセスしますが、loop()関数の if(SecCount>=xxxx)で自由に変更してください。
– FastLEDライブラリは高度な色指定ができますので自由に改造してください。
– フォントデータは、3次元配列 NumFont[10][FontHeight][FontWidth]です。好きなフォントに改造してください。

 

OLYMPUS DIGITAL CAMERA

WiFi LANでのESP32環境センサーノードとESP32データロガー

ESP32 environment sensor node and data logger on WiFi LAN

Overview
In order to investigate the temperature distribution in the indoor space, we created a system that records data from multiple environmental sensor nodes wirelessly to a data logger. The environmental sensor node performs intermittent operation by connecting the BME280 environmental sensor to the ESP32 as a battery drive to facilitate installation. The data logger connects the real-time clock and SD card to the ESP 32 and records the received time and data in a file for each sender. Assign a fixed IP address with the ESP32 MAC address using a dedicated WiFi router. Data is sent from the environmental sensor node to the data logger’s IP address using UDP, and the data logger learns the environmental sensor node number from the sender IP address.

概要
屋内空間の温度分布を調べるために、複数の環境センサーノードから無線でデータロガーに記録するシステムを作りました。環境センサーノードは設置を容易にするために電池駆動としてESP32にBME280環境センサーを接続して、電池の交換頻度を減らすために間欠動作を行います。データロガーはESP32にリアルタイムクロックとSDカードを接続して、受け取った時刻とデータを送信元ごとのファイルに記録します。専用のWiFi ルーターを使って使用するESP32のMACアドレスで固定IPアドレスを割り当てます。環境センサーノードからデータロガーのIPアドレスに向けてUDPでデータを送り、データロガーは送信元IPアドレスから環境センサーノードの番号を知ります。

使用した機材

ESP32: MH-ET LIVE ESP-32 Mini kit

10ピン4列のピンソケットには分割ロングピンソケット 1x42 [FHU-1x42SG] (秋月電子通商)を使用しました。
http://mh.nodebb.com/topic/5/mh-et-live-esp-32-devkit-mini-kit-user-guide-updating

環境センサー: BME280 GYBMEP

ライブラリ:BlueDot BME280 Library

BME280 : ESP32
VIN           : 3.3V
GND         :GND
SCL           :IO22
SDA          :IO21

マイクロSDモジュール:

ライブラリ: ESP32標準 SD(esp32)

配線
SD             : ESP32
CS             : IO5
SCK          : IO18
MOSI       : IO23
MISO       : IO19
VCC          : VCC
GND         : GND

リアルタイムクロック: DS3231 ZS-042モジュール


充電できないCR2032を使用するため充電用パターンをカットしました。

ライブラリ:DS3231FS

配線
DS3231      : ESP32
32K             : NC
SQW           : NC
SCL             : IO22
SDA            : IO21
VCC            : VCC
GND          : GND

無線LANポータブルルーター: エレコムWRH-300BK3-S

ESP32のMACアドレスを調べて、MACアドレスとIPアドレスを紐付けにします。SSIDのスティルス機能を使い、登録されたMACアドレス以外は接続を拒否しています。

電池ケース: マルツGB-BHS-3X4C-LW(単3×4本 スイッチ・フタ・リード線付き)
ESP32のVDDに+6V、ESP32のGNDに0Vを接続します。

 

動作の安定性について
ESP32環境センサーノードは送信時に毎回起動するような動作のため安定して動作します。ESP32データロガーは連続動作のためWiFi LANへの接続不良の場合やSDへの記録が正常に行えない場合はESP32をリスタートすることにしました。

 

ESP32環境センサーノードのスケッチ

 

 

ESP32データロガーのスケッチ

 

 

 

メイカーフェア東京2018

メイカーフェア東京2018に出展します。
木目のパズル「プログラミングとレーザーカッターの素敵な関係」というタイトルで「チームいわて」のメンバーとして参加します。
ブースはC/02-02です。
「LabVIEW Home版をメイカーな人たちに広めよう」ということで、FM音源モジュールを接続したArduinoに、LabVIEWから音源パラメータを送り込むプログラムをデモします。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

タッチディスプレイでLabVIEWのUIをクリックすると、
パラメータがArduinoに送られて、音源モジュールのレジスタが書き換えられ、
音源もジュールからPCのマイク端子に音声信号が送られ、
LabVIEWで信号を受け取って波形とパワースペクトルが表示され、
PCのイヤホン端子から外部スピーカーで音が出る、
というものです。

今回のデモ用にたまたまHPの安いノートPCを購入したのですが、タッチディスプレイの便利さを実感しました。
ブースレイアウトを確認してパッキングしました。

OLYMPUS DIGITAL CAMERA

(180803)

ESP32でYMF825音源のデモ(音色データ、音階、和音)

ヤマハのFM音源YMF825をArduino UNOで制御できましたので、ESP32に移植しました。
ESP32で使うと何がうれしいか !! —- >> タッチセンサーとBLEが使えます。

Arduino UNOの例は下記の記事を参照してください。
http://keisoku-lab.mond.jp/2018/02/09/ヤマハfm音源lsi-ymf825搭載モジュールのデモプログラム/

ESP32は3.3V系ですから、5V系のUNOで使っていたYMF825モジュールを接続するのはちょっと注意が必要です。ウダ電子の公式ページでは5Vと3.3V電源を接続し、抵抗を外し、ハンダを盛ってジャンパーする旨書かれています。3.3V単独電源になるなら頑張れますが、5Vも供給しなければいけないのは面倒ですから、YMF825モジュールは5Vのままで、SPIの信号を調整する方向で考えます。信号線はSCK, MISO, MOSI, SSとリセット信号の5本です。ESP32から出力する信号は3.3VなのでそのままでもYMF825に伝わりますので気にしないことにします。ESP32に5V信号が入ってくると壊れてしまいますが、入力はMISOだけです。MISOはレジスタの値を読み取る時に使われますが、読まないと決めればつなぐ必要がないことに気がつきました。SPIライブラリの中ではMISOも指定しないとエラーになりますのでMISOも割り当てますが、配線はしません。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

但し、後日何か問題が起こった時に配線チェックをして、抜けている線を発見すると反射的に結線してしまう可能性がありますので注意が必要です。何気なくMISOを結線するとESP32を壊してしまいます。Vfが2VぐらいのLEDの+側をYMF825のMISO、-側をESP32のMISO入力端子に接続しておけば、思い出すきっかけにもなりますし、破壊する心配も無くなります。

ESP32のSPIでYMF825を使う方法は
ywabikoさんの記事がたいへん参考になりました。

YMF825モジュール <<—->> ESP32
RST_N <<—->> IO32
5V <<—->> USB 5V
GND <<—->> USB GNDとESP32 GND
SCK <<—->> IO18
MISO <<—->> 接続しない (IO19)
MOSI <<—->> IO23
SS <<—->> IO5

(180213)