記事の詳細
後閑哲也先生監修!デジマルマルチメータWeb詳細解説
※記事内に試作品の画像を使っているものがあります。
キット版の組み立て方はこちらのPDFもご参照ください
・Windows用アプリケーション [DMMv1.1.zip]
- 第一章 デジマルマルチメータの全体概要
- 第二章 デジマルマルチメータのハードウェア設計
- 第三章 デジマルマルチメータのファームウェアの制作
- 第四章 ラズパイアプリケーションの制作
- 第五章 デジマルマルチメータの使い方
第一章 デジマルマルチメータの全体概要
Raspberry Pi(以下ラズパイと略す)とPICマイコンを組み合わせた測定器で実験ベンチを製作することにします。
ラズパイのネットワーク機能を活用してブラウザベースの測定器で実験ベンチに必要と考えられる測定器を揃えることにします。
最初の測定器は測定器の必需品ともいえるデジタルマルチメータ(DMM)です。
単純なテスタではなく、ブラウザで扱えるちょっと高性能なマルチメータです。
電圧、電流だけでなく抵抗値、容量値、周波数も測定できます。
しかもすべて同時に測定が可能となっています。
完成した外観は写真1-1のようになります。
Raspberry Pi3BとPICマイコンで製作した計測制御ボードの2つで構成されています。
両者の接続はUSBシリアル変換ケーブルでラズパイのUSBと接続するか、ヘッダピン接続ケーブルを使ってラズパイのGPIOと接続するかの2通りがあります。
この写真はUSBシリアル変換ケーブルでUSB接続した場合です。
写真1-1
1-1 DMMのシステム構成
製作するDMMの全体構成は図1-1-1のようにするものとします。各種の計測そのものはPICマイコンで製作した「計測制御ボード」で行います。その計測データをラズパイにUSB経由またはGPIO経由で送信し、ラズパイでブラウザベースの表示にしてネットワーク経由でパソコンやスマホ、タブレットなどから観測できるようにします。また、計測制御ボード自身にも液晶表示器を接続し、計測値を常時表示するようにします。
1-2 DMMの仕様
製作するDMMの目標とする性能仕様は表1-1-1のようにするものとします。これらの全項目を同時に測定できるようにします。いずれも精度を制限する要素がありますが、抵抗、コンデンサ、発振子などの基準となるものに高精度のものが入手できればさらに精度をよくすることも可能です。
表1-1-1 DMMの計測項目と目標性能仕様
ラズパイと計測制御ボード間の通信フォーマットは表1-1-2のようにしました。
表1-1-2 シリアル通信のフォーマット
ブラウザでの表示形式は図1-1-2のようにするものとします。
表示は約1.5秒周期で更新し、全計測値が常に更新されるようにします。
URLのアドレスはIPアドレスとポート番号で指定します。
第2章 デジマルマルチメータのハードウェア設計
最初にDMMの心臓部となる計測制御ボードを製作します。このボードはPICマイコンを中心に構成しています。
計測制御ボードの外観は写真2-1のようになります。下部にあるZIFソケットがコンデンサと抵抗の測定端子となっています、左側中央にスイッチがあり、電圧の1/1と1/11の切り替え用ですが、本稿では1/11に固定することにしましたので使っていません。
2-1 全体構成
計測制御ボードの全体構成は図2-1-1のようにしました。全体制御はPICマイコンの16ビットファミリである「PIC24FV32KA302」を使いました。これを選定したポイントは、CTMUモジュールと、12ビット分解能のA/Dコンバータを内蔵しているということです。(CTMU:Charge Time Measurement Unit)
その他、次のようにPICマイコン内蔵モジュールをフル活用しています。
I2C:デルタシグマA/Dコンバータと液晶表示器を制御
UART:ラズパイとの接続
CTMU:容量測定用
12ビットADC:容量測定と抵抗測定
OC1、OC2(Ouptput Compare)、Timer1:周波数カウンタを構成
図2-1-1の構成で各計測項目は次のようにして実現することにしました。
①電圧:18ビットのデルタシグマA/Dコンバータで直接計測
②電流:1Ωの抵抗の電圧降下を18ビットデルタシグマA/Dコンバータで計測
③抵抗:基準抵抗と被測定抵抗で分圧した電圧を内蔵A/Dコンバータで計測し電圧比から求める
④容量:CTMUを使ってコンデンサを定電流充電し、基準コンデンサとの充電電圧の比から求める
⑤周波数:内蔵タイマで1秒間カウントして計測
次にそれぞれの計測方法を詳しく説明します。
2-2 デルタシグマA/Dコンバータによる電圧と電流の計測方法
電圧と電流の計測に使用した18ビットデルタシグマA/Dコンバータはマイクロチップ社製MCP3422で、8ピンのSOICという小型のパッケージとなっていて、次のような特徴を持っています。
・18ビット分解能のデルタシグマ方式A/Dコンバータ
・外部インターフェースはI2C
・2チャネルの差動入力でそれぞれどちらの極性も入力可能
・変換ごとに内部オフセットとゲインを自動補正
・高精度電圧リファレンス内蔵 2.048V±0.05%
・可変ゲインアンプ内蔵 ゲイン=1,2,4,8
・クロック用発振器内蔵
・変換:1回ごとまたは連続の指定が可能
・単電源:2.7V~5.5V
・動作温度範囲:-40℃~125℃
内部の構成は図2-2-1のようになっていて、マイコンとの接続インターフェースがI2Cとなっています。
18ビット分解能のデルタシグマA/Dコンバータ以外に、ゲイン可変のアンプと2.048V±0.05%という高精度のリファレンス電圧を内蔵しているのが特徴です。
I2C接続で、さらにこれだけの内蔵回路があると、外付け部品は特に必要がなくなりますから、ピン数が8ピンで足りることになります。
このA/Dコンバータのアナログ部の仕様は表2-2-1のようになっています。
表2-2-1 A/Dコンバータアナログ部の仕様
このMCP3422は、I2CによりPICマイコン側からコマンド送信で内部コンフィギュレーションレジスタを書き換えることで、各種の動作モードを設定します。また、A/D変換の結果を読み出すことになりますから、I2Cの通信では送信と受信両方の動作があります。
(1) コンフィギュレーションの設定方法
I2CでPIC側からデータを送信してコンフィギュレーション設定を行います。このときのデータフォーマットは図2-2-2のようになります。
マスタとなるPIC側から7ビットアドレス+Writeモードで1バイトのデータを送信します。アドレスは「0xD0」が標準となります。
下位3ビットは工場出荷時に設定可能ですので注文で指定します。指定しない場合は「000」というアドレスになります。続いて送信する1バイトのデータがコンフィギュレーションデータで図2-2-2のような構成となっています。これでA/Dコンバータの動作モードが決まります。チャネル選択は、MCP3422には2チャネルしか実装されていませんから00か01だけです。
このコンフィギュレーションで特徴的なのは、A/Dコンバータの分解能を4種類から選択できることです。このビット数により変換速度つまりサンプルレートが変わり、少ないビット数ほどサンプルレートが大きくなり高速になります。
また変換の仕方も、自立的に連続で変換を繰り返す連続変換モードと、マイコン側から変換開始を指定したときに変換するワンショットモードの2種類から選択できます。
可変ゲインアンプのゲインは、1倍、2倍、4倍、8倍の4種類から選択できます。
(2) データの読み出し
変換結果のデータを読み出す場合には、分解能によってビット数が異なりますから読み出すデータバイト数も異なってきます。この読み出しフォーマットを図2-2-3に示します。
18ビット分解能の場合は図2-2-3(a)のようにデータ部が3バイトとなります。最初のバイトは上位2ビット分が右詰でセットされ上位6ビットには最上位ビット(D17)の符号と同じ値がセットされます。2バイト目はデータのD15からD8までの8ビット分がセットされています。3バイト目はD7からD0の8ビットがセットされています。
これで変換結果のデータは取得できますが、その後のバイトにはコンフィギュレーションのデータがセットされています。レディービットをチェックするためです。
データ転送を終了させるには、マスタ側となるPICマイコンがNACKを返してからストップ条件を出力する必要があります。マスタ側がNACKを返さないとA/Dコンバータからの送信が終了とならず、永久にコンフィギュレーションデータが繰り返し出力されます。逆にNACKを返送すればそのバイトで通信が終了となります。
16ビット以下の分解能の場合は、データ部が2バイトで構成できますから、出力データも2バイトとなります。14,12ビット分解能の場合の上位の空いたビットには、データの最上位ビットの符号と同じ値がセットされています。
取得されたデータは正、負両方の場合があり、18ビット分解能で可変ゲインアンプのゲインが1倍の場合には、表2-2-1のような形でデータが変換されます。
正の上限値が+2.048Vで負の下限値は-2.048Vということになり、その範囲外の場合には上下限値のまま同じ値となります。この形式であれば、絶対値を求める場合、負の値のときは、0と1を反転させてから1を加えるだけで求められることになります。表のようにゲインが1倍の場合には、最小分解能が16μVとなります。
表2-2-1 取得データのフォーマット
(3) 電圧測定方法
A/DコンバータのPGAのゲインは1としてゲインの誤差が最小となるようにします。このときA/Dコンバータ直接では2.048Vまでしか計測できません。電圧の計測範囲としてはちょっと物足りないところです。そこで、前段に分圧抵抗を挿入することにしました。A/Dコンバータの入力抵抗が約2MΩですので、分圧抵抗の値に余り大きな値を使うと並列誤差が多くなってしまいますので、100kΩと10kΩで1/11に分圧することにしました。いずれも1%以上の高精度のものを使います。これで0Vから2.048V×11≒22.5Vまで計測できることになります。
分解能としては、16μV×11=176μVが理論値ですが、実際にはノイズが重畳しますから、余裕を見て1mVとしました。
(4) 電流測定方法
これは単純に1Ωの抵抗を回路に直接に挿入して電圧降下で計測します。これで最大2.048Aまで計測できることになります。分解能の理論値は16μAとなりますが、こちらも余裕を見て100μAとしました。
(5) C言語によるA/Dコンバータの制御方法
A/Dコンバータの制御といっても、インターフェースはI2C通信です。実際のコンフィギュレーション設定関数は、リスト2-2-1の「CmdI2C()」関数となります。I2Cを直接制御しています。
A/Dコンバータからの変換結果を入力するためのI2C受信関数がリスト2-2-1の「GetDataI2C()」関数となります。最初にスタート条件を出力し、スレーブアドレスをReadモードで出力します。この後、指定されたバイト数だけ受信を繰り返してBufferに格納してからストップ条件を出力しています。最後のデータ受信の場合にはNACK応答を返すようにしています。
2-3 A/Dコンバータによる抵抗の測定方法
この測定方法は単純で、図2-3-1のように基準抵抗と被測定抵抗を直列接続して電源電圧を分圧します。この分圧された電圧と、もともとの電源電圧の比に基準抵抗値を乗じて抵抗値を求めています。
基準抵抗が一つでは測定範囲が狭いので、1MΩと10kΩの2種類の基準抵抗を独立のチャネルとして用意しました。それぞれ図の式で計算して求めています。
2-4 コンデンサ容量の計測方法
これには内蔵モジュールのCTMU(Charge Time Measurement Unit)を使っています。CTMU内部は、図2-4-1(a)のような構成で、アナログピンに一定の電流を供給する定電流回路と、その電流をオンオフする充電用トランジスタ(充電TR)、接続されている容量成分の電荷を放電させるための放電トランジスタ(放電TR)がおもな構成部品となっています。
CTMUの動作は、まず、A/Dコンバータのアナログマルチプレクサ(MUX)で選択された一つのピンがA/DコンバータとCTMUモジュールに接続されます。この後の動作を簡単に示すと図2-4-1(b)のようになります。
CTMUの放電TRを一定時間オンにし、接続されたピンのコンデンサに残っている電荷を完全に放電させます。その後、充電TRをオンにして充電します。一定電流でコンデンサを充電しますから、直線的に電圧が上昇していきます。このときの電圧はコンデンサ容量に反比例して増加速度が変わります。一定時間だけ充電した後の電圧をA/Dコンバータで読み込み、同じ条件で充電した基準コンデンサの電圧との比でコンデンサの値を求めます。定電流値はx1(0.55μA)、x10(5.5μA)、x100(55μA)、x1000(550μA)と4段階で切り替えられますし、充電時間はプログラムで任意にできますから、かなり広範囲の容量を測定することが可能になります。
本稿では、1pFから1μFの範囲の測定ができるよう、基準コンデンサを0.1μF、0.01μF、0.001μFの3種類を用意して別々のアナログピンに接続しています。アナログピンはプログラムで自由に切り替えられますから、測定レンジを自動で切り替えることができます。そこで、容量測定では基準コンデンサを切り替える処理をすべて自動的に行うようにしてレンジの切り替えを自動化しました。
実際にCTMUを使って容量を測定する関数部がリスト2-4-1となります。
最初にレンジごとに充電電流を選択し、充電時間を設定しています。充電時間は基準コンデンサを充電したときの充電電圧が電源電圧のおよそ70%程度になるように調整しています。
その後被測定コンデンサのチャネルを選択してから10msec間放電し、その後充電を開始しています。充電時間は短時間ですのでDelay関数で設定しています。充電完了後にA/D変換して電圧値を求めています。
2-5 周波数の測定
周波数はPICマイコンの内蔵タイマのTimer1で入力パルスを1秒間カウントして計測します。これに関連する内蔵モジュールは図2-5-1のようになっています。
まずOutput Compare(OC1)とOC2を連結して32ビットモードとし、クロックの16MHzから1秒周期のPWMパルスを生成します。これで1秒間隔の割り込みが発生します。この割り込みで、タイマ1のカウントのスタートストップを交互に制御します。タイマ1は外部クロックをカウントするように設定し、オーバーフロー割り込みが発生したら、変数のOverFreqを+1するようにします。
これで次の1秒後にタイマ1を停止したとき周波数は下記で求めることができます。
周波数 = OverFreq×65536 + TMR1
このカウント精度はPICマイコンのクロック発振器の精度に依存します。今回は通常の8MHzのクリスタル発振器を使いましたので、発振器の精度が50ppmですからこれがそのまま周波数カウンタの精度になります。つまり有効数字5桁の精度ということになりますから、20MHzでは20000xxxまでは正しいということになります。
2-6 回路設計と基板製作
全体構成と個々の計測方法を実現する回路図が図2-6-1となります。
まず電源はラズパイのUSBかGPIOからの5Vを使いレギュレータで3.3Vにして全体に供給しています。
UARTのピンと書き込み用のピンが重なっているため、1kΩの抵抗を経由してUARTに接続しています。
電圧計測の入力部には1倍と11倍の切り替えスイッチを用意しましたが、本稿では11倍に固定としています。液晶表示器とデルタシグマA/DコンバータはI2C接続ですので、同じラインに接続してアドレスで区別しています。
周波数カウンタの入力にはオペアンプを挿入して電圧レベルを10倍に増幅するとともに可変抵抗で電圧を調整できるようにしています。このオペアンプには20MHz以上をフラットで増幅できるように周波数特性の良いものを使う必要があります。また入力コネクタには高周波用ということでBNCコネクタを使いました。
容量や抵抗の測定端子には、簡単に着脱できるものが必要でしたので、14ピンのZIFソケットを利用しました。容量測定用の基準コンデンサは3種類用意し、それぞれAN1、AN4、AN5に接続しています。コンデンサには精度の高いものが必要ですが、誤差2%のものしか入手できませんでした。被測定コンデンサはZIFソケットに実装するものとしてAN11に接続しています。
デルタシグマA/Dコンバータ周りは微小な電圧を扱うので、グランドをデジタル系と分離し、電源にはLCフィルタを挿入しました。基板のパターンもグランドを分離して1か所で接続するようにしています。
また入力にもノイズ対策のRCフィルタを挿入しています。
回路図を元に作成した基板の実装図が図2-6-2となります。組み立てははんだ面の表面実装部品から行い、次がジャンパ線、抵抗の順に実装するときれいにできます。
組み立てが完了した基板の部品面が写真2-6-1、はんだ面が写真2-6-2となります。
写真2-6-1 計測制御ボードの部品面
写真2-6-2 計測制御ボードのはんだ面
第3章 デジマルマルチメータのファームウェアの製作
続いて計測制御ボードのPICマイコンのプログラムの製作です。使ったPICマイコンが16ビットファミリですから、MPLAB X IDEとXC16 Cコンパイラを使って製作します。
3-1 プログラム全体構成
製作するプログラムの全体構成をフロー図で表すと図3-1-1のようになります。最初に多くの周辺モジュールの初期設定を行っています。その後液晶表示器に開始メッセージを出力してから、容量測定の較正を行うため現在値を測定し、それをオフセット値として実際の測定の際に引き算するようにします。
メインループでは、最初にデルタシグマA/Dコンバータを使って電圧と電流の計測をしますが、A/Dコンバータの動作が遅いですから、ステート関数として1回のループ実行ごとに2つのチャネルを交互に計測するようにしています。計測値は液晶表示器の1行目に表示します。
次に容量と低抵抗値と高抵抗値の測定を実行しバッファに格納します。周波数の測定はOC2の1秒周期の割り込み時にタイマ1のカウント値から計算しています。その後スイッチで選択された1項目だけを液晶表示器の2行目に表示します。
ラズパイからの受信は割り込みで常時受け付けられ、コマンド受信完了でフラグがセットされますから、それをメインループでチェックし、データ要求コマンドであれば全測定値を一括で送信します。最後に300msecの遅延を入れていますが、これは液晶表示の繰り返しが適当な間隔になるようにするためと、デルタシグマA/Dコンバータの動作時間を確保するためです。
スイッチの割り込みで計測項目の選択を行います。容量、低抵抗、高抵抗、周波数のいずれかが選択されます。
タイマ1の割り込みは、周波数カウントのオーバーフローですからOverFreq変数をカウントアップするだけです。
3-2 プログラム詳細
最初は宣言部ですが、ここではコンフィギュレーションの設定とグローバル変数の定義、関数のプロトタイピングをしています。グローバル変数の定義部はリスト3-2-1となります。
ラズパイとの送受信バッファはキャラクタ型として定義し、文字列で送受しています。
次にユニオンをひとつ定義しています。これはデルタシグマA/DコンバータのデータをI2Cで読み込むとバイト単位になりますが、これをlong型の値として読み替えるために使っています。
液晶表示器用のメッセージがたくさんありますが、後半のメッセージのxxxの部分に計測したデータを文字に変換して格納し表示するようにしています。
次はメイン関数ですが、最初の初期設定部では数多くの内蔵モジュールの初期設定を行っています。ここはほとんど標準的な設定だけですので詳細は省略します。最後の部分で液晶表示器の初期化と開始メッセージを表示したあと、容量の測定を一度実行しています。これは、何も接続されていないときの容量値をオフセット値として測定しておき、後から実際の計測値から引き算するためです。
このあとメインループに入ります。最初にデルタシグマA/Dコンバータで電圧と電流の測定をしています。その詳細がリスト3-2-2となります。
デルタシグマA/Dコンバータの変換時間が18ビットモードのときは350msec程度かかります。そこでメインループがだいたい500msec程度で繰り返されるようにして、処理をステート関数としてループごとにステートを進めて変換時間を確保するようにしています。つまり、ループごとに「CH1の変換開始→CH1のデータ取得→CH2の変換開始→CH2のデータ取得」という繰り返しをステート変数Stateで進めるようにしています。これで他の処理も行いながらA/Dコンバータの変換時間を確保することができます。
取得したデータは3バイトでこれをlong型にするには4バイトのデータにする必要がありますので、ユニオンで下位3バイトに格納したあと、データが負の値の場合は、ユニオンの最上位バイトに0xFFを代入して負のlongの値となるようにしています。最後に2の補数にして正の値に変換し、正のlongの数値にしてから、電圧か電流の値に変換しています。このとき電圧の場合は分圧抵抗で1/11倍されていますから、値を11倍しています。
電圧電流それぞれの値を求めたら文字列に変換して液晶表示用バッファに格納してから、1行目に表示しています。1行で電圧と電流両方を表示するようにしています。
次がコンデンサ容量と抵抗値を測定する部分でリスト3-2-3となります。最初に容量を計測するためのレンジを決めるため、高レンジから順次レンジを切り替えて実際に測定し、ある値(4000)より小さくなるレンジを測定レンジとしています。そのレンジで実際の値を計測し、スタート時に計測したオフセット値を引き算しています。
抵抗値測定には、まず現在の電源電圧を基準値として計測し、その後高抵抗値の計測と低抵抗値の計測を続けて実行しています。それぞれの抵抗値を計測する関数内では、30回の計測を実行して平均を求めています。
メインループの最後の部分がリスト3-2-4となります。ここで液晶表示の2行目の表示を実行しています。2行目には容量、高抵抗値、低抵抗値、周波数の4種のどれか一つしか表示できませんので、スイッチで選択して表示します。これをCRSWという変数で区別するようにして区分けしています。
容量の表示は、μFとpFの単位を変えて表示するため別のサブ関数DispCap()で実行しています。抵抗値の表示では、一定値以上の値となった場合Range Overのメッセージを表示します。
液晶表示器の表示フォーマット例は写真3-2-1のようになっています。
最後がラズパイからのコマンド受信とデータ送信を実行する部分になります。まず受信割り込み処理でコマンドを受信するとrFlagがセットされますからそれを待ちます。フラグセットされたらコマンドの内容をチェックして「MR」コマンドの場合、計測した全データを文字列に変換して送信しています。
最後にメインループ全体の繰り返し間隔を調整するための遅延関数があります。この遅延は全体ループが大体0.5秒くらいになるようにしています。
この後は多くのサブ関数があります。最初はコンデンサ容量を測定する関数で、リスト3-2-5となります。最初にlevelという変数でレンジごとに分岐します。各レンジでは基準コンデンサの充電後の電圧を計測し、続いて被測定コンデンサの充電後の電圧を測定します。その2つの比から被測定コンデンサの容量を求めています。充電後の電圧の計測はCTMUCap()関数で行っています。この関数の詳細はリスト2-4-1となります。
この他にも多くのサブ関数がありますが、単純な関数ですので詳細は省略します。
以上で計測制御ボードのPICマイコンのプログラムの説明は終わりで、次はラズパイのアプリの製作となります。
第4章 ラズパイのアプリケーションの製作
次はラズパイで動作させるアプリケーションプログラムの製作です。こちらは、ラズパイに標準実装されているRasbianを有効活用して製作します。RasbianはもともとLinuxですから、世界中多くのアプリケーションプログラムが無料で使える環境が整っています。今回もこれらの環境を使っています。
4-1 プログラムの全体構成
デジタルマルチメータの計測値をブラウザで観測するために製作したプログラムの全体構成は、図4-1-1のようになっています。基本はWebIOPiというアプリケーションを活用し、プログラム部はPythonスクリプトで記述しています。
まず、計測制御ボードのPICマイコンとはシリアルインターフェースで接続しますが、ここは2通りの方法があって、ラズパイのUSBにUSBシリアル変換ケーブルで接続するか、GPIOのシリアルピンに直接接続するかです。本稿ではUSB経由としています。
WebIOPiというアプリケーションを使ってラズパイがネットワークから呼び出されたとき、DMM01.htmlというHTMLファイルで計測データとボタンの表示ページを提供します。
ブラウザでページを表示したあと、Startボタンを押すとDMM01.pyというPythonスクリプトをバックグラウンド動作で起動します。このPythonスクリプトは常時1秒間隔でシリアル通信して計測制御ボードからデータを取り込んでファイルとして保存しています。
Startボタンを押したあとは、HTMLファイルからDMM02.pyというPythonスクリプトのマクロ関数を1.5秒間隔で呼び出し、保存されている計測データから値を取り出してHTMLページの該当箇所に計測データとして上書きします。これでブラウザ内の計測データが更新されることになります。
4-2 データ取り込みスクリプトDMM01.pyの詳細
計測制御ボードから周期的にデータを取り込むPythonスクリプトDMM01.pyはリスト4-2-1のようになっています。
呼び出されると最初にシリアル通信を有効化してから、while trueの中でデータ受信と保存を1秒間隔で永久に繰り返すようになっています。
このシリアル通信の有効化ではUSBを使う場合には「ttyUSB0」で定義し、GPIOのシリアルピンを使う場合には「ttyAMA0」で定義します。
繰り返しループの最初に「MR\r\n」というコマンドデータを送信しています。計測制御ボードではこのコマンドを受信すると全データを一括で返送するようになっていますから、これを一括受信し、時刻データを付加してからファイルに保存しています。時刻データは特に使っていませんが、将来ログ記録の機能を追加する場合便利なようにしておきました。
4-3 HTMLファイルの詳細
次にブラウザに表示するページを提供するHTMLファイルの詳細です。まず提供するページの詳細情報は図4-3-1のようになっています。
表題とStartボタンの下はテーブル構成になっていて、各項目の表示部はテーブルの中のテーブルという構成になっています。そして内部のテーブルだけ枠線を表示させ、外側のテーブルは枠線なしとしています。
さらに各計測項目に赤字で示したIDを付与し、これでJavascriptから項目を指定して値を更新できるようにしています。
このページを実現したHTMLファイルのHeader部がリスト4-3-1で、ここでJavascriptを記述しています。
最初にJavascriptとwebiopiのJavascriptであることを宣言しています。
次にwebiopiとして使う関数の定義をしています。
StartAp()関数がStartボタンを押したときに実行される関数で、ここでDMM01.pyをバックグラウンドで動作させるマクロ関数Trigger()を呼んでから、1.5秒ごとにMesure()関数を繰り返し実行するようにしています。Trigger()マクロ関数では、前回に起動したものを停止させてから再起動しています。
Mesure()関数が計測データを取得する関数でwebiopiのマクロ関数を呼び出しています。このとき項目をパラメータの番号で指定しcallback関数で各計測値を戻り値として取得しています。
callback関数では、それぞれのデータを表示枠に表示させています。この枠の指定にIDを使っています。
表示フォーマットは、取得するデータが数値の文字データとなっていますので、そのまま表示するようにしています。
次がShutdownボタンの処理で、確認ダイアログを表示してYesの場合だけシャットダウン処理をするマクロ関数を呼んでいます。
最後は表示させる文字のフォーマットを指定するスタイル指定です。
次に、HTMLファイルのBody部でリスト4-3-2となります。ここで実際に表示する内容を記述しています。
最初は見出しの表示でちょっと大き目の文字にしています。続いてStartボタンの表示と呼び出すマクロ関数(StartAp())の指定をしています。
この後はテーブル構造としていて、各計測項目はテーブル中のテーブルとして枠を付けて表示しています。
それぞれの項目の表示にはIDを付与してJavascriptと連携させています。
ブラウザ表示ですからメッセージが自由に追加できるので、項目ごとに計測の範囲制限と注意のコメントを追加しています。最後がShutdownのボタンの表示と呼び出す関数の指定です。
4-4 マクロ関数スクリプトDMM02.pyの詳細
最後がwebiopiのマクロ関数のスクリプトファイルDMM02.pyでリスト4-4-1となります。
最初に項目ごとの変数を用意します。次にGetValue()マクロ関数では、パラメータで項目が指定されています。最初にファイルから一括で全データを読み出し、内部を項目ごとに分けて変数に取り出します。すべて数値の文字データとなっています。そのあとで、パラメータで指定された項目だけ戻り値として戻しています。
次がDMM01.pyスクリプトをバックグラウンドで起動するマクロ関数ですが、ここではいったん既に起動済みの関数を終了させてから再起動するようにしています。
いずれもPythonのsubprocessを使ってシェルコマンドを実行するようにしています。
最後にあるのはシャットダウンを実際に実行するマクロ関数で、こちらもsubprocessを使ってシェルコマンドを実行しています。
以上がラズパイのアプリケーションプログラムの全体です。
4-5 アプリケーションの実装
DMMとしてラズパイに必要なプログラムができたところで、次はラズパイをDMMとして使うために必要なインストール作業と設定となります。必要な作業は次のようになります。
(1) Rasbianのインストール
NOOBS ver2.1.0を使いました。標準的なインストールで問題ありません。日本語環境にするのと、Wi-Fiを使ったリモートデスクトップ環境にしておく必要があります。
(2) シリアルインターフェースの有効化
シリアルインターフェースを有効化します。Raspberry Pi 3Bモデルの場合には、コンソールを無効化しさらにBluetoothを簡易シリアルにする必要があります。その手順は下記となります。
① 次のコマンドで「cmdline.txt」を読み出して内容を変更します。
sudo nano /boot/cmdline.txt
下記の行を修正します。
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline rootwait
シリアルポートの “serial0″を含む記述部、ここでは「console=serial0,115200」の部分を削除します。
② Bluetoothの無効化のためコンフィギュレーションファイルに追記
Bluetoothの設定と、CPUクロック周波数の自動変更を禁止するように修正します。次のコマンドでファイルを読み出します。
sudo nano /boot/config.txt
このファイルの最後に下記2行を追加します。
core_freq=250
dtoverlay=pi3-miniuart-bt
(3) webiopiのインストール
最新の「WebIOPi-0.7.1」をインストールします。このとき、Raspberry Pi2B以降用のパッチも忘れずにインストールします。インストール手順は次のようになります。
①下記で最新バージョンを入手
sudo wget https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
②圧縮ファイルを解凍
sudo tar xvzf WebIOPi-0.7.1.tar.gz
③パッチの入手と適用
cd WebIOPi-0.7.1 (ディレクトリの移動)
wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
patch -p1 -i webiopi-pi2bplus.patch
④セットアップ
sudo ./setup.sh
⑤再起動
(4) webiopiのconfigファイルの変更
DMMとしてwebiopiが自動的に動作するようにconfigファイルをリスト4-5-1のように4か所追加修正します。
さらにwebiopiが自動起動するように下記1行のコマンドを実行します。
sudo update-rc.d webiopi defaults
(5) 作成したアプリケーションプログラムを下記ディレクトリにすべて格納する
/home/pi/DMM/
以上の作業でラズパイの電源をオンにすれば、DMMとして自動起動して動作するようになります。
第5章 デジマルマルチメータの使い方
ラズパイのアプリも完成したらいよいよ動作開始です。ラズパイと計測制御ボードを接続して計測を開始する手順を説明します。
5-1 接続方法
まずラズパイと計測制御ボードの接続方法です。これには2通りの方法があります。
①USBシリアル変換ケーブルを使ってラズパイのUSBで接続する場合
このとき使用する変換ケーブルはUART側がTTL接続となっているものを使います。
ラズパイ側のUSBにはコネクタが4つありますが、どれに接続しても問題ありません。
計測制御ボード側は写真5-1-1のように黒のGNDピンが液晶表示器側になるように接続します。
USBから電源も供給しますから、計測制御ボードの電源ジャックなどはありません。
写真5-1-1
②ヘッダピン接続ケーブルを使ってラズパイのGPIOと接続する場合
こちらは写真5-1-2のようにヘッダピン接続ケーブルを使います。ケーブルは自作しても良いですし市販のものでも構いません。写真ではたまたま市販の6ピンのものを使いましたので1ピン余分な状態となっています。
こちらの場合もやはりGPIOから電源を供給しますので、接続方向やラズパイの列を間違えないようにしてください。
写真5-1-2
5-2 ブラウザで開く
ラズパイと計測制御ボードを接続し、ラズパイに電源を供給して、ラズパイの起動が完了すれば、同じネットワークに接続しているパソコンやスマホからブラウザのページが開けるようになります。
ブラウザで開く場合のURLは「ラズパイのIPアドレス:8040」とポート番号を付加して指定すればよいだけです。
本稿ではすべてブラウザに「Google Chrome」を使っていますが、「Internet Explorer」でも見ることができます。しかし表示内容はちょっと異なり図5-2-1のように計測項目の枠線が表示されません。
ブラウザでページを表示したあとStartボタンをクリックすれば各計測項目の現在値が表示されます。
5-3 抵抗、コンデンサの接続方法
抵抗の値やコンデンサの容量を測定する場合は、計測制御ボードのZIFソケットに実装して行います。
ZIFソケットの位置が決まっていて、図5-3-1のようになっています。いずれも2列ずつ同じ測定ができるようになっていますからどちらに実装しても構いません。
ここで注意が必要なことはコンデンサの容量測定では、リセット直後に較正を実行していますので、リセット時にはコンデンサを実装しないようにしてください。起動後に被測定コンデンサを実装します。
抵抗もコンデンサも実装すれば直ぐ測定値が表示されます。
抵抗の場合は1MΩ以下の場合と10kΩ以下の場合で実装する位置が異なっています。表示する単位もkΩとΩになっています。
5-4 電圧と電流の計測方法
電圧と電流を計測する場合の接続方法は図5-4-1のようにします。電圧はプラスとマイナスのピンに接続しますが、1/11に分圧している側のピンを固定的に使うようになっています。スイッチも固定的に同じ側で使います。これで最大20Vを1mAの分解能で計測できます。
電流も同じようにプラスとマイナスのピンに接続して計測します。このピンの間に1Ω2Wの抵抗が接続されています。これで2Aまでの電流を0.1mAの分解能で計測できます。しかし大電流を長時間流して計測すると抵抗が発熱しますから注意してください。
5-5 周波数の計測方法
こちらは被測定信号をBNCコネクタに接続するだけです。これですぐに計測値が表示されます。可変抵抗でレベルを調整して一定の周波数が表示されるようにすれば問題なく計測できます。
信号レベルは0.3V以上、10V以下であれば正常に表示されます。
基準となるPICマイコンの発振器に通常のクリスタル発振器を使いましたから、周波数の精度は有効数字が5桁程度となります。発振器に高精度のものを使えばそのままで精度がアップします。
以上でDMMの説明は終わりです。使い方を工夫して活用していただければよいかと思います。