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) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2019年11月16日

STM32 RTC起因のUART不具合

STM32マイコンの多くはVBAT端子があり、RTC機能をマイコンに内蔵しています。VBAT端子にリチウム電池等を接続することで時刻を保持することができます。

STM32マイコンのRTCの特徴として、マイコンのファームを書き換えた際にも時刻が保持されます。また、時刻の他にバックアップレジスタがあり、ちょっとしたデータを保持することが可能です。

マイコンのファームを書き換えた際にも時刻が保持されるため、開発側としては非常に便利ですが、ごく稀に不具合が発生することがあったので現象と対処方法を紹介します。


前提:
VBAT端子にリチウム電池を接続し、時刻を保持した状態でファームを書き換える

不具合:
ごく稀にUARTのボーレートが異常な値となり、マイコン自体は動いているものの、UART通信ができなくなる

対処方法:
マイコンのメイン電源を切り、VBAT端子にリチウム電池を外して数秒放置させる


上記の事象が発生した場合、ファームをフルイレースしても現象は直りません。VBAT端子の供給を遮断し、RTC関連をリセットする必要があります。RTC関連をリセットすれば時刻情報は消えますが、再度、ファーム書き換え直す必要もなく、UARTは正常に戻ります。


もし、STM32 RTCを使用していてUARTに不具合が発生した場合はVBAT端子の電池を外してみてください。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2019年11月02日

I2C/Uartコンバータ

今回はI2C/UARTプロトコルブリッジICのSC16IS740/750/760 を紹介します。SC16IS740/750/760はI2CからUARTに変換するICです。

マイコンでUARTを使用する場合、UARTのボーレートに合わせてマイコンのメインクロックを調整するといったことが必要な場合が多々あります。また、UARTポートが他の用途で使用して足りないこともあります。特にUARTの受信処理はSPIに比べ、信号タイミングを測定しながらサンプリングする必要があり、ソフトウェアUARTで実装するとマイコンの負荷が高くなりがちです。マイコンの負荷が高くなることで受信ミスも発生しやすくなります。

I2C/UARTプロトコルブリッジICのSC16IS740/750/760 を使用することでこのような問題を解決することができます。

マイコンからはSC16IS740/750/760 をI2Cデバイスとして制御し、UARTのボーレート設定、送信、受信処理をすることはできます。64 bytesのバッファを内蔵しているため、通信速度が遅いI2Cでも一旦、バッファで受けて後から受信したデータを読み出すといったことが可能です。

また、SC16IS740/750/760 は別途水晶発振子を接続する必要があり、マイコンのクロックから切り離すことができます。そのため、UARTのボーレートに合わせてマイコンのクロックを最大クロックから下げるといった調整が不要です。また、7.3728MHzの水晶発振子を搭載することで9600bps、38400bps、57600bps、115200bpsといった一般的なボーレートに対してほぼ誤差率0でデータのやり取りをすることが可能です。

SC16IS740、750、760で3種類ありますが、違いは下記の通りです。

 SC16IS740SC16IS750SC16IS760
Flow Control PinRTS/CTSRTS/CTS/DSR/DTR/CD/RIRTS/CTS/DSR/DTR/CD/RI
IO Pin088
SPI Max Clock4Mbit/s4Mbit/s15Mbit/s


SC16IS740/750/760の電源は3.3Vですが、信号の各ピンは5V耐圧のためArduino UNOなどに接続してそのまま使用することも可能です。


このSC16IS740/750/760を使用してGrove変換アダプタを作成してみました。GROVEからUARTに変換する「I2C UART Converter」とGROVEからRS232Cに変換する「I2C RS232C Converter」を設計してみました。

I2CUart.jpg

I2CRS232.jpg




GROVEの多くはI2Cデバイスですが、一部のGROVEはUARTデバイスがあります。UARTデバイスの場合、そのままI2Cポートでは接続できず、ソフトウェアUARTを使用せざるを得ない場合がありました。そのような場合に上記Converterを使用するとソフトウェアUARTを使用せずにUARTデバイスを接続することができます。

サンプルコードを作成して設計に問題なければ、どこかで販売をしたいと思います。

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

2019年06月22日

CO2センサ

今回は先日、入手したCO2センサについて少し紹介します。

CO2センサは室内の空気管理、植物を育てる温室の空気管理、人の混み具合可視化など用途が広く面白いセンサです。



CO2センサの原理として、光学式、電気化学式、半導体式があります。
MH-Z14Aはどのような構造か、精度が悪化することを承知で中身を確認してみました。


co2_1.jpg

上部に白い布状のテープが貼ってあり、ここからCO2が入るようです。



co2_2.jpg

使用しているマイコンはSTM32F051K8のようです。マイコン横のICはWS6252と記載されていますが、情報がありませんでした。回路パターンからオペアンプだと思われます。


co2_3.jpg

上の蓋を外すと内部は至ってシンプルでした。左側に豆電球、右側に光センサ素子がついています。



co2_4.jpg

