動作も確認できたところで、いよいよ実際のインプリメンテーションに向けて作業を始める事にする。410回にも軽く触れたのだが、やりたいことはWattMeterのデータをもっと高精度に取得することだ。なので、とりあえずはArduinoと同じことが出来るのをまずは目標としたい(将来的にはI2Cあたりで液晶をつけるとかも考えているが、それはとりあえず動いてからということで)。となると、やるべきことは、

  • ADC経由でWattMeterの信号を取得
  • 取得した信号から電流/電圧/位相を取得し、ここから消費電力と力率を計算
  • 値をPCに転送

ということになる。最初の2つはまぁそれほど問題はなさそうだ。ADCに関してはサンプルもいくつかあるため、これを見ながら何とかできそうだし、計算はもうアルゴリズムと処理速度の問題だけである。もし間に合わなければFPUあるいはDSPを使うことになり、最悪アセンブラのお世話になる可能性はあるが、今のところはそこまでしなくても行けそうな気がしている。問題は最後の、どうやって転送するかである。とりあえずざっと調べたところ、方法論としては、

  1. USB OTGポートの上でVCPを構築する
  2. USB OTGをCDC(Communication Device Class)として動かし、これ経由で通信する
  3. UARTなりUSARTなりのポートにUSB変換チップ(例えばFT232R)を接続する
  4. STLINK2のために搭載されているSTM32F103経由でVCP(Virtual COM Port)を構築する

あたりがある。もう少し説明しよう。

(1)は、STM32F2ベースのSTM32F207VGで利用できる方法である。STM32F207VGは、STM32F4-Discoveryに搭載されているSTM32F407VGと非常に似たハードウェア構成をとっており、最大の違いはCPUコアがCortex-M3かCortex-M4か、というあたりである。このSTM32F207VGには、評価ボード上で利用できるVCP用のライブラリと、これをホスト(PC)側で扱うためのデバイスドライバが用意されている。なので、もしSTM32F207VG用のVCPのライブラリを使ってSTM32F407VG上でVCPのFirmwareが動作すれば、そのまま接続して普通に通信が出来る。

(2)はもう少し正攻法である。STM32F407VGはUSB Host/Device/OTGとして動作するUSBポートを1つ持っており、これがMicroUSBとして外に出ているわけだが、この上でUSBのCDC Classを使うためのライブラリが標準で用意される。CDC Classは名前の通りUSBポートを経由して通信を行うためのもので、この中のCDC-ACM Classを使うと仮想的にCOMポートが利用できる。実のところ、(1)にしても実態はCDC-ACM Classを利用して通信を行っている。一見よさそうに見えるのだが、実はちょっとWindows環境では懸念がある。このCDC ClassはMicrosoftが標準でusbser.sysというドライバを提供してくれるので、これを使えば一応使えるのだが、このClassは2つのBulk Transferと1つのInterrupt Transferを利用する。問題は、こうした使い方がUSB 1.1の1.5Mbps(USB Low Speed)では許されていないことだ。USB 1.1でも12Mbpsの方は問題ないし、USB 2.0以降でも問題はない。このため、しばしばベンダーはusbser.sysを使わずにこのあたりを対策した独自ドライバを配布していたりする。(1)の場合、STMicroelectronicsがVCP DriverをWindows用に提供しているのはこのためだろう。また、STM32F4をリセットすると、ポートの接続がリセットされるという問題もある。

ただ幸いというべきかどうか、筆者が現在利用しているWindows 7の環境の場合、この問題が多かったusbser.sysに代えてUSB8023.sysという新しいドライバが提供されているので、これを一応試してみる価値はあるかな?と考えている。

(続く)