0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

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

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

前回の記事からの続き。リアルタイムプロットで表示ラインまで選択できるようなグラフができましたが、さらに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

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

ADGraph.png

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

###ソースコード

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同時に使う事はあまり無いので…

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?