概要
大阪から高松に移って一人暮らしをして10年以上。『行ってきます!』、『ただいま!』。一人でつぶやいてもどことなく寂しさを感じます。
日常のほんのちょっと寂しいなって感じたシーンをポジティブに変えられたらいいなと思い、出勤時と帰宅時に『行ってきます!』と『ただいま!』をいってくれるぬいを作ってみました。
完成品の動画像
構成
DFPlayer miniとRaspberry Pi Pico、Speakerを接続し、音声再生します。
扉の開閉検知には磁気センサを使用しています。
扉の内側に超音波センサをつけ、人の手を検知します。
「いってらっしゃい」と「おかえりなさい」の識別
扉の内側に超音波センサがついています。
出勤、外出時は超音波センサに手をかざしてからドアが開くので超音波センサが手を検知してから磁気センサがOFFになります。逆に帰宅時は、超音波センサに手がかざされることなく、磁気センサがOFFになります。このセンサの状態の違いを利用していってらっしゃいとお帰りなさいを適切に再生しています。
全体プログラム
コードはコチラ
from machine import UART, Pin, time_pulse_us
import time
# 磁気センサのピン設定
MAGNET_PIN = 4
magnet = Pin(MAGNET_PIN, Pin.IN, Pin.PULL_UP)
# 超音波センサのピン設定
TRIG_PIN = 3
ECHO_PIN = 2
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
# DFPlayer Miniの設定
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
def send_command(cmd, param1, param2):
"""DFPlayer Mini にコマンドを送信"""
checksum = 0xFFFF - (0xFF + 0x06 + cmd + 0x00 + param1 + param2) + 1
checksum_high = (checksum >> 8) & 0xFF
checksum_low = checksum & 0xFF
command = bytearray([0x7E, 0xFF, 0x06, cmd, 0x00, param1, param2, checksum_high, checksum_low, 0xEF])
uart.write(command)
# DFPlayerの初期化
send_command(0x3F, 0x00, 0x00) # 初期化
time.sleep(1)
def get_distance():
"""超音波センサで距離を測定"""
trig.low()
time.sleep_us(2)
trig.high()
time.sleep_us(10)
trig.low()
duration = time_pulse_us(echo, 1, 30000)
if duration < 0:
return None # 測定失敗
distance = (duration * 0.0343) / 2 # cm単位に変換
return distance
# 状態管理変数
open_time = None # 扉が開いた時刻
closed_state = True # 扉が閉まっているか
last_play_time = 0 # 最後に音声を再生した時刻
WAIT_TIME = 5 # 5秒間音声を再生しない
DOOR_OPEN_TIME_LIMIT = 30 # 30秒以内の判定
# メインループ
while True:
current_time = time.time()
# 扉の状態を確認(磁気センサ)
if magnet.value() == 1: # 扉が開いた
if closed_state: # 直前まで閉まっていたなら
print("扉が開いた")
open_time = current_time # 開いた時間を記録
closed_state = False # 扉が開いている状態に変更
else: # 扉が閉じている
if not closed_state: # 直前まで開いていたなら
print("扉が閉まった")
closed_state = True # 扉が閉まっている状態に変更
# 超音波センサで距離測定
dist = get_distance()
if dist is not None:
print(f"距離: {dist:.2f} cm")
# 10cm以下で、最後の再生から10秒経過している場合のみ処理
if dist <= 10 and (current_time - last_play_time) > WAIT_TIME:
if open_time and (current_time - open_time) <= DOOR_OPEN_TIME_LIMIT:
print("おかえりなさい!")
send_command(0x03, 0x00, 0x01) # おかえりなさいの音声を再生
elif closed_state:
print("いってらっしゃい!")
send_command(0x03, 0x00, 0x03) # いってらっしゃいの音声を再生
last_play_time = current_time # 再生時刻を記録
# **音声再生後、10秒間は何もしない**
print("10秒間待機...")
time.sleep(WAIT_TIME) # 10秒待機
print("再び監視開始")
# **扉の開閉状態をリセット**
open_time = None
closed_state = True
else:
print("測定失敗")
time.sleep(1) # 1秒ごとに測定
</details>
動きを付けたい!
何回か実際に使っていると、行ってきますのとき手を振ってほしいなって思いました。ぬいに動きをつけたかって思ったのですが、今回、リアルでつけるのが難しかったので、せめて動画だけでもと思い、Amazon Nova Reelで動きを付けてみました!
動画生成の様子
生成された動画②
まとめ
・仕事でめっちゃ疲れているときにお帰りなさいって言ってくれる存在がいるのはやっぱいいなって思った。自分の頭の中にあった考えが形になって嬉しいです。
・服に隠れて手が見えない写真からでも、手がにょきって出てくるのはやっぱり生成AIの強い所だと感じた。 (プロンプトを色々工夫すれば、自分の想像とか人に伝える手段として便利そう)
・複数に分裂していたのは、自分が英語でプロンプトを入力したときに単数と複数を間違えたから。自分より賢いって思った。
・でもやっぱりリアルでぬいをうごかせるようになりたいって思った。引き続き、改良していきたいなって思いました。




