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)

 

ESP32(MH-ET LIVE ESP32 MiniKIT)のタッチセンサー

ESP32には10本ものタッチセンサーがあります。しかも、インタラプト関数が用意されているので便利に使えそうです。

OLYMPUS DIGITAL CAMERA

ESP32の安価でコンパクトなボードを購入したので試しに使ってみようと思います。特にアフィリエイトが得られるわけではありませんが、購入先は下記URLです。

https://ja.aliexpress.com/item/MH-ET-LIVE-D1-mini-ESP32-ESP-32-WiFi-Bluetooth-Internet-of-Things-development-board-based/32816658883.html?spm=a2g0s.9042311.0.0.u50SMy

このボードはLチカ用LEDが付いているのが原因だと思いますが、T2は使えません。また、T8とT9が入れ替わっているようです。

T0–IO04
T1–IO0
T3–TDO
T4–TCK
T5–TDI
T6–TMS
T7–IO27
T8–IO32
T9–IO33

フラットケーブルを使ったら60ぐらいあったタッチセンサーの出力が20ぐらいまで低下して、検知できるギリギリですがなんとか使えています。

(18.02.11)

 

ヤマハFM音源LSI YMF825搭載モジュールのデモプログラム

Arduino UNO互換機でYMF825を動作させてみました。

複数の音色パラメータから音色データを生成して、西洋音階で和音を鳴らします。ヘッドフォンアンプが付いていますが、スピーカーにつないでいます。

購入先はスイッチサイエンスです。
https://www.switch-science.com/catalog/3399/

OLYMPUS DIGITAL CAMERA

音の雰囲気が伝わるように動画を作りました。
https://www.facebook.com/koji.ohashi.12/videos/1635981226477849/

音色パラメータが4種類入っているのでプログラムが長くなっていますが、実際に使えるものを作ろうとするとこのぐらいの機能は必要になるのでまとめてみました。

lineNo.304-307にバグがありましたので修正しました。(180213)

(18.02.09)

参考にさせてもらったサイト

https://kanpapa.com/today/2017/08/ymf825-fm-board.html

https://sites.google.com/site/himagine201206/home/arduino/ymf825/030

 

NeoPixelのDemo

ArduinoのNeoPixelライブラリのサンプルは参考になりますが、盛りだくさん過ぎて分かりにくい印象があります。

OLYMPUS DIGITAL CAMERA

シンプルでカラフルに書いてみました。

ついでに、「グルグル巻けば円筒ディスプレイ」用のDemoプログラムも紹介します。10mmピッチのLEDを200個φ60mm(よりも少し太い)のボトルに巻きつけました。一周21個で縦に9個の(狙いは20個✖️10個でしたが、)円筒ディスプレイです。

 

ESP32のArduino IDEでBLEを試してみました

ESP32はWiFiに加えてBLEも使えるということで注目されています。Arduino IDEでは、2017年の10月頃からBLEがサポートされ始めました。

ボードも入手しやすくなってMH-ET LIVE D1 mini ESP32という小型のボードは$7.5ぐらいでAliExpressで購入できました。

https://ja.aliexpress.com/item/MH-ET-LIVE-D1-mini-ESP32-ESP-32-WiFi-Bluetooth-Internet-of-Things-development-board-based/32816658883.html?spm=a2g0s.9042311.0.0.Zbsxqj

今回はそのESP32を2個使って、サーバーとクライアントで動作させてみました。どちらもArduino IDEでプログラミングできるので楽なのではないかと思います。サーバーには照度センサーNJL7502Lがあり、クライアントが接続すると照度のデータを送ります。クライアントが接続している間はゆらゆら人形が揺れます。クライアントはデータをもらってシリアルでPCにデータを表示します。

電気回路:
3.3Vを照度センサの+側(長い足)、照度センサの-側(短い足)は10kΩでGNDに接続して、短い足の電圧をアナログ入力AI6(IO34)に接続します。データシートを見ると1000luxで3Vの出力になるようです。ゆらゆら人形はIO5とGNDに接続します。ゆらゆら人形はDaisoのソーラーゆらゆらを改造して、コイル両端を回路から外して外部に取り出します。
クライアント側はUSBでPCに接続します。

