2018/05/19

M5Stackオシロスコープ

液晶表示のオシロスコープをM5Stackに移植しました。
2チャンネルで最大40k/sサンプリングできますので4kHz程度の波形は見ることができます(^-^;
*なんとなく波形らしいのが見えればいいや・・程度のものです、「使い物にならない!」などのクレームはご容赦ください(*- -)(*_ _)ペコリ

立上がり、立下りエッジでのトリガ機能もあり、最後の観測画面をM5Stack内蔵のSDカードに保存(表示画面のスナップショットをBMP形式で保存)したり、観測値をUARTにCSV形式で出力することもできます。
M5Stackのアナログ入力を使って波形読取りを行っていますので、入力できる電圧は最大で3.3Vです、通常使われると思われる5Vを観測するためには下記のような抵抗での分圧回路が必要になります。
デフォルトでは、下記の抵抗分圧で接続されていることを想定していますので、最大観測電圧を5V以外としたい場合は抵抗値を変更する必要があります。
*負電圧を入力したり、3.3Vを超える電圧を入力するとM5Stackの内部にダメージを与える可能性があります、ご注意ください。

操作の説明
・初期メニュー画面
画面の下に並ぶ5つのボックスがメインメニューです、初期状態では「CH1」がフォーカスされています(黄色線でマーク)、ここで「Bボタン(以降は[B])」で左に、[C]で右にフォーカスを移動できます。
[A]を押すとフォーカスされているメニューの選択になります。
メニューを選択すると設定可能なサブメニューにフォーカスが移動します。
サブメニュー内では[B]で上に、[C]で下にフォーカスが移動します。
サブメニュー内で[A]を押すとサブメニュー内のフォーカスされているアイテムの選択値が変わります。
サブメニューアイテムの一番上、または一番下がフォーカスされている状態で、[B]または[C]でメインメニューに戻ります。

[CH1]メニュー(CH1の各種設定)

[CH1]メニュー(CH2の各種設定)

[Horz]メニュー(水平掃引の各種設定)

[Trig]メニュー(トリガ条件などの設定)

[Util]ユーティリティーメニュー(テスト波形、ダンプ設定)

それぞれのサブメニューの詳細説明は省略いたします(*- -)(*_ _)ペコリ
最後のUtilityメニューだけ説明します。

・テスト信号[Wave]
S5Scopeが内部で生成するテスト信号の選択です、テスト信号は2種用意されています。
Pin2からはデジタル信号で1kHzの矩形波が出力されます、またPin26からは内蔵のDACを使った200Hzの矩形波、鋸波、階段波、正弦波が出力されます。
(出力電圧はどちらも3.3Vです)

・ダンプ[Dump]
[BMP]:観測画面のスナップショットを画像ファイル(.BMP)で保存します。
[UART]:観測画面の観測データを数値(CSV)でUART(115,200BPS)に出力します。
どちらも選択後に[A]を長押し(800ms以上)することで設定した出力先に出力します。

ソースファイル:
まだまだ色々と問題があると思いますので、当面はGithubでの公開ではなく、ここに置いておきます(^-^;

M5SScope999.zip(ここをクリック) 999はバージョンです
————————————————————————————–
dump.ino
font8x12.h
ICONs.h
M5SScope080.ino
TFTlib.ino

不具合/制限事項など:
1) 内蔵のADCを使用していますので入力電圧と計測値の直線性は良くありません、計測値の補正が必要ですが、組込んでおりません。
2) サンプリング間隔時間は内部タイマー割込みを使っています、またテスト波形にもタイマー割込みを使っているために、サンプリング間隔の変動があり正確ではありません。
3) SDへの画像保存がエラーとなることがあります。この状態はハードリセット以外で回復することはできません。

お願い:
まだまだ不具合や使いにくいところもあるかと思います、ご意見やご感想をこの記事のコメントでお寄せくださると幸いです。


この記事へのトラックバック URL :

    Trackbacks:0

    コメント:2

  1. はじめまして
    M5stackGray + Arduino 1.8.13で試してみました。
    至る所でコンパイルエラーが発生します。
    narrowing conversion of ‘38518’ from ‘int’ to ‘int16_t {aka short int}’ inside { } [-Wnarrowing]

    一見よさそうですが、[VW_xb + (49 * 0)] 部分がintにキャストされる様です。Arduinoをインストールした環境にも原因がありそうですね

    #define SCOPE_HOME_XS 16
    uint16_t VW_xb = SCOPE_HOME_XS;
    uint16_t foo[1] = {
    VW_xb + (49 * 0)
    };

  2. 自己解決されたようですが、備忘録として対策を書いておきます。

    エラー:”narrowing conversion”(型変換において、表現できる情報量が小さい型に変換している)
    対策:警告を無視する(コンパイルオプション:-Wnarrowing)
    具体的にはArduinoの環境設定で「コンパイラの警告:なし」にする。
    ⇨全ての警告を無視します。

    正しく修正するには、下記の修正が必要です・・

    -dump.ino:16 int16_t bmpHeader[7 + 20 + 32] = {
    +dump.ino:16 uint16_t bmpHeader[7 + 20 + 32] = {
    -dump.ino:16 -240, -1, // Height = -240
    +dump.ino:16 0xFF10, 0xFFFF, // Height = -240

    但し、上記の変更を行っても、他に多数の”narrowing conversion”が発生するので全てを修正はしません。^^;

Leave a comment