DAA-DコンバータMCP3008前回、A-DコンバータMCP3008の任意のチャネルを読み出すスケッチを作りました。それを改良して、全チャネルを読み出します。変更はloop()の部分です。delay(100);}コンソールの出力です。6個の変換は連続して行われるのですが、7個目と8個目の変換間隔があきます。マスタかスレーブのどちらに原因があるかは不明です。コンソールに表示するのに時間差は出ません。●データ転送速度MCP3008のデータ変換は200kspsです。データシートに書かれているSPIバスのデータ転送速度の上限は3.6MHzです。いままで1MHzでテストをしていました。3バイトで1回のデータ転送が終わります。SS端子のHIGH-LOWまでの期間はその5割増しだとすると、5バイト=40ビットと仮定して、1ビットのクロックが3.6MHzならば、クロックの幅は280ns、40倍で11usが1回のデータ転送時間です。データ変換200kspsは、5usで変換が終わることになります。したがって、データ転送が11usかかるなら、いつも最新のデータが得られることになります。クロックを3.6MHzに変更しました。コンソールに出力されるデータを見ると問題ないようです。実測したクロックは500nsでした。1回の転送時間は約20usで、先ほどの試算の倍の時間です。);で設定する周波数は、実際には2分周されているのかもしれません。ATMega328の転送クロックには、CPUクロックの1/4以下(倍速クロックを選んだときは1/2と思われる)しか動作が保証されていないので、周波数の上限には限界があります。クロックを5MHz、8MHzと上げていきましたが、読み出したデータは正常のようです。MCP3008もデータが間に合って出力しているようですが、データシートの上限を超えているので、温度を上げてみたり十分なテストが必要です。16MHzでは、時々正常な値が読み出せる状態なので使えません。●16チャネルに拡張MCP3008を2個使って16チャネルに拡張します。SPIバスは共通に配線できますが、SS端子はデバイスごとに用意します。SS信号はArduinoのSPIライブラリでは指定されたピン番号はありません。1個目は10番でしたので、2個目は9番を使うことにします。●スケッチSS端子に10番を使ったときは、OUTPUTの指定をした後何もせずにHIGHになっていたようです。9番を二つ目のSS端子としてOUTPUTの指定した後何もしないと、読み出したデータが正常ではありませんでした。setup()内で、どちらもHIGHに指定しました。delay(100);}実行中の波形です。線が太いところは短時間に2回の読み取りができています。ほとんどがある程度の一定期間をとったインターバルで読み取っています。スケッチのadcRead()関数を8から16チャネル対応に変更しました。呼び出す側は、チャネル番号0~16を入れて値を読み出します。IDEをPCにインストールしてプログラムを書き始めることです。R3には、性能や機能がほとんど同じ製品がたくさん市販されています。+」を取り上げています。IDEで開発できるマイコンはCortex-M0~M4の製品もあります。ここではソニー「Spresense」を取り上げています。Wi-Fiもすぐに利用できるのが「ESP32」です。ライセンスで提供されています。