BLEライブラリの導入には以下のURLの情報を参考にしました。
「Arduino IDEでESP32 BLEライブラリを導入」
https://qiita.com/tomorrow56/items/afa06e206eec9fafcc7a

 

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

BLEライブラリはArduinoっぽくないので、「山勘で書いて、動いた」というレベルですのでもっと良いサンプルを誰かが書いてくれると思います。現状で分かっている問題点としては、サーバーが電源OFFで停止するとクライアントがハングアップして、クライアントの電源をOFF-ONしないと復帰しない点です。

 

サーバー側のスケッチ(ベースにしたのはBLE_notify)

 

クライアント側のスケッチ(ベースにしたのはBLE_client)

 

LabVIEWでミニCNCフライスを制御して測定治具にする方法

部品の検査で複数箇所の寸法を測定するときに、3軸ステージにセンサーを載せてセンサーを移動させて測定する場合がよくあります。安価なCNCフライス組み立てキット(送料込みで$220)を見ていると、まさに3軸ステージです。測定をLabVIEWで行うとするとCNCフライスもLabVIEWで制御した方が治具としては効率的に運用できるはずです。

OLYMPUS DIGITAL CAMERA

このCNCフライスはGrblという制御用ファームウェアでG-codeを受けてステッピングモーターのパルスと主軸用PWMを生成しています。そしてGrblはAtmega328pチップを使用するArduinoボードに書き込めるオープンソースのファームウェアなのです。CNCキットを使わない場合でも、パルスモーターを使った計測治具をArduinoとGrblを使ってLabVIEWで制御したら簡単で便利です。

さて、G-codeは3軸から6軸のCNC工作機械に使用される数値制御用プログラム言語です。NISTのG-code標準書「The NIST RS274NGC Interpreter」はありますが、メーカー毎の独自規格が用いられているようです。Grblの開発は「LinuxCNC」を参考に進められているとのことですから、Grblで使用するG-codeについてはGrblの資料とLinuxCNCがレファレンスになります。

G-codeはコマンドとパラメータを行単位で記述して機械の動作を指示します。
例えば、「G1 X30.0 Y10.0 F250」は、250という速度(F250)で、XY座標の(30.0, 10.0)まで直線的に移動(G1)するという指示です。mmやinchなどの単位系の指定や絶対座標あるいは相対座標などの座標系の選択は事前に指示されているものが使われます。

G-codeプログラムは、一連の動作をG-codeで記述したものをテキストファイルで保存します。PCからG-codeプログラムをGrblなどのファームウェアに送るアプリケーションをG-code Senderといいます。Grblで使えるG-code Senderとしては[bCNC]や[Universal G-code Sender]など多くの種類があります。フライスの軌跡表示、ボタンによるマニュアル移動、先読みバッファへの効率的なコマンド発信など機能が充実しています。LabVIEWでG-code Senderを作成する意味合いは、G-codeとGrblを使った簡便で安価な位置制御と計測とを統合することにあります。

生産者・消費者デザインパターンで、UIイベントループ、G-code送信&レスポンス受信ループを作成し、さらに測定ルーチン用にループを追加しました。G-codeではカッコ内はコメントとして受け取られるので、UIイベントループから”(measure)”を送信することで測定用のキューを生成し、測定ループの動作タイミングを作り出しています。

測定のための動作例を紹介します。ワーク座標の原点(0,0,0)に移動し、3秒待機した後、250の速度で(20,20,0)に直線補完で移動します。0.5秒待機し、(Measure)というコメントを受けます。LabVIEWプログラムでは(Measure)をトリガーにして測定を行います。測定に要する3秒待機した後、原点に戻ります。

 

GrblはAtmega328pチップを使用するArduinoボード(Uno, Duemilanove, Nano, Micro, etc)で動作します。ArduinoのSketchではありませんが、ブートローダ領域を残したまま書き込むことができるとのことです。GitHub-gnea/grblからZipファイルをダウンロードしてArduino IDEにライブラリとして追加します。サンプルフォルダにある「grblUpload.ino」を開いて「マイコンボードに書き込む」ボタンを押すと書き込まれてGrblが動き出します。