外乱として外部の光が入らないような入れ子構造になっていました。センサ側の蓋はミラー状になっており、豆電球の光を受ける構造になっていました。

ということでMH-Z14Aは光学式CO2センサと分かりました。非分散型赤外線(NDIR: non dispersive infrared)検出方式のようです。思った以上にシンプルな構造でした。豆電球の光をばらつきなく受光素子に届けるための蓋の金色と形状がポイントだと思いました。LEDの代わりに豆電球を使用しているのは単調な波長でなく、幅を持った波長でCO2を検出するためと思われます。


また別の機会に実際につかってみたいと思います。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2019年06月08日

Digital Video Shield 応用編その2

Digital Video Shieldの応用編その2を紹介します。
ここ数回、応用方法を紹介(初回その1)しましたが、今回はJPG、PNGの画像を表示させてみました。

Digital Video Shieldで使用しているビデオエンジンBT816はCo-Processorエンジンを搭載しており、LOADIMAGEコマンドを使用することでJPGやPNGの画像をデコードしてビットマップに展開する処理をBT816内で行うことができます。
BT816でデコードできるため、Arduino等の小規模のマイコンでもJPG、PNG画像を表示させることができます。

また、Digital Video ShieldにはmicroSDスロットがあるため、他の配線なしでSDカードに入った画像を読み込んで表示することができます。



JPG、PNG画像をBT816に読み込む方法はいくつかあります。
@SDカードデータ→BT816内のRAMに展開→BT816内のRAMからビデオ出力
ASDカードデータ→BT816内のRAMに展開→Digital Video ShieldのFlashへ書き込み→FlashからRAMへ展開→BT816内のRAMからビデオ出力
B@の方法でSDカードの代わりにコード内にバイナリデータを実装
CAの方法でSDカードの代わりにコード内にバイナリデータを実装

なお、BT816でデコードせずにそのままBitmapを表示させる方法はありますが、専用ツールで前処理(専用のファイル形式への変換)が必要で手間と汎用性に欠けるため、今回はこの方法は使用しません。

B、Cはマイコンに十分なROM領域がないと実現できないため、汎用性を考え、@の方法を紹介します。
Aの方法はDigital Video ShieldのFlashを活用する意味では魅力的ですが、BT816に接続されたFlashは読み込み時はそのまま読み込むことはできず、必ずRAMに展開する操作が必要となります。また、Flashのメモリは16MBでSDカードと比べると小さく、SDカードの方が汎用性が高いため、機会があれば別途紹介したいと思います。

全体手順
1. microSDに800x480の画像データをPCから保存
2. main while内、もしくはloop内にEveDemo3関数呼び出しコードを記述
3. Digital Video ShieldのSDスロットにメモリを挿入
4. マイコンに上記コードを書き込み
5. ディスプレイを接続して電源を投入する
6. JPG/PNGが表示されます


JPG/PNGのデコード、表示処理を行うEveDemo3関数の内部処理を簡単に紹介します。EveLoadJpgFile内でメモリから読み込み、デコード、表示処理を行います。

1. SDカード内の該当する画像ファイルを開く
2. CMD_LOADIMAGE命令を実行し、BT816内の汎用RAM領域RAM_Gにデータ展開する
 ※RAM_G展開したデータはCMD_LOADIMAGE命令で自動でデコードされます
3. デコードされたビットマップデータをEveCmdSetBitmapで設定します
 ※ここで高さ、幅は読み込んだファイルのそのままのピクセルサイズを設定します
4. 位置を変更する場合はVERTEX2II(x,y,...)で必要に応じて変換処理を行います
 ※今回は紹介しませんが、大きさ変更や回転させる場合はCMD_SCALE、CMD_TRANSLATEといったコマンドがあります
5. DISPLAY、DLSWAPで表示処理を行うことでディスプレイに表示されます


img5.JPG

SDカードから800x480ピクセルサイズのJPG/PNGをBT816のRAMに読み込ませて800x480のディスプレイに表示させてみました。JPG/PNGのファイルをそのまま前処理(専用のファイル形式への変換)なしで表示できるのは非常に魅力的だと思いました。


arduino.jpg

ArduinoUNOでコンパイルした結果は 使用率ROM45%、RAM58%でまだまだ余裕があります。ArduinoUNOを使用してSDカードのファイルシステム、JPG/PNGのデコード、画像表示までできることが確認できました。ArduinoUNOといったマイコン側にRAM容量がなくともビデオエンジンBT816の大容量RAMによりこのような処理を実現することができました。BT816のRAMサイズは1MBあるため、JPG/PNGをデコードしたビットマップで1MB以下の画像であれば表示できると思います。


今回のサンプルはArduinoUNO及びSTM32F401 Nucleoで実装しています。Githubに上がっているコードをアップデートし、JPG/PNG読み込み例(EveDemo3)を追加しました。

Digital Video ShieldとArduinoUNOで自作フォトフレームといったことも簡単に実現できそうです。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする