名刺くん(石田悠)

IoT演習最終レポート〜名刺くん〜

機械工学科3年石田悠

  • 0.作成にあたっての経緯

何か新しいIoT機器を作ろうと最初は張り切っていたが、思いつくものを検索してももうすでに試されているか、試作段階になっているものばかりであった。IoT名刺もヒット数がたくさんあったが、よく見ると名刺を電子化するだけのものしかなかった。いくら名刺が電子化されても、実際名刺を劇的に有効活用できるようになっているとは思えなかった。よって、私はよりヒトと名刺のリンクを強めて名刺の機能をより強力なものとするようにするデバイス、“名詞くん”を考案した。

  • 1.機能

名刺とその本人のつながりを強める、つまりはその名刺が誰のであるかがすぐわかるようにする。具体的には、名刺をもらった時間、写真、場所の情報を用いて、その名刺の人が誰かを思い出させることを、この名刺くんの主な機能とした。流れとしては、以下の図1のようである。

図1

今回、このIoT演習で作成したのはこのデモ機であり、すでに実用化されている名刺をpdf化する部分は作成しなかった。また、場所はGPSセンサーを用いた。

  • 2.作り方

最初に使用しようと考えていたのがEPS32であるが、結局カメラとの不具合によって使用を断念して、紹介していただいたRaspberry Pi Zeroを使用した。

以下が、最終的なデモ機に使用した部品を紹介する。

 

Raspberry Pi Zero ケースセット

Raspberry Pi カメラモジュールとカメラ用ケーブル

Grove button

Grove GPS

 

これらを組み合わせて、ボタンを押すと写真を撮影、GPS取得して、その時の時間とともに、IoTサーバにpostメソッドで送るというコード書いて実装した。

以下が、そのコードである。swich_camera_GPS.pyは、Raspberry Pi 上に、その他のファイルは、IoTサーバ側のコードである。

 

switch_camera_GPS.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#初期設定
import picamera
import requests
import time
import datetime
import RPi.GPIO as GPIO
import serial

# GPIO指定をGPIO番号で行う
GPIO.setmode(GPIO.BCM)

# GPIO18 ピンを入力モードに設定
GPIO.setup(18, GPIO.IN)


#カメラをONにする
camera = picamera.PiCamera()

print('カメラON')

while True:
 while GPIO.input(18)==0:
 pass

#シリアル通信でGPSデータを取得
 #10ピンにtx
 s = serial.Serial('/dev/serial0', 9600, timeout=10)
 GPS = s.readline()
 print ('GPS取得')

#カメラからキャプチャー
 camera.capture('image.jpg')

print 'カメラキャプチャ'

#キャプチャしたイメージをサーバーへpost
 url='http://iotmlab.ddns.net/~IoT04/cgi/upload.cgi'
 url2 = 'http://iotmlab.ddns.net/~IoT04/GPS/GPS_get.pl'

#時刻をファイル名にする
 d=datetime.datetime.today()
 time_cap = d.strftime("%Y%m%d%H%M%S")
 filename = 'image' + str(time_cap) + ".jpg"


 files = {'upfile': (filename, open('image.jpg', 'rb'))}
 r = requests.post(url, files=files)
 r1 = requests.get(url2, params = GPS)
 print 'サーバPOST終了'
 time.sleep(1)

upload.cgi

#!/usr/bin/perl

use CGI;
 use File::Copy;
 use File::Basename;

my $q = new CGI;

my $fname = basename($q->param('upfile'));
 #my $path = '../files';
 my $path = '../images';

my $newfile = "$path/$fname";

my $fh = $q->upload('upfile');
 copy ($fh, "$newfile");
 undef $q;

print "Location: ../upload_bin.html\n\n";

meishikun.cgi

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import re
import cgi

#dir = "../files"
dir1 = "../images" #imagesディレクトリに画像データを保存

dir2 = "../GPS/GPS_log.txt" #GPS_log.txtにGPSログを格納


files= os.listdir(dir1)# ファイルのリストを取得)

files_sorted = sorted(files, reverse = True) #listdirでは順番がおかしいのでソートする
count = 0
for x in files:
 index = re.search('.jpg',x)# 拡張子がjpgのものを検出
 if index:# jpgの時だけ(今回の場合は)カウンタをカウントアップ
 count = count + 1
f = open(dir2) #GPSログデータの読み込み
GPS = f.readlines()
f.close()

print 'Content-type: text/html\n'
print """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/st$
<html><head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>名刺くん</title>
<style type="text/css">

td{
 text-align: center;
 }
 #container {
 height: 40%;
 vertical-align: center;
 width: 80%;
 }
 #container2 {
 width: 80%;
 }
</style>
<table id = "container2">
<center><font size="5">お助けくんへようこそ!!</font></center>

"""
print('<table id = "container2">')

