2020年02月01日

Node-Redを用いた赤外線グリッドセンサ制御と可視化

前回紹介したNode-RedからのI2Cデバイス制御する方法に続いて、応用例を紹介します。

Node-Redはノードを結び付けてフローを作成してプログラミングできる他にNode-Red-dashboardを使用することで簡易的にUIを作って可視化することも簡単にできます。

今回はPanasonic製 赤外線グリッドセンサAMG8833とUSB-I2C変換アダプタを使用して取得したデータをNode-Red-dashboardで可視化してみました。Node-Red-dashboardに加えてNode-Red-ui-heatmapを追加しています。

Panasonic製 赤外線グリッドセンサAMG8833は8x8の赤外線アレイセンサです。画素は粗いものの比較的低価格で非接触でサーモカメラを実現できます。

Node-Redのフローは下記のように作成してみました。

Node-Red_AMG8833.png

全体のコードはこちらにアップしています。



指を横向きに近づけると下記のように温度変化を取得することができました。

AMG8833_finger.jpg


赤外線センサなので物の材質によって放射率が異なるため、接触温度計に比べると温度精度は期待できません。ただ、非接触で温度をざっくり測定できるのはやはり面白いセンサだと思いました。

Node-Red-dashboardはチャート(折れ線グラフ)、ゲージなど様々なUIが用意されているため、センサデータの可視化も容易に実現できます。他にもボタンやスイッチといったUIも用意されているので、USB-I2C変換アダプタと組み合わせた応用例を紹介したいと思います。

※追記
USB-I2C変換アダプタで使用しているSC18IM700のFIFOは16byteですが、16byteを超えるデータを要求して受信することができました。順次シリアルでデータを送信する仕様なようです。ただ、通信設定やデバイスによって受信できない場合もあると思われます。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2020年01月25日

Node-RedからのI2Cデバイス制御

今回はNode-RedからのI2Cデバイス制御する方法を紹介します。

Node-Redからセンサ等のI2Cデバイスを制御する場合、SBC(Raspberrypi等)にNode-Redをインストールして専用のノード(BME280VL53L0)でI2Cデバイスにアクセスすることが一般的です。他の方法としてArduinoを経由する方法などもあります。

専用ノードの場合はNode-Redを実行するハードウェアに依存するため、WindowsやMacではそのままのノードが使えません。

先日紹介したUSB-I2C変換アダプタを使用するとハードウェアの依存度を下げることができます。USB-I2C変換アダプタはシリアルCOMポートとして認識されるため、Node-Redのシリアルポートノードを使用することでSBC(Raspberrypi等)の他、WindowsやMacでもそのまま同じノード、フローを使用することができます。

なお、Node-RedのシリアルポートノードをWindowsで使用するためにはオンプレミス版Node-Redを使用する必要があります。こちらの記事を参考にしてください。



USB-I2C変換アダプタを使用してI2C接続タイプのLCDのAQM1602をNode-Redから制御してみました。



Node-Red_AQM1602.jpg

実際のNode-Redフローはこちらで公開しています。


I2CLCD.JPG

任意の文字列が表示できました。


また、I2Cデバイスのアドレスを取得してデバイス検索するコードも作成してみました。I2Cデバイスと通信できない場合にデバイスの動作確認やアドレスの確認として非常に便利です。

Node-Red_I2Cdevicesearch.jpg

実際のNode-Redフローはこちらで公開しています。

USB-I2C変換アダプタの応用例を今後、紹介してみたいと思います。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2020年01月04日

UART I2Cプロトコルブリッジ

あけましておめでとうございます。
2020年も電子工作をはじめとした活動を発信していきたいと思います。

以前からシリアル変換ブリッジIC(I2C/SPII2C/Uart)を紹介しましたが、今回はUARTからI2Cを制御できるUART I2CプロトコルブリッジSC18IM700を紹介します。

SC18IM700を使用するとUARTからI2Cデバイスを制御することができます。SC18IM700がI2Cデバイスマスタとなって様々なI2Cデバイスを制御することができます。

UARTをUSBシリアル変換アダプタに接続すればパソコンのTeraterm等からI2Cデバイスを制御することが可能となります。

また、スピードは期待できないものの、SC18IM700は汎用GPIOの8つを利用することも可能です。


プロトコルブリッジSC18IM700とUSBシリアル変換IC PL2303SAを組み合わせてUSB-I2C変換アダプタを作成してみました。

I2CUSB_1.jpg

I2CUSB_2.jpg

I2CにGrove互換コネクタを搭載することで様々なGroveデバイスを制御することができます。特にTeratermはマクロ機能があるため、マクロ機能を活用することで簡易なドライバ作成ができます。ちょっとしたI2Cセンサのアドレス確認や動作確認、部品の出荷テスト等でパソコン単体でセンサを接続する際の治具として活躍できそうです。

試作基板の動作確認して問題なければteratermのサンプルプログラムをいくつか準備して販売したいと思います。
追記 2/7からスイッチサイエンスにて販売を開始しました。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2019年12月28日

磁気エンコーダMLX90316

