記事の詳細
後閑哲也先生監修!オシロスコープWeb詳細解説
・Windows用アプリケーション [Oscillov1.1.zip]
※記事内に試作品の画像を使っているものがあります。
第一章 オシロスコープの全体概要
Raspberry Pi(以下ラズパイと略す)とPICマイコンを組み合わせた測定器で実験ベンチを製作します。
第2回目で製作する測定器はオシロスコープです。
通常のオシロスコープと異なり波形表示をブラウザで行います。
完成した外観は写真Aのようになります。
左側のRaspberry Pi3Bと右側のPICマイコンで製作した「データ収集ボード」の2つで構成されています。
写真はヘッダピン接続ケーブルでGPIO接続した場合です。
1-1 オシロスコープのシステム構成
製作するオシロスコープの全体構成は図Aのようにしました。
被測定信号の取り込みそのものはPICマイコンで製作した「データ収集ボード」で行います。
その収集データをラズパイにUSB経由またはGPIO経由で送信し、ラズパイでブラウザベースの表示にしてネットワーク経由でパソコンやスマホ、タブレットなどから観測できるようにします。
1-2 オシロスコープの性能仕様
製作するオシロスコープの目標とする性能仕様は表Aのようにしました。
入力信号の振幅調整や、垂直位置調整は基板に実装した可変抵抗で行います。
トリガ位置と水平同期の時間調整はブラウザからボタンクリックで行います。
Raspberry Pi3Bとデータ収集ボードとの間の通信データのフォーマットは表Bのようにしました。
ブラウザでの表示形式は図Bのようにしました。
表示は約4秒周期で更新し、新たな波形に更新されるようにします。
URLのアドレスはIPアドレスとポート番号で指定します。
第二章 ハードウェアの製作
最初は高速で波形データを取り込むデータ収集ボードの製作です。高速でアナログ信号を取り込む必要がありますから、PICマイコンファミリの中でも最速のA/Dコンバータを内蔵するPIC24FJ64GC006を使います。さらに入力信号を増幅し、垂直位置も調整するため前段にオペアンプ回路を挿入します。完成したデータ収集ボードの概観が写真Aとなります。
2-1 全体構成
データ収集ボードの全体構成は図Aのようにしました。全体制御はPICマイコンの16ビットファミリである。「PIC24FJ64GC006という64ピンのPICマイコンを使いました
2-2 10Mspsの高速A/Dコンバータによるデータ収集
このオシロスコープでは、いかに高速にアナログデータを取り込むかがポイントになります。このPICマイコンでは、パイプライン型A/Dコンバータでこれを実現しています。
このA/Dコンバータの方式は、通常の逐次変換方式のコンパレータ部をパイプライン構成にするという方式となっています。このため1クロックごとにA/D変換結果を出力することができますので、最高10Mspsという高速A/D変換が可能となっています。
このA/Dコンバータは、チャネルの選択順序などの変換シーケンスを、「サンプルリスト」というテーブルで設定するようになっていて、差動入力かシングルエンド入力かの選択とチャネル順序を任意に指定できるようになっています。テーブルは最大4つまで設定できます。さらに新たに内蔵されたDMAで変換結果のバッファ内容をメモリに自動転送できます。
このA/Dコンバータの内部ブロックを簡単に示すと図Bのようになっています。入力は最高50チャネルを切り替えて入力し、これをA/D変換部で変換して、16ビット幅で32ワードの内蔵バッファに格納します。このチャネル切り替えシーケンスはサンプルリストで決定されます。変換終了は通常はA/Dコンバータの割り込みで通知されますが、DMAを使うとメモリに結果が自動転送され、DMAで設定された変換回数終了によるDMA割り込みで変換終了が通知されます。
PIC24Fの16MIPSの命令実行速度では10Mspsという変換速度には割り込み処理では追従できませんので、高速で使う場合にはDMAを組み合わせて使うことになります。
この高速A/Dコンバータを使ったオシロスコープは、図Cのような構成とすることで実現しました。
入力信号は、DCからの入力を可能とするため差動入力のオペアンプで増幅し、ゲイン調整したあと、次のオペアンプにシングルエンドとして渡します。この2段目のオペアンプでオフセットつまり垂直位置を調整してからA/Dコンバータに入力します。
A/Dコンバータは、最高4MHzのタイマ2の一定周期のトリガで変換して入力波形を取り込みます。これで4Mspsのサンプリング周期となります。変換結果はA/D用バッファを経由してDMAによりメモリに自動保存します。これを2516回繰り返して1回分の計測としています。実際に必要なのは2500回分なのですが、2516回としたのはA/D変換を開始してからパイプラインが詰まるまでは4Mspsの性能は出ませんので最初の16回を捨てているためです。
このA/Dコンバータの性能は10Mspsとなっていますが、自動スキャン方式であればこの性能が出せますが、トリガごとに1チャネルごとの計測とすると毎回1サイクル分のアクイジションタイムを挿入するため半分の5Mspsという性能になってしまいます。さらにPIC24Fの場合は最高サイクルタイムが16MHzですので、A/Dコンバータ用のクロックとしては8MHzが最高となりますから、サンプリング周期としてはこの半分の4Mspsが最高となります。
毎回2516回の変換を行うのは、表示の横軸が2000回分あり、トリガを検出するのを前半の500回のサンプル内で行うようにしたためです。つまり、最初の500回までの間にトリガ条件を検出し、検出できたらそこから2000回のサンプルデータを表示するようにしています。トリガが検出できなかった場合は最初から2000回のデータを表示するようにしました。
このA/Dコンバータを使うための設定は次のようにしています。
- データ形式を正整数にし、フルパワー動作を指定
- リファレンスを内蔵定電圧とします。これでGNDから3.072Vの範囲で電圧を測定します
- バッファへの格納方法をインデックスで指定場所に格納とします。これで変換ごとにサンプルリストの順番にバッファに結果が格納されます。本稿では1チャネルのみしか使いませんので、常に最初のバッファのみ使います。
- クロックをシステムクロックとしTADを2Tsys(8MHz)に設定。ここで使ったPICのクロックは32MHzでサイクルタイムは16MHzになります。A/Dコンバータの最高クロックが10MHzですので、16MHzの1/2が使える最高周波数になります。
- 自動スキャンなしで変換ごと毎回割り込み指定とします。1チャネルの変換ごとにDMAでメモリに転送して格納する必要がありますから、DMAのトリガとするため毎回割り込み生成が必要となります。
- サンプルリストは#0で1エントリだけ、タイマ2をトリガとし有効化しています。これでタイマ2の周期で1チャネルのみのA/D変換を繰り返し行うことになります。さらにAN4とREF間のシングルエンドの1個のエントリだけ設定しています。このサンプルリストの設定方法の詳細は表Aから必要なチャネル接続のエントリコードを選択し指定します。本稿ではAN4とVREF間のシングルエンドですから「0000100」となります。
2-3 DMAモジュールの使い方
DMAモジュールは今回の高速A/Dコンバータでは必須のモジュールです。このDMAの動作は図Dのようになります。通常のCPUと周辺デバイスとの間でデータをやり取りする周辺バスの他に、DMAバスが追加されていて、周辺デバイスとRAMメモリとの間が直接接続されています。したがってDMA対応の周辺デバイスにはCPU用とDMA用の2つのデータバスが接続されています。
DMAの設定で、特定のDMAチャネルと周辺デバイスが関連づけされると、周辺デバイスの割り込み信号のトリガでDMAが起動され、周辺デバイスとRAMメモリとの間で直接データが転送されます。RAMメモリは、デュアルポート構成となっていて、CPUからのRAMアクセスとDMAからのRAMアクセスが同時に動作可能となっています。
このため、DMAでデータ転送中もCPU側は何ら影響を受けることなく動作を継続できます。DMA動作はすべてハードウェアで実行されますから、最速での周辺デバイスとRAMメモリ間の転送が可能となります。
したがって、例えば周辺デバイスがSPIの場合、数Mbpsのような高速転送でもフルスピードでのデータ通信をDMAで行うことが可能となります。
本稿のように4MspsのA/D変換とすると、250nsecごとに1個のデータが変換され生成します。これを連続的にプログラムの割り込みなどで取り込むのは困難です。これにDMAを使えば、CPUサイクルタイムが16MHzとすれば8MHzの速度まで追従してデータ転送を実行することができます。
さらにDMAの転送回数をあらかじめ設定しておけば、指定転送回数完了でDMAの割り込みを生成しますので、この割り込みでプログラム処理すればよくなります。
このような周辺デバイスとメモリ間だけでなく、メモリとメモリ間の転送にもDMAを使うことができますので、大容量のメモリ移動やコピーをプログラムに負荷をかけることなく実行することができます。このような転送の接続を最大4組から8組まで同時に扱うことができます。何組がサポートされているかはデバイスごとに異なります。
DMAを使う手順は次のようにします。
- DMAを有効化し優先順位を固定とする
- 超えてはならないメモリアドレスを設定します。本稿では下限を0x800、上限を0x2000としました。
- チャネル0の設定をします。
- リロードを可能とし、増し分を可能として、転送元は増し分なし、転送先は増し分あり、サイズはワード(16ビット)と指定します。これで、A/D変換結果の方は常に同じレジスタを指定し、転送先のメモリは順次アドレスをカウントアップする動作で転送が行われます。
- 転送元をA/D変換結果のバッファ0と常に同じとします。
- 転送先の最初を変換格納バッファの先頭とし、転送ごとに+1しながら書き込んでいきます。
- 転送回数にA/D変換回数の2516を設定します。
- トリガ要因をPipeline A/D Convertorを指定し、転送完了で割り込み生成とします。
これで高速A/Dコンバータの変換終了ごとにDMAが起動されて転送が行われ、完了で割り込みを生成します。 - DMAチャネル0を有効化して動作を開始します。
以上の設定で、高速A/Dコンバータの変換ごとにメモリに結果が書き込まれ、2516回の変換が完了するとDMAの割り込みが発生します。
2-4 データ収集ボードの回路設計と製作
製作するデータ収集ボードの回路図は図Eのようにしました。
電源はラズパイのUSBまたはGPIOからのDC5V入力とし、レギュレータで3.3Vを生成し全体に供給します。さらにオペアンプ用にDC/DCコンバータでマイナス電源を生成しています。
クロックは内蔵クロックもありますが、少し精度が欲しかったのでクリスタル発振とすることにしました。通常のクリスタル振動子による構成でも構いませんが、ここでは手持ちの8MHzの発振器を使いました。
PICマイコンは64ピンなのですが、実際に使っているピンは少ないものになっています。
入力信号を増幅するオペアンプ回路は、2段の構成にしていて、さらに2チャネル用に2回路を用意しています。前段の入力部はBNCコネクタとし、直流も扱えるよう両電源の差動入力アンプとしています。このアンプのゲインは10倍としています。この出力に可変抵抗を挿入してゲインを調整してから2段目に入ります。ここはゲイン1倍のアンプとしていて、プラス側入力に可変電圧を加えてオフセット調整ができるようにし、オフセットを変えてもゲインが変化しないようにしています。これでオシロスコープの垂直位置調整ができるようにしています。
回路図を元に作成したパターン図でプリント基板を作成しました。作成したプリント基板の実装は図Fのようになります。
オペアンプは性能の異なるものが試せるようにDIPのICソケットで入れ替えができるようにしました。このためSOICタイプのオペアンプを変換基板に実装してDIP型にして実装しています。
プリント基板が完成し、部品が集まったら組み立てます。基板への実装順序は、最初にはんだ面側の表面実装部品をはんだ付けします。レギュレータとチップコンデンサです。次にジャンパ線と抵抗を実装します。スイッチSW1のジャンパは本体でできますので不要です。
あとはソケット類など背の低いものから順に実装します。
PICマイコンはTQFPですので、直接基板実装は難しいですから、変換基板に実装してからソケット実装としました。このソケットには2列のヘッダピンを使いますが、中央の1ピンを抜く必要があります。
入力コネクタにはBNCコネクタを使いましたのでこれがちょっと大型部品ですから最後に実装します。
こうして組み立てが完了した基板の部品面が写真Bのようになります。
次がはんだ面の写真で、写真Cとなります。
第三章 ファームウェアの製作
3-1 ファームウェアの構成
このファームウェアは簡単な構成となっていて、全体の流れをフロー図で示すと図Aのようになります。
最初の初期化部では内蔵モジュールの初期化を行っています。ADCとDMAの初期設定は別関数としています。
メインループでは常時UARTからのコマンド受信があるかどうかをチェックしています。受信は割り込みで実行されていて終了文字の「E」の受信で終了フラグをセットしています。
受信があればメインループで受信データ処理を実行し、計測開始コマンドであれば、チャネル指定でチャネルを切り替え、水平同期時間となるサンプリング周期に基づいてタイマ2の周期を設定してスタートさせてサンプリングを開始します。この間A/D変換完了ごとにDMAで結果がメモリに保存されます。そして2516回のサンプリングが終了するまでそのまま待ちます。DMAの割り込みフラグオンで終了と判定します。
次にトリガレベルでトリガの検出処理を実行します。検出は216サンプル目から500サンプルの間で実行し、検出ができたら、その検出位置の前200サンプルを送信データの開始位置とします。検出できなかったら、216サンプル目を送信開始位置とします。
その後、収集したデータを2000個分一括で送信します。送信が完了したら再度コマンド受信待ち状態となります。
3-2 ファームウェアの詳細
ファームウェアの詳細を説明します。最初は宣言部でリストAとなります。最初のコンフィギュレーション部は省略しますが、ここでは外部発振器でPLLあり、WDTなしとしています。
次がグローバル変数宣言ですが、2716×2バイトという大きなバッファが必要ですので、attribute修飾でfar領域を指定して確保する必要があります。
次がメイン関数の初期化部でリストBとなります。
最初にクロック設定で8MHzからPLL設定で32MHzを生成してフルスピードとしています。
次がI/Oピンの初期化で、2ピンだけアナログピンとし後はすべてデジタルにしています。
続いてA/D変換トリガ用に使うタイマ2の初期化を4MHz周期にして実行していますが、この時間設定はラズパイからのコマンドで変更されます。
次にUARTの初期化で115.2kbpsの速度にしています。
最後にADCとDMAモジュールの初期化の関数(Init())を呼んで初期化を行ったあと、DMAをスタートさせ、UARTの受信割り込みを許可して準備完了となります。
初期化で呼び出しているADCとDMAの初期化関数の詳細がリストCとなります。
この関数で必要なアナログモジュールとDMAの初期化をすべてまとめて実行しています。
最初がDMAの初期設定で、チャネル0だけ使っています。まず設定を自動的に再ロードすることで、1回ごとに再設定するようにしています。そして送信元をA/Dコンバータのバッファ(ADRES0)にしてインクリメントはなしとし、送信先はメモリ内のバッファ(Buffer)として自動インクリメントありとしています。転送回数をMax_Sizeつまり2716回とし、トリガをA/Dコンバータとしてから有効化しています。
次が定電圧リファレンスの設定で、3.072Vの出力として設定しています。
続いて高速A/Dコンバータの設定です。変換形式を正整数としリファレンスを定電圧リファレンスとしています。格納先は内蔵バッファとしクロックを8MHzとしています。続いてサンプルリストの作成ですが、ここでは1チャネルだけの繰り返しとして設定しています。
アクイジションタイムを0.5Tadとしタイマ2のトリガで動作させ、AN18だけを繰り返し変換します。
続いてA/Dコンバータの較正を実行してから変換準備を完了して動作開始しています。
次がメインループ部の詳細でリストDとなります。
常時コマンド受信完了を待っていて、受信完了したらヘッダ部を確認して正常ならデータ処理を実行します。コマンドが「T」の場合は、計測開始コマンドですから、計測処理を開始します。
最初にチャネル指定を取り出して指定チャネルに切り替えます。次に水平同期種別のデータで周期設定関数(Hsync())を実行し、タイマ2の周期とA/Dコンバータのアクイジションタイムの設定をします。続いてタイマ2をスタートしてサンプリングを開始します。
このあとは2716回のサンプリングが終了してDMA0の割り込みフラグがセットされるまでwhileで待ちます。2716回のサンプリングが終了したら、トリガ検出を行います。216サンプル目から716サンプルの間で条件に合う変化があるかどうかを検出します。検出できた場合はFindを1にします。
その後はトリガ検出できなかった場合は216サンプル目から、できた場合は検出位置200サンプル目から2000サンプル分のデータをラズパイに送信します。これで1回の計測が完了します。
詳細の最後は水平同期を設定するサブ関数部でリストEとなります。
ラズパイから受け取った受信データから水平同期用パラメータを引数として呼び出されます。その引数により分岐してそれぞれにADCのクロックとタイマ2の周期を設定します。
タイマ2の周期でサンプリングを行いますからこれが水平同期の周波数となります。50μsecより短い水平同期の場合は4Mspsより高速なサンプリングにはできませんから、表示間隔を拡大することで対応しています。これでグラフが横方向に拡大されて表示されることになります。
この他にUARTの送受信関数や遅延関数がありますが詳細は省略します。以上でファームウェアの全体となります。
第四章 ラズパイのアプリケーションの製作
次はラズパイで動作させるアプリケーションプログラムの製作です。こちらは、ラズパイに標準実装されているRasbianを有効活用して製作します。
4-1 プログラムの全体構成
オシロスコープの計測結果をブラウザで観測するために製作したプログラムの全体構成は、図Aのようになっています。基本はWebIOPiというアプリケーションとPythonスクリプトを活用し、matplotlibというPythonのライブラリでグラフを作成しています。データ収集ボードとの通信部分もPythonで記述したプログラムとなっています。
まず、データ収集ボードのPICマイコンとはシリアルインターフェースで接続しますが、ここは2通りの方法があって、ラズパイのUSBにUSBシリアル変換ケーブルで接続するか、GPIOのシリアルピンに直接接続するかです。本稿ではGPIO経由としています。
WebIOPiというアプリケーションを使って、ラズパイがネットワークから呼び出されたとき、Oscillo.htmlというHTMLファイルでオシロスコープとしてのグラフと各種ボタンを含む表示ページを提供します。
ブラウザで表示されたページでStartボタンを押すと、Mesure.pyというPythonのマクロ関数を通してGathering.pyというPythonスクリプトをデーモンとして起動します。このGathering.pyスクリプトは一定周期でシリアル通信によりデータ収集ボードに計測要求コマンドを送信し、データ収集ボードから計測データを取り込みます。さらにそのデータをグラフ化してファイルgraph1.pngとgraph2.pngとして保存しています。HTMLファイルではこの生成されたグラフgraph2.pngを読み出してブラウザで表示できるようにしています。これとは別にいくつかのボタンを用意し、WebIOPiのマクロ関数呼び出しにより水平同期やチャネルの切り替え、トリガ位置の設定などを実行しています。
4-2 HTMLファイルの詳細
ブラウザに表示するページを提供するHTMLファイルの詳細です。まず提供するページの詳細情報は図Bのようになっています。
表題とStartボタンの下はテーブル構成になっています。左端のテーブル枠内にボタンを並べ、右側の枠内にグラフを表示しています。グラフにだけ「G」というIDを付与しています。
各ボタンには呼び出すPythonの関数が図のように割り付けられていて、クリック時にそれぞれの関数を実行するようになっています。
このページを実現したHTMLファイルのHeader部がリストAで、ここでボタンに割り付ける関数をJavascriptで記述しています。
最初にJavascriptとwebiopiのJavascriptであることを宣言しています。次にwebiopiとして使う関数の定義をしています。ボタンごとの関数となります。
StartAp()関数がStartボタンを押したときに実行される関数で、ここでGetGraphマクロ関数を呼び出して、データの取り込みとグラフの作成をデーモン扱いで実行させます。次がDisplay関数で、GetGraph関数で作成されたグラフを3秒間隔でグラフ領域に表示しますが、同じファイル名の場合はブラウザの表示が更新されませんから、ファイル名に検索語を付加して擬似的に毎回異なるファイル名になるようにしています。
水平同期ボタンの場合は同期種別をパラメータとしてSetHsyncマクロ関数を呼んでいます。
チャネル選択も同様にSetChanマクロ関数を呼んでいます。トリガ位置のアップダウンのボタンの場合は、トリガレベル値を上下させ、その値をパラメータとしてSetTrigマクロ関数を呼んでいます。上下とも一定範囲で制限をしています。
シャットダウンボタンの場合は、確認ダイアログを表示してYesの場合だけShutCmdマクロ関数を呼んでいます。
次に、HTMLファイルのBody部がリストBとなります。ここで実際に表示する内容を記述しています。最初は見出しの表示でちょっと大き目の文字にしています。続いてStartボタンの表示と呼び出す関数(StartAp())の指定をしています。
この後はテーブル構造としていて、各設定ボタン表示と関数の指定をまとめて同じセルの中に入れています。次のセルに波形グラフgraph2.pngを表示しています。最後にShutdownのボタンの表示と呼び出す関数の指定です。
4-3 データ取り込みスクリプトGathering.pyの詳細
Gathering.pyはデータ収集ボードからデータを取り込んでグラフを作成するPythonスクリプトになります。
Startボタンクリックでデーモンとして常駐して動作するようになります。
スクリプトの前半部がリストCとなります。ここでは変数の定義と変数を格納するファイル名を定義しています。2つのPythonスクリプト間での変数の受け渡しをファイルですることにしました。
次が実際にグラフを作成する関数makeGraph()です。まず、データ収集ボードから入力されたデータを文字列のリストからINT型の数値のリストに変換します。一つのデータが2ケタの文字で表現されていますから、それを数値に変換します。数値にする際、0から4095の値を-2048から+2047の値としています。
その後グラフのインスタンスを生成してからまずY軸とX軸の体裁を整えています。入力されるデータは0から4095の値なのですが、Y軸上の目盛は-2048から+2047として表示します。そしてY軸の補助線を6等分して表示します。次にトリガレベルの現在値を横線で表示します。立ち上り設定の場合は赤線で、立下りの場合は青線で表示します。最後にタイトルに日本語が使えるようにフォントを用意してからタイトルを表示させています。
次がスクリプトの後半部でリストDとなります。ここでは横軸を表示させていますが、水平同期ごとに横軸の拡大率と目盛が異なることになりますから、それぞれに別々の表示設定となっています。横軸の拡大率を設定してからX軸の補助線を表示し、目盛を表示しています。
最後に実際の波形グラフを表示していますが、チャネル1の場合は赤線で、チャネル2の場合は青線で表示しています。さらに生成したグラフ全体をファイルとして保存しています。
グラフ生成が完了したらmatplotlib関連のリソースをすべて解放します。これを解放しないとメモリを食いつぶしていくのである時点でラズパイが動けなくなってしまいます。
Gathering.pyスクリプトの最後がメイン関数部になりリストEとなります。
最初に変数を定義し、現在設定値ファイルを最初に生成しています。その後繰り返しループに入ります。
ループ内ではまず、現在設定値をファイルから読み出します。この設定値は次で説明するMesure.pyスクリプトで保存されています。トリガレベルだけ文字列から数値に変換し、さらに±2048の範囲となるようにしています。
つぎにシリアルインターフェースを有効化してから、データ収集ボードにコマンドを送信し、折り返し送信されてくる全データをdataというリスト変数に受信します。受信完了で受信データの頭と最後の文字を確認して正常受信できていたらグラフ作成関数を呼び出してグラフgraph1.pngを作成します。できたグラフの名前をgraph2.pngと変えてコピーします。HTMLファイルで表示するグラフはgraph2.pngの方です。これは、graph1.pngを直接表示に使うと、グラフ生成に時間がかかりますので作成途中のグラフが表示されてしまうためです。最後に1秒の間をいれて繰り返しています。
4-4 マクロ関数スクリプトMesure.pyの詳細
最後がwebiopiのマクロ関数のスクリプトファイルMesure2.pyでリストFとなります。
ここではブラウザでボタンが押されたときに実行するマクロ関数を記述しています。水平同期などの設定ボタンの場合は、設定値をファイルとして保存し、ファイルでGathering.pyに渡すようにしています。
Startボタンの場合がGetGraph()マクロ関数で、ここではまず既に起動済みのGathering.pyスクリプトを終了させてからデーモンとして再起動しています。終了させているのは複数の同じプロセスが起動しないようにするためです。
水平同期のボタンはすべてHsync()マクロ関数が呼び出され、パラメータとして水平同期の種類が渡されます。これもファイルとして保存してGathering.pyに渡します。最後がシャットダウンボタンに対応するマクロ関数で、ここでは直接シャットダウンのシェルコマンドを実行しています。
以上がラズパイのアプリケーションプログラムの全体です。
4-5 アプリケーションの実装
オシロスコープとしてラズパイに必要なプログラムができたところで、次はラズパイをオシロスコープとして使うために必要なインストール作業と設定となります。必要な作業は次のようになります。
(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 - webiopiのインストール
最新の「WebIOPi-0.7.1」をインストールします。このとき、Raspberry Pi2B以降用のパッチも忘れずにインストールします。インストール手順は次のようになります。
①下記で最新バージョンを入手
udo 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
⑤再起動 - webiopiのconfigファイルの変更
オシロスコープとしてwebiopiが自動的に動作するようにconfigファイルをリストGのように4か所追加修正します。
さらにwebiopiが自動起動するように下記1行のコマンドを実行します。
sudo update-rc.d webiopi defaults
5.作成したアプリケーションプログラムを下記ディレクトリにすべて格納する
/home/pi/Oscilloscope/
以上の作業でラズパイの電源をオンにすれば、オシロスコープとして自動起動して動作するようになります。
第五章 オシロスコープの使い方
ラズパイのアプリも完成したらいよいよ動作開始です。ラズパイとデータ収集ボードを接続して測定を開始する手順を説明します。
5-1 接続方法
まずラズパイとデータ収集ボードの接続方法です。これには2通りの方法があります。
①USBシリアル変換ケーブルを使ってラズパイのUSBで接続する場合
このとき使用する変換ケーブルはUART側がTTL接続となっているものを使います。
ラズパイ側のUSBにはコネクタが4つありますが、どれに接続しても問題ありません。
データ収集ボード側は写真Aのように黒のGNDピンが基板端側になるように接続します。
USBから電源も供給しますから、データ収集ボードの電源ジャックなどはありません。
②ヘッダピン接続ケーブルを使ってラズパイのGPIOと接続する場合
こちらは写真Bのようにヘッダピン接続ケーブルを使います。ケーブルは自作しても良いですし市販のものでも構いません。写真ではたまたま市販の6ピンのものを使いましたので1ピン余分な状態となっています。
こちらの場合もやはりGPIOから電源を供給しますので、接続方向やラズパイの列を間違えないようにしてください。
5-2 ブラウザで開く
ラズパイとデータ収集ボードを接続し、ラズパイに電源を供給して、ラズパイの起動が完了すれば、同じネットワークに接続しているパソコンやスマホからブラウザのページが開けるようになります。
ブラウザで開く場合のURLは「ラズパイのIPアドレス:8100」とポート番号を付加して指定すればよいだけです。
ブラウザで画面が表示されたら「Start」ボタンをクリックします。最初に表示したときだけもう一度「Start」ボタンをクリックしてください。これで表示が更新されるようになります。
表示されたブラウザは図Aのようになります。30Hzと100kHzの例ですが100kHzでもきれいな正弦波で表示されることが分かります。およそ300kHz程度までの正弦波はきれいに表示されます。
本稿ではすべてブラウザに「Google Chrome」を使っていますが、「Internet Explorer」でも見ることができます。ほぼ同じような表示となります。
ブラウザでページを表示したあとStartボタンをクリックすれば波形表示が始まり4秒ごとに更新されます
5-3 信号の調整の仕方
入力信号は2つあるBNCコネクタのいずれかに接続します。入力信号は30mV程度から300mVp-pまでの信号が入力できます。
波形が表示されたら表示波形を見ながら、ゲインと垂直位置をデータ収集ボードにある4個の可変抵抗で調整します。4個の可変抵抗は図Bのようになっています