Raspberry pi PICO デジタルオシロスコープ用フロントエンド　設計編


# 製作に至るきっかけ
Raspberry Pi PICOをデジタルオシロスコープにできるソフトウエアを見つけました。ロジアナの機能も持っています。

[Scoppy - Oscilloscope and Logic Analyzer](https://oscilloscope.fhdm.xyz/)

ちょうどPICOを入手してはいたものの、何に使おうかと迷っていたところでしたので、早速試してみました。
これはなかなか優れたもので、スマホのアプリと連携して利用できるものです。
これまで電子工作のお供には中華製の格安DSOとUSBのロジアナを使っていましたが、この際、こちらに乗り換えたいなと思い、ちょっと不足する部分を補う意味で、前段のアナログアンプ機能、ロジアナ用のバッファー機能を製作することにしました。

# コンセプト

フロントエンドのサンプルはこちらに公開されています。

[Analog Front-End Examples](https://oscilloscope.fhdm.xyz/wiki/Analog-Front-End-Examples)

上記の例では、高い電圧を分圧して、読み取ることを可能にするものがほとんどのようです。
あまり高い電圧を使うこともないので、せっかくなのでゲインのあるアンプを前段に置くことにします。
以下のGPIOピンを見ると各チャンネルが2&3と4&5でゲインの切り替えに対応していることがわかります、ということで、ゲインを4段階に切り替えるアンプを準備します。

[Pico GPIOs](https://oscilloscope.fhdm.xyz/wiki/GPIOs)

ロジアナのバッファーはおまけ程度ですが、3.3Vと5Vの両方に対応したものにしたいと思います。


# 設計

構想としてはこういう感じです。
ゲインの切り替えは押しボタンスイッチで順次切り替えることにします、プログラマブルアンプを利用して、ゲインを設定します。
この部分のコントロール用にPICを準備して簡単な制御を実現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/f29d4e2b-aed0-a4e6-d27c-02defb515523.png)


## ハードウエア

主要な部品は以下の通りです。
PIC以外は秋月電子で入手できます。PICは必要なピン数があれば、ほかの型番でも問題ありません。

* バッファアンプ MCP6022
* プログラマブルゲインアンプ MCP6S21
* 仮想グラウンド用オペアンプ AD8656 
* アナログ電源用レギュレータ ADP151AUJZ-3.3
* レベルコンバーター AE-LLCNV8-DIP20(８ビット双方向ロジックレベル変換ブレークアウトモジュールキット)
* PIC 16F1503

回路図はこちらになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/21581441-479f-bd00-008a-530ad5bc8431.png)


## ソフトウエア

PICの部分のソフトを作りました。
押しボタンスイッチを押した時に割り込みを発生させ、順次SPIでプログラマブルアンプのゲインとPICOへの電圧設定ピンを切り替えていきます。

```
#include "mcc_generated_files/mcc.h"


int amp1=0;
int amp2=0;

void SPICmd1(unsigned char adrs,unsigned char data)
{
    SPI_Open(SPI_DEFAULT);
    IO_RA2_SetLow();
    SPI_ExchangeByte(adrs);
    SPI_ExchangeByte(data);
    SPI_Close();
    IO_RA2_SetHigh();
}

void SPICmd2(unsigned char adrs,unsigned char data)
{
    SPI_Open(SPI_DEFAULT);
    IO_RC3_SetLow();
    SPI_ExchangeByte(adrs);
    SPI_ExchangeByte(data);
    SPI_Close();
    IO_RC3_SetHigh();
}

void BUTTON_1(void)
{
    unsigned char gain;    
    // increment amp variable
    amp1++;
    amp1&=0b11;
    // set amp gain 00=x1,01=x5,10=x10,11=x32
    
    // set multiplier to PICO
    IO_RA5_PORT=amp1 & 0b1;
    IO_RA4_PORT=(amp1 >>1) & 0b1;
    //IO_RC0_Toggle();
    
    if (amp1 ==0) 
    {
        gain=0;
    } else 
    {
        gain=((unsigned char)amp1<<1) | 1;
    }
    SPICmd1(0b01000000,gain);
    
    // wait a while (to avoid chataling)
    DELAY_milliseconds(10);
    while(IO_RA0_GetValue() ==0){}
    DELAY_milliseconds(10);
}

void BUTTON_2(void)
{
    unsigned char gain;    
    
    // increment amp variable
    amp2++;
    amp2&=0b11;
    // set amp gain
    
// set multiplier to PICO
    IO_RC5_PORT=amp2 & 0b1;
    IO_RC4_PORT=(amp2 >>1) & 0b1;
    
    
    if (amp2 ==0) 
    {
        gain=0;
    } else 
    {
        gain=((unsigned char)amp2<<1) | 1;
    }
    SPICmd2(0b01000000,gain);
    
    
    // wait a while (to avoid chataling)
    DELAY_milliseconds(10);
    while(IO_RA1_GetValue() ==0){}
    DELAY_milliseconds(10);
}

/*
                         Main application
 */
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:
    IOCAF0_SetInterruptHandler(BUTTON_1);
    IOCAF1_SetInterruptHandler(BUTTON_2);

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();
    
    // Set initial state of RC port

    //Set all low PICO div output
    IO_RA4_SetLow();
    IO_RA5_SetLow();
    IO_RC4_SetLow();
    IO_RC5_SetLow();

    // SPI CS port set as HIGH
    IO_RA2_SetHigh();
    IO_RC3_SetHigh();
            
        
    while (1)
    {
        // Add your application code

        SLEEP();
    }
}
```

と、ここまでを一度ブレッドボード上で実現して、動作を確認しました。

今回はプリント基板を発注して製作しましたので、製作編に続きます。

[Raspberry pi PICO デジタルオシロスコープ用フロントエンド　製作編](https://qiita.com/keitanak/items/d4c69b0e14b74861dfbe)

# 関連リンク

ラズパイ PICO オシロの紹介をされている動画、ページなどのご紹介です。

[衝撃の価格！わずか1,000円で超手軽に使えるオシロスコープをご紹介します！](https://www.youtube.com/watch?v=TDA-7wgfBe0&t=679s)

[【部品代1000円】Raspberry Pi Picoで オシロスコープ](https://www.youtube.com/watch?v=LRcMg56Tius&t=99s)