Melexis社製の14bit磁気エンコーダMLX90316を試食してみました。

先日紹介した3線式SPI通信を使用して磁石の角度情報を読み込んでみました。
結論から言うとMLX90316はダイヤルといったインターフェース向けのエンコーダでモータ制御にはあまり向いていないようです。

Arduinoのサンプルプログラムでは動作しますが、STM32マイコンのSPI通信で実装すると思うように位置情報が読み込めない不具合に遭遇しました。原因を追うとデータシートにその答えがありました。

MLX90316_1.jpg
 MLX90316データシートP.33から抜粋

データシートをよく見るとt1が最小2.3usということで最大クロックは300kHz程度です。さらにt2で1バイトごとに10us以上待機する必要があり、SPI通信で連続してバイトの読み書きができません。また、t5でCS=1状態で300us以上待機する必要があることが書かれています。数MHzのクロックで通信できるSPI通信のメリットがありません。

つまり、位置データ読み込みは数msに1回程度しか読み込めないということになります。MLX90316の仕様でSPI通信対応ということで細かい部分を見逃していました…

CubeMX上でClock Phaseを2Edgeに設定し、SPIのプリスケーラを256に設定してSPIのボーレートを31.25Kbit/sに設定すると正常に位置情報を読み込むことが確認できました。

MLX90316_2.jpg


 uint8_t sdata[4];
 uint8_t rdata[8];
 uint16_t dat[4];

 uint16_t res;
 uint8_t halres; 
 sdata[0]=0xAA;
 sdata[1]=0xFF;


 SPI_1LINE_TX(&hspi1);
 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
 halres=HAL_SPI_Transmit(&hspi1,sdata,2,0x1000);
 if(halres !=HAL_OK) printf("Transmit Err:%d \n\r",halres);
 SPI_1LINE_RX(&hspi1);
 halres=HAL_SPI_Receive(&hspi1,rdata,8,0x1000);
 if(halres !=HAL_OK) printf("Receive Err:%d \n\r",halres);
 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
 dat[0] = (rdata[0]<<8) + rdata[1];

 if((dat[0]&0x03)==2){
   // Err Data
  if ( dat[0] & (1 << 4)) {
   //printf("Magnetic Field is Too Strong!\n\r");
  }
  else if ( dat[0] & (1 << 5)){
   //printf("Magnetic Field is Too Weak!\n\r");
  }
 }
 else if((dat[0]&0x03)==1){
  res=(dat[0]>>2);//16bit Angle Data
  printf("RES: %d \n\r",res);
 }



MLX90316_SPI_Wide.jpg




磁気エンコーダをモータ制御として使用する場合、少なくとも1msに1回、理想は100usに1回読み込みたいのでMLX90316の仕様は満足しないことが分かりました。ダイヤルといったインターフェース向けのエンコーダとしては低コストかつシンプルなコマンドで通信できるため、非常によいと思いました。

14bi磁気エンコーダとして癖がなく、高速な処理に対応しているのはやはりAMS社のAS5048Aが個人的にベストな磁気エンコーダだと改めて思いました。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2019年12月07日

FTDI2232を用いたJTAG通信 Machxo2書き込み

Lattice社のFPGAの開発環境はインストールパッケージが1GB前後と軽いのが特徴です。それもあってLattice社を好んで使っています。また書き込みツールがFTDIの2232Dなどでそのまま純正書き込みソフトで書き込むことが可能なため、高価な書き込みツールが不要なのも特徴です。
※Machxoシリーズに対応した開発環境Diamond、iCE40に対応したiCECubeともにそれぞれ1GB前後です

今回はLattice社のFPGA、Machxo2(LCMXO2-256HC-4TG100C)の書き込みについて少し紹介します。

秋月のサイトにもMachxo2の書き込み方法(PDF)について紹介されていますが、安定した書き込みができず少し苦労しました。



Machxo2のJTAGポートは弱いプルアップやプルダウンがありますが、安定化のための十分でないため、外部に別途プルアップやプルダウンが必要です。

TDO、TDI、TMSはプルアップ、TCKはプルダウンですが、抵抗値もポイントです。すべて4.7kohmでは安定した書き込みができませんでした。

評価用ボードの回路を確認すると理由が分かりました。TDO、TDI、TMSはプルアップが4.7kohmというのは同じでしたが、TCKのプルダウン抵抗が違いました。純正の評価ボードのTCKは2.2kohmでプルダウンしていました。



jtag_pull.jpg


純正の評価ボードに合わせてTCKを2.2kohmでプルダウンすると安定して書き込みできることが分かりました。
ただ、正直、Machxo2(LCMXO2-256HC-4TG100C)を書き込む際には2232DよりもTinyFPGAプログラマが簡単です。
TinyFPGAプログラマ専用のソフトウェアでの書き込みになりますが、書き込み速度も高速で便利です。
TinyFPGA AX2 Boardでなくても書き込みできました。
なお、Machxo3は識別コードが異なるため、TinyFPGAプログラマ専用のソフトウェアそのままでは書き込みできませんでした。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする