Arduino UNOの6ch ADCをプロットしグラフ表示する(1)

前回投稿した記事で使ったArdipyと選択できるグラフ表示を使い、Arduino UNOに搭載された6ch ADC(アナログデジタルコンバータ)をグラフ表示するアプリを作りました。
6ch同時取得と、プロットするADCを選択できる仕組みを作る事を目指します。
組み込みのマイコンのプログラムをしているのであれば頻繁に使うADC(アナログデジタルコンバータ)に関しての説明は別サイトに任せておいて、とりあえず電圧をリアルタイムに表示する装置だと思ってください。

Arduino UNOとWindows PC(Python)とのインターフェースには下記を使います

https://qiita.com/Nomisugi/items/08ff9613b670bb326b82

Arduino UNOから取得したADCの表示には下記を使います

https://qiita.com/Nomisugi/items/ecb7385f2562c0a6b953

前回の記事からの続き。リアルタイムプロットで表示ラインまで選択できるようなグラフができましたが、さらにX軸とY軸を変更するような仕組みを入れてみます。


###コンセプト
Arduino UNOにはADC 6chが搭載されていますが、同時に取得してグラフ表示するソフトは見たことがないため今回作ってみようと思いました。
また、Ardipyのコンセプトである、PCとの簡単接続サンプルプログラムとなります。

###Arduino UNOで使用するポート
下図のAnalog IN専用ポートを使います。こちらのポートは0V～5Vまで測定できます。
Arduino UNOは10bitの値で5Vを表現できます。(0V = 0x0000 ,  5V = 0x03FF)とマイコン上では数値として読み取れます。
![arduino-transparent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/0c0e9f13-8ada-b327-c2f9-e0eaef42c9f3.png)


###完成イメージ
というコンセプトで完成したのは下記のようなGUIとなります。

![ADGraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/37e637c6-28b6-bae4-05e8-2a17d061f0b8.png)

Y Axis Rangeがが電圧を表しています。
Plot Numberが表示するサンプル数となります。(MAX 500ポイント)
100ms間隔でADCデータを更新と表示をしています。現在は固定値です。

###ソースコード
```Python:Ardipy_ADGraph.py
import sys
import binascii
import re
import time
import tkinter as tk
import tkinter.ttk as ttk
sys.path.append('../')
from Ardipy_Driver import Ardipy
sys.path.append('../Tool')
from Ardipy_Frame  import Ardipy_Frame
from SelectableGraph import *

Ardipy_ADGraph = "1.2"

class AdgraphException(Exception):
    pass

class Control_Frame(Ardipy_Frame):
    def __init__(self, master):
        self.log = None
        self.ardipy = Ardipy(self.log)
        super().__init__(master, self.ardipy)

        #Control Frame
        self.run_flag = True
        control_frame = tk.LabelFrame(master, text= "Control",relief = 'groove')
        start_button = tk.Button(control_frame, text="START/STOP", command=self.start)
        start_button.pack(side = 'left')
        control_frame.pack(side = 'top', fill = 'x')

        graph_list = ["AD0", "AD1", "AD2", "AD3", "AD4", "AD5"]
        graph_frame = ttk.Frame(master)
        self.gf = SelectableGraph(graph_frame, graph_list)
        graph_frame.pack(side = 'right', fill = 'both')
        self.gf.setGraph_Y_Range(-1, 6)
        self.update()

    def start(self):
        self.run_flag = not self.run_flag
        if( self.run_flag ):
            self.gf.start()
        else:
            self.gf.stop()
            
    def update(self):
        vals = []
        if (self.ardipy.isConnect() & self.run_flag):
            vals.append(self.ardipy.adRead(0) * (5/1024))
            vals.append(self.ardipy.adRead(1) * (5/1024))
            vals.append(self.ardipy.adRead(2) * (5/1024))
            vals.append(self.ardipy.adRead(3) * (5/1024))
            vals.append(self.ardipy.adRead(4) * (5/1024))
            vals.append(self.ardipy.adRead(5) * (5/1024))
            self.gf.setValues( vals )
        self.master.after(100, self.update)
        return
    

if __name__ == "__main__":
    win = tk.Tk()
    cf = Control_Frame(win)
    win.geometry("750x600")
    win.title("Ardipy ADC Graph viewer")
    win.mainloop()


    
```

###課題
・サンプリング間隔が固定なので、サンプリング間隔変更できるようにする事
・今までは単機能プログラムだったのですが、今回は機能が複雑なので、他ファイルもimportしています。
そのため、とてもシンプルにソースコード書けていますが、上記ソースをコピーペーストしただけでは動きません。
・githubに登録されている必要なコードだけをまとめる方法の勉強
・そもそもこのプログラムの有効な使い道… ADC 6ch同時に使う事はあまり無いので…