Arduinoでセンサーなど周辺機器を使用する場合はI2CかSPIで通信を行うことになります。
ただ、センサーによってはシリアル通信(UART)でのアクセスが必要になるものがまだまだあります。
UARTでは通信速度の設定が必要となります。UARTは調歩同期式といって、お互いの通信速度を合わせて通信を行うことが必須となります。
通常のArduinoでは問題になることはありません。115200bpsでの速度でも物理ポート、ソフトウェアシリアル経由でも問題になることはありません。
これは、5V16Mhzで動作しているので処理速度に問題がないためです。
ただし、省電力のために3.3V8Mhzで動作させている場合はこの速度でのUART通信ができません。8Mhzの動作周波数では115200bpsでの通信を処理するためのパフォーマンスが満たせないためです。
8Mhzでの高速UART通信をおこなうにはどうするか
Arduino(ATMEGA328)でパフォーマンスが不足しているのであれば外部モジュールを使うしかありません。
代表的な製品としてはSWITCHSCIENCEから発売されているSC16IS750 シリアル-I2C ピッチ変換済みモジュールがあります。
I2C経由でのアクセスになりますが、このモジュールが高速でのUART通信を行ってくれます。モジュールには64byteのFIFOバッファが搭載されています。
Arduinoのドライバは公式には提供されていませんが、SC16IS750を使用するドライバはGitHubで公開されていますのでそちら流用できます。
例えばUART_Bridgeなどがあります。
ドライバを使用する場合の注意点
サンプルコードではTXとRXを直結して送受信を行うサンプルになります。ハード不良がない限り失敗することはありません。ただ、外部機器と通信が正常にできないことが多いと思います。
これは、ドライバの設定を変更する必要があります。
SWITCHSCIENCEの機器は12Mhzの水晶発信子が実装されています。
かたや、ドライバのヘッダファイルを見てみます。
define SC16IS750_CRYSTCAL_FREQ (14745600UL) //#define SC16IS750_CRYSTCAL_FREQ (1843200UL) //#define SC16IS750_CRYSTCAL_FREQ (16000000UL)
通信する際に使用される水晶発信子の設定があります。
デフォルトでは14Mhzが設定されています。
この設定のままではUARTの通信タイミングがずれてしまうため正常通信が行えません。
そこで、この値を12Mhzで設定する必要があります。「12288000UL」を設定すると正常通信が行えるようになります。
コメント