2019年04月13日

Node-Red Dashboardテンプレート

今回はNode-Red Dashboardテンプレートの使用方法について紹介します。


Node-Red Dashboardテンプレートを使用すると標準で用意されているUIよりもリッチで多彩なUIを実現することができます。
テンプレートはAngularJSベースで実装されているため、Angularのスクリプトやhtml記述を利用することができます。
Node-Red上でmsg.payloadの値を受けて表示を変えたり、ボタンを押してmsg.payloadへ値を渡すこともできます。



■要素紹介
・ボタン

ui5-4.jpg

<md-button ng-click="send({payload: {index_name:model_name}})" layout-align="start center" >
登録
</md-button>

model_nameには送りたい情報のモデルを入れて使用する

・トグルボタン
ui5-5.jpg
<md-switch ng-model="model_enable" ng-change="send({payload: {enable:model_enable}})" layout-align="start center" >
トグルボタン1
</md-switch >

ng-changeを指定することでボタン操作でmsg.payloadに情報が渡される

・数字入力

ui5-2.jpg

<input type="number" ng-model="model_id" />


・テキスト入力

ui5-3.jpg

<input type="text" ng-model="model_name" />

・日付選択

ui5-1.jpg

<input type="date" ng-model="mydate" ng-change="send({payload: mydate})">


■msg.payload受け取り方


ui1-2.jpg


・手前のfunctionノード
var nowDate=new Date();
msg.payload=nowDate.toLocaleString("ja-JP",{hour12:false});
return msg;

・テンプレートノード
<div>
更新日時:{{msg.payload}}
</div>

ui1-1.jpg

timestampボタンを押すと更新日時が表示されます。

■mas.payload送り方

ui2-3.jpg

・テンプレートノード
<body>
 <input type="number" ng-model="model_id" />
 <input type="text" ng-model="model_name" />
 <md-button ng-click="send({payload: {index_id:model_id, index_name: model_name}})" layout-align="start center" >
 登録
 </md-button>
</body>

ui2-1.jpg


ui2-2.jpg

登録ボタンの際に、数字入力と文字入力のモデルから情報を受け取ってpayloadに格納しています。


■応用編
・表に要素を並べる例

ui3-2.jpg


・手前のfunctionノード
var source_array = new Array();
source_array.push({ enable:true, id:1, name:"Name1"});
source_array.push({ enable:false, id:2, name:"Name2"});
msg.payload = source_array;
return msg;


・テンプレートノード
<table id="table" border="1" align="center">
 <tr>
  <th>無効/有効</th>
  <th>番号</th>
  <th>名</th>
  <th>テキスト</th>
  <td align="center" colspan="2">
   ボタン
  </td>
 </tr>
<tbody>
 <tr ng-repeat="row in msg.payload" align="center">
 <td align="center">
 <md-switch tr ng-model="row.enable" ng-change="send({payload: {row}})">
   </md-switch>
 </td>
 <td>{{row.id}}</td>
 <td>{{row.name}}</td>
 <td>
 <input tr type="text" ng-model="row.text1" />
 </td>
 <td>
 <md-button tr ng-click="send({payload:[{row},{update:1,delete:0}]})">更新
 </md-button>
 </td>
 <td>
 <md-button tr ng-click="send({payload:[{row},{update:0,delete:1}]})">削除
 </md-button>
 </td>
 </tr>
</tbody>
</table>



ui3-1.jpg

受け取った配列を表として表示することができます。
配列の数に応じて表の行が自動的に変化します。
例えば、データベースやセンサから受け取った情報を並べて表示するといったことができます。
また、表の中のボタンを押すことでボタンを押した行の情報をmsg.payloadとして次のノードに渡すことができます。

Node-Red Dashboardテンプレートを使用するとこのように動的なUIを実現することができます。
今回紹介したNode-Redのフローをこちらから利用できます。


posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2019年03月23日

NodeJS Portableで気軽にNode-Redを始める方法

Windows環境でNode-Redを使用する場合、DockerやUbuntuをVM上で動作させて使用することが多いと思います。
ただ、初心者にとってDockerの設定、VM導入は少し敷居が高いです。

WindowsにNodeJSを直接インストールしてNode-Redを使用することもできないことはないですが、UnixベースのOSでNodeJSが開発されていることもありうまくインストールできないことが多々あります。また、PC毎にインストール作業が必要で構築に労力を要します。


ここで紹介するのはNodeJS Portableを活用する方法です。
NodeJS Portableはその名の通り、Portableなので
一度、Portable版でNode-Redをインストールすれば、
そのフォルダ毎コピーで別のPCでも動きます。

フォルダで管理することができるため、
同じPC上でもバージョンやアプリケーションごとに分けて
フォルダ管理するということも可能です。


■NodeJS PortableにNode-Redを導入する手順
@NodeJS Portableをダウンロードする
※sourceforgeからダウンロードできなくなったため、githubを使用してください

AダウンロードしたNodeJS Portableを実行し、
NodeJS Portableフォルダを生成する
※注意点としてNodeJS Portableフォルダは浅いディレクトリで実行してください
フォルダの階層が深いとファイル生成に失敗する可能性があります。
例:C:\Users\XXXXの直下にフォルダを生成する XXXXはユーザー名

※NodeJSをアップデートするまでNodeJS Portableフォルダ内のNodeJSPortable.exeを起動させないでください
初回起動で古いNodeJSのファイルがDataフォルダ内に展開されます


BNodeJSをダウンロードする
デフォルトのNodeJS Portableはv5.7.0でNodeJSのバージョンが非常に古いです。
そのままではNode-Redがインストールできても実行できません。

今回はNodeJSサイトからnode-v8.15.1-win-x86.zip をダウンロードしました。
なお、デフォルトのNodeJSがx86のため、同様にx86版のv8を選択しています。

Cnode-v8.15.1-win-x86.zipを解凍する

DNodeJSの置き換え
\NodeJSPortable\App\NodeJS内のnode.exeを削除し、先ほど解凍したnode-v8.15.1-win-x86内のnode.exeに置き換えてください。

また、\NodeJSPortable\App\DefaultData\node_modules内のnpmフォルダを削除し、先ほど解凍したnode-v8.15.1-win-x86.zip\node-v8.15.1-win-x86\node_modules内のnpmフォルダに置き換えてください。

Dataフォルダ内に古いNodeJSのファイルが展開されている場合はDataフォルダ内を全削除してください

ENodeJSPortable起動
\NodeJSPortable内のNodeJSPortable.exeを実行します。
コンソール画面が表示され、置き換えしたNodeJSバージョンが表示されれば置き換え成功です。


node.jpg

NodeJS Portableのデフォルトはv5.7.0ですが、
置き換えをしてv8.15.1と表示されています。

FNode-Redインストール
npm install -g --unsafe-perm node-redと打ち込んでインストールします。
数分でインストールが完了します。

GNode-Red起動
node-redと打ち込んでEnterで実行されます。

初回は下記のようにファイアウォールの設定が自動で表示されます。
「アクセスを許可する」をクリックしてください。

firewall.jpg

起動に成功すると下記のようにNode-Redのコンソールが表示されます。

node-red2.jpg

HNode-Redにアクセス
ブラウザ(FirefoxもしくはChrome、IEは非推奨)から下記のアドレスにアクセスします。

お馴染みの画面が表示されればあとはNode-Red三昧です。

node-red3.jpg

必要に応じてパレットに「node-red-node-serialport」や「node-red-dashboard」といった追加ノードをインストールしてください。

I終了する
コンソールウインドウを閉じるか、
Ctrl+cを押してy、exit、yで終了させてください。

■NodeJS Portable固有の情報
・インストール時にnode-gyp系のエラーがでる場合は
WindowsのビルドツールPythonをインストールしてください。

