アプリケーションノート 3845

MAXQマイクロコントローラの実用例:MAXQ2000による自転車用コンピュータの設計

筆者: Kris Ardis

要約: ツールドフランス優勝を夢見る熱心なサイクリスト用に作られたこの小型のコンピュータは、サイクリストのトレーニングに役立ちます。この自転車用コンピュータは、MAXQ2000マイクロコントローラをベースに、速度計、時計、温度計、湿度センサー、心拍数モニター、およびストップウォッチを内蔵しています。



あまり知られていませんが、私はツールドフランスに向けてトレーニングしています。私より少々有名なもう一人のテキサス男のように、私もいつかあのレースで優勝することができるかも知れません。確かに、その有名な方のテキサス男は、フレンチアルプスの厳しい登りに立ち向かう体力、信念、根性、勇気、そしてスタミナを持っています。しかし、私の方も彼にはないものを持っています。MAXQ2000マイクロコントローラです。

MAXQ2000は、ダラス・セミコンダクタのエンベデッドアプリケーション向け高速、低ノイズ、低電力マイクロコントローラMAXQファミリの最初の製品です(MAXQマイクロコントローラの詳細については、付録2を参照)。MAXQ2000は、LCDコントローラ、SPIポート、リアルタイムクロック、2つのUART、ハードウェア積和演算ユニット(MAC)、および多数の作業に対応する十分な汎用I/Oを備えています。MAXQはシングルサイクルコアおよび低電力モードを備えているため、短時間で非常にわずかなバッテリパワーを使って多くのタスクを実行することができます。

しかし、ツールドフランスで優勝するためにマイクロコントローラが具体的にどのように役立つのでしょうか?

トレーニング開始—自転車用モニターの基礎

私の中には2つの部分があります。外に出てトレーニングしたいと考えるアスリートの部分と、トレーニングの向上に役立つガジェットを作成したいと考えるエンジニアの部分です。ツールドフランスを目標に、MAXQ2000を使用してバッテリ動作の自転車用モニターを作ることに決めました。自転車での自分のパフォーマンスを高めるため、速度計、時計、温度計、湿度センサー、心拍数モニター、およびストップウォッチが必要でした。MAXQ2000は、この問題を解決するための適切なツールをすべて備えています。

MAXQ2000のLCDコントローラは、このアプリケーションの表示に必要な数を大幅に上回る最大132セグメントに対応します。[1] MAXQ2000のリアルタイムクロック(RTC)を使用して、現在時刻の追跡管理およびストップウォッチの動作を実現しました。DS1923 Hygrochron iButtonによって、湿度と温度の測定を処理しました[2] (DS1923 Hygrochron iButtonの詳細については、付録1を参照)。残る2つの自転車用モニターの機能、すなわち自転車の速度の測定と心拍数の測定は、さらに興味深い(そして難しい)作業になりました。

速度の測定には、強力な磁石と1-WireカウンタのDS2423を使用しました。磁石を自転車の車輪上に配置し、車輪の1回転ごとにDS2423のカウンタを作動させます。速度の計算は単なる数学の問題で、高校で習った幾何を覚えていれば解けるはずです。[3]

心拍数モニターは、設計にとりかかる前の最後の障害でした。私はストラップで胸に装着するPolar F1心拍数モニターを持っています。それには心拍数を監視するための時計も付いていますが、アプリケーションの設計に心拍数モニターを組み込む方が面白いと考えました。少し調べた結果、Polarのトランスミッタは心拍ごとに短い5kHzのパルスを生成し、インダクタコイルでそれを拾うことが可能だと分かりました。いくつかのオペアンプ段で信号のフィルタと増幅を行い、マイクロコントローラで受信可能なものにすることができるはずです。[4]

上位レベルの設計を決めた後、MAXQ2000の評価キットを使用してアプリケーションのプロトタイプ作成を開始しました。

ルート確認—装置のプロトタイプ作成

MAXQ2000の評価キットは、自転車用モニターの多数の機能のコーディングとテストに役立つハードウェアを備えているため、プロトタイプ作成の出発点として最適です。評価キットには、4.5桁の7セグメントLCDディスプレイ、2つのプッシュボタン、およびHygrochron、DS2423、心拍数回路の接続に必要な全I/Oが付属します。アプリケーションのプロトタイプを作成した後、自転車のハンドルバーへの取付けに便利な独自のカスタムボードを作成することができます。