for s in range (count):
 if s%4==0:
 print('<tr>')

img_src = files_sorted[s]
 GPSdata = GPS[count-s-1].split(",")
 time = re.split('[image.jpeg]',img_src)
 date = time[5]
 dt = map(int,str(date))
 year = int(reduce(lambda x, y: x + y, [str(x) for x in dt[0:4]]))
 month = int(reduce(lambda x, y: x + y, [str(x) for x in dt[4:6]]))
 day = int(reduce(lambda x, y: x + y, [str(x) for x in dt[6:8]]))
 hour = int(reduce(lambda x, y: x + y, [str(x) for x in dt[8:10]]))
 minute = int(reduce(lambda x, y: x + y, [str(x) for x in dt[10:12]]))
 second = int(reduce(lambda x, y: x + y, [str(x) for x in dt[12:14]]))

GPSdata = GPS[count-s-1].split(",")
 #print GPSdata
 #print GPSdata[2]
 flag = 0
 if (GPSdata[2]!="") and (GPSdata[2]!="0"):
 lt = float(GPSdata[2])
 lg = float(GPSdata[4])
 #print lt 
 #print lg
 #lt = map(int,str(GPSdata[2]))
 #lt_d = int(reduce(lambda x, y: x + y, [str(x) for x in lt[0:2]]))
 #lt_m = int(reduce(lambda x, y: x + y, [str(x) for x in lt[2:9]]))
 lt_d = int(lt/100)
 lt_m = lt - (lt_d*100)
 #print lt_d,lt_m
 #lg = map(int,str(GPSdata[4]))
 #lg_d = int(reduce(lambda x, y: x + y, [str(x) for x in lg[0:3]]))
 #lg_m = int(reduce(lambda x, y: x + y, [str(x) for x in lg[3:9]]))
 lg_d = int(lg/100)
 lg_m = lg - (lg_d*100)
 #print lg_d, lg_m
 flag = 1

print('<td>')
 #print('<li>')
 print("%d: %s年%s月%s日%s時%s分%s秒"%(s+1,year,month,day,hour,minute,second)) 
 #print('</li>')
 #print('<img src ="../files/' + str(img_src) +' ">')
 #print('<img src ="../images/' + str(img_src) + '"width="600" height="400">')
 
 print('<a href = "../images/' + str(img_src) + '">')
 print('<img src ="../images/' + str(img_src) + '"width="120" height="80">')
 print('</a>')

print('<br/>')
 
 if flag == 1:
 print('<a href = "https://www.google.co.jp/maps/search/' \
 + 'N' + str(lt_d) +'º' + str(lt_m)+ "'" \
 + 'E' + str(lg_d) + 'º' + str(lg_m) + "'" + '">')
 else:
 print('<a href = "../GPS/noGPS.html">') 
 print('位置情報</a>')
 print ('<p>名刺をアップデート<br>')
 print('<input type="file" name="%d"></p>'%s)

print('</td>')
 if s%4 == 3:
 print('</tr>')
#print("</ol>")
print("</body></html>")

 

  • 3.改良点

位置情報に関しては改良の余地がある。今回使用したのは、GPSセンサーであったが、それでは平面的な情報しかわからず、また室内での測定は厳しく、今回の名刺の付加情報としてはあまり有用ではなかった。そのため、室内でも場所を特定できるようなシステムを作る必要があると考えられる。その一例としては、あらかじめある場所で観測できるWiFiのIPアドレスをマッピングしておき、観測されたIPアドレスの組み合わせから場所を特定する方法が挙げられる。マッピングをあらかじめしておかなくてはならず、少し手間であるのでまだまだ代替案を考察中である。

また、外観についても考察が必要であると感じた。デモ機のボディは、方眼紙で自身の手作りであるが、実際に製品として考える場合はより形状をブラッシュアップしていく必要があると思う。当初は名刺入れ型にして少し大きめのシンプルな形を想定していたが、写真を撮るということに抵抗がある人も考えられる。その解決解の一つとして考えられるのが、SHARPで販売されているRoBoHonである。人型でとても親しみやすい外観であり、写真を隠し撮りされているなどの不信感は格段に軽減されると思われる。

 

  • 4.後輩たちへ

あたかも一本道で進んできたようにも思える最終レポートとなってしまったが、実際のところはかなりの回り道を多くしてきた。もともと余裕を持ってのスケジュールであったが結局は全く時間が足りなかったわけであるが、その回り道もかなり楽しめたし、為になったと後になっては思う。それもIoTメディアラボの皆様が丁寧に1から教えてくれたからのこそであり、せっかくこの演習を履修して教われる機会を逃す手はないと思う。今までで一番楽しかった授業であると個人的には思うし、ぜひともいろんなにとに受講してもらいた。


 

発表会ビデオ