「レジなし無人冷蔵庫」磁気センサーで冷蔵庫のドアが閉じられた事を検出する

2020.12.25

1 はじめに

CX事業本部の平内(SIN)です。

Amazon Web Services ブログでは、「レジなし無人販売冷蔵庫を構築についての記事」が公開されています。
レジなし無人販売冷蔵庫を構築できる、This is my Smart Cooler プログラムを公開しました

こちらでは、「お客様自らがレジなし無人販売冷蔵庫を迅速に構築し学習や体験ができる This is my Smart Cooler プログラムを発表します。」ということで、そのレシピがGithubで公開されています。
レジ無し無人販売冷蔵庫 構築レシピ

「これを真似てみたい」ということで、ここまで作業を進めています。

今回は、冷蔵庫のドアが閉じられた事を磁気センサーで検出してみました。

2 磁気センサー

使用した磁気センサーは、レシピで紹介さていたドアマグネット 表面実装 有線NCドア センサーアラーム磁気リードスイッチ ホワイト MC-38 2個入りです。

このセンサーは、下記のように、2つのセンサーが合わさると、10数Ω程度の抵抗で疎通します。

3 コード

このセンサーをRasperryPiのGPIO18とGNDに接続して、ドアが閉じられたことを検出するコードです。

参考:https://github.com/aws-samples/smart-cooler/blob/master/door-sensor-function/src/door_sensor.py

"""
センサーをGPIO18とGNDに接続して、ドアが閉じたことを検出する
"""
import os
import sys
import logging
import json
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
DOOR_SENSOR_PIN = 18
GPIO.setup(DOOR_SENSOR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def run_loop():
    OPEN, CLOSED = 1, 0
    last_status = None
    last_reads = []

    while True: 
        if last_status is None:
            last_status = GPIO.input(DOOR_SENSOR_PIN)
        current_status = GPIO.input(DOOR_SENSOR_PIN)
        print('current status is {}, last status is {}'.format(current_status, last_status))

        last_reads.append(current_status)
        last_reads = last_reads[-10:]

        if len(set(last_reads)) > 1:
            time.sleep(0.05)
            continue

        if last_status == OPEN and current_status == CLOSED:
            print('Door was closed')
            time.sleep(5)

        last_status = current_status
        time.sleep(1)

run_loop()

このコードを実行すると、センサーが合わさったタイミングで、"Door was closed" が表示されます。

4 取り付け

センサーの一方を冷蔵庫の下部に、そして、ドアを閉じた時に合わさるように、もう一方を扉に両面テープで貼り付けました。

ドアを閉じた時の整合は、抵抗を測定しながら作業しています。

5 最後に

今回は、磁気センサーでドアを閉じたタイミングを検出してみました。

「磁気センサー」始めて使ってみましたが、簡単に使えて色々応用できそうです。

進捗悪いですが、「レジなし無人販売冷蔵庫」頑張って作ります。