質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

ADCして取り込んだ値をリアルタイムにグラフ(横軸:時間[sec])表示する方法

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,104

score 7

【やりたいこと】
Raspberry piにmcp3208をつかってADCし入力した値をリアルタイムにグラフに表示するADチャート(正式名称ではなく俗称)のようなものが作りたいと思っているのですが、行き詰まっているのでアドバイスが頂きたく投稿しました。

ADチャートとは:イメージはオシロスコープの画面のようなものを俗称で呼んでいます。オシロスコープとは→https://ja.wikipedia.org/wiki/オシロスコープ
今回python2で作ろうとしているものもオシロスコープと類似しています。

現在下記のようなMCP3208を使ったAD変換のソースコードを作りました。

///AD変換///
# coding:utf-8

import time
from gpiozero import MCP3208


# 0.1秒インターバルの永久ループ
while True:
    time.sleep(0.1)

    Vref = 3.2947
    pot = MCP3208(channel=0)
    pot2 = pot.value * Vref

    print(str(pot2) + "V")

次に擬似的に?入力信号を作ってリアルタイムにグラフ表示するソースコードが
https://qiita.com/hausen6/items/b1b54f7325745ae43e47
のサイトにあったので(下記コード)このソースコードに上記ソースコードと合体させようとしているのですがどのように合体させるべきか分からず困っています。

/////リアルタイムグラフ表示//////
"""
matplotlibでリアルタイムプロットする例

無限にsin関数をplotし続ける
"""

from __future__ import unicode_literals, print_function

import numpy as np
import matplotlib.pyplot as plt


def pause_plot():
    fig, ax = plt.subplots(1, 1)
    x = np.arange(-np.pi, np.pi, 0.1)
    y = np.sin(x)
    # 初期化的に一度plotしなければならない
    # そのときplotしたオブジェクトを受け取る受け取る必要がある.
    # listが返ってくるので,注意
    lines, = ax.plot(x, y)

    # ここから無限にplotする
    while True:
        # plotデータの更新
        x += 0.1
        y = np.sin(x)

        # 描画データを更新するときにplot関数を使うと
        # lineオブジェクトが都度増えてしまうので,注意.
        #
        # 一番楽なのは上記で受け取ったlinesに対して
        # set_data()メソッドで描画データを更新する方法.
        lines.set_data(x, y)

        # set_data()を使うと軸とかは自動設定されないっぽいので,
        # 今回の例だとあっという間にsinカーブが描画範囲からいなくなる.
        # そのためx軸の範囲は適宜修正してやる必要がある.
        ax.set_xlim((x.min(), x.max()))

        # 一番のポイント
        # - plt.show() ブロッキングされてリアルタイムに描写できない
        # - plt.ion() + plt.draw() グラフウインドウが固まってプログラムが止まるから使えない
        # ----> plt.pause(interval) これを使う!!! 引数はsleep時間
        plt.pause(.01)

if __name__ == "__main__":
    pause_plot()

合体のイメージはAD変換したpot2の値をリアルタイムグラフのソースコードのどこかに代入することで作れるのかな?と思っていますが、どこに代入するべきか分からないのでこの部分に関してお詳しい方がいらっしゃいましたらアドバイスお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

AD変換結果を返す関数をまず作りましょう。

そして、そのグラフを描画するプログラムのところにその関数を呼び出し、yに代入するコードを書きます

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/13 12:44

    アドバイスありがとうございます。1度頂いたアドバイスを元にコードを作ってみます。また不明点があったら質問しますのでよろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る