図1. MAXQ2000の評価キットは、自転車用モニターアプリケーションのプロトタイプ作成に必要なすべてのツールを備えています。
図1. MAXQ2000の評価キットは、自転車用モニターアプリケーションのプロトタイプ作成に必要なすべてのツールを備えています。

このアプリケーションはバッテリ動作のため、効率に注意してアプリケーションを書く必要がありました。可能な限り、MAXQ2000の低電力ストップモードを使用してバッテリ消費を節約し、プッシュボタン(外部割込み)またはリアルタイムクロックアラームをマイクロコントローラのウェイクアップに使用しました。

私はこのアプリケーションをメニュー方式にしようと考えました。1つのプッシュボタンを現在のアプリケーションモード(すなわち、速度、温度、時計)の選択に使用し、他のボタンをさらなる制御(ストップウォッチのスタート/ストップなど)に使用します。

アプリケーションのモードをグローバル変数に保存することで、アプリケーションのメニュー部分が簡素化されました。必要なのは、ウェイクアップし、アプリケーションモードを変更し、新しいデータを表示し、スリープに戻ることのみです。これはすべて短時間で行われるため、非常に「パワーフレンドリー」です。

バッテリ寿命にとって難題なのは、センサーの読取りでした。このアプリケーションでは、多数のセンサー(1つの温度および湿度センサー、1つの速度センサー、および1つの心拍数センサー)を監視する必要があります。温度または湿度の変換は実行に750msかかる高消費の演算のため、できる限り回数を減らします。温度と湿度の読取りは、5秒に1回で間に合わせることにしました(たとえフレンチアルプスでも、これより激しく変化する気象条件の中を自転車で通過することはたぶんないでしょう)。

速度センサーの読取りは、はるかに短時間で可能ですが、設計上の興味深い問題がありました。我々は本当に速度を測定するのではなく、所定の時間内における車輪の完全な回転数を測定します。磁石がDS2423の位置を通過する正確なタイミングは分からないため、単純に車輪の回転間の時間を使用することはできません。代わりに、アルゴリズムで数秒分の入力を追跡管理し、それらの平均を求める必要があります。したがって我々の自転車用モニターは、速度の変化に即座に反応するのではなく、代わりに平均速度を測定することになります。

試運転—メニューの立案とコーディング

コードを書き始める前に、メニューシステム(各ボタンの機能)を定義しました。第1のボタンは、各種モード(温度、速度など)を切り替えます。残りのボタンは、各モード内のオプションに使用します。このメニュー(表1)は、コーディングが必要な全機能のリストアップに役立ったのみでなく、カスタムボードにボタンがいくつ必要になるかも特定してくれました。

表1. 自転車用モニターのメニュー*
Mode Button 2 Function Button 3 Function
Clock Hours++ Minutes++
Speed Change MPH-KPH None
Temperature Change F/C None
Humidity None None
Stopwatch Start/Stop Reset
Heart Rate None None
*この表は、アプリケーションのメインメニューの動作内容、および他のボタンが何の機能を実行するかを決定するために作成しました。

MAXQ2000の評価キットは2つのプッシュボタンを備えているため、カスタムハードウェアを開発する前に、この機能の大部分のプロトタイプを作成することができました。

コードの出発点として、メインメニューのループを実装しました(リスト1)。このコードの最も重要な部分は、application_mode変数の書換えと、Display()関数の呼出しです。Display()関数は、時間、温度、またはその他のデータをLCDスクリーンに表示します。メニューハンドラ内のその他のコードは、電力の最適化を実現するもので、dotemperaturedohumidity、およびdocounterの各フラグによって、プログラムがウェイクアップしたときにそれらのセンサーをチェックすべきかどうかを示します。チェックが不要の場合、プログラムはそれらの動作をスキップし、マイクロコントローラがより短時間でスリープに戻ることを可能にします。スリープ時間は、割込みからも設定されます。装置がストップウォッチモードの場合、10分の1秒の桁をリアルに更新するため、十分な頻度で表示を書き換える必要があります。

リスト1. 自転車モニターアプリケーションのメインメニューのコード。省電力化のため、センサーの読取りは必要時にのみイネーブルされます。

Display()関数の動作は、現在のアプリケーションモードによって異なり、適切な関数を呼び出してデータをLCDスクリーンに表示します。たとえば、アプリケーションが湿度検出モードの場合、Display()関数はshowHumidity()関数を呼び出します。Display()によって呼び出されるshowHumidity()などの関数は、小型かつ高速で、単に何らかの入力データ(温度や現在時刻)を受け取り、LCDスクリーンに表示するために意味の分かる形式に整形します。

我々が選んだLCDスクリーンへのデータ書込み方法は簡素です。LCDスクリーン上の個々の文字は、MAXQ2000のレジスタ空間の1つのLCDレジスタによって制御されます。LCDコントローラが陰でコモンおよびセグメント信号を生成するため、数字の表示に関してソフトウェアで必要な処理は、LCDレジスタへの値のロードのみです。関数lcd_getlcddigitは、入力された数に基づいてLCDレジスタにロードする適切な定数を参照します。

    // display the number 5 in the second LCD digit
    LCD2 = lcd_getlcddigit(5);
機能メニューシステムが用意できたところで、アプリケーション各部の検討を開始しました。アプリケーションのメインループのプログラムの流れを、リスト2に示します。ここで、MAXQ2000が温度、湿度、および車輪の回転を測定することによって、環境をモニターします。

リスト2. アプリケーションのメインループの擬似コード。主要なセンサーが読み取られ、アプリケーションはスリープに戻ります。ウェイクアップ割込み中に呼び出されたディスプレイ関数が、センサーデータを表示します。

メインループは、プッシュボタンのデバウンス処理も行います。外部割込みをディセーブルし、200msの間スリープに移行した後、ウェイクアップしてプッシュボタンを再びイネーブルします。デバウンスルーチンの後、コードはどのセンサーを読み取る必要があるか決定します。それらの読取り結果は、Display()関数がそれらを使うことができるように、グローバルなデータ位置に保存されます。センサーの読取り後、MAXQ2000は再び低電力スリープモードに戻り、プッシュボタン割込みまたはRTC割込みによってウェイクアップされるのを待ちます。

RTC割込みは自転車用モニターアプリケーションにとっての鼓動で、LCDスクリーンを更新するためにDisplay()ルーチンが呼び出される通常の方法です。RTC割込みルーチンが完了すると、MAXQ2000はメインループに戻り、必要なセンサーの読取りを開始し、スリープに戻って、次のクロック割込みを待ちます。

メニューエンジン、クロックアラーム、およびメインループのコーディングが終わると、アプリケーションの中核部分が揃ったことになります。引き続きMAXQ2000の評価キットを使用して、抜けている部分を埋める作業を開始し、アプリケーションの残りの機能をコーディングします。

温度および湿度センサー

最初にコーディングすべき機能の1つは、温度と湿度の測定です。DS1923は、その両方を測定することができます。堅牢なiButton形状の中に、温度センサーと湿度センサーの両方が内蔵されています。DS1923を接続するため、1-Wireパブリックドメインキットのポートを使用しました。このキットは、iButtonおよびその他の1-Wireデバイスと通信するためのオープンソースのルーチン集です。[5] DS1923の測定には750msかかり、このアプリケーションは省電力を重視するため、測定は時々行うのみとし、温度(または湿度)モードへの移行時に1回、およびその後そのモードに留まっている間は5秒に1回測定します。

現在時刻の表示

MAXQ2000は、時計表示の実装も容易です。内蔵RTCは、32ビットカウンタに秒以下8ビットの分解能で秒数を積算します。起動時、RTCカウンタは0に初期化されます。時刻を計算するため、アプリケーションは単に合計の秒数を60で割って経過した分数を決定し、次に分数を60で割って経過した時間数を決定します。次にこれらの値がそれぞれ60および24を法として縮小され、時刻が得られます。

現在時刻の設定にはプッシュボタンを使用しました。MAXQ2000のRTCカウンタはソフトウェアで設定可能なため、これも簡素な操作です。時間または分を足すには、適切な数の秒数をRTCカウンタに加算します。

ストップウォッチ

ストップウォッチの実装は、もう少し難題でした。RTCは元々計時を行っているため、この機能にRTCを使用するというのは魅力的な考えです。ストップウォッチは自由にスタート/ストップすることができる必要がありますが、RTCをスタート/ストップすることはできません。可能な解決策として、MAXQ2000の3つのタイマーの1つを使用して、100msごとに割込みを生成するように調整し、それによってLCDスクリーンを更新する方法が考えられます。しかし、システムにもう1つの割込みを導入する代わりに、よりソフトウェア指向の方法でストップウォッチを実装しました。

ストップウォッチは、時間の積算器に他なりません。簡素なストップウォッチは、単にいつスタートしたかを記憶し、経過時間を継続的に表示します。しかし我々のアプリケーションの場合、一時停止可能なストップウォッチが必要なため、問題がより複雑になります(我々のアプリケーションでは、スタート時からの経過時間はもう無効です)。代わりに、この問題を解決する方法として累積時間を考えました。

ストップウォッチが0からスタートするとき、RTCによって報告された時間を「スタート時間」の変数にセットし、「累積時間」に0をセットします。RTC割込みが発生したとき、ストップウォッチが動作している場合にのみ「現在時間」の変数を更新した上で、現在時間の変数と記録されているスタート時間の差を表示します。ストップウォッチを止める場合、スタート時間と現在時間の差を累積時間にセットし、次にスタート時間と現在時間の両方に0をセットします。ストップウォッチが再スタートするとき、再びスタート時間に現在のRTC時間をセットし、ストップウォッチが以前と同様に動作するようにします。違いは、経過時間を表示するときに、累積時間も加算するという点です。リスト3のコードは、タイマーがスタートまたはストップされるときのロジックを示します。

リスト3. このコードは、ストップウォッチを成立させるソフトウェアの接着剤として機能します。難しい作業はここで処理されます。ユーザーがクロックを一時停止する場合、RTCを停止するわけにはいかないため、時間を積算する必要があります。

速度の測定

速度を測定するには、何らかの特別なハードウェアが必要です。DS2423とリードスイッチを使用した小型の回路を前輪の近くに実装し、車輪に付けた磁石が1回転ごとにセンサーを通過するようにする必要がありました。この回路は、かつてDallas Semiconductorの気象観測装置が風速の測定に使用していたものと同じ原理に基づいており、磁石がリードスイッチの近くを通過して接点が閉じると、DS2423が内部カウンタをインクリメントします。図2は、この回路を示します。

図2. リードスイッチに接続された1-WireカウンタのDS2423。磁石が近くを通過するとスイッチが瞬間的に閉じ、DS2423のカウントがインクリメントされます。
図2. リードスイッチに接続された1-WireカウンタのDS2423。磁石が近くを通過するとスイッチが瞬間的に閉じ、DS2423のカウントがインクリメントされます。

DS1923 Hygrochronとの通信に、すでに1-Wireパブリックドメインキットのコードを使用しているため、1-WireカウンタのDS2423からのカウントの読取りにも同じキットのコードを使用しました。

心拍数の監視

アプリケーションのこの部分は、ソフトウェアを専門とする私にとって最も作成が困難で、オペアンプに関する知識の不足を克服する必要がありました。私のPolar心拍数トランスミッタは、電極両端の電圧を検出するたびに(つまり、心臓の鼓動ごとに)短い5kHzの磁気誘導信号を出力します。この信号を受信するため、5kHzで共振するように調整したインダクタとコンデンサのペアを使用しました。しかし、結果の信号の大きさはわずか約10mVでした。外部の心拍数回路のサンプリングについて考えなくて済むよう、この信号を外部割込みに結び付けることにしました。10mVから3.6Vを得るため、信号が複数のフィルタおよび増幅用のオペアンプ段を通って、最後に簡素なコンパレータに入力します。これで、回路が心拍を検出すると、約5msにわたって0~3.6Vの短いパルスをいくつか受信することになります。この検出は外部割込みに結び付けられているため、ソフトウェアで必要なのは単に心拍が発生した時間を記録することのみです。これにかかる時間は5msのパルスより短いため、一時的に心拍割込みをディセーブルし、後続のパルスを検出しないようにする必要もありました。[6] [7]

図3. 心拍数モニターセンサーの回路図。5kHzの信号を受信するようにインダクタとコンデンサのペアを調整し、オペアンプでそれを増幅およびフィルタ処理します。プロトタイプの回路では、MAX4483を使用しました。
図3. 心拍数モニターセンサーの回路図。5kHzの信号を受信するようにインダクタとコンデンサのペアを調整し、オペアンプでそれを増幅およびフィルタ処理します。プロトタイプの回路では、MAX4483を使用しました。

新しいハードウェアの必要性

この時点まで、MAXQ2000の評価キットが実際に制約となるようなことは何もしていませんでした。しかし、フランス旅行用のシステムを作る準備は整っておらず、よりモバイルに適したハードウェアが必要でした。

ボードの設計は、基本的にMAXQ2000の評価キットの縮小版で、同じLCDスクリーンと電圧レギュレータを使用しています。EVキットの多数の未使用部品を設計から取り除きましたが、いくつかのアイテム(バッテリパック用のネジ穴、2つの追加のプッシュボタン、およびいくつかの追加の接続用ヘッダ)を追加しました。

ボードの設計に当たっては、他にもいくつか念頭に置くべきことがありました。1つは、ボードのサイズです。自転車のハンドルバーに容易に取り付けることができるよう、サイズを小さくする必要がありました。もう1つは、1-Wireインタフェースの取り付け場所および配置でした。交換の必要性が少ないため、(Hygrochron用の) iButtonホルダの理想的な場所はボードの裏面です。しかし、メインの自転車用ボードから数インチ下にあるDS2423回路への接続用に、もう1組のピンも必要でした。これらのピンは、自転車用モニターのボードからDS2423に直接ワイヤを延ばせるよう、ボードの裏面に配置しました。

図4. 自転車用モニターのボード。裏面には、DS1923用の1-Wire缶ホルダ、3つのAAバッテリ用のバッテリホルダ、およびDS2423回路への接続ピンがあります。
図4. 自転車用モニターのボード。裏面には、DS1923用の1-Wire缶ホルダ、3つのAAバッテリ用のバッテリホルダ、およびDS2423回路への接続ピンがあります。

フランスに向けて

すべてのハードウェアとソフトウェアが完成し、テストの準備が整いました。プラスチックのタイラップを使って、自転車用ボードをハンドルバーに取り付けました。これは明らかに長期的ソリューションとして最適なものではありませんが、まだデバッグが完了していないことが分かっていたからです。プラスチックのタイラップなら、容易に切断して自転車用ボードをオフィスに持ち帰り、再プログラムすることができます。

自転車に乗る前から、いくつかの機能については修正が不要だという確信がありました。時計、ストップウォッチ、温度、および湿度の表示は、リスクの少ない項目です。自転車に乗っても、それらの動作が変わることはありません。心拍数モニターについても、心配していませんでした。オフィスで正常に動作するなら、自転車の上でも何が違うでしょうか?主な懸念は、速度の測定でした。オフィスでは、磁石をセンサーの近くを通過させて速度の測定値が増減するのを確認しましたが、時速の計算が誤っているかどうかは分かりませんでした。

そのため、自転車に乗って速度の測定を作動させました。まだ家から通りに出ないうちに、自転車用ボードによると7マイル/時(mph)出ていました。これは少々高い気がしますが、途方もない値ではありません。近所を走り回ったところ、記録された最高速度は約50mphでした。私がどんなに良い体格だとしても、その速度ではマウンテンバイクの方がバラバラになってしまうでしょう。どこかで2倍の計算ミスをしていることはほぼ確実だったため、オフィスに戻ってコード中の式をチェックしました。どこにも問題はなさそうだったので(車輪の直径は2Rで合っていますよね?)、DS2423から報告されるカウントを表示するようにコードを書き換えました。ほとんど予想されたように、車輪が1回転するごとにカウントが2ずつインクリメントしました。磁石が通る位置がセンサーに近すぎたため、磁石が通過するたびにDS2423の回路全体が大きくバウンスしていたのです。磁石を数ミリ後退させることで問題が解決し、本来あるべき20mph~25mphに速度が低下しました。

予想どおり、時計、ストップウォッチ、温度、および湿度の各機能はすべて正常に動作しました。しかし、心拍数モニターを試したとき問題が発生しました。自転車に乗りもしないうちから、230bpm (beats per minute)という心拍数を報告してきたのです。私はあの有名なテキサスの自転車選手ほど体調が良くはないかも知れませんが、この数値は異常です。オフィスでデバッグするためにボードを持ち帰り、外部デバッガに接続すると、再び正常に動作しました(約60bpm)。電源の違いによって、センサーに何らかのノイズが発生している可能性がありました。3つのAAバッテリからのより不安定な4.8Vに比べて、デバッグボードは安定したクリーンな5Vを自転車用モニターに提供します。最初に、私はこれが量の問題ではないことを確かめようと考えました。レギュレータの動作が4.8Vでは限界に近い可能性があると思ったのです。9Vのバッテリを接続して電源を供給してみましたが、心拍数センサーはやはりおかしな動作をしました。マキシムのパワーレギュレータに対する疑いは晴れました。

次に疑ったのは、バッテリが恐らく低ノイズの4.8V電源を供給していないのではないかということです。当初は、3.6V入力ラインを安定化するために、心拍数回路に1µFのコンデンサを付加していました。より大容量のコンデンサをいくつか漁った後、私はV36とグランド間に22µFのコンデンサ、V36と信号グランド間に1µFのコンデンサを追加しました。これで回路のノイズが治まったようでした。心拍数モニターの受信範囲はややぎりぎりでしたが、ボードの方に少し体を伏せることによって動作させることにしました。

次の目的地:フランス...もしくは次のMAXQプロジェクト

自転車用モニターが動作するようになり、次のツールドフランスに向けてトレーニングを開始するときが来ました。私が入賞したというニュースを皆さんが耳にする可能性は低いでしょうが、MAXQマイクロコントローラについてさらに多くの話を聞く可能性は高いです。MAXQの充実したペリフェラルと高性能によって、このアプリケーションを容易に設計、開発、およびデバッグすることができました。今後さらに多くのバージョンのMAXQマイクロコントローラが発表される予定で、多数のアプリケーションで使用されることになるでしょう。

MAXQ2000の評価キットを入手して、MAXQマイクロコントローラがどのように役立つかをご覧ください。

参考文献
[1] マキシム・インテグレーテッド、MAXQ2000データシート
[2] マキシム・インテグレーテッド、DS1923データシート
[3] マキシム・インテグレーテッド、DS2423データシート
[4] Data Harvest Group, Inc.、Polar心拍数エクササイズセンサー
[5] 1-Wireパブリックドメインキット
[6] James W. Nilsson、Susan A. Riedel共著、「Electric Circuits, Fifth Edition」、Addison-Wesley、マサチューセッツ州レディング(1996年)
[7] Bill Bowden著、「Operational Amplifier Basics

リソース
MAXQ2000のホームページ
MAXQ2000の評価キット

付録1

DS1923 Hygrochron iButtonは、温度および湿度条件の測定と記録に使用することができる堅牢な環境センサーです。Hygrochronには、ミッション(サンプリングの頻度および対象をデバイスに指示する1組の命令)を与えることができます。最大8kサンプルの温度および湿度をiButtonの内蔵メモリに記録するか、または無制限のサンプルをシングルショット方式でホストに返すことが可能です。Hygrochron iButtonは、すべてのiButtonと同様に固有の64ビットID番号を備え、塵埃、湿度、水滴、および洗濯サイクルに対する高い耐性を持つステンレススチールの缶に格納されています。

付録2

MAXQは、Dallas Semiconductorによるユニークな、新しい16ビットRISCマイクロコントローラアーキテクチャです。非常に直交性の高い設計によって、ほぼすべての命令をシングルサイクルで実行可能です。このアーキテクチャは、高性能、低電力、および電気的低ノイズを実現するように設計されています。また、独自のモジュール性も備え、タイマー、I/Oインタフェース、およびアナログコンポーネントなどのMAXQのペリフェラルは、迅速かつ容易に新しいMAXQマイクロコントローラに内蔵することができるように設計されています。ハードウェアデバッグサポートによって、実際のハードウェア上でのソースコードデバッグが可能で、高価なエミュレータは不要です。最大の利点は、新しい命令セットを学ぶ必要すらなく使えるという点です(やはり楽しい作業ではありませんよね?)。MAXQは、IARのEmbedded Workbench、PhytonのProject MQ、およびRowleyのCrossWorksなど、おそらく皆さんがすでに習熟していると思われるツールによってサポートされています。

同様の記事がCircuit Cellarの2005年11月号(通巻184号)に掲載されています。

DS2423は、新しい設計には推奨されません。