エントリー

カテゴリー「オシロスコープ」の検索結果は以下のとおりです。

秋月オシロスコープキットの波形イメージ転送(2)

プログラムはできTera Termとのテストは完了したので実際にUSART(UARTかな)接続による実機確認を行うことにする

先ずはオシロキットの転送機能の確認を行っていないのでUSBで接続で確認してみた(動作しなかったら確認にもならないので・・・)

電源ON時にそれなりの文字が表示されると、どこかのサイトで見たことがあるが文字化けで最初の文字は確認できなかった(USB変換の性能の問題か?)

term

Tera Term側からXmodem受信したところ正常終了したのでオシロキットの転送機能は正常動作している

転送前後で何らかの文字が送られてないか期待したが何もなかった(転送後も上のTera Term画面から変化なし)

次は作成した(Arduino上)プログラムで確認し正常終了

実機

これまでテストで使ったSDカードの中身、タイムスタンプが同じになるのは残念なところ

SD

今回転送した波形イメージ

今日はここまでで終了

秋月オシロスコープキットの波形イメージ転送

秋月オシロスコープキットの波形イメージをPCに取り込みできるようにする

元々PCへ波形イメージをシリアルで転送する機能があるがI/FがUSARTなのでPCと通信するにはRS232CかUSBレベルに変換する必要がある

いずれにしても転送する際にPCと接続しないとならないのと受信ソフトの操作が必要で面倒だなってことで、いっそSDカードに格納してしまおうかってことを考えていた(SDにしてもPCにもっていく作業はあるが・・・)

といっても、オシロスコープにSDカードスロットを追加することはハード、ソフト的にも困難なのでUSARTの出力をAVRで受けてSDカードに格納することにした

ざーと思い立った仕様は

  • 3.3V版のATmega328Pを使用しArduinoで開発後ユニバーサル基盤に実装して組み込む
  • SDカードスロットとの接続は先日確認した物を使う
  • イメージの転送が行われてない時はスリープ状態で省電力化(自動的に転送を開始したいが可能かどうか現状は不明)
  • SDカードに格納される波形イメージファイルは連番のファイル名で被らないようにする

当初、作成しないとならないと思っていたXmodemプロトコルはArduino用のxmodemライブラリがあったので利用させてもらった

しかもXmodemで受けてSDカードに保存してくれる仕様だったのでありがたい

ライブラリはダウンロードし、IDEの libraries\xmodem 配下(xmodem フォルダー作成)に展開して、xmodem.h はそのまま、xmodem.c は xmodem.cpp と変更して置いた

さくっと以下(コメントなどは適当な部分があるので注意)を作成してTera Termを相手にテスト

/*    Oscilloscope kit for micro SD card
 *
 *      SD card attached to SPI bus as follows:
 *        MOSI - pin 11
 *        MISO - pin 12
 *        CLK - pin 13
 *        CS - pin 4
 */
 
#include <avr/sleep.h>        // スリープモード
#include <EEPROM.h>
#include <SD.h>
#include <xmodem.h>

#define PROM_CPUID_ADDR        (0)        //byte data address
#define PROM_FILENUM_ADDR    (2)        //short data address

#define CABLESELECTPIN    (4)
#define STATLEDPIN        (8)

char cpuID;
int fileNum;

void setup()
{
    // Open serial communications and wait for port to open:
    //Serial.begin(38400);
    Serial.begin(9600);
    // wait for serial port to connect. Needed for Leonardo only
    while (!Serial);

    Serial.print("Initializing SD card...");
    // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
    // Note that even if it's not used as the CS pin, the hardware SS pin
    // (10 on most Arduino boards, 53 on the Mega) must be left as an output
    // or the SD library functions will not work.
    pinMode(10, OUTPUT);

    if(!SD.begin(CABLESELECTPIN)) {
        Serial.println("initialization failed!");
        return;
    }
    Serial.println("initialization done.");

    //LEDステータス
    pinMode(STATLEDPIN, OUTPUT);

    //スリープモード設定(アイドル)
    set_sleep_mode(SLEEP_MODE_IDLE);

    //格納ファイル名データ(EEPROM保持)
    cpuID = EEPROM.read(PROM_CPUID_ADDR);
    fileNum = (EEPROM.read(PROM_FILENUM_ADDR)<<8) + EEPROM.read(PROM_FILENUM_ADDR + 1);
}

void loop()
{
    char fileName[13];

    //シリアル入出力バッファ初期化
    Serial.flush();

    //アイドルモードで転送待ち(シリアルデータ受信でウェイクアップ)
    while(!Serial.available()) {
        cli();                //割り込み禁止
        sleep_enable();        //スリープ許可
        sei();              //割り込み許可
        sleep_cpu();        //割り込みで抜ける
        sleep_disable();    //スリープ禁止
    }

    //receive file to SD write
    digitalWrite(STATLEDPIN, HIGH);
    sprintf(fileName, "OSK%c%04d.BMP", cpuID, fileNum);

    Serial.println(fileName);

    short res = XReceive(&SD, &Serial, fileName);

    Serial.print("XReceive result : ");
    Serial.println(res);

    if(res < 0) {
        //error
        for(;;) {
          digitalWrite(STATLEDPIN, HIGH);
          delay(500);
          digitalWrite(STATLEDPIN, LOW);
          delay(500);
        }
    }
    //complite
    fileNum++;

    EEPROM.write(PROM_FILENUM_ADDR, (fileNum>>8)&0xff);
    EEPROM.write(PROM_FILENUM_ADDR + 1, fileNum&0xff);

    digitalWrite(STATLEDPIN, LOW);
}

