Raspberry Pi Pico WとTFTタッチスクリーンLCDで2CH WEBオシロスコープ・Pulse generator・Function Generator・周波数カウンタ

更新日 2024.03.13 登録日 2022.05.31
*

大阪教育大学の光永さんの Arduino でオシロスコープ は古い128x64のLCDディスプレイ用に作られたものですが、それを基に128x64の1.3インチOLEDで使えるように変更して ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ を作ったので、それを基にRaspberry Pi Pico Wに移植し、320x240のタッチパネル付き2.8インチLCDで使えるように変更して、WEB表示機能を追加しました。まだ不完全ですがPCやスマートフォンの大きな画面で波形を確認できます。サンプル数は300ポイントです。

波形データの送信にはWebSocketを使いました。WebSocketの通信は手抜きでEndian処理をしていません。そのためBig EndianのCPUでは正しく波形が表示できません。いまどきそんなCPUは少ないと思いますしPentiumやARM系のAndroidであれば使えますので大丈夫でしょう。波形の描画にはHTML5のCanvasを使っています。オシロスコープ機能はマルチコアのCORE0で処理し、WiFi機能はCORE1で処理するようにしています。

周波数カウンタは1kHz単位のものを仮実装です。また、等価時間サンプリングはRaspberry Pi Picoで実装する方法が分からないのであきらめました。

開発環境は Arduino IDE 1.8.19 + Raspberry Pi Pico/RP2040 by Earle F. Philhower, III version 3.4.0です。
この環境ではAnalogRead()が使えるのですがオーバーヘッドが多過ぎるようで遅いので、adc_read()を使うようにしました。また、単発のadc_read()では速度に限界があるので高速サンプリング時にはDMAを使って単一チャンネルで500kspsまで出来るようにしました。2チャンネルなら250kspsができるようにしました。

時間軸拡大機能を追加しました。2us/divは500kspsの10倍拡大、4us/divは5倍拡大になります。拡大にはsin(x)/xによる補間をしています。(2024.03.13 update)

Raspberry Pi PicoにはEEPROMが無いのですが、Mbed OSではESP32のようにFlash Memoryを使ってシミュレートするライブラリが無いので設定を保存する機能は外してあります。Arduino-Picoの環境ならあるようですので、そのうちにサポートされるようになるかもしれません。
Raspberry Pi Pico/RP2040 by Earle F. Philhower, IIIの開発環境ではEEPROMのシミュレーションを利用して設定を保存するようにしました。

ソースコード

最新版はGitHubに置いてあります
https://github.com/siliconvalley4066/RaspberryPiPicoWTFTOscilloscope

RPPicoTFTOscillo122.zip 2024.03.13 update

CPU速度は当初125MHzを想定していました。 Raspberry Pi Pico/RP2040 by Earle F. Philhower, IIIの環境ではdefaultで133MHzになっていてDDSとPWMの周波数がずれる問題が発生したので、システムクロック周波数を取得して自動的に対応するようにしました。ただし、PWMの周波数可変範囲が変動します。

TFT LCDのライブラリはTFT_eSPIを使用します。Arduino IDEのライブラリマネージャーから検索してインストールしてカスタマイズする必要があります。 GitHubのhttps://github.com/siliconvalley4066/RaspberryPiPicoWTFTOscilloscopeを参照してください。

WebTask.inoの
const char* ssid = "XXXX";
const char* pass = "YYYY";
に使用するWiFiアクセスポイントのssidとpasswordをXXXXとYYYYに記入する必要があります。ソースコードを少し変更すればAPモードにすることも可能です。

WebSocketsのライブラリはライブラリマネージャーから検索できるものではなく、以下を使いました。
Links2004/arduinoWebSockets

Pi Pico用にも変更無しでコンパイル出来るように自動的にpre-defineを見てWEB機能を外すようにしてあります。

Arduino Mbed OS RP2040 Boards 3.1.1 でもコンパイルできますが、CPUがPi PicoのみでWEB表示と設定保存は出来ません。また、何故かタッチパネルが使えません。

回路図

10:1プローブを使うために入力インピーダンスを1Mohmに近付けたいので、2Mohmの抵抗を使ってみると、Raspberry Pi PicoのADCの入力インピーダンスが低いようで、無信号時に0.4Vが観測されてしまいます。高入力インピーダンスをあきらめて100kohmの抵抗を使うことで入力インピーダンスは約50kohmになります。
*
(2023.11.02 update)

操作方法

先ず起動する前にArduino IDEのシリアルモニターを開いておきます。プログラムが開始してWiFiアクセスポイントに接続成功したらIPアドレスを取得してシリアルモニタに表示します。そのIPアドレスをWebブラウザのアドレスバーに入力すればWEBオシロに接続できるはずです。
例えばシリアルモニタに、
WiFi Connected. IP = 192.168.1.128
と表示されたら、Webブラウザのアドレスバーに192.168.1.128と入力します。

LCDのタッチパネルで操作出来ます。また、タクトスイッチで画面上の項目を選択して操作することもできます。WEB表示では画面右側のコントロールで操作できます。ただし、タッチパネルやタクトスイッチで変更した内容はWEB表示の波形には反映されますが、設定値の表示はリロードするまで反映されません。

タクトスイッチでの操作方法は、UpボタンとDownボタンでメニュー内の項目を移動します。それぞれの項目の位置でRightボタンかLeftボタンを押すとその項目の値を変更したりOn/Offの切り替えをします。

  • CH1をタップすると上下正転表示->上下反転表示->非表示->上下正転表示と切り替わります。上下反転時はアンダースコア"_"を表示します。AC入力の時は"~"を表示します。
  • CH2をタップすると上下正転表示->上下反転表示->非表示->上下正転表示と切り替わります。上下反転時はアンダースコア"_"を表示します。AC入力の時は"~"を表示します。
  • 電圧レンジをタップすると色がCyanになり、画面の右半分をタップするとレンジが上がり、左半分をタップすると下がります。
  • 時間軸レンジをタップすると色がCyanになり、画面の右半分をタップするとレンジが上がり、左半分をタップすると下がります。
  • トリガレベルは画面右端のレベル表示エリアをタップすることで変更できます。
  • VPOSは通常Gray表示ですが、タップするとPOS1->POS2->VPOSと順に変化します。画面の右半分か左半分をタップすることで上下できます。画面の左右中央をタップすると標準の位置にリセットします。DC時は最下端、AC時は中央になります。
  • TG1が表示されている時はCH1をトリガソースにします。タップするとTG2が表示されてCH2をトリガソースにします。
  • "/"かバックスラッシュが表示されているトリガエッジをタップすると、上下の切り替えが出来ます。
  • トリガモードはタップする度にAuto->Norm->Scan->One->Autoと切り替わります。Oneの場合は右上に赤字でHALTと表示します。画面をタップすると1回ずつトリガが掛かります。他のトリガモードでは画面をタップするとトリガを停止し、再度タップすると再開します。
  • "FUNC"をタップすると外面下側のメニューが切り替わり、その他の機能が選択できます。
  • Pulse Generatorについて

    Raspberry Pi Pico WとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタと同じです。

    PWM DDS Function Generatorについて

    Raspberry Pi Pico WとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタと同じです。

    周波数カウンタについて

    Raspberry Pi Pico WとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタと同じです。

    Known Bugs

  • 波形表示が所々途切れることがある。
  • Raspberry Pi PicoのADCの入力インピーダンスが低いようで、無信号時に0.4Vが観測されてしまう。入力インピーダンスをあきらめて2Mohmを200kohmくらいに変更するかOPアンプのバッファを入れた方が良いかもしれない。
  • 原理的に周波数測定には画面上で2周期以上が必要。
  • 周波数測定と電圧測定はCH1のみ。CH2のみ表示でもCH1の測定値が出る。v1.10からCH2も測定できるようにした。 2023.11.23 update
  • トリガモードのOneがうまく機能しない。
  • トリガが掛からない状態でトリガモードをNormにすると、トリガ検出から抜け出せなくなり操作不能になる。トリガが掛かる入力を入れれば復帰する。
  • 2ch表示で信号源インピーダンスが大きい場合は相互に観測波形に影響が出る。入力インピーダンスが下がるのを許容して入力回路の抵抗値2Mohmを200kohm以下に下げれば軽減できると思う。
  • 2ch間でレベル差が大きい部分には相互干渉が発生することがある。
  • ADC入力の保護抵抗を省略したのでRaspberry Pi Picoが壊れやすい。直列に1kohmから10kohmの抵抗を入れておいた方が良い。
  • Pulse generatorはCPUクロックを分周していて1/2から整数分の1の周波数を発生する。周波数の高い方は62.5MHz, 41.67MHz, 31.25MHz, 25MHz, 20.83MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になる。
  • これ単体で2チャンネル入力にPulse generatorとFunction Generatorの出力を入れて波形観測して遊べます。
  • 改良可能性

  • 取り込みサンプル数を増やして表示位置を移動できるようにしてみたい。
  • 時間軸拡大表示。
  • Hold Off調整機能を入れた方が便利かもしれない。
  • 機能概要

    機能 内容
    入力チャンネル数 2
    入力結合 DC and AC
    入力電圧範囲 0 to 3.3V
    入力インピーダンス 不明。50kohm程度
    電圧レンジ(volts/div) 1V, 0.5V, 0.2V, 0.1V, 50mV
    時間レンジ(time/div) 10s, 5s, 2s, 1s, 0.5s, 0.2s, 0.1s, 50ms, 20ms, 10ms, 5ms, 2ms, 1ms, 500us,
    (DMA mode) 200us, 100us (250ksps), (1 channel) 50us, 10us, 5us (500ksps)
    トリガモード Auto, Normal, Scan
    トリガ極性 rise/fall edge
    トリガソース CH1 or CH2
    トリガレベル調整 画面内位置を上下に調整
    外部トリガ No
    波形位置調整 上下に調整可能
    波形反転表示 Yes
    電圧測定表示 Max, Average, Min (AC入力でもDCレベルを表示)
    周波数&Duty測定 Yes
    電圧・周波数・Duty表示 表示・非表示切り替え
    文字表示 文字サイズ固定
    FFT Yes
    A/D変換分解能 12bits
    サンプル数 300samples/channel 12bit/sampleを電圧レンジに応じて0から200又は400にスケーリングして表示
    表示解像度 LCD: 300x200 dots, 水平25dots/div 垂直25dots/div
    WEB: 300x400 dots, 水平25dots/div 垂直50dots/div
    等価時間サンプリング No
    設定状態EEPROM保存 Yes
    操作方法 タッチパネル及び5方向スイッチ (Left, Right, Down, Up)
    プリトリガー No
    ホールドオフ機能 No
    時間軸拡大表示 x5 (10us/div), x10 (5us/div)
    X-Y表示 No
    Pulse Generator 7.48Hz to 62.5MHz 約3.3Vpp方形波 Duty ratio可変
    Function Generator 8bit PWM DDS 0.01Hz to 9999.99Hz(実用は400Hzまで) 約3.3Vpp
    23波形 sine, saw, revsaw, triangle, rectangle, 20% pulse, 10% pulse, 5% pulse, 1dot pulse, noise, gaussian noise, ECG, sinc5, sinc10, sinc20, sine 2 harmonic, sine 3 harmonic, chopped sine, sine abs, trapezoid, step2, step4, chainsaw
    周波数カウンタ Yes 分解能1kHz 2kHzから125MHz程度まで
    PCへのデータ転送 No
    SDカードへの波形保存 No

    関連するオシロスコープ

  • Arduino UNO/Nano OLED版: ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
  • Arduino UNO/Pro Mini LCD版: ArduinoとLCDタッチシールドで2CHオシロスコープ
  • ESP32 OLED版: ESP32とOLEDで2CHオシロスコープ・Pulse generator・Function Generator
  • ESP32 OLED WEB版: ESP32で2CH WEBオシロスコープ・Pulse generator・Function Generator
  • ESP32 LCD WEB版: ESP32とTFTタッチスクリーンLCDで2CH WEBオシロスコープ・Pulse generator・Function Generator
  • Raspberry Pi Pico OLED版: Raspberry Pi Pico WとOLEDで2CH WEBオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
  • Raspberry Pi Pico LCD版: Raspberry Pi Pico WとTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
  • STM32F103C8T6 OLED版: STM32F103C8T6とOLEDで2CHオシロスコープ・Pulse generator・Function Generator
  • STM32F103C8T6 LCD版: STM32F103C8T6とTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator
  • STM32F103C8T6 0.96-inch 80x160 LCD版: STM32F103C8T6と0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・Function Generator
  • STM32F103C8T6 DLO-138-SPI: STM32F103C8T6とTFT LCDで2CHオシロスコープDLO-138-SPI

  • <=Arduinoで電子工作に戻る
    <=Siliconvalley4066番地に戻る
    ゲストブックへ
    siliconvalley4066@yahoo.co.jp