【mbed】NucleoのAnalogIn::read_u16関数にバグ発見

このページをスマートフォンなどでご覧になる場合は、画面を横長にする方が読みやすくなる事があります。
2014年08月04日 公開。
2014年12月27日 一部追記。(報告したバグが訂正されていた)
Nucleo F103RBにI/Oピン一つで読み取れるキーパッドを接続した様子
↑ 画像をクリックすると拡大
Nucleo F103RBにI/Oピン一つで読み取れるキーパッドを接続した様子

目次

1. はじめに … 1ページ
2. I/Oピン一つで読み取れるキーパッドのライブラリ製作中に異常発生 … 1ページ
3. mbedのフォーラムでバグを報告してみた … 1ページ
4. 報告したバグが訂正されていた … 1ページ

1.はじめに

Arduino用にシールドなどを開発しているので、それをmbedでも使えるように、ライブラリを移植しようとして、mbedを勉強しています。その過程で、STMicroのNucleoシリーズのmbedのAnalogIn::readu16関数にバグを発見したので、報告します。

2.I/Oピン一つで読み取れるキーパッドのライブラリ製作中に異常発生

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関数を使ってライブラリを作る方が無難かもしれません。

3.mbedのフォーラムでバグを報告してみた

私はmbed初心者なので、0~4095の範囲の数を返すのが、仕様ではなくてバグである事に自信がなく、mbedのフォーラムで質問してみました。フォーラムで発言するのは、mbedの世界に慣れるためという意味もあります。そうすると、やっぱりバグだろうという内容のコメントが付きました

そこで、次はフォーラムでバグの報告を行いました。さて、無事バグの内容が確認され、コードが訂正されますかどうか…。

2014年12月27日追記

4.報告したバグが訂正されていた

しばらく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キーパッドキット 商品名 I/Oピン一つで読める4X4キーパッドキット
税抜き小売価格 900円
販売店 スイッチサイエンス
サポートページ
I/Oピン一つで読める4X4キーパッド(完成品) 商品名 I/Oピン一つで読める4X4キーパッド(完成品)
税抜き小売価格 1380円
販売店 スイッチサイエンス
サポートページ
I/Oピン一つで読める4X5キーパッドキット 商品名 I/Oピン一つで読める4X5キーパッドキット
税抜き小売価格 2400円
販売店 スイッチサイエンス
サポートページ
PCBgogoのバナー
Arduino 電子工作
このサイトの記事が本になりました
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。
電子工作で学ぶ論理回路入門
このサイトの中の人が書いた本です。
ISBN:978-4-7775-2280-4
工学社の書籍の内容の紹介ページ
この本の紹介記事
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。