別シリーズでSPI接続のADCをArduino Unoに取り付け、SPI接続の確認を実施。今回は同じことをNucleo-F401REでやってみます。OSはMBed OS v6.15を使用、開発環境には最近使い始めた Keil Studio Cloudを利用。慣熟訓練?Arduinoよりコード短いんじゃないかい。
※「モダンOSのお砂場」投稿順Indexはこちら
元々は、SAR型のADCの実例としてアナログねたの方でやってみたデバイスなんであります。アナデバ製の12ビットADC、SPI接続品です。SPI接続ということでマイコンに取り付けてみなくちゃ、ということで下記の記事で取り付けて動作確認(変換精度とか、つべこべ言わず、接続のみ。)
IoT何をいまさら(107) SPI接続のADC、AD7920をArduinoで制御してみる
柳の下のドジョウということで、今回は同じデバイスをNucleo-F401REに接続し、Arm Mbed OSで制御してみることにいたしました。
比較表が以下に。
Arduino Uno | Nucleo F401RE | |
---|---|---|
CPU | ATmega328P (8bit) | STM32F401RE (32bit) |
フレームワーク/OS | Arduino | Mbed OS 6.15E |
電源電圧 | 5V | 3.3V |
昔だったらね、ボードの載せ替え、ましてやマイコンを変えて動かすなんぞ、恐れ入るような工数がかかったもんですが、本当に簡単です。チョロイ?
AD7920の接続
AD7920を載せたブレッドボード、今回も何もいじってません。それどころかマイコンボードとの接続もクリソツ。まずは Arduino Uno に接続したときの回路図が以下に。
そして、下がNucleo-F401REに接続したときの回路図です。よ~く見ないとその差はわかりませぬ(違いは電源とボードの御名前。)
当然、カラクリはありです。STM32F401REはATmega328Pに比べたら遥かに端子数も多く、機能も豊富なのですが、Arduino互換のコネクタも併設しております。そして、そのコネクタはArduinoになるべく近くなるように設定がされています。今回実験のSPIについでも、まったく同じコネクタから信号線を取り出せます。
唯一の違いは、STM32F401REが3.3V IOのデバイスなので、5VのArduinoとは電源を変更した点です。AD7920自体は、5Vでも3.3Vでも動作可能(ただしフルスケールは電源電圧までなので、検出可能電圧は変わります。)
実機写真は以下に。
Mbed用の実験ソース
別件記事のArduino用のソースを見ながら、Mbed用のソースを作成いたしました。参照するのは、SPIについてのAPIのマニュアルページであります。
ArduinoのAPIでは16bit幅の読み取りができなかったので、2回に分けて読み取ってましたが、MbedOSではビット幅の指定が可能なので16ビット幅で一気に読みます。コマケー違いはあれど似たようなもん。でもこっちゃの方が簡単?
// AD7920 12bit AD connection test. // SPI1 // CS: PB_6(D10) // MISO: PA_6(D12) // MOSI: PA_7(D11) // SCLK: PA_5(D13) // SPI MODE2: CPOL=1(active low), CPHA=0(Falling Edge) #include "mbed.h" SPI spi(PA_7, PA_6, PA_5); // mosi miso sclk DigitalOut cs(PB_6); int main() { cs = 1; spi.format(16, 2); // 16bit, SPI MODE2 spi.frequency(1000000); // 1MHz while (true) { cs = 0; int dat = spi.write(0); cs = 1; printf("DAT: %d\n", dat); ThisThread::sleep_for(1s); } }
動作確認
ビルドしたバイナリをボードに書き込み(Keil Studio CloudはWebベースですがこれができます)、伝統のTeratermで出力を観察しているところが以下に。
ボリュームを捻ると電圧が変わりそれに追従して出力値も変わります。タマに「飛んだ」値が出るのはノイズでしょうか。ADに与える電源などシッカリしたものにしたいものですが、まあ、接続の試験、Keil Studio Cloudの練習だし。