Arduino UNO R4 Minimaで2CH USBオシロスコープ・Pulse generator・Function Generator

更新日 2025.03.11 登録日 2025.03.08

*

大阪教育大学の光永さんの Arduino でオシロスコープ は古い128x64のLCDディスプレイ用に作られたものですが、それを基に128x64の1.3インチOLEDで使えるように変更して Arduino UNO R4 MinimaとOLEDで2CHオシロスコープ・Pulse generator・Function Generator を作ったので、それを基にUSB接続のPCで表示できるようにしてみました。サンプル数は512ポイントです。

GitHubにRaspberry Pi Picoを使ってPCとのUSBシリアル通信でHTMLとjavaスクリプトで表示できる pico-RP2040-oscilloscope というものがあったので、その通信方法を流用させていただきました。HTMLはほぼ元のままで、ほんの少し修正しただけです。九工大のArduino簡易オシロスコープのProcessingの代りにWEBブラウザを使うようなものです。

開発環境は Arduino IDE 1.8.19 + Arduino UNO R4 Boards by Arduino version 1.3.2です。
ボードはArduino UNO R4 Minimaを指定します。

この環境ではAnalogRead()が使えるので単純にループしてサンプリングしています。標準でR3よりも速くなってはいますが、それでも変換時間が25us程度なので40ksps程度が限界です。高速サンプリング用にはレジスタを直接アクセスして単一チャンネルで346kspsまで出来ています。 IOポートの割り当てが違うArduino UNO R4 WiFiでは使えない可能性があります。

ソースコード

最新版はGitHubに置く予定です
https://github.com/siliconvalley4066/R4USBOscilloscope

R4USBOscillo101.zip (2025.03.11 update)

ライブラリがインストールされていない場合はライブラリマネージャーから検索してインストールしてください。

使用ライブラリ

  • arduinoFFT by Enrique Condes 2.0.0
  • 回路図

    Arduino UNO R4のADCの入力インピーダンスが2.5kohmから6.7kohmと低いので、信号源インピーダンスが高いと波形が乱れます。回路図上では高入力インピーダンスにするためにオペアンプMCP6002によるボルテージフォロワを入れてありますが、動作確認するだけならこの入力回路は不要で、直接A1とA2に接続しても構いません。ただし、0Vから5Vの範囲を超える電圧を与えるとマイコンチップが壊れる恐れがありますので注意してください。
    *

    操作方法

    Arduino IDEで書き込むUSB接続そのままにして使えます。ファイル"UnoR4scope.html"をEdgeやGoogle Chrome等のブラウザで開くと画面左上でシリアルポートの選択ができるので、Arduino IDEで使ったポートを選択すれば波形が表示されるはずです。あとはブラウザの画面で直感的に操作できると思います。このHTMLからシリアルポートを使う機能は実験的なもののようでスマートフォンのChromeブラウザでは動きませんでした。

    波形画面内の緑色の横線はトリガレベルで、ドラッグすれば変更できます。赤と紫の縦線が初期状態で右端にありますが、これをドラッグすることによって時間間隔を計測出来ます。緑の縦線は元々はトリガ位置なのですが現状では未使用です。

    squware wave frequencyとsquware wave duty cycleはenterキーを押しただけでは変わりません。 数字入力ボックス内とボックス外の空白部分を交互にクリックしていると変わります。

    Pulse Generatorについて

    R4のPWMのことはよく分かっていませんが、1MHzまでは出せたという記事が有ったので、2MHzを1/2から1/65536まで設定できるようにしました。発生できる周波数は30.5Hzから1MHzまでになります。周波数自体を設定するのではなく、発生できる上または下の周波数へ設定を変更して、その設定で発生される周波数を計算して表示します。周波数の高い方は1MHz, 667kHz, 500kHz, 400kHz, 333kHzのように飛び飛びの値になります。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になり細かく設定できます。インタラプトは発生しないはずです。

    (2025.03.11 追記) version1.01からカウントとプリスケーラの分周比を直接設定する方法が分かったので、発生できる周波数は0.715Hzから24MHzまでに広がりました。クロック周波数48MHzを元にして分周比は、1倍、4倍、16倍、64倍、256倍、1024倍で、カウントは1/2から1/65536まで使います。周波数の高い方は24MHz, 16MHz, 12MHz, 9.6MHz, 8MHzのように飛び飛びの値になります。しかしながら、元にした通信方法の制約で16bit整数でしか指定できないので、今のところ1Hzから65535Hzまでしか設定できません。

    DAC DDS Function Generatorについて

    Lab3 - Laboratory for Experimental Computer Science を流用させていただきました。波形データはその他色々な所から集めました。周波数の設定と波形の選択だけがオリジナルです。周波数の分解能は取り敢えず0.01Hzにしました。インタラプト処理が入るので速いサンプリング時にオシロスコープの波形が間延びするようなら明示的にOFFにした方が良い。 Arduino UNO R4には12bit DACがあってA0ピンに出力できますが、変換速度があまり速くなく30us程度なので サンプリング周波数は30kHzにしました。メモリに余裕があるので用意した23波形すべてを使えます。 他のオシロで使っているデータを流用しているので8ビットデータになっています。
    現状ではユーザーインターフェースが無いので238.41Hzの正弦波に固定です。

    DAC出力の負荷抵抗は30kohm以上であることが仕様なので、必要に応じてバッファアンプを付けてください。

    R4にはanalogWaveというライブラリがあってDACで波形を出力できますが、サイン波とのこぎり波と矩形波だけで時間方向の分割数が粗いのと周波数が飛び飛びになるので利用していません。

    リンク先が消えているようなので同じ内容を探してみました。 Arduino Sinewave Generator

    Known Bugs

  • まだソフトの完成度が低いので、時々暴走してマイコンボードに書き込み出来なくなることがあります。そんな時はリセットボタンをダブルタップすればブートモードになって書き込みできるようになります。ブートモードではオンボードのLEDがフワフワと点滅します。
  • 元にした通信プロトコルが8bit/sampleなので12bit ADCの性能を活用できていない。
  • 周波数測定には画面上で3周期程度が必要。
  • 2チャンネル表示時には周波数測定がめちゃくちゃ。
  • Single Shotのユーザーインターフェースは未実装。
  • Arduino UNO R4のADCの入力インピーダンスが低いので、信号源インピーダンスが高いと波形が乱れます。OPアンプのバッファを入れた方が良い。
  • 2ch表示で信号源インピーダンスが大きい場合は相互に観測波形に影響が出るかもしれない。
  • 2ch間でレベル差が大きい部分には相互干渉が発生することがある。
  • ADC入力の保護抵抗を省略したのでCPUが壊れやすい。直列に1kohmから10kohmの抵抗を入れておいた方が良い。
  • これ単体で2チャンネル入力にPulse generatorとFunction Generatorの出力を入れて波形観測して遊べます。
  • 改良可能性

  • 12bitデータを送るようにしたい。
  • References

  • pico-RP2040-oscilloscope https://github.com/jklomp/pico-RP2040-oscilloscope
  • Arduino でオシロスコープ https://n.mtng.org/ele/arduino/oscillo-j.html
  • 機能概要

    機能 内容
    入力チャンネル数 2
    入力結合 DC and AC
    入力電圧範囲 0 to 5.0V
    入力インピーダンス 1Mohm。オペアンプ無しの場合は信号源2.5kohmから6.7kohm以下
    電圧レンジ(volts/div) 1V
    時間レンジ(time/div) 10s, 5s, 2s, 1s, 0.5s, 0.2s, 0.1s, 50ms, 20ms, 10ms, 5ms, 2ms, 1ms, 500us, 200us, 100us, 70us (141ksps), (1 channel) 30us (346ksps)
    トリガモード Auto
    トリガ極性 rise/fall edge
    トリガソース CH1 or CH2
    トリガレベル調整 画面内位置を上下に調整
    外部トリガ No
    波形位置調整 No
    波形反転表示 No
    電圧測定表示 Max, Min (AC入力でもDCレベルを表示)
    周波数&Duty測定 Yes
    電圧・周波数・Duty表示 常に表示
    文字表示 文字サイズ固定
    FFT Not yet
    A/D変換分解能 12bits
    サンプル数 512samples/channel (8bits/channel) 12bit/sampleを電圧レンジに応じて8bitにスケーリングして表示
    表示解像度 800x350 dots
    等価時間サンプリング No
    設定状態EEPROM保存 No
    操作方法 HTML
    プリトリガー No
    ホールドオフ機能 No
    時間軸拡大表示 x2, x5, x10 直線補間
    X-Y表示 No
    Pulse Generator 1Hz to 65,535Hz 約5Vpp方形波 Duty ratio可変
    Function Generator 8bit DAC DDS 238.41Hz 約5Vpp
    波形 sine
    周波数カウンタ No
    PCへのデータ転送 No
    SDカードへの波形保存 No

    関連するオシロスコープ

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

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