・置き換え後にNode-Redのインストールに失敗する場合、先にNode-Redをインストールしてからnode.exeを置き換えして起動させてください。

・フローの保存場所について
\NodeJSPortable\Data\.node-red内のflows_XXXX.jsonが作成して保存されたフローです。XXXXにはPC名が入ります。
他のPCであらかじめ作成したフローを開く場合はXXXXを動かすPCのPC名に書き換えてから起動させてください。

・NodeJSPortableはSerial Port Nodeを使用することができます。パレットから追加することができますが、エラーが発生して追加できない場合はnode-redインストール同様にnpm install node-red-node-serialportと打ってコマンドからインストールすると上手くいく場合があります。
DockerやVMのNode-RedではUSBデバイスやシリアルノードを使用することが簡単にはできません。NodeJSPortable版は簡単にUSB Serial等をNode-Redから操作できます。これは組込系の機器と連携することができるため、非常に魅力的です。

・デプロイがうまくできなくなってしまう場合やNode-Red画面の応答がない場合、コンソール画面でEnterキーを連打して溜まったログを出力させてください。


posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2019年01月26日

Node-RedからのElasticsearchデータ検索

Node-RedからElasticsearchのデータを取得する場合に
少し煩わしい点があったため備忘録として紹介します。

Node-Redに限らず、
Elasticsearchにデータ投入する場合はPostメソッドを使用します。

Elasticsearchに投入したデータを検索して取得する場合は
CurlコマンドやKibanaのコンソール画面からはGetメソッドですが...

公式のElasticsearhの検索APIの説明でもGETメソッドを使用しています。

一方、Node-Redから検索APIを使用する場合は
Getメソッドでは取得できませんでした。
Getメソッドを使用するとmatch_allコマンド同様の結果となり、
意図した検索がされず、投入データすべてがhitとなってしまいます。

Node-Red本家のIBMのサイトで検索APIをNode-Redから使用する際の方法について説明がありました。
「複数の検索条件を指定する場合はメソッドがPOST」を使用する

直観的にはGetメソッドですが、
Node-Redからの場合はPostメソッドの使用するのがポイントのようです。

実際にPostメソッドで検索APIを使用すると
意図した検索範囲の結果を返してきました。

同様にPostメソッドを使用します。


CurlコマンドやKibanaのコンソール画面ではGetメソッドで取得できるにも関わらず、
Node-Redからは取得できないため、Wiresharkで小一時間色々試行錯誤してしまいました。

posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2017年05月18日

Eclipse Index更新方法

SW4STM32に限らず、
Eclipseを使用して開発を行っている場合、
Eclipseのインデックス機能が便利だと思います。


インデックス機能は
ifdefで定義されていない場合に
グレーアウトする機能や
定義へのジャンプ機能などです。


ただ、時々インデックス機能がうまく働かない場合があります。
その場合に確認すべきインデックス機能の設定と操作を紹介します。


「ウインドウ」→「設定」を開く
indexer3.png



「C/C++」→「Indexer」内の「Build configuration for the indexer」の
「Use active build configuration」を選択。

indexer.png


プロジェクトフォルダを右クリックし、
「Index」→「Rebuild」をクリック。
indexer2.png


数秒待って、
インデックスが更新されれば、完了です。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2017年04月19日

I2S使用方法

今回はPDM出力のデジタルマイクSPH0641LU4Hを
I2S接続で読み込んでみました。



最近のデジタルマイクはMEMSマイクのため、
一般的なマイクに比べ、
高感度かつ広帯域で感度も帯域に癖がなく、
非常にフラットな感度を持ちます。


特に今回紹介するMEMSマイクは
超音波帯域のマイクとしても使用でき、
80kHzまで拾うことができます。

一般的な超音波受信器は共振型のため、
36kHzと書いてあれば36kHz前後周辺の超音波しか拾うことができません。