(処理概要)リセット後アイドルモードでスリープしシリアルの割り込みでウェイクアップしたらXmodemでデータ受信してSDカードに記録する

ところが、このプログラムは失敗

なぜかというと、Xmodemは受信側が転送プロトコルのトリガーになっており(つまり受信側が受信しますというデータを送信しないと送信側は待ち状態で送信しない)このプログラムでは送信側のTera Termで送信手順を行っても動作しない

とりあえずはTera Termで1文字入力したらXmodemによる通信が開始されSDカードに記録されたのでXmodemライブラリの動作確認はとれた

仕様変更で以下を追加

・SDカード格納時リセットボタンを押す

起動ボタン操作でも可能なのだがハングアップやエラー状態からの復帰方法を考慮した結果リセットボタンにすることにした
(オシロキットから転送開始が受けれれば自動にもできるが信号があるかどうか不明)

改良仕様版は以下のとおり(同じくコメントなどいいかげんな部分もあるので注意)

/*    Oscilloscope kit for micro SD card
 *
 *      SD card attached to SPI bus as follows:
 *        MOSI - pin 11
 *        MISO - pin 12
 *        CLK - pin 13
 *        CS - pin 4
 */
 
#include <avr/sleep.h>        // スリープモード
#include <EEPROM.h>
#include <SD.h>
#include <xmodem.h>

#define PROM_CPUID_ADDR        (0)        //byte data address
#define PROM_FILENUM_ADDR    (2)        //short data address

#define CABLESELECTPIN        (4)
#define STATLEDPIN            (8)

void setup()
{
    char fileName[13];

    //パワーON・外部リセット判定
    char regMCUSR = (MCUSR&0x0f);
    MCUSR = 0;

    //LEDステータス
    pinMode(STATLEDPIN, OUTPUT);

    //パワーオン・リセットとブラウン・アウト・リセットの場合はスリープする
    if(regMCUSR&(0x01|0x04)) {
        sleep();
        return;
    }

    //外部リセットとウォッチドッグ・システム・リセットの場合はデータ受信後スリープ
    // Open serial communications and wait for port to open:
    Serial.begin(38400);
    //Serial.begin(9600);
    // wait for serial port to connect. Needed for Leonardo only
    while (!Serial);

//    Serial.print("Initializing SD card...");
    // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
    // Note that even if it's not used as the CS pin, the hardware SS pin
    // (10 on most Arduino boards, 53 on the Mega) must be left as an output
    // or the SD library functions will not work.
    pinMode(10, OUTPUT);

    if(!SD.begin(CABLESELECTPIN)) {
//        Serial.println("initialization failed!");
        return;
    }
//    Serial.println("initialization done.");

    //格納ファイル名データ(EEPROM保持)
    char cpuID = EEPROM.read(PROM_CPUID_ADDR);
    int fileNum = (EEPROM.read(PROM_FILENUM_ADDR)<<8) + EEPROM.read(PROM_FILENUM_ADDR + 1);

    //シリアル入出力バッファ初期化
    Serial.flush();

    //receive file to SD write
    digitalWrite(STATLEDPIN, HIGH);
    sprintf(fileName, "OSK%c%04d.BMP", cpuID, fileNum);

//    Serial.println(fileName);

    short xresult = XReceive(&SD, &Serial, fileName);

//    Serial.print("XReceive result : ");
//    Serial.println(xresult);

    //エラーの場合はloop()へ
    if(xresult < 0) return;

    //正常終了でファイルNoをカウントアップして格納
    fileNum++;
    EEPROM.write(PROM_FILENUM_ADDR, (fileNum>>8)&0xff);
    EEPROM.write(PROM_FILENUM_ADDR + 1, fileNum&0xff);

    digitalWrite(STATLEDPIN, LOW);

    sleep();
}

void sleep()
{
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    cli();                //割り込み禁止
    sleep_enable();        //スリープ許可
    sei();              //割り込み許可
    sleep_cpu();
}

void loop()
{
    //エラー時の点滅処理
    digitalWrite(STATLEDPIN, HIGH);
    delay(500);
    digitalWrite(STATLEDPIN, LOW);
    delay(500);
}

(処理概要)電源ON時は何もしないでパワーダウンスリープ、リセットボタンでXmodeによる通信を行いSDカードに記録し正常終了でパワーダウンスリープする

アイドルスリープからパワーダウンスリープになったので未処理中は更に省電力になった

ボタンを押すという操作が増えてしまったのは残念(改良したい課題となった)

尚、プログラムサイズは以下のとおり

(追加)

