2014年08月04日 | 公開。 |
2014年12月27日 | 一部追記。(報告したバグが訂正されていた) |
Arduino用にシールドなどを開発しているので、それをmbedでも使えるように、ライブラリを移植しようとして、mbedを勉強しています。その過程で、STMicroのNucleoシリーズのmbedのAnalogIn::readu16関数にバグを発見したので、報告します。
mbedのライブラリを作るなら、最初は簡単なものの方がいいなと思い、I/Oピン一つで読み取れるキーパッドのドライバをmbedに移植しようと思いました。mbedのマイコンボードについては、mbed祭り2014 @春の大阪というイベントに参加したときに頂いたST Nucleo F103RBが手元にあったので、それを使う事にしました。
このキーパッドはアナログ入力を使うので、まずA/D変換値の取得のサンプルプログラムを書くことにしました。その時書いたプログラムを次に示します。
#include "mbed.h" AnalogIn KeyPadAd(A0); int main() { while(1) { printf("%d %f\n",KeyPadAd.read_u16(),KeyPadAd.read()); } // while } // main
mbedでアナログ入力を行う場合、AnalogInというオブジェクトのインスタンスを宣言します。その際、どのピンの電圧をA/D変換するかも指定します。
AnalogIn KeyPadAd(A0);
では、A0ピンのA/D変換値の取得にKeyPadAdというオブジェクト変数を使う事を宣言しています。
A/D変換値を取得するメンバー関数はread()とread_u16の2種類があります。
read関数はA/D変換の結果を0.0~1.0の範囲に正規化して、float型で返す関数です。
一方でread_u16関数はA/D変換の結果をunsigned short型(16ビット)で返します。16ビット未満のA/Dコンバータを搭載したマイコンボードの場合は、下位ビットに0をパディングして、16ビット値にしてから返す事になっています。
前述のプログラムを実行したところ、read関数は正常に動くものの、read_u16関数は0~4095の範囲で値を返す事が分かりました。ST Nucleo F103RBは12ビットのA/D変換器を内蔵しているのですが、下位4ビットに0をパディング(すなわちA/D変換値を16倍する)せずに、A/D変換値をそのまま返しているようです。
浮動小数点を使わない方がコードが小さくなると思ってread_u16関数を試してみたのですが、この様なバグがあるなら、read関数を使ってライブラリを作る方が無難かもしれません。
私はmbed初心者なので、0~4095の範囲の数を返すのが、仕様ではなくてバグである事に自信がなく、mbedのフォーラムで質問してみました。フォーラムで発言するのは、mbedの世界に慣れるためという意味もあります。そうすると、やっぱりバグだろうという内容のコメントが付きました
そこで、次はフォーラムでバグの報告を行いました。さて、無事バグの内容が確認され、コードが訂正されますかどうか…。
2014年12月27日追記
しばらくmbedから離れていたのですが、今日STのSDK change logを見たら、v89の変更内容に、"Fix bug with analogin_read_u16 function return value"と書かれていました。試しに、mbedライブラリをアップデートして、先ほどのA/D変換値取得のサンプルコードをビルドしなおしたら、read_u16()関数が、下位4ビットに0をパディングして、16ビットに正規化した値を返すように、無事変更されていました。
私の報告が、バグフィックスのきっかけになったのかどうかは、はっきりしないですが、とりあえず、これでread_u16()関数が安心して使えるようになりましたので、mbed用のキーパッドのライブラリの制作を再開しようかと思っています。
商品名 | I/Oピン一つで読める4X4キーパッドキット | |
税抜き小売価格 | 900円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X4キーパッドキットサポートページ |
商品名 | I/Oピン一つで読める4X4キーパッド(完成品) | |
税抜き小売価格 | 1380円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X4キーパッド(完成品)サポートページ |
商品名 | I/Oピン一つで読める4X5キーパッドキット | |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X5キーパッドキットサポートページ |