RaspberryPi(介護ロボットVol.6:離床通報機能編)
母が深夜に徘徊するのを察知すべく離床通報システムを作ることにした
子機、親機とも余っているRaspberryPi3を使う
離床マットや親機、子機のプログラムはすべて手作りしてコスパを上げる
このシステムを作るにあたってシステム概要を以下に述べる
1.センサー部の作成
材料は次の写真の通り
圧力センサー以外はホームセンターで調達のもの
(1)センサー取付
圧力センサーに防振粘着マットを貼り付け、セルロイド板とアルミ板の間に
設置
コード部分は接触不良やショートを防止するため半田付けのあとホットガン溶着する
コードがふらふらして切れないように、マットに縫い付けて完成
圧力センサーの感度を測定する
解放時:約20kΩ
坐位で両足をマットに乗せた状態:2kΩ
マットの端で立位:600Ω
マットの真ん中で立位:300Ω
解放と立位でしっかり抵抗差が出ているので回路設計も簡単そう
2.RasPiとセンサー間のインターフェース回路の作成
センサー感度がよかったので、抵抗分圧方式でスイッチングすることを考える
回路図とインターフェース基盤は次の通り
3.クライアント・サーバーシステムの構築
寝室に設置する離床センサーを収容するクライアントと
別室で警報を出すサーバーとの間はソケット通信を利用してデータの受け渡しを実現する
Pythonを使って、サーバー、クライアントともにプログラムを作る
すでにソケット通信はスタンダードなので、先人の方々の紹介されているプログラムを参考にさせていただいた
参考にしたサイトはPH_pypiさんのサイト(下記)ありがと~さんです
サーバー:https://www.raspberrypirulo.net/entry/socket-server
クライアント:https://www.raspberrypirulo.net/entry/socket-client
4.離床警報プログラムの作成
サーバー側のソケット通信プログラムに埋め込む形で次の機能を実現する
(1)離床を検出したら、親機のスピーカーで「離床・離床」と音声で伝える
JtalkパッケージをInstallして利用した
(2)離床を検出したら、日時時刻とともにログファイルに追記記録する
以上のサーバー側とクライアント側のPythonコードは次のとおり
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
import os import socket import threading from datetime import datetime HOST_IP = "192.168.0.34" # サーバーのIPアドレス PORT = 12345 # 使用するポート CLIENTNUM = 3 # クライアントの接続上限数 DATESIZE = 1024 # 受信データバイト数 class SocketServer(): def __init__(self, host, port): self.host = host self.port = port # サーバー起動 def run_server(self): # server_socketインスタンスを生成 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket: server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((self.host, self.port)) server_socket.listen(CLIENTNUM) print('[{}] run server'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) while True: # クライアントからの接続要求受け入れ client_socket, address = server_socket.accept() print('[{0}] connect client -> address : {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), address) ) client_socket.settimeout(60) # クライアントごとにThread起動 send/recvのやり取りをする t = threading.Thread(target = self.conn_client, args = (client_socket,address)) t.setDaemon(True) t.start() # クライアントごとにThread起動する関数 def conn_client(self, client_socket, address): with client_socket: while True: # クライアントからデータ受信 rcv_data = client_socket.recv(DATESIZE) if rcv_data: # データ受信したデータをそのままクライアントへ送信 client_socket.send(rcv_data) print('[{0}] recv date : {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rcv_data.decode('utf-8')) ) os.system('/usr/bin/aplay onsei.wav') with open('/home/pi/test/logfile.txt', 'a') as f: print('[{0}] recv date : {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rcv_data.decode('utf-8')) , file=f) else: break print('[{0}] disconnect client -> address : {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), address) ) if __name__ == "__main__": SocketServer(HOST_IP, PORT).run_server() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import socket import time from datetime import datetime #GPIOの初期設定 import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) #GPIO18を入力端子設定 GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP) HOST_IP = "192.168.0.34" # 接続するサーバーのIPアドレス PORT = 12345 # 接続するサーバーのポート DATESIZE = 1024 # 受信データバイト数 class SocketClient(): def __init__(self, host, port): self.host = host self.port = port self.socket = None def send_recv(self, input_data): # sockインスタンスを生成 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # ソケットをオープンにして、サーバーに接続 sock.connect((self.host, self.port)) print('[{0}] input data : {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), input_data) ) # 入力データをサーバーへ送信 sock.send(input_data.encode('utf-8')) # サーバーからのデータを受信 rcv_data = sock.recv(DATESIZE) rcv_data = rcv_data.decode('utf-8') print('[{0}] recv data : {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rcv_data) ) if __name__ == '__main__': client = SocketClient(HOST_IP, PORT) while True: sw_status = GPIO.input(18) if sw_status == 1: input_data = "離床" client.send_recv(input_data) time.sleep(0.2) |
と言うわけで完成した介護ロボ・離床通報機能版の試験動画です