LoginSignup
15
4

More than 5 years have passed since last update.

IoTのポストを作ってみた

Posted at

概要

ポストに郵便物が届いたら、ケータイに通知が届くIoTシステムを考えました。

材料

・3軸加速度(ジャイロ)センサモジュール KXR94-2050
・Raspberry Pi Model 3B
・ジャンパーケーブル
・ブレッドボード
・Arduino
・USBケーブル
・電源など、他

大まかな概要図


次のような流れで、作っていきます。
iotポスト概要図.png

接続

このようにブレッドボードとラズパイ、Arduinoを接続しました!
無題のプレゼンテーション (2).png

仕様書を見ながらジャイロセンサーをArduinoに接続し、ArduinoはUSBでラズパイに接続しています。

IoTポストの仕組み


ポストの開閉部分にジャイロセンサをつけ、ポスト開口部の「開閉動作があった時に動く方向軸」の角度が変わったらものが届いたという判断をします。開口部が動く方向軸以外の動きは必要ない情報なので、取得していません。

Arduinoとジャイロセンサーで傾きの値を取得し、USBシリアル通信でラズパイのPythonへデータを送ります。Pythonでは、得た傾きの値を元に、ポストに動きがあったかどうかを検知しています。

動画



ソースコード

Arduinoスケッチ

#include <SoftwareSerial.h>

void setup() {
  Serial.begin(9600);
}

void loop() {
  long x;
  x = 0 ;
  x = analogRead(A3) ;
  Serial.print(x);
  delay(200);
}

Python

import serial
import time
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

FROM_ADDRESS = '通知を出すメールアドレス(Gmail)'
MY_PASSWORD = 'パスワード(Gmailのパスワード)'
TO_ADDRESS = '通知を受けるメールアドレス'
BCC = ''
SUBJECT = 'POST!'
BODY = 'Got a Post!!'

def main():
   i = 0
   x_a = 0
   x_dif = 0

  con = serial.Serial('/dev/ttyACM0', 9600) 
  #ラズパイで、コマンド「dmesg」でデバイスファイルの名前を調べましょう。
  #Arduino UNOならこのままでいいです。

   time.sleep(2)
  print con.portstr
while 1:
    str=con.read(3)
    x = str.decode()
    if(x > x_a):
      x_dif = int(x) - int(x_a)
    else:
      x_dif = int(x_a) - int(x)

    if(x_dif > 100):
      if(i != 0):
          print("POST")
          to_addr = TO_ADDRESS
          subject = SUBJECT
          body = BODY

          msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
          send(FROM_ADDRESS, to_addr, msg)

          flg = True
          time.sleep(30)

      else:
        i = 1

    x_a = x

def create_message(from_addr, to_addr, bcc_addrs, subject, body):
  msg = MIMEText(body)
  msg['Subject'] = subject
  msg['From'] = from_addr
  msg['To'] = to_addr
  msg['Bcc'] = bcc_addrs
  msg['Date'] = formatdate()
  return msg

def send(from_addr, to_addrs, msg):
  smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
  smtpobj.ehlo()
  smtpobj.starttls()
  smtpobj.ehlo()
  smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
  smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
  smtpobj.close()

if __name__ == '__main__':
  main()

つまずきやすいポイント

実現したいことに対してどんなセンサーを使用するのかが、IoTを考える上で重要なポイントです。
色々試してみて、今回は惜しくも向かなかったのが感圧センサー。指で押したりした時の圧力は測れるのですが、紙程度の重さではセンサーの数値が誤差程度しか動かなかったので、使用しませんでした。

感想


この方法で、郵便物が届いたことを確実に通知できました!
15
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
4