UNOの場合のピン配置は次のようになっています。
D2/D5:X軸Step Pulse / X軸Direction
D3/D6:Y軸Step Pulse / Y軸Direction
D4/D7:Z軸Step Pulse / Z軸Direction
D8:Stepper Enable/Disable
D9:X軸Limit SW
D10:Y軸Limit SW
D11:主軸PWM
D12:Z軸Limit SW
D13:主軸回転Direction

A0:Reset/Abort (DI Pullup)
A1:Feed hold (DI Pullup)
A2:Cycle Start/Resume (DI Pullup)
A3:Coolant Enable
A4:(NotUsed/Reserved)
A5:Probe

AVRチップの優れた機能を駆使して精密なタイミングと非同期の動作を実現し、30kHzまでジッターなしで制御できているとのことです。

Grblではパルスモーターなどハードウェアに関連するパラメータを$xxx変数としてEEPROM領域に記憶します。実際にX軸のStep Pulse(D2)の出力をオシロスコープで測定してみました。

パルス幅($0): 10μsec
step/mm($100): 250steps/mm
F(Feed Rate): 500mm/min
等速移動の周波数: 2.1kHz

パルス幅($0): 10μsec
step/mm($100): 250steps/mm
F(Feed Rate): 10000mm/min
等速移動の周波数: 41.5kHz

 

lv-G-SenderはLabVIEW2014以降で動作します。ダウンロードはここから。CNCが手元に無くとも、Arduino UNOと2相4線のパルスモーターとPulse/Direction入力のドライバーがあれば楽しむことができるのではないかと思います。

上記内容は10月25日のNIDays2017の会場の片隅で行われるユーザー会で紹介する予定です。

<<コメントはスパムがひどいため受け付けないようにしています。トップ画面の下の方に連絡先のメールアドレスがありますのでご連絡ください。スパムでなければメールは大歓迎です。>>

(2017.10.11)

赤外線温度計を作ろう

赤外線温度センサーがちょっと遊んでみようか、というレベルの値段になっているので講習会で使ってみました。

GY-906というモジュールでMelexis MLX90614という赤外線センサーが使われています。Web上の情報ではESFBAAというタイプのようですがGY-906の回路図が見つかりませんでしたので正しいかどうかはわかりません。Melexisからデータシートが公開されているので、ESFBAAが正しいとするとOperating Temperature Rangeは-40℃から85℃で、TO-39型ケース、3V動作(モジュール内で5V→3V変換)、シングルゾーン(視野が単一)、標準パッケージ(視野角90°)ということです。測定できる温度は-70℃から+380℃です。

Amazonでは HiLetgoで670円でした。

https://www.amazon.co.jp/gp/product/B071VF2RWM/ref=od_aui_detailpages00?ie=UTF8&psc=1

AliexpressではMT Technology Co., Ltd.でさらにいくらか安い$4.05でした。

https://ja.aliexpress.com/item/Free-Shipping-GY-906-MLX90614ESF-New-MLX90614-Contactless-Temperature-Sensor-Module-For-Arduino-Compatible/32465344732.html?spm=a2g0s.9042311.0.0.aeFeEN

I2Cですのでライブラリを追加して配線4本でOKです。UNOでは(Nanoでも同じですが、)SDAをA4、SCLをA5に接続します。

表示器も欲しいということになって、I2CのOLED Display Module 128X64も接続しました。これもAmazonの HiLetgoで420円でした。
https://www.amazon.co.jp/gp/product/B071ZPFDWW/ref=od_aui_detailpages00?ie=UTF8&psc=1

AliexpressではHwa Yeh Tech CO.,LTDでいくらか安い$3.00でした。表示器のライブラリはAdafruit_SSD1306を使用しました。ディスプレイへの表示用ライブラリAdafruit_GFXも合わせてインストールします。Adafruit_SSD1306を使う時には使用しているディスプレイの解像度に合わせてAdafruit_SSD1306.hのコメントアウトの行を変更する必要があります。行番号72からの数行を抜き出しましたが、下記が変更後です。

 