状態を知るためLEDを使っている

消灯:スリープ中

点灯:通信処理中(通信しているとは限らない)

点滅:エラー時(SDカード無し、書込みエラーなど)

秋月オシロスコープキットの機能確認

秋月オシロスコープキットの機能確認と操作方法覚書

波形を保存

①[OK]でHOLD

②[V.POS]

V.POS

③[+][-]で保存先指定

④[OK]

OK

End

保存波形を参照

①[OK]でHOLD

②[SLOPE]で選択画面

③[+][-]で保存波形を選択

④[OK]

PCへ波形イメージを転送(未確認)

①HOLD画面にする(保存画面でも可能)

②[LEVEL]で転送画面

③[OK]で送信

通信設定:38,400bps,8bit,nonp,フローなし,Xmodem(CRCチェック)

最終的にはオシロスコープ本体で操作が判るようにしようと思う

秋月オシロスコープキットのケースを製作

秋月オシロスコープキットのケースを製作した

LCDとメイン基板をどのように配置するかで悩みながら高さ(厚み)が30m以上で大体140mm×120mmの入れ物を探してみた

こちらの方の様にKIDS用のお弁当箱というのも参考に100円ショップを探してみたがなかなか良いサイズの物が見つからない

アルミなどでケースを作ろうかなと作るかなと思いながら再度配置を考えていたところ、基のキットの形がいまいちだなというのを思い出した

最初にWebで見た時に思ったことなのだが、

  • 左にスローブ、右に電源コードのコネクタが配置されていて管理人は使用する時、左に置いて使いそうなので不便そう(右利きのせいか)
  • +-のボタンが反対のほうが良さそう(どこかの評価でも記載されていたかな)

のせいで、このオシロは横型でなくLCDを左90度で取り付けて縦型にしたほうが良いのでは?と考えていた

縦型になると上がスローブ、下が電源コードコネクタとなり、+-ボタンは上下になる

更にコンパクトなため片手で持ち易いのではないかな

管理人はLCDを変更したため上記の思惑は不可能だが、+-ボタンの配置を換えることは出来そうってことで基板を縦型に配置した場合も考えてみたところ150mm×180mmの入れ物でも良いかという結論に達したら、なんと目の前にあったキットの部品を整理した部品用ケースが該当してしまった

そこで100円ショップへ探しにいくと丁度良さそうなのを発見(平日は時間が無かったので本格的に探した訳だが・・・)

ケース

サイズは145×175×28mmで、このまま入れても良いが素材がポリプロピレンなので強度が欲しいパネル面は別にするため蓋は取っ払う

パネル面としてアルミかアクリルを考えホームセンタへ行ってみたら、色の良い3mmの低発泡塩ビ板があり、加工もし易そうだったので今回はこちらにした

塩ビ板

素材が柔らかいので加工は簡単でサクサク進んだ

完成後の表面(パネル面)

表

ケースの素材であるポリプロピレンと塩ビの加工は楽だがバリが取りにくかった(面取りよりリーマーで取り除く方が楽であることが判った)

パネルの角は丸くしようとも考えたが柔らかい素材なので角があっても支障はないのでこのままにした

ボタンの文字は綺麗にしたかったが面倒になって手書き

LCDの保護シートを剥がし、適当な透明シートを被せようと思ったが保護シートがあってもLCDが発光すると問題なく観れるのでそのままにした(LCDが発光すると保護シートがあるのが判らない)

大きいものになったが空いたパネル面のスペースにブレッドボードも載せられるので良し

パネル面が3mmあるのでスライドスイッチが今ひとつ使い勝手が悪くなった(良い方法があったら改善かな)

完成後の裏面

裏面

パネル面からは左が電源で右がスローブのコネクタにした

電源スイッチは現状は必要ないがリセットのため取り付け、本来電源側だがスロープ用のRCAコネクタが出っ張っているのとやっぱ電源スイッチは右という言い訳で右にした(立てる、斜めにして利用する場合を考え下方には何も置かない)

中身のLCDあたりには画面イメージの取り込み基板、下方には内蔵電源を設置できるスペースを確保している

上方にはもともとあった蓋の止め具(つまり部品ケースの状態では上下が逆)を残してあり、ここに紐を通せばぶら下げることができる

熱対策は行っていないほぼ密閉状態であるので発熱による内部温度が心配(ただ30分程の連続使用では特に熱を感じていない)

シールドは必要?と思っているがこれも現状はこのまま

 

見た目は思ったほど悪くないので満足(写真写りが悪いような)

次は画面イメージの取り込みでも考えることにする

ページ移動

  • ページ
  • 1
  • 2
  • 3
  • 4

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

Re:3.6Vの組充電池用充電器の試作
2022/11/06 from admin
Re:3.6Vの組充電池用充電器の試作
2022/11/03 from 通りすがり
Re:WXtoImgのweather.txtが更新できない件
2022/09/14 from admin
Re:WXtoImgのweather.txtが更新できない件
2022/09/14 from matusita
Re:メロディICと圧電サウンダ
2022/08/29 from 権限がありません

過去ログ

Feed