バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はtkinterのタイマ処理にmatplotlibへの描画を追加。
と言っても、コードを追加しただけで動作は見ていない。
よって、今回は実際の動作を確認してみる。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
現状のソースコード
太郎くん
ここまで、いろいろコードを追加してきたと思うけど、
現状どういうことになってるんだろう?
フクさん
前回のタイマ処理にsin波描画を追加した段階で以下になってるな。
import tkinter
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import time
import numpy as np
root = tkinter.Tk()
root.title("DC Motor Control")
w = root.winfo_screenwidth()
h = root.winfo_screenheight()
root.geometry(str(int(w/2))+"x"+str(int(h/2))+"+"+str(int(w/2))+"+0")
fig = plt.figure()
fig.set_size_inches(8.4, 4.5)
ax = plt.subplot(1,1,1)
ax.set_xlabel('Time')
ax.set_ylabel('Value')
# define plots
ax.plot([], [], label="target[rad/s]", color='Magenta',linewidth=3)
ax.plot([], [], label="voltage[V]", color='Red')
ax.plot([], [], label="speed[rad/s]", color='Blue',linewidth=0.9)
ax.plot([], [], label="loadTorqueStep.tau[N m]", color='Cyan')
ax.plot([], [], label="current[A]", color='Green',linestyle='--',linewidth=0.8)
ax.plot([], [], label="cpu_load[ms]", color='Black',linestyle='--',linewidth=1)
ax.legend(bbox_to_anchor=(1, 1), borderaxespad=0, fontsize=10)
ax.grid(which='both')
canvas = FigureCanvasTkAgg(fig, root)
canvas.get_tk_widget().pack(side = tkinter.RIGHT)
toolbar=NavigationToolbar2Tk(canvas, root)
toolbar.place(x=0, y=h/2-40)
scalbln = tkinter.BooleanVar()
scalbln.set(True)
chk = tkinter.Checkbutton(root, variable=scalbln, text="Enable Scale bar")
chk.place(x=0, y=10)
cpuloadbln = tkinter.BooleanVar()
cpuloadbln.set(False)
chk = tkinter.Checkbutton(root, variable=cpuloadbln, text="Enable Cpu Load")
chk.place(x=0, y=30)
pausebln = tkinter.BooleanVar()
pausebln.set(False)
chk = tkinter.Checkbutton(root, variable=pausebln, text="pause")
chk.place(x=0, y=50)
sinbln = tkinter.BooleanVar()
sinbln.set(False)
chk = tkinter.Checkbutton(root, variable=sinbln, text="sin wave")
chk.place(x=0, y=70)
sawtoothbln = tkinter.BooleanVar()
sawtoothbln.set(False)
chk = tkinter.Checkbutton(root, variable=sawtoothbln, text="Sawtooth wave")
chk.place(x=0, y=90)
def change(value):
if scalbln.get():
_ytmp = float(value)
print(_ytmp)
scale = tkinter.Scale(
root,
label = "target Speed",
orient=tkinter.VERTICAL,
command=change,
length = 300,
from_ = 100,
to = 0
)
scale.pack(side = tkinter.LEFT)
def plot_handler():
if pausebln.get() == False:
times = np.linspace(time.perf_counter()-8, time.perf_counter(), 800)
ax.lines[0].set_data( times, np.sin(times) )
ax.relim() # recompute the data limits
ax.set_xlim(times[0],times[-1])
canvas.draw()
root.after(200, plot_handler)
plot_handler()
root.mainloop()
動作確認
太郎くん
現状のコードが確認できたところで動作確認をしてみよう。
太郎くん
お!
ちゃんとsin波が動いてる!
太郎くん
そして、pauseのチェックを入れるとちゃんと一時停止になってる。
フクさん
これでtkinterのタイマでリアルタイム描画はできそうってのが確認できたわけだ。
まとめ
フクさん
まとめだよ。
- いままでごちゃごちゃと追加してきたコードを再確認。
- tkinterによるリアルタイム描画の動作確認。
- sin波が流れるように描画されていることを確認。
- pauseで一時停止もできることを確認。
- FMU関連処理はまだ未実装だが、tkinterによるリアルタイム描画はできそう。
バックナンバーはこちら。
コメント
I enjoy what you guys are up too. This sort
of clever work and reporting! Keep up the fantastic works guys I’ve
added you guys to blogroll.