2020年03月07日

Node-Redを用いたRTCの設定と読み込み

前回紹介したNode-RedからのI2Cデバイス制御する方法に続いて、応用例を紹介します。今回はDS1307搭載のRTCモジュールUSB-I2C変換アダプタを使用して、RTCの読み込みと設定をしてみました。


Arduino等でRTCモジュールを使用するプロジェクトとして時計やちょっとしたデータロガーなどが考えられます。このような用途では主要機能は時刻を読み込むだけなので、RTCモジュールに時刻を設定する方法が悩みどころです。パソコンから時刻をUARTで送信するか、ディスプレイとスイッチをつけるなど少し作りこみが必要です。個人レベルであれば、ベタでコードに時刻を書いて、Arduino等から書き込むといったことが多いと思います。

そこでUSB-I2C変換アダプタを使えば、PCから簡単にRTCモジュールに時刻を設定することができます。Node-RedがPC上で動いている特徴を生かして、時刻を書き込む際にはPC上の時刻をjavascriptで取得してRTCに書き込み仕様にしています。その都度、時刻を書き換えてRTCモジュールに書き込む必要がありません。


Node-Red_DS1307.jpg

読み込みはRTCから取得した情報をpayloadに格納してDebugに表示する仕様です。今回のサンプルコードはこちらで公開しています。活用してみてください。

なお、今回はDS1307を搭載したRTCモジュールを使用しましたが、個人的にDS1307を推奨しません。DS1307は時刻精度が悪く、数か月で数分以上時刻がずれます。また、チップのESD対策が悪く、コネクタ未接続状態、特に電池を外した状態で扱うと静電気ですぐに破損or動作不良になります。気づいたら時刻が読み込めない、時刻が書き込めない、変な値が読み出されるといった症状に悩まされます。
 DS1307の代わりに温度補償水晶発振器(TCXO)を内蔵したDS3231を推奨します。ピン配置、パッケージが異なるものの、DS1307とコマンド互換があるため、置き換え可能です。DS3231であれば数か月で数秒程度のずれに収まり、DS1307に比べてESD対策もされている感じです。

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

2020年02月29日

Node-Redを用いたEEPROM読み込みと書き出し

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

Node-Redはノードを結び付けてフローを作成してプログラミングできる他にファイルの読み込み、書き出しをすることが可能です。今回はMicrochip製のI2C接続EEPROM 24LC512USB-I2C変換アダプタを使用してメモリデータのファイルへの読み出しとファイルからの書き出しをしてみました。プログラムのforループを書き直すことで24LC64, 256にも対応可能です。また、アドレスをバンク毎で書き換えれば24LC1024にも対応できます。なお、アドレスセレクトのA0、A1、A2はすべてGNDに接続しています。


下記のようにNode-Redでコードを書いてました。

full_read.jpg

16byteずつ読み込んでcsvファイルに出力します。NodejsPortableの場合はNodeJSPortable\Dataのフォルダにmem_read.csvが生成されます。

read_csv.jpg


処理のラグが多く、24LC512の場合はすべて読み出すまでに10分程度要しました。



csvファイルから読み込んで書き込むツールも同様に作成してみました。16byte毎に0~255の数字を書き込んだcsvファイル(mem_write.csv)を用意し、Node-Redから読み込んで24LC512に書き込みます。


full_write.jpg

読み込み同様に16byte毎のcsvファイル(mem_write.csv)から8byte毎に書き込みを実行します。NodejsPortableの場合はNodeJSPortable\Dataのフォルダにcsvファイル(mem_write.csv)を配置します。シリアルI2C変換SC18IM700のバッファサイズが16byteのため、開始や終了コマンドを含めると最大10byte毎の書き込みとなりますが、キリが悪いので8byte毎に書き込みを実行しました。

write_csv.jpg

読み込み同様に書き込みには10分ほど要しました。一般的には書き込みの方が時間を要しますが、今回のシステム構成の場合は書き込みの方が若干早く処理が終わりました。この理由として読み込みの場合、Node-Redのシリアル送信処理をしてからシリアル受信するまで待機する必要があります。一方、書き込みの場合は一方的にシリアル送信処理のみなのでシリアル受信するまで待機する必要ありません。シリアル受信はOS側のFIFOやNode-Red側の割込み発生周期などが影響し、シリアル受信してもすぐに受信処理が実行されません。現在のコードは受信処理が16byte毎に発生しますが、少し大きなサイズでまとめて受信すれば、受信処理の待機時間の回数を減らせるため、全体の処理時間を短くできると思われます。


