概要
本稿では、視覚障害者用の水平器(水準器)を取り上げます。その設計において鍵になるのは、アナログ・デバイセズの加速度センサー「ADXL312」です。同センサーは、水平面と垂直面における重力を測定する役割を果たします。同センサーが正確に水平または垂直な状態にある場合に、水平器はブザー音を鳴らします。
この水平器は車載アプリケーションでも利用できます。例えば、トレーラーを水平に保つための傾きセンサーとして使用するといった具合です。その場合、水平器はジョッキー・ホイールから離れた場所に配置される可能性があります。また、車両の安定制御システムやドローンで利用することも可能です。
はじめに
Amar Latif氏は、英国のテレビ番組「Celebrity MasterChef」に出演したことを機に、同国の料理業界で一躍脚光を浴びる存在になりました。ただ、同氏は単に料理人として優れているだけの人物ではありません。旅行会社の経営者であり、モチベーショナル・スピーカーでもあります。南米のほぼ全域を徒歩で縦断した経験を持ちますし、テレビ番組のパーソナリティも務めています。このように、同氏からは無限のパワーがあふれているようにも感じられます。しかし、実際には彼にできることには限界があります。
同氏は95%の視力を喪失しているのです。現在は、技術がますます進化し、世界中がそれに追随すべく奮闘している状況にあります。その闘いは、視覚障害者にとってはより厳しいものになります。多くの場合、新たな技術を活用するには、より長い時間にわたって画面の前で過ごさなければならないからです。視覚障害者にとって、そうした新技術からメリットを享受するのは非常に困難です。
ただ、視覚障害者の生活を豊かにするために新たな技術を開発することもできるはずです。視覚障害者として登録されている方のうち、全盲の方は18%ほどです。つまり、大多数の方は、細部まで識別できるか否かはともかくとして、いくらかの視覚機能を有していることになります。このような背景から、視覚障害者の方にとって役に立つ水平器を開発しようというアイデアが生まれました。
設計の概要
本稿で紹介する傾きセンサーはADXL312をベースとします。同製品は、消費電流が極めて少ないことを特徴とする加速度センサーです。これを使用すれば、X、Y、Z軸方向の最大±1.5gの加速度を測定することができます。取得したデータは、SPI(Serial Peripheral Interface)バスを介して読み出すことが可能です。パッケージのサイズは5mm×5mm、スタンバイ・モードにおける消費電流は0.1μAです。測定分解能は10ビットで、各軸について最小±2.9mgの変化を検出できます。各軸の測定結果は、最大値/最小値が±511のデータとして保存されます。実際の保存形式は2の補数です。システムで使用するマイクロコントローラはそれらの値を読み出し、1行/16文字に対応する液晶ディスプレイに表示します。
ADXL312のフルスケールの測定値は1.5gです。したがって、1gの重力はその2/3にあたります。ADXL312が正確に水平な状態にある場合、Z軸のレジスタの測定値はフルスケールの2/3になり、X軸とY軸の測定値はゼロになるはずです(図1)。同様に、ADXL312が完全に垂直な状態にある場合には、X軸の値はフルスケールの2/3、Y軸とZ軸の値はゼロになるはずです。いずれかの軸に傾きがあると、ADXL312の最大測定値はその傾き角度の正弦に比例して減少します。また、それ以外の軸の測定値は増加します。
ADXL312の内部構造
ADXL312は、シリコン・ウェーハ上に形成されたPSM(Polysilicon Surface-micromachined:ポリシリコン表面微細加工)構造から成るMEMS(Micro Electro Mechanical System)デバイスです。この構造がポリシリコンのばねによってウェーハ表面の上に吊り下げられ、加速度に対する抵抗を与えます。
固定のシリコン・フィンガで可動プルーフ・マス上のフィンガを挟むことにより、差動コンデンサが構成されます(図2)。加速度は、このコンデンサの容量値の変化を検出することによって計測されます。加速度によって梁が歪み、差動コンデンサが不平衡になったことを受けて、センサーの出力として振幅が加速度に比例する信号が得られます。
ADXL312にはI2CまたはSPIによってアクセスできます。X/Y/Z軸のデータは、6個のレジスタ(8ビット)に格納されます。ADXL312は、32レベルのFIFO(First In, First Out)、複数の機能に対応する2種の割込み、オフセット・レジスタ、機械的セルフ・テスト、自動スリープ・モードなど、多くの機能を備えています。
水平器の設計
図3に示したのが、傾きセンサー全体の回路図です。
ADXL312の電源電圧は最大3.6Vですが、液晶ディスプレイとブザーには5Vの電源が必要です。そのため、この回路に供給するメインの電圧は5Vとしています。この5Vの電圧は、3.3V/150mA出力のリニア・レギュレータ「ADP121」を使用して降圧します。得られた3.3Vの電圧を、ADXL312、マイクロコントローラ、EEPROMに供給します。
マイクロコントローラ(PIC16F883)のポートB(2番ピン、CALピン)は、10kΩの抵抗によってハイにプル・アップされています。このピンは、ジャンパJP1によってグラウンドにも接続できるようになっています。マイクロコントローラは、起動時にCALピンの状態を確認します。同ピンがジャンパによってローにプル・ダウンされている場合には、まずX/Y/Z軸のレジスタからデータを読み出します。続いて、それらの値をゼロから差し引きます。次に、得られた結果をADXL312のオフセット・レジスタに書き込むと共に、外付けのEEPROM(25AA040)に格納します。ADXL312は、プロセッサからの介入を必要とすることなく、オフセット・レジスタの値をその後の測定値に自動的に加算します。それにより、キャリブレーションに基づくオフセット値が測定値から差し引かれます。
ジャンパが接続されていない場合、CALピンはハイにプル・アップされており、キャリブレーションのルーチンは割愛されます。オフセット値はEEPROMから読み出され、ADXL312のオフセット・レジスタに書き込まれます。製造時には、水平器をキャリブレーション用の治具に配置し、CALピンをローにプル・ダウンすることで、デバイスのキャリブレーションを実施することができます。その際、オフセット値はEEPROMに保存されます。そして、キャリブレーションの実施後にはジャンパを取り除きます。その結果、システムの起動時には、EEPROMからデータを読み出すことによって、キャリブレーションに基づくオフセット値がADXL312のオフセット・レジスタに書き込まれるようになります。
この水平器の利用時には、ソフトウェアによる制御が行われ、各軸の測定が8回実施されます。その平均値が、16文字に対応する液晶ディスプレイに表示されます。ディスプレイは100ミリ秒ごとに更新されます。
図4は、各センサーの測定値がゼロに近い場合に感度が最大になることを表しています。そのとき、正弦波の傾きが最大になります。そして、傾きの変化に対応した重力の測定値の変化も最大になります。
幸い、この水平器では、各センサーが完璧に水平で、センサーの測定値がゼロに近い場合だけ測定が行えれば十分です。
ソフトウェアは、X軸とZ軸の両方を同時にキャリブレーションできるように記述しました。ADXL312を水平なプラットフォーム上に配置すれば、傾きセンサーのX軸のキャリブレーションを容易に実施できます。その際には、Z軸に1gの力がかかります。そこで、Z軸の測定値を取得し、1gにおけるフルスケールの値(オフセット・レジスタに読み込まれた誤差があればそれを加算)と比較する必要があります。水平面と垂直面の両方でキャリブレーションを実施すれば、傾きセンサーの各軸をより正確に補正できます。ただ、そうすると2段階のキャリブレーションを実施することになるので、ソフトウェアも変更しなければなりません。
表1に2の補数の例を示しました。正の値については、通常の2進数の表記と同じです。負の値については、最上位ビット(MSB)を符号ビットとして使用します。正の値のMSBは0で、負の値のMSBは1です。
10進数の表記 | 2進数の表記 |
+511 | 01 1111 1111 |
+1 | 00 0000 0001 |
0 | 00 0000 0000 |
-1 | 11 1111 1111 |
-511 | 10 0000 0001 |
正の値の2の補数は、すべてのビットの値を反転して1を加算することによって得られます。数値が0から-1に変化すると、コードは「00 0000 0000」から「11 1111 1111」に変化することになります。
ソフトウェアは、X軸とZ軸のレジスタの値を読み出し、いずれかが0または1023(11 1111 1111)であればポートB、ビット5をハイにします。それによってトランジスタQ1がオンになり、5Vを印加しているブザーが音を発します。傾きセンサーが完璧に水平であれば、X軸の測定値は0または1023です。一方、完璧に垂直であれば、Z軸の測定値が0または1023になります。両方のレジスタの値が0でも1023でもない場合にブザーの音は停止します。
精度の向上、機能の改良
1つの軸だけについて考えると、1gという最大測定値が得られるのは、その軸に沿って重力が印加される場合です。図5に示すように、ADXL312を90°まで徐々に傾けると、測定値は徐々に減少して最後は0gになります。
印加される重力は次の式で表されます。
ここで、φは水平を基準とした傾きの角度です。ADXL312では2.9mgまで測定可能なので、角度としては0.17°まで測定できることになります。気泡式の標準的な水平器の精度を評価するのは容易ではありません。気泡の正確な位置を判定するのが難しいからです。しかし、実験の結果から、気泡が中心からずれているようには見えない状態でも、1.2mの水平器の先端は約3.2mm動いている可能性があることがわかっています。3.2mmというのは、何も実装していない2枚のプリント回路基板の厚さに相当します。また、これは約0.15°の角度に相当するので、気泡式の水平器を電子式の傾きセンサーに置き換えても、分解能はほとんど低下しないことがわかります。
より高い精度が必要な場合には、±1gの範囲で11ビットの分解能が得られる「ADXL313」を使用するとよいでしょう。インターフェースとレジスタ・セットはADXL312とほぼ同じなので、ソフトウェアを大きく変更する必要はありません。また、「ADXL355」を使用すれば、格段に優れたノイズ性能と高い分解能が得られます。
ADXL312のノイズ密度は340µg/√Hzです。ノイズ性能は、帯域幅が狭いほど高くなります。ADXL312の帯域幅は3.125Hz~1600Hzの範囲でプログラム可能であり、デフォルトでは50Hzに設定されています。帯域幅を狭めればノイズ性能は向上しますが、それによってディスプレイの更新レートも低下します。帯域幅を6.25Hzに設定した場合のRMSノイズは850µgです。測定回数を増やして多くの測定値の平均をとれば、ノイズはより低くなります。
更なる改良点として、液晶ディスプレイに角度の値を表示できるようにするということが考えられます。しかし、そのためにソフトウェアで正弦関数や余弦関数の計算を行うには、C言語の算術関数ライブラリを使用する必要があります。そうした関数を導入すると、ローエンドのマイクロコントローラにおいて、あまりにも大きなコード領域を占有してしまうことになります。ただ、テイラー展開を使用すれば正弦関数の近似値を得ることができます。これであれば、コード領域の占有量をかなり小さく抑えられるはずです。
まとめ
ADXL312を使用すれば、ローエンドのマイクロコントローラに簡単に接続できる低コストの傾きセンサー・システムを構築することができます。本稿で示した設計は、従来の気泡式水平器に匹敵する精度を達成できることが実証されています。また、電子式のインターフェースを利用できるという長所も備えています。トレーラーの水平化システムや安定制御システム、ドローンなど、傾きの計測を必要とするより大きなシステムに組み込むことが可能です。
ただ、より重要な長所は、視覚障害者にメリットを提供できることです。本稿では、ハードウェア、ソフトウェア、EEPROM、音声/視覚出力を含むシステム・レベルの設計例を示しました。