講習会ではArduino Nano互換機を使いましたが、この記事を書いている今は手元にあったUno互換機を使っています。

 

この記事を書きながらセンサーの資料を見返していたら、放射率の補正が間違っていたことが分かりました。下のスケッチは訂正済みです。

赤外線温度センサーMelexis MLX90614は5.5μmから14μmの波長域の赤外線を受光して、赤外線で加熱された受光面の温度を多数の熱電対で測定して赤外線の量を求めているようです。赤外線を放出している物体は黒体(放射率=1.0)と仮定して、センサーの温度測定値も用いて、測定対象の温度を推定しています。実際は物体の表面によって放射率は異なり(1よりも小さくなる)、放射率の低い金属表面を測定した場合は黒体に比べて赤外線の放出量が少ないので測定結果は実際の表面温度よりも低い値を出力します。

MLX90614に内蔵されたEEPROMに測定対象の放射率を書き込んで補正した結果を出力するように設定することができます。しかしながらライブラリでは対応していないことと、書き込むためには通信エラー検出用のPEC値も書き込む必要があり、かなり面倒みたいなので、Arduinoのプログラムで補正をすることにしました。放射率E(0~1.0)と、センサー温度(K) Tsnr、測定対象の温度(K) Tact、赤外線量から推定した温度(K) Tmeasの関係式がMelexis社の資料に書かれています。

https://www.melexis.com/en/documents/documentation/application-notes/application-note-mlx90614-changing-emissivity-setting

放射率が分かっていればこの関係式を使って測定対象の温度に変換することができます。

実際の表面の放射率は分からないことが多いので、熱電対等で実測して赤外線センサーでの測定値がその値を示すように放射率で調整する使い方になるようです。

 

2017.08.15

手作りの大型7セグメントフルカラー表示器(デモ版)

メイカーフェア東京2017では、LEDの点滅状態がわかりやすいように、加工前のシリアルLEDと2個ずつセグメント状態に配置した表示器を並べて展示しました。

表示器で数値をカウントアップ、カウントダウンするだけなので、プログラムがシンプルで分かりやすいと思います。下の写真が全体の画像です。左端に14個のLEDが並んだシリアルLED、右下が1セグメントに2個のLEDを配置した7セグメント表示器、右上がプリント基板です。どちらのLEDもNanoの5V、GND、D7に接続しました。

LEDは次の写真のように0から13までの順番でつながっています。

 

OLYMPUS DIGITAL CAMERA

プリント基板のパターンは、右端中央から信号が入り、左端中央から次の桁に信号を伝えるように考えました。基板の面積を最小限にできるようにナルト模様のようにしました。基板を近づけて配置するときに有効な方法だと思います。基板は木工CNCで切削してパターンを作成しました。バリがあると指に刺さったり、短絡してしまったりするので、ヤスリで削ってあります。

OLYMPUS DIGITAL CAMERA

左側の14個の切断していないLEDと7セグメント表示器の14個のLEDは、電気的には全く同じように直列に14個接続されたもので、Nanoの同じ端子に接続されています。

OLYMPUS DIGITAL CAMERA

全て点灯させると以下のように光ります。写真では色がわかりにくいですが、2個のシリアルLEDはNanoに近い方から末端まで同じ色に光っています。

OLYMPUS DIGITAL CAMERA

数字の4はこのように点灯します。

OLYMPUS DIGITAL CAMERA

ソフトウェア

seg[0]からseg[6]までの配列でセグメント0からセグメント6に対応させて、表示する数値によってセグメントを点灯するときはHIGH、消灯するときはLOWにします。具体的にはSeven_seg_Mask(int i)関数で、seg[0]からseg[6]まで設定します。rainbowCycle_Mask(uint8_t wait)関数はサンプルプログラムのrainbowCycle(uint8_t wait)関数をベースにseg[0]からseg[6]までのHIGH/LOWでHIGHの場合だけ点灯するように改造しました。ここで、セグメントに2個LEDを配していることに注意して、i番目のLEDのHIGH/LOWはseg[i/2]で表わしました。

rainbowCycle関数を使った色の設定と、セグメントHIGH/LOWを掛け合わせることで簡単にカラフルな数値表示を実現しています。

(2017.08.10)

Maker Faire Tokyo 2017 お立ち寄り御礼 (Thank you for coming)

180cmのテーブルいっぱいに「手作りの大型7セグメントフルカラー表示器を使った置き時計」、オガールラボでの電子工作講習会の作品紹介、キッチンスケールをハックしてArduinoとLabVIEW Home版を連携させたリアルタイム重量計測のデモを展示しました。大勢の方々に興味を持って話を聞いていただきました。ありがとうございました。

展示を見て7セグメントフルカラー表示器を作ろうと思ってくださった方が多かったと感じましたので、これまでの記事を整理して電子工作に慣れていない方でも取り組みやすいような構成でまとめたいと考えています。

オガールでの電子工作講習会に興味を持っていただいた方も多くいらっしゃいました。講習会のテキストなどダウンロードできるよう関係者と調整したいと思います。

LabVIEW Home版についても多くの方に興味を持って聞いていただきました。デモで使用したArduinoのシリアル出力を受け取るプログラムについて記事を書きたいと思っています。

Maker Faire Tokyoに海外からこられた方々にも大勢立ち寄っていただきました。ありがとうございます。現物があり、同じ興味を持っている方々でしたから、なんとか内容を伝えることができたのではないかと思います。ほぼ同じ構成で時計を作ったばかりだという方もいて、Web上では何人かの方がシリアルLEDで大型表示器を作られていることは把握していましたが、直接会話ができてとても楽しく感じられました。

At my booth I did the following three types of exhibits at 180 cm wide tables.
(1) Clock using a handmade large 7-segment full color display
(2) Works of electronic work seminar at OGAL Lab
(3) Real time weight measurement created with Arduino and LabVIEW Home version by hacking the kitchen scale
Thank you for seeing a lot of people interested.

I felt that there were more people who thought about making a 7-segment full color display by looking at the exhibition. I plan to write a new article so that even those who are not familiar with electronic work can easily deal with it.

Many people were interested in electronic workshops at OGAL Lab. I would like to be able to download the materials of the course.

Many people were also interested in LabVIEW Home edition. I’d like to write an article about the program that receives the Arduino serial output used in the demo.

People from overseas also came. Thank you very much. I think that I was able to communicate the contents somehow because it was people who have the same interest in front of the work. I was able to talk with someone who was just about making the clock with almost the same composition and felt it was fun.

 

キッチンスケールをHackして デジタル出力の秤を作ろう

MFT2017でデモしたLabVIEWプログラムやスケッチは以下のURLからダウンロードできます。

北東北LabVIEWユーザー会
https://forums.ni.com/t5/北東北-LabVIEWユーザー会/メイカーフェア東京2017でのLabVIEW-Home版のデモの紹介/gpm-p/3674153

 

測定結果が保存できる秤が欲しかったので、市販のキッチンスケールのセンサー(ロードセル)と筐体を利用して作成しました。
シリアル通信で測定結果をPCに伝えますが、PC側のソフトウェアとしてLabVIEW Home Editionを使うとメーターやグラフやデータ保存などのプログラムが簡単なので紹介します。

ロードセル用アンプHX711は小型でデジタルインターフェースなのでロードセルの直近に配置できます。Amzonで150円ぐらいで購入できます。ライブラリも幾つか提供されていますが、スケッチのコメントに書いたライブラリを使いました。

Macで使っていてノイズが少なくて安定していたのですが、Windows PCに置き換えたところノイズが目立ちました。Windows PCではUSBから取っているNanoの5Vがやや高めになっているのが気になって、HX711を3.3V駆動に変えたらOKになりました。

Arduino用スケッチ

 

NI LabVIEW Home Editionは秋月で購入できるようになりました。

LabVIEWプログラム

Maker Faire Tokyo 2017に持っていきます。