LabVIEWで画像処理、便利?

LabVIEWで画像処理するのは便利ですかと聞かれたのでデモプログラムを作成しました。NI Visionは所有していないので無料評価版を使いましたが、あと数日で期限が切れるので、期限があるうちにアップロードすることにしました。

「ビー玉を並べる作業のAVIファイルを開いてビー玉の個数と位置を表示するNI Visionのデモプログラム」

AVIファイルのフレーム取得、斜めから撮影した画像の台形補正、差分画像の生成、登録画像の検出などが使われています。

作業者が盤の上にビー玉を4個順番に置く作業をしています。作業をビデオに録画してビー玉を置いた場所や置いた順番を自動的にチェックするプログラムです。デモプログラムはAVIファイルに記録されている作業を順次再生しながらビー玉を検知して位置と個数を表示します。デモプログラムでは判定は行いません。

ファイルはNIのCommunity「北東北LabVIEWユーザー会」からダウンロードしてください。

LabVIEW2017の”評価版”で作ったものですが、LabVIEW2009版にバージョンダウンしたものもアップしています。Visionを持っていない方は最新の評価版で試してみてください。

AVIで保存するプログラムとAVIファイルのフレームをjpgで保存するプログラムもアップしています。

木目のパズル「プログラミングとレーザーカッターの素敵な関係」

Wood grain puzzle “Lovely relationship between Processing programming and laser cutter”

この記事はMFT2018 (Maker Faire Tokyo 2018 )エントリーシートの予稿です。

出展者のプロフィール
レーザー加工といえばイラストレーターで図案を描いてMDFを切り抜くものという風潮に抗って、Processingプログラムでパズル図案を描いて、地元の木材をレーザーカッターで切り抜いて木目のパズルを作っています。本業は計測の自動化と解析処理用のLabVIEWプログラムを提供していますので、LabVIEWホーム版を使ったArduino+FM音源YMF825の音作りツールも紹介する予定です。

出展内容
プログラムで描いた画像をレーザー光線がたどって切り取ってくれる。画面の中の五角形が厚みを持った五角形の木片になる。ジグソーパズルの無限の組み合わせをプログラムで描いて、地元の木材でパズルを作ってみよう。絵はいらない、木目が元の場所を教えてくれるから。久慈の南部アカマツ、遠野の桜、浄法寺のウルシ、木目は木の物語。プログラミングとレーザーカッターの素敵な関係を提案します。木目のパズルを見に来てね。

ジグソーパズルの製作
(1)Processingでピースの形状をランダムに作画します。
(2)レーザーカッターで切断します。
(3)パズルの完成です。
(4)画面の図形が厚みを持ってさわれる!!!

デモビデオ「プログラミングとレーザーカッターの素敵な関係」
https://www.facebook.com/koji.ohashi.12/videos/1696150310460940/

五角形のパズル

OLYMPUS DIGITAL CAMERA

Processingでレーザー加工用図形をプログラムしよう!!

Processingって何?

たくさんあるプログラムツールの中でProcessingを選ぶ理由は四つ。
(1) オープンソースなので無料で使うことができる。
(2)図形をPDFで出力できる。
(3)グラフィック関連の関数が一通り揃っている。
(4)プログラムサンプルが豊富で使いやすい。

 

タングラムという古典的な図形パズルを例にプログラム方法を紹介します。

タングラムって何?

プログラムで作成するタングラムの図案。
図案が少し違いますが、タングラムを切断加工している様子です。
プログラムサンプル

processingでのプログラムはディスプレイに表示することを主眼に作られているのでピクセルが基本単位です。72ピクセルが1インチ(25.4mm)ですから、1mmは72/25.4ピクセルとなります。長さ100mmは100*72/25.4ピクセルとなります。つまり、欲しい寸法(mm)とプログラムで使うピクセルの変換は72/25.4を掛ければ良いだけです。

また、ドキュメントサイズを変数で指定することとPDFライブラリを使用していることに注目してください。

 

 

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)