前回の“Genuino101プログラム”に続き、今回は「Raspberry Piプログラム」の作成について紹介を致します。
sudo apt-get install libglib2.0-dev
(2) ライブラリをインストールします。Pythonのバージョンにより実行するコマンドが異なります。
sudo pip install bluepy
sudo pip3 install bluepy
以上でライブラリのインストールは終了です。
#! /usr/bin/env python3 # -*- coding: utf-8 -*- # モジュールをインポート import bluepy.btle as btle import struct import tkinter as Tk # Python3.4 import tkinter.messagebox as Msg # Python3.4 #import Tkinter as Tk # Python2.7 #import tkMessageBox as Msg # Python2.7 import sys # Frameクラスを定義 class Frame(Tk.Frame): def __init__(self, master=None): Tk.Frame.__init__(self, master) # Variableオブジェクトのインスタンスを生成 self.stat = Tk.StringVar() self.sig = Tk.StringVar() self.rly = Tk.StringVar() self.eep = Tk.StringVar() self.life = Tk.IntVar() self.rmlife = Tk.StringVar() # 変数の初期化 self.cnt = 10 self.pcdata = 0 self.prv_data = 0 self.rlydata = 0 self.eepdata = 0 self.lifedata = 100000 self.started = False # Variableに値を設定 self.var_set() # ウィンドウのタイトルを設定 self.master.title('Relay Control Demo') # リレーの状態を表示するフレームを設定 f_display = Tk.Frame(self, relief=Tk.RIDGE, bd=4) f_display.pack( padx=5, pady=5 ) # リレーの状態を表示するラベルを設定 self.fc_display = Tk.Label(f_display, textvariable=self.stat, width=15, relief=Tk.SUNKEN, bd=2, font=('Helvetica', '24'), bg='white') self.fc_display.pack() # リレーの入出力信号の状態を表示するフレームを設定 g_display = Tk.Frame(self, relief=Tk.RIDGE, bd=4) g_display.pack( padx=5, pady=5 ) # リレーの入力信号の状態を表示するラベルを設定 self.g1_display = Tk.Label(g_display, textvariable=self.sig, width=30, relief=Tk.SUNKEN, bd=2, font=('Helvetica', '12'), bg='white') self.g1_display.pack() # リレーの出力信号の状態を表示するラベルを設定 self.g2_display = Tk.Label(g_display, textvariable=self.rly, width=30, relief=Tk.SUNKEN, bd=2, font=('Helvetica', '12'), bg='white') self.g2_display.pack() # リレーの寿命を表示するフレームを設定 h_display = Tk.Frame(self, relief=Tk.RIDGE, bd=4) h_display.pack( padx=5, pady=5 ) # リレーの駆動回数を表示するラベルを設定 self.h1_display = Tk.Label(h_display, textvariable=self.eep, width=30, relief=Tk.SUNKEN, bd=2, font=('Helvetica', '12'), bg='white') self.h1_display.grid(row=0,column=0, columnspan=2) # リレーの寿命を表示するラベルを設定 self.h2_display = Tk.Label(h_display, text='Life:', width=15, relief=Tk.SUNKEN, bd=2, font=('Helvetica', '12'), bg='white') self.h2_display.grid(row=1,column=0) # リレーの寿命を入力するテキストボックスを設定 self.lifeentry = Tk.Entry(h_display, textvariable=self.life, width=14, justify=Tk.RIGHT, relief=Tk.SUNKEN, bd=2, font=('Helvetica', '12'), bg='white') self.lifeentry.grid(row=1,column=1) self.lifeentry.bind('', self.func) # リレーの残り寿命を表示するラベルを設定 self.h3_display = Tk.Label(h_display, textvariable=self.rmlife, width=30, relief=Tk.SUNKEN, bd=2, font=('Helvetica', '12'), bg='white') self.h3_display.grid(row=2,column=0, columnspan=2) # ボタンを表示するフレームを設定 f_button = Tk.Frame(self) f_button.pack(pady=2) # スタートボタンを設定 self.b_start = Tk.Button(f_button, text='Start', command=self.start) self.b_start.pack(side=Tk.LEFT, padx=1) # ストップボタンを設定 self.b_stop = Tk.Button(f_button, text='Stop', command=self.stop, state=Tk.DISABLED) self.b_stop.pack(side=Tk.LEFT, padx=1) # self.measureを実行 self.measure() # テキストボックスに入力された値を型変換して変数に代入 def func(self, ev): self.lifedata = int(self.life.get()) # Genuino101からデータを取得してVariableに値を設定 def var_set(self): # Genuino101からデータを取得 try: self.pcdata = struct.unpack( 'B', PC.read() ) # 入力信号の状態 self.rlydata = struct.unpack( 'B', Relay.read() ) # 出力信号の状態 self.eepdata = struct.unpack( 'I', EEPROM.read() ) # 駆動回数 # エラー処理 except btle.BTLEException: Msg.showerror(title = 'Error', message = 'BLE Device fail or not found') root.destroy() sys.exit() # Variableに値を設定 self.stat.set('Relay Status:OFF') # リレーの状態 self.sig.set('Input Signal:%d' % (self.pcdata)) # 入力信号の状態 self.rly.set('Output Signal:%d' % (self.rlydata)) # 出力信号の状態 self.eep.set('Total Count:%d' % (self.eepdata)) # 駆動回数 self.life.set(self.lifedata) # 寿命回数 self.rmlife.set('Remain Life:%d' % (self.lifedata - int(self.eepdata[0]))) # 残り寿命回数 # Startボタンを押したとき def start(self): # Genuino101にデータを送信 try: Switch.write(struct.pack('<b', 1)) # エラー処理 except btle.BTLEException: Msg.showerror(title = 'Error', message = 'BLE Device fail or not found') root.destroy() sys.exit() self.started = True self.cnt = 10 # ボタンの状態を変更 self.b_start.configure(state=Tk.DISABLED) self.b_stop.configure(state=Tk.NORMAL) # self.countingを実行 self.counting() # Stopボタンを押したとき def stop(self): # Genuino101にデータを送信 try: Switch.write(struct.pack('<b', 0)) # エラー処理 except btle.BTLEException: Msg.showerror(title = 'Error', message = 'BLE Device fail or not found') root.destroy() sys.exit() self.started = False # ボタンの状態を変更 self.b_start.configure(state=Tk.NORMAL) self.b_stop.configure(state=Tk.DISABLED) # Variableに値を設定 self.stat.set('Relay Status:OFF') # Genuino101からデータを取得 def measure(self): # Genuino101からデータを取得 try: self.pcdata = struct.unpack( 'B', PC.read() ) self.rlydata = struct.unpack( 'B', Relay.read() ) self.eepdata = struct.unpack( 'I', EEPROM.read() ) # エラー処理 except btle.BTLEException: Msg.showerror(title = 'Error', message = 'BLE Device fail or not found') root.destroy() sys.exit() # 入力信号が変化したか判定 if self.prv_data != self.pcdata: self.cnt = 5 self.prv_data = self.pcdata # Variableに値を設定 self.sig.set('Input Signal:%d' % (self.pcdata)) self.rly.set('Output Signal:%d' % (self.rlydata)) self.eep.set('Total Count:%d' % (self.eepdata)) self.rmlife.set('Remain Life:%d' % (self.lifedata - int(self.eepdata[0]))) # 残り寿命の判定 if (self.lifedata - int(self.eepdata[0])) < self.h3_display.configure(bg='red') elif (self.lifedata - int(self.eepdata[0])) < self.h3_display.configure(bg='yellow') else: self.h3_display.configure(bg='white') # 100m秒後にself.measureを実行 self.after(100, self.measure) # 入力信号が一定時間内に変化するか判定 def counting(self): if self.started: # 入力信号が変化しなかったとき if self.cnt <= self.stat.set('Relay Status:NG') self.fc_display.configure(bg='red') # 入力信号が変化したとき else: self.stat.set('Relay Status:OK') self.fc_display.configure(bg='white') self.cnt -=1 # 1秒後にself.countingを実行 self.after(1000, self.counting) # メインウィンドウを生成 root = Tk.Tk() # ウィンドウサイズを350×250ドットに指定 root.geometry("350x280") # メインウィンドウのサイズ変更を禁止 root.resizable(0,0) # Genuino101と接続 try: Rly = btle.Peripheral(":4F:EE:0F:CC:7E") # エラー処理 except btle.BTLEException: Msg.showerror(title = 'Error', message = 'BLE Device fail or not found') root.destroy() sys.exit() # キャラクタリスティックのリストを取得 chrts = Rly.getCharacteristics() # UUIDに対応したキャラクタリスティックのインスタンスを生成 for chrt in chrts: # リレー制御開始用キャラクタリスティック if chrt.uuid == btle.UUID("19b10011-E8F2-537E-4F6C-D104768A1214"): Switch = chrt # リレー接点信号用キャラクタリスティック elif chrt.uuid == btle.UUID("19B10012-E8F2-537E-4F6C-D104768A1214"): PC = chrt # リレー励磁信号用キャラクタリスティック elif chrt.uuid == btle.UUID("19B10013-E8F2-537E-4F6C-D104768A1214"): Relay = chrt # リレー駆動回数用キャラクタリスティック elif chrt.uuid == btle.UUID("19B10014-E8F2-537E-4F6C-D104768A1214"): EEPROM = chrt # Frameクラスのインスタンスを生成 f = Frame(master=root) # Frameを配置 f.pack() # mainloopを実行 root.mainloop()
それではこのプログラムを順番に説明します。
Copyright © 2024 TAHARA ELECTRIC CO., LTD. all right reserved