一方、MEMSマイクは36kHz以外でも拾うことができるため、
例えば、amazonのDashButtonの初期設定のように
普通のマイクとしても、
超音波を使って自在にスマートフォンと機器の間で通信することもできます。



超音波に対応したMEMSマイクはKnowlesから
デジタル版MEMSマイクSPH0641LU4H以外に
アナログ版MEMSマイクSPU0410LR5Hも出ています。


ただ、アナログ版はご存じのようにオペアンプ増幅回路など
周辺回路が必要です。
一方、デジタル版はそのままマイコンに接続できるため、
周辺回路が不要です。
また、アナログ部がセンサ内部のみとなるため、
ノイズにも強い回路にできます。

一般的にはデジタルマイクはPDM出力となっており、
I2S接続でオーバーサンプリングで取得します。



環境は
・STM32F401RENUCLEO
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(HAL ライブラリ、F4 ver. 1.15.0)
です。


CubeMXの設定は次の通り。

I2S-setting.png

Data and Frame FormatとSelected Audio Frequency
は試しに設定した値です。
ポイントはHalf-Duplex Masterに設定し、
ModeをMaster Recieveに設定することです。


接続は
I2S2_CKをマイクCLK
I2S2_SDをマイクDATA
に接続します。

今回はモノラルで使用するため、
I2S_WSは未使用です。


コードは下記の通り
実際には音を安定して連続に取り込む必要があるため、
DMA転送等を利用すべきですが、
動作確認のため、必要なデータ数を読み込みました。

    uint32_t I2S_RX_BUFFER[24];


  while (1)
  {
     
      int8_t res=HAL_I2S_Receive( &hi2s2,
                            (uint16_t*)&I2S_RX_BUFFER,
                            24,1000);
      HAL_Delay(200);
      //printf("Res: %d ", res);
      printf("Data: %" PRIu32", %"PRIu32", %"PRIu32" , %"PRIu32" \n",
              I2S_RX_BUFFER[0],
        I2S_RX_BUFFER[1],
        I2S_RX_BUFFER[2],
        I2S_RX_BUFFER[3]);
  }
 


今回、テストで使用したKnowles社の
デジタルマイクSPH0641LU4Hは
入力するクロックによってモードが切り替わります。

Low-Power Mode           :351 kHz ≤ fCLOCK ≤ 815 kHz
Standard Performance Mode  :1.024 MHz ≤fCLOCK ≤ 2.475 MHz
Ultrasonic Mode            :3.072 MHz ≤ fCLOCK ≤ 4.8 MHz


HALライブラリのI2Sの設定では
オーディオサンプリングの帯域設定しかありません。
実際に設定によってどのようにクロックが変化するか
確認してみました。


I2Sバスクロック96MHz設定の場合のI2Sクロック結果は下記の通り。

I2S_CLK.png

なお、クロック4.8MHz以上はデジタルマイクSPH0641LU4Hの動作保証外です。
一応、DATA出力としては6MHzまでは出ましたが...


実際にUART出力してみた例は下記の通り。

uart.png

音によって値の桁が変化するため、
正常に読み込んでいると思われます。

今度は読み込んだ値をFFT化したりして、
意図した周波数の信号がとれるか確認してみたいと思います。


なお、I2S_WSは16B幅の場合は
16bit毎にHIGH、LOWが入れ替わり、
それ以外では32bit毎にHIGH、LOWが入れ替わるようです。

96k,16B
16B_96k-WS.png

96k,32B
32B_96k-WS.png


96k,24B
24B_96k-WS.png

96k,16BEX

16BEX_96k-WS.png


1番目がCLK、2番目がDATA、3番目がWSです。


HALライブラリを利用したI2Sの場合、
HALの設定でオーディオサンプリング周波数に応じて
いい感じにクロックを出力してくれることが分かりました。
ただ、今回のセンサのようにクロックによって動作が変わる場合、
I2Sクロック周波数が直感的に分からないため、
オシロスコープ等で確認する必要がありそうです。


ラベル:STM32 HAL
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする