オシロスコープは、電子技術者やメーカーの作業台にある最も重要なツールの1つです。これは主に、波形を表示し、入力に適用される信号の電圧レベル、周波数、ノイズ、および時間の経過とともに変化する可能性のあるその他のパラメータを決定するために使用されます。また、組み込みソフトウェア開発者がコードをデバッグしたり、技術者が修理中に電子デバイスをトラブルシューティングしたりするためにも使用されます。これらの理由により、オシロスコープはすべてのエンジニアにとって必須のツールになっています。唯一の問題は、それらが非常に高価になる可能性があることです。最も基本的な機能を最低の精度で実行するオシロスコープは、45ドルから100ドルの費用がかかる可能性がありますが、より高度で効率的なオシロスコープの費用は150ドルを超えます。今日はArduinoの使い方をデモンストレーションしますそして、私のお気に入りのプログラミング言語Pythonで開発されるソフトウェアは、波形の表示や電圧レベルの決定など、安価なオシロスコープの一部が展開されているタスクを実行できる、低コストの4チャネルArduinoオシロスコープを構築します。信号用。
使い方
このプロジェクトには2つの部分があります。
- データコンバーター
- プロッタ
オシロスコープは通常、入力チャネルに適用されるアナログ信号の視覚的表現を含みます。これを実現するには、最初に信号をアナログからデジタルに変換してから、データをプロットする必要があります。変換には、Arduinoが使用するatmega328pマイクロコントローラーのADC(アナログ-デジタルコンバーター)を利用して、信号入力のアナログデータをデジタル信号に変換します。変換後、時間あたりの値はUARTを介してArduinoからPCに送信され、Pythonを使用して開発されるプロッターソフトウェアは、各データを時間に対してプロットすることにより、入力データストリームを波形に変換します。
必要なコンポーネント
このプロジェクトをビルドするには、次のコンポーネントが必要です。
- Arduino Uno(他のボードはどれでも使用できます)
- ブレッドボード
- 10k抵抗(1)
- LDR(1)
- ジャンパー線
必要なソフトウェア
- Arduino IDE
- Python
- Pythonライブラリ:Pyserial、Matplotlib、Drawnow
回路図
Arduinoオシロスコープの回路図は単純です。調べる必要があるのは、検査する信号をArduinoの指定されたアナログピンに接続することだけです。ただし、単純な分圧器のセットアップでLDRを使用して、検査する信号を生成します。生成された波形は、LDRの周囲の光の強度に基づいて電圧レベルを表します。
以下の回路図に示すようにコンポーネントを接続します。
接続後、セットアップは下の画像のようになります。
接続がすべて完了したら、コードの記述に進むことができます。
ArduinoOsclloscopeコード
2つのセクションのそれぞれにコードを記述します。前述のプロッターの場合、 UARTとプロットを介してArduinoからのデータを受け入れるPythonスクリプトを作成し、コンバーターの場合、ADCからデータを取得して変換するArduinoスケッチを作成します。プロッタに送信される電圧レベル。
Python(プロッター)スクリプト
Pythonコードはもっと複雑なので、それから始めましょう。
以下を含むいくつかのライブラリを使用します。先に述べたように、 drawnow、Matplotlib 、 Pyserial とPythonスクリプト。 Pyserialを 使用すると、シリアルポートを介して通信できるPythonスクリプトを作成できます。また、 Matplotlib を使用すると、シリアルポートを介して受信したデータからプロットを生成できます。また、 drawnow は、プロットをリアルタイムで更新する手段を提供します。
これらのパッケージをPCにインストールする方法はいくつかありますが、最も簡単な方法は pipを使用すること です。Pipは、WindowsまたはLinuxマシンのコマンドラインからインストールできます。PIPはpython3にパッケージ化されているため、python3をインストールし、パスへのpythonの追加に関するチェックボックスをオンにすることをお勧めします。pipのインストールで問題が発生した場合は、Pythonの公式Webサイトでヒントを確認してください。
pipをインストールすると、必要な他のライブラリをインストールできるようになります。
Windowsユーザーの場合はコマンドプロンプトを開き、Linuxユーザーの場合はターミナルを開き、次のように入力します。
pip install pyserial
これが完了し たら 、;を使用して matplotlib をインストールします。
pip install matplotlib
Drawnow はmatplotlibと一緒にインストールされることもありますが、念のために実行してください。
pip install drawow
インストールが完了したら、Pythonスクリプトを作成する準備が整いました。
このプロジェクトのPythonスクリプトは、Raspberry Pi BasedOscilloscope用に作成したものと似ています。
コードに必要なすべてのライブラリをインポートすることから始めます。
import time import matplotlib.pyplot as plt from drawow import * import pyserial
次に、コード中に使用される変数を作成して初期化します。配列 val はシリアルポートから受信したデータを格納するために使用され、 cnt はカウントに使用されます。ロケーション0のデータは、50データカウントごとに削除されます。これは、データがオシロスコープに表示され続けるようにするために行われます。
val = cnt = 0
次に、ArduinoがPythonスクリプトと通信するためのシリアルポートオブジェクトを作成します。以下に指定されているCOMポートが、ArduinoボードがIDEと通信するために使用するCOMポートと同じであることを確認してください。上記で使用した115200ボーレートは、Arduinoとの高速通信を確保するために使用されました。エラーを防ぐために、Arduinoシリアルポートもこのボーレートと通信できるようにする必要があります。
ポート= serial.Serial( 'COM4'、115200、timeout = 0.5)
次に、;を使用してプロットをインタラクティブにします。
plt.ion()
受信したデータからプロットを生成する関数を作成する必要があります。予想される上限と最小値を作成します。この場合は、ArduinoのADCの解像度に基づいて1023です。また、タイトルを設定し、各軸にラベルを付け、凡例を追加して、プロットを簡単に識別できるようにします。
#Figure関数を作成def makeFig():plt.ylim(-1023,1023)plt.title( 'Osciloscope')plt.grid(True)plt.ylabel( 'ADC output')plt.plot(val、 'ro -'、label ='チャネル0 ')plt.legend(loc ='右下 ')
これで、使用可能な場合にシリアルポートからデータを取得してプロットするメイン ループ を作成する準備が整いました。 Arduinoと同期するために、ハンドシェイクデータがPythonスクリプトによってArduinoに送信され、データを読み取る準備ができていることを示します。 Arduinoはハンドシェイクデータを受信すると、ADCからのデータで応答します。このハンドシェイクがないと、データをリアルタイムでプロットすることはできません。
while(True): port.write(b's ')#Arduinoとの ハンドシェイクif(port.inWaiting()):#arduinoが value = port.readline()#を 応答する場合、応答を読み取るprint(value)#print監視する number = int(value)#受信したデータを整数に変換する print( 'Channel 0:{0}' .format (number))#0.5秒間スリープします。 time.sleep(0.01) val.append(int(number)) drawnow(makeFig)#updateプロットで新しいデータ入力を反映 plt.pause(.000001) cnt = cnt + 1 if(cnt> 50): val.pop( 0)#位置0のデータを削除して、プロットを最新の状態に保ちます
arduinoオシロスコープの完全なPythonコードは、以下に示すこの記事の最後に記載されています。
Arduinoコード
2番目のコードはArduinoスケッチで、ADCからの信号を表すデータを取得し、プロッタソフトウェアからハンドシェイク信号を受信するのを待ちます。ハンドシェイク信号を受信するとすぐに、取得したデータをUART経由でプロッタソフトウェアに送信します。
私たちは、Arduinoのアナログピンのピン宣言することで起動信号が印加されるには。
int sensorpin = A0;
次に、ボーレート115200でシリアル通信を初期化して開始します。
void setup(){ // pythonスクリプトのシリアル通信と一致するように115200ビット/秒でシリアル通信を初期化します 。Serial.begin(115200); }
最後に、データの読み取りを処理し、データをシリアル経由でプロッタに送信する voidloop() 関数。
void loop(){ //アナログピン0の入力を読み取ります: float sensorValue = analogRead(sensorpin); バイトデータ= Serial.read(); if(data == 's') { Serial.println(sensorValue); delay(10); //安定性のために読み取り間の遅延 } }
完全なArduinoのオシロスコープのコードは、以下に示す、この記事の最後にだけでなく、以下のとおりです。
int sensorpin = A0; void setup(){ // pythonスクリプトのシリアル通信と一致するように115200ビット/秒でシリアル通信を初期化します 。Serial.begin(115200); } void loop(){ //アナログピン0の入力を読み取ります:################################## ###################### float sensorValue = analogRead(sensorpin); バイトデータ= Serial.read(); if(data == 's') { Serial.println(sensorValue); delay(10); //安定性のために読み取り間の遅延 } }
Arduinoオシロスコープの動作
コードをArduinoセットアップにアップロードし、Pythonスクリプトを実行します。次の画像に示すように、Pythonコマンドラインを介してデータのストリーミングが開始され、光の強度に応じてプロットが変化するのがわかります。
これがArduinoをオシロスコープとして使用する方法です。Raspberrypiを使用して作成することもできます。RaspberryPiベースのオシロスコープに関する完全なチュートリアルをここで確認してください。