正直、実用的なバックアップ、リストアツールではありませんが、ちょっとデータを保存しておきたいといった場合や複製したいという場合には有効だと思いました。I2Cアドレスやサイズを変更すれば24LC512以外でもI2CのEEPROMであれば利用できます。今回のサンプルコードはこちらで公開しています。活用してみてください。

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

2020年02月15日

組込ビデオコントローラBT817

以前に組込ビデオコントローラを紹介してから、実際にDigital Video Shieldとして製品化しました。Digital Video Shieldでは汎用性を考え、BT816を選定しました。先日、BridgetekからBT817が発表されました。

発表資料によるとBT817はBT815/816の後継機種で下記のような特徴があるようです。

・BT815/816互換性有
・24bit 最大解像度1280x800
・BT815/816に比べてパフォーマンスが50%向上
・四角以外のLCDにも対応

最大解像度がBT815/816の800x600から拡大したことは魅力的ですが、HD対応でないのは少し残念です。HD対応であれば、後継版Digital Video Shieldも検討したのですが。一旦様子見というところです。少しニッチな組込ビデオコントローラという市場で毎年のように新しいビデオコントローラが発売されるのは頼もしい限りです。今後のHD対応に期待したいと思います。

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

2020年02月08日

UART割込み有効確認

STM32マイコンのシリアルUART受信の割込みについて少し紹介します。

STM32マイコンのHALライブラリを使用してUART受信をする場合は割込みHAL_UART_Receive_ITか、DMA受信転送HAL_UART_Receive_DMAのどちらかを多く使用します。

HAL_UART_Receiveを使用しない理由として、ブロッキング処理のためUART受信するまで他の処理が停止してしまいます。
一方、HAL_UART_Receive_IT、HAL_UART_Receive_DMAはノンブロッキング処理のため、他の処理をさせて、受信したときor受信後にのみ処理を走らせることができます。ノンブロッキング処理のUART受信処理をする場合は事前にHAL_UART_Receive_IT、HAL_UART_Receive_DMAを実行し、割込みを有効化する必要があります。受信するとHAL_UART_RxCpltCallback関数が呼び出されます。


ここで事前にHAL_UART_Receive_IT、HAL_UART_Receive_DMAを実行する際に注意すべきポイントがあります。別の処理で既に実行されていて、割込みが有効化されている場合に再度、実行するとエラーが発生します。エラーを避けるためにはUART割込み有効か確認して無効の場合にのみ実行するような処理が必要です。今回はその割込み有効確認の関数を紹介します。

■割込みHAL_UART_Receive_ITの場合

uint32_t UART_IsEnabledIT_RX(UART_HandleTypeDef *huart){
 #if defined(USART_CR1_FIFOEN)
  return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE) == (USART_CR1_RXNEIE_RXFNEIE)) ? 1U : 0U);
 #else
  return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)) ? 1U : 0U);
 #endif
}

■DMA転送の場合
uint32_t UART_IsEnabledDMA_RX(UART_HandleTypeDef *huart){
 return (READ_BIT(huart->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR));
}

上記の事前に確認して、すでに有効な場合は割込み有効化処理をしないといったことができるようになります。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年01月18日

シリアル受信割り込み

以前に紹介したUART I2Cプロトコルブリッジを用いてNode-Red連携をする際に少し戸惑った点があったので対処方法についてお伝えします。

USBシリアル変換IC PL2303SAを用いてNode-Redのserialノードでデータを受信する際にNode-Redの受信ノードが動作せず、シリアルデータを受信してもイベントが発生しない不具合がありました。

node-red.jpg

Teratermでは受信できるものの、Node-RedのSerialノードでは受信してもイベントが発生しませんでした。
他のFTDI製のUSBシリアル変換ICでは受信すると正常にイベントが発生しました。

原因を追ってみるとドライバが古いことが分かり、Windowsの標準ドライバからアップデート、再起動するとUSBシリアル変換IC PL2303SAでも正常に受信することができました。


Driver.jpg

正常に動作確認ができたところでUART I2Cプロトコルブリッジを用いてNode-Redから様々なI2Cデバイスを制御する例について今後、紹介したいと思います。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする