======================
(野村さんへのメモ)
・ここは主力(実製作)の部分なのでちょっと超過しているかもしれません。
・「Appendix　筆者オリジナル筋電センサ回路の変遷」は、本文の必要上、こちらに移動しました
・「★補足解説1」の部分は囲み記事として添えて下さい
・「★★★ブレッドボードは絶対に禁止★★★」の部分は、色付き、あるいは太字でお願いします(★★★は取って下さい)
======================

■第4部　マイコンでトライ！ 生体情報の信号処理の基礎■

第2章　mbedによる筋電情報システムの例

2-2　Arduinoシールド上に筋電センサ回路を作る　

●筋電センサ回路の製作と実装

筆者はこれまで、4世代の筋電センサ・システムを実現してきました(→Appendix1)が、その最新の第4世代の回路技術を活用して、今回(第5世代)の筋電センサ回路も、初段には生体計測に最適なローノイズ高入力インピーダンス差動増幅OPアンプAD627を活用しました。回路は図2-2-1のようなもので、初段はAD627、次に2段のAD8607のフィルタ回路で、ほぼ定石通りです(→★補足解説)。単電源回路として動作させるための中点電位の生成には、シャントレギュレータLM4051を使用することで、センサ電極からオペアンプにノイズが逆流した場合に強くなりました。いずれの素子も、ネットから簡単に入手できます。

(図2-2-1　本システムの筋電センサ・フロントエンド回路)

初段のAD627は筋電センサ回路としてもっとも重要なのでスペックを確認しておくと(AD627Bの例)、
	・広い電源電圧(+2.2 V~±18 V)と低電源電流(85μA[max])により電池動作ＯＫ
	・1本の外付抵抗でゲイン(5倍〜1000倍)設定可能、レールtoレール出力
	・ゲイン・ドリフトは10ppm(Gain=5)と小さい
	・入力オフセット電圧は125μV[max]と小さい
	・入力オフセット電圧の温度ドリフトは1μV/°C[max]と小さい
	・入力バイアス電流は10nA[max]と小さい
	・入力換算(RTI)ノイズは38nV/√Hz(1kHz, Gain=100)と小さい
	・同相信号除去比(CMRR)は100Hzで92db、80kHzの帯域幅(Gain=5)にわたって83dbと良好
などとなっています。昔であればこんな理想的な増幅器は「夢」だったのですが、アナログの世界も地道に進化していることに圧倒されます(日本の半導体メーカがこの領域から去ってしまったのがちょっと残念ですが)。

==================
★補足解説1　ここから↓

第3章で関連するアナログ回路に関して解説しますが、図2-2-1の筋電センサ回路について補足すると、まず初段のAD627は10倍ゲインに抑えています。これは、生体とセンサ電極間には電解質（汗）があり、いわば電池として常にDCオフセット(数10ｍV程度)が発生するので、この初段で100倍とかのゲインを稼ごうとすると、信号が飽和してしまうためです。次段のAD8607アンプをそれぞれ10倍ゲインとして、初段と合わせて10×10×10=1000倍ゲインで「Vオーダ」の出力を得ています。OPアンプ1段だけで100倍以上の高増幅度を狙うと、増幅器自身の発生するノイズの影響が大きくなる事にも注意して下さい。

そして次段AD8607の入力の0.33μFに100kΩを直列接続した１次HPFのカットオフ周波数 [f=1/(2πCR)]　は4.825Hzで、これはJIS「筋電」の時定数が「0.032秒、5Hz」と定義されている事に対応しています。このフィルタを、身体動作によるアーティファクトで基線が暴れることを想定してカットオフ周波数を50Hz程度に上げることもよくあります。この次段AD8607の出力側はゲイン設定の1MΩに330pFを並列接続して緩いLPFとなり(カットオフ周波数は482.5Hz)、全体としてBPFを構成しています。

2段目AD8607の入力側のHPFは1.0μFに100kΩを直列接続してカットオフ周波数1.592Hzでほぼ「素通し」、出力側はゲイン設定の1MΩに1000pFを並列接続して(カットオフ周波数159.2Hz)、全体としてはBPFというよりほぼLPFとなっています。これはNucleoF401REのA/Dコンバータのサンプリングに対する緩いアンチエイリアスフィルタと見ることも出来ますが、筋電信号はホワイトノイズみたいなものなので、周期的な成分を持つ他の生体信号ほど厳格にLPFをかけなくてもいい、とも言えます。

★補足解説1　ここまで↑
==================

今回のシステムでは、この筋電センサ回路を、NucleoF401REに取り付けるArduinoシールド対応のユニバーサル基板に2チャンネル分、製作しました。シールド上には、筋電情報をホストPCにWiFi伝送するためのXBeeも搭載したので、手配線では2チャンネル搭載が限界でした。もしArduinoシールドソケットに対応した新基板を作れば、XBeeも搭載しつつ、4チャンネル程度の筋電センサ回路まで詰め込めると思います。
なお、★★★ブレッドボードは絶対に禁止★★★です。ブレッドボードのソケットと部品リードの接触抵抗は、この筋電センサ回路においては「致命的に駄目」ですので、必ずハンダ付けして下さい。

OPアンプは1.27mmピッチの小型フラットパッケージなので、まず図2-2-2のように、DIP(2.54mmピッチ)への変換基板の上に取り付けます。筆者は白光の「フラックス」を塗ってみましたが、ハンダごてで撫でると簡単に奇麗に出来ました。2チャンネル分の筋電センサ回路にはこの変換基板が4枚必要なので、図2-2-3のように、Arduinoシールド増設コネクタ、筋電センサ電極用コネクタ2個、XBeeモジュール用変換基板とともに、ユニバーサルArduinoシールド上に並べて配置を検討します。

(図2-2-2　変換基板でDIPピン間隔に変換)

(図2-2-3　ユニバーサル・Arduinoシールド基板)

回路図にはあまり現れませんが、OPアンプごとに電源ラインに105(1μF)のパスコン(積層セラミックコンデンサ)を入れ、かなりの空中配線を駆使して、Arduinoシールド上の筋電センサ回路は図2-2-4のようになりました。この余白部分のソケットには、秋月電子の変換基板にXBeeを載せて挿入します。

(図2-2-4　筋電センサ回路の実装の様子)

◆筋電センサ電極の製作

生体信号を検出するために皮膚に取り付けるセンサ電極で、一般にもっとも性能が良いのは「銀〜塩化銀」電極です。筆者は「純銀円盤」電極を用いた筋電センサ電極ベルトを自作・愛用してきました。また第4世代の筋電センサの実験では、「導電ゴムシート」電極を試して、まずまず使えるような感触を得ました。そして今回の筋電センサシステムでは、秋葉原で仕入れた「筋肉マウス」の「導電布(+導電ジェル)」電極を使用しました。(→Appendix2)

(図2-2-5　導電布による筋電センサ電極)

◆「USBオーディオ治具」の製作

これで筋電センサ回路から筋電電極まで完成して、オシロスコープで筋電信号の波形を見ることができるようになりました。ただし今回はNucleoF401REによるデジタル信号処理がメインなので、ここで道具として「USBオーディオ治具」を製作しました。これにより、第1章の図1-2-1のような、mbedプログラミングの材料となる自然な筋電信号を、データとして記録して何度でも再現・検証できるようにしました。毎回ランダムに異なる筋電信号に惑わされることも、筋電ベルトを片腕に密着させた不自由な姿勢でmbedプログラミングする事も不要です。回り道のようで、このような道具を作ることがプロジェクト全体を推進する、という例として参考にして下さい。(→Appendix3)

●XBeeによるWiFi伝送

今回の筋電センサシステムでは、ホストPCとのインターフェースに、「XBeeによるWiFi伝送」を採用しました。これまでの筆者の筋電センサは全て「有線」でしたが、特にUSB接続というのは生体信号のように微弱な世界では致命的にノイズが多いので、今回は筋電センサ情報を有線でホストに送ることは除外しました。ちょうどこのところ、いくつものシステムでXBeeをシンプルな「1対1通信モード」で活用していて「練れて」きていたので、ここで採用する事にしたわけです。(→Appendix4)

◆XBeeの設定

筆者はXBeeの高度な通信プロトコルを使ったことはなく、単純に「マイコンのシリアルポートを無線で延長する」という「1対1通信モード」で使っています。手元にいつも、38400bpsとか19200bpsとかの通信速度で、自分と相手がペアになるようにコンフィグレーションを書き込んだXBeeのペアをストックしていて、必要になると「ケーブル」に相当する「部品」として活用します。今回は38400bpsのXBeeペアを使いましたので、読者が他の通信速度を採用する場合には、NucleoF401REのプログラムで、筆者が「xbee.baud(38400);」とした部分を例えば「xbee.baud(19200);」などと変更して下さい。

◆NucleoF401REのジャンパ設定

NucleoF401REには3系統のシリアル通信ポートがありますが、ここではArduino互換シールドに割り当てられている「PA_2」と「PA_3」というポートを使用しました。もしNucleoF401REの他のポートを使う場合には、筆者が「Serial xbee(PA_2, PA_3);」とした部分を例えば「Serial xbee(PA_11, PA_12);」などと変更して下さい。また、この「PA_2」「PA_3」というポートは、defaultではUSB経由でホストPCと通信する(モニタ)ようになっているので、図2-2-6のようにNucleoF401RE基板の裏側の「SB13」と「SB14」のジャンパブリッジ(ジャンパをショートさせているチップ)にハンダごてを当てて外して切り離します。また、図2-2-7のように「SB62」と「SB63」のジャンパブリッジパターンが分離しているので、ここにハンダを盛ってショートさせます。この2箇所のジャンパ変更で、NucleoF401REのArduino互換シールドの「TX」と「RX」の端子はXBee通信に使えるようになります。

(図2-2-6　NucleoF401REのジャンパ設定(1))

(図2-2-7　NucleoF401REのジャンパ設定(2))

◆システムの電源回り

Arduino用の「XBee専用シールド」基板は、Arduinoの信号が+5VレベルでXBeeの信号が+3.3Vレベルなので、電圧レベル変換が付いています。本システムではユニバーサル基板タイプのArduino互換シールド基板なので、変則的な2mm間隔ピンのXBeeの搭載のために、図2-2-8の秋月電子の変換基板を使いました。便利なことにXBee用の+3.3V電源用3端子レキュレータが載っているので、ここで、システム全体の電源回りを以下のように整理しました。
	・外付けの電池ケースに単3アルカリ電池を4本 (+6V)
	・この電池電源を「低ドロップ3端子レギュレータ」　ＬＭ２９４０ＣＴ-５．０で+5Vに
	・この+5VをNucleoF401REの「外部+5V電源」として供給
	・ジャンパJP5をプログラム開発時には「U5V」にしてUSB電源を使用
	・ジャンパJP5を筋電センサ回路動作時には「E5V」にして電池電源を使用
そして秋月電子の変換基板の電源には、NucleoF401REの+3.3V電源でなく、電池からＬＭ２９４０ＣＴ-５．０で作った+5Vを供給しました。

(図2-2-8　秋月電子のXBee変換基板)

◆XBeeシリアル通信のプロトコル設計

NucleoF401REでXBeeを経由してホストPCとシリアル通信する部分のプログラミングについては次節(2-3)で詳しく解説しますが、ここではそのプロトコルの検討について紹介します。XBeeを「1対1通信モード」で使う、という事は、単純に8ビットデータが双方向で行き来するだけですが、実際にはホストPCから「コマンド」と「データ」を区別してNucleoF401REに送りたくなります。またNucleoF401REからの筋電情報についても、せっかく12ビットA/Dコンバータが10チャンネルもあるので、8ビットのデータがただ出力されるのでなく、「A/Dポートの番号」と「データ(12ビット/16ビット幅)」というような情報としてホストPCに送りたいです。

そのためには、「8ビットデータの羅列」である通信データを何らかのパケットにまとめた「メッセージ」とする必要があります。同じシリアル非同期通信のMIDI規格では、メッセージは2バイトないし3バイトのセットとなっていて、先頭データのMSBが必ず1である、というルールでデータを区別しています。そこで本システムではとりあえず、メッセージを「7バイトデータ」とする事にしました。

これは「6バイトの16進文字+1バイトの"CR"」というもので、定義としては以下です。末尾の「1バイトの"CR"(=13)」を確認して、非同期通信での次のメッセージの先頭を確定させる事になります。
	・通信は38400のスピードで双方向、同一フォーマットとする
	・データは常に7バイト単位で、最終バイトのデータは「CR」=13、とする
	・先頭から6バイトは16進文字(0〜9,A〜F)の大文字とする(a〜f　はNG)
	・つまり先頭から6バイトの部分が、000000〜FFFFFFの24ビットデータとなる

以上のような準備を経て、システムは図2-2-9のように繋がりました。ホストPCのUSBハブには4つの機器が繋がっていますが、これは以下のようになっています。
	・NucleoF401RE開発用のUSB接続
	・XBee経由で送られた情報をホストのMaxが受信するXBee→シリアル
	・ホストのMaxから基準信号をNucleoF401REに与えるUSBオーディオ治具
	・USBオシロスコープ

(図2-2-9　ホストPCのUSBハブに繋がった4つの機器)

これにより、1台のMac(ホストPC)の2画面を使って、図2-2-10のように一気にプログラム開発できる環境となりました。

(図2-2-10　ホストPC[2画面]によるNucleoF401REプログラミング風景)
