がじぇっとるねさす

ホビーとエレクトロニクスを繋げるサイト

がじぇるね工房

作品タイトル:GR-SAKURAを使って家庭の問題を解決する

表示名:北村トモミ

GR-SAKURAを使って家庭の問題を解決する

コンセプト・作品説明
お母さんがGR-SAKURAを使ったら

初めまして、北村トモミ(@tomomi_ktmr)と申します。10歳と6歳の娘をもつお母さんです。7年前まで、ロボットや電子工作をしていましたが、次女の妊娠を機に封印。当時、Arduinoも少しいじっていました。

最近のIoTブーム到来で、また何か作ってみようかという気になっていたところに、Arduinoライクに使えて、しかも最初からネットワークに接続できてSDまで読める!?というてんこもりセットGR-SAKURAをゲット。(当時はそれを実装するのは、大変だったような。。時代の流れを感じます。)Softbankで開催されたIoTの勉強会 「IoT LT」で発表させていただいた作品のご紹介です。
####

子供の困ったを解決する

せっかく作るので、なにか役立つ物作りをしようと考えました。次女が新1年生になって勃発した問題が「お母さんにプリントを渡すのを忘れる」あるあるですね。

長女の時は、それはもう大変でした。怒る母(私)、泣く長女、こんな悲劇は二度と繰り返さないように、今回は、子供が楽しんでお手紙を渡したくなる仕組みを、GR-SAKURAを使って作ることにしました。

お手紙を、「お手紙入れ」に入れると何か楽しいことが起きれば、お手紙を渡すようになるだろうと思い、なにか動いたり音が出たりするシステムを作ることにしました。

####

簡単に作りたい

お手紙が届いたことを検知すると、サーボモーターが動いて、スピーカーから音がでるという簡単な仕組みで作ることにしました。できれば、長女(10歳)にもわかるような簡単なものを作りたかったのです。

検知する仕組みは、光センサ(CdSセンサ)を使い、お手紙が入ることによって、センサ部分が暗くなり、しきい値を超えた場合にお手紙が入れられたという判定にします。

音は、現代っ子はBeep音では満足してくれません。GR-SAKURAにはSDを読み込める機能がすでにあるので、音楽と音声を録音しwavデータをSDに書き込んで再生することにしました。音データは実際に長女にピアノを弾いてもらい、次女(当事者)に声を吹き込んでもらいました。 制作に本人達を巻き込んで、なるべく愛着を持つように制作の段階から関わってもらいました。

 

####

お母さんの問題を解決するためのネットワーク機能

しかし、お手紙を入れてくれたのをお母さんが気づかない。。。という問題が発生しました。 追加仕様として、「メール通知」を追加、メールでは見損ねることや忘れることもあるので、「ダイニングの照明の色が変わる」という機能を追加しました。

これらの機能は、一見難しそうに思えますが、「IFTTT」というWebサービスで簡単に実装できます。

####

実際に使ってみた

配布物を確実にお母さんに渡すシステム「otegami」を制作しました。 クリアトレイにお手紙をいれると、音が出て、旗が動きます。その後、お母さんにメールが届き、ダイニングの照明が赤くなります。流石に、お母さん(私)もダイニングの照明が赤くなっていたら気づきます。 実際に使ってみたムービーはこちらです。
https://youtu.be/xqYPw-6wLeQ

 

####

使ったもの

・CdSセル 30円
 (秋月電子通商 http://akizukidenshi.com/catalog/g/gI-00110/
・抵抗 10kΩ 1円ぐらい
 (秋月電子通商 http://akizukidenshi.com/catalog/g/gR-25103/
・圧電スピーカー 50円
 (秋月電子通商 http://akizukidenshi.com/catalog/g/gP-01251/
・サーボモーター E-SKY EK02 0500 400円ぐらい?
・クリアトレイ(ダイソー)100円
・スペーサー(M2.6 六角・ネジ)GR-SAKURA取り付け用
 (秋月電子通商 http://akizukidenshi.com/catalog/goods/search.aspx?keyword=M2.6&maker=myg&goods=&number=&name=&min_price=&max_price=&last_sdt=&sort=&style=T&search.x=0&search.y=0
 (秋月電子通商 http://akizukidenshi.com/catalog/g/gP-07324/
・ブレッドボードジャンパーコード(柔らかいジャンパワイヤー)
 (秋月電子通商 http://akizukidenshi.com/catalog/g/gC-05159/
・microSD 2GB  約700円 
・PHILIPS hue フィリップス LED スマート照明システム(ネットワーク経由で色を変えられる照明)
  (http://www2.meethue.com/ja-JP

####

組み立て方法

柔らかいジャンパコードで、各センサ等を直に半田しました。そして直接、GR-SAKURAに取り付けています。熱でセンサが壊れないように気をつけて下さい。

GR-SAKURAをクリアトレイに取り付けるための穴は、クリアトレイは熱に弱いので半田ごてで溶かして穴を開け、ドライバーでゴリゴリして穴を綺麗にしました。スペーサーで取り付けます。 たまたま、クリアトレイの背面にスリットが入っている形状だったので、いつでもSDカードが取り出し可能です。その他のパーツは比較的軽いので、両面テープやかわいいマスキングテープ、ホットボンドで接着しました。

配線図

前面

背面

クリアトレイへの取り付け

 

####

スケッチ

作ったスケッチはこちらです。作ったというより、既存のSDからmp3・wavを読み出すテンプレート(GR-SAKURA_MP3_WAV_V2.07.zip)を元に、CdSセンサの値の判定、サーボモータの動作、IFTTT(メール通知、照明コントロール)を挿入して改変しただけのスケッチとなっています。お手紙を検知した後、お母さんが確認をして、背面のボタンを押すことで、リセットする機能も付いています。

 

 
/*
 * gr_sketch.cpp - wavmp3p library
 * Copyright (c) 2015 Mitsuhiro Matsuura.  All right reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
/* This template is based on GR-SAKURA Sketch Template V2.07 */

#include 
#include 
#include 
#include 
#include 
#include 
// servo ^^
#include 
#define INTERVAL 50
int val=0; 
// servo vv


#define LED_ON		HIGH
#define LED_OFF		LOW

#define Serial Serial1
#define SW_PAUSE	5
#define SW_SKIP		4
#define SW_ON		0
#define SW_OFF		1


Servo servo0;

// IFTTT ^^^
//#define USE_SERIAL

// Enter a MAC address and IP address for your controller below.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;
char server[] = "maker.ifttt.com";

// IFTTT strings
char eventName[] = "otegami"; // Enter THIS event name for your recipe
char secretKey[] = "d6nhkuCDkhqCgQFAgNtNMr"; // Enter your secret key
char s[128];
int val1, val2, val3;

int frg = 0;

// IFTTT vvv


WavMp3p wavmp3p(44100);
File root;

static
void cyclic_handler(void);

void setup()
{
 //   Serial.begin(9600);	
	
// servo ^^
    pinMode(PIN_SW, INPUT);
    servo0.attach(9);
    servo0.write(90);
    

// servo vv
    
	Serial.begin(115200);
	Serial.println("wav & mp3 player");

	pinMode(PIN_LED0, OUTPUT);
	digitalWrite(PIN_LED0, LED_ON);

	while(!SD.begin())
	{
		Serial.println("Card failed, or not present.");
		digitalWrite(PIN_LED0, LED_OFF);
		delay(1000);
		digitalWrite(PIN_LED0, LED_ON);
	}

	pinMode(SW_PAUSE, INPUT_PULLUP);
	pinMode(SW_SKIP, INPUT_PULLUP);

	MsTimer2::set(100, cyclic_handler);
	MsTimer2::start();
	
	
	// IFTTT ^^^^
	    pinMode(PIN_LED0, OUTPUT); // check to start
    pinMode(PIN_LED1, OUTPUT); // check to begin Ether
    pinMode(PIN_LED2, OUTPUT); // check to connect IFTTT
    pinMode(PIN_LED3, OUTPUT); // check to finish sending HTTP
    pinMode(PIN_SW, INPUT);

    // Open serial communications and wait for port to open
#ifdef USE_SERIAL
    Serial.begin(9600); // for debug
    while (!Serial.available())
        ; // key wait
    Serial.println("start to begin Ether.");
#endif

    digitalWrite(PIN_LED0, HIGH);

    // start the Ethernet connection:
    while (!Ethernet.begin(mac)) {
#ifdef USE_SERIAL
        Serial.println("Failed to configure Ethernet using DHCP");
#endif
    }
    digitalWrite(PIN_LED1, HIGH); // success to begin

#ifdef USE_SERIAL
    // print your local IP address:
    Serial.print("My IP address: ");  // for debug
    Serial.println(Ethernet.localIP());  // for debug
    Serial.println("Push blue SW on GR-SAKURA to start.");  // for debug
#endif

// IFTTT vvvv
	
}

#if 1
void loop()
{
//	wavmp3p.play("1.mp3");
//	wavmp3p.play("2.mp3");
	
//wavmp3p.play("1.wav");
//	wavmp3p.play("2.wav");

val=analogRead(0);
//Serial.println(val); //入力された値をモニターに出力

    delay(500);


// IFTTT ^^^
// 青ボタンを押した時にfrgを0に
   if (digitalRead(PIN_SW) == LOW) {
    frg=0;
    // wav play ^^^
    wavmp3p.play("2.mp3");
}

   if(frg == 0 && val > 390){
    frg=1;
// wav play ^^^
    wavmp3p.play("1.wav");
// servo move
        servo0.write(45);
        delay(1000);
        servo0.write(90);
        delay(1000);
        servo0.write(135);
        delay(1000);
        servo0.write(90);
        delay(1000);
        servo0.write(45);
        delay(1000);
        servo0.write(90);
        delay(1000);
        servo0.write(135);
        delay(1000);
        servo0.write(90);
        delay(1000);
         


        // if you get a connection, report back via serial:
        if (client.connect(server, 80)) {
            digitalWrite(PIN_LED2, HIGH);
#ifdef USE_SERIAL
            Serial.println("connected to IFTTT server");  // for debug
#endif
            // Make a HTTP request:
            sprintf(s,
                    "GET http://maker.ifttt.com/trigger/%s/with/key/%s HTTP/1.1",
                    eventName, secretKey);
#ifdef USE_SERIAL
            Serial.println(s); // for debug
#endif
            client.println(s);
            client.println("Host: maker.ifttt.com");
            client.println("Connection: close");
            client.println();
            digitalWrite(PIN_LED3, HIGH);
            delay(500);
        }
        else {
            // if you didn't get a connection to the server:
#ifdef USE_SERIAL
            Serial.println("connection failed");  // for debug
#endif
        }
        digitalWrite(PIN_LED2, LOW);
        digitalWrite(PIN_LED3, LOW);
    }

    if (client.available()) {
        char c = client.read();
#ifdef USE_SERIAL
        Serial.print(c);
#endif
    }

    if (!client.connected()) {
        client.stop();
    }
    // IFTTT vvv


}

#else
// This sample plays the .wav or .mp3 in a card in order.
char path[1024][8+1+3+1];

void printDirectory(File dir, int numTabs)
{
	while(true)
	{
		File entry = dir.openNextFile();

		if(!entry)
		{
			return;
		}

		if(entry.isDirectory())
		{
			strcpy(path[numTabs], entry.name());
			printDirectory(entry, numTabs + 1);
		}
		else
		{
			char fpath[1024] = "";
			for(uint8_t i=0; i< numTabs; i++)
			{
				strcat(fpath, path[i]);
				strcat(fpath, "/");
			}
			strcat(fpath, entry.name());
			Serial.print(fpath);

			char *res = wavmp3p.play(fpath);
			if(res)Serial.println(res);
		}
	}
}

void loop()
{
	root = SD.open("/");
	printDirectory(root, 0);
	Serial.println("done!");
}
#endif

// The below handler enables to skip or stop.
static
void cyclic_handler()
{
	static int ct_pause = 0;

	if(SW_ON == digitalRead(SW_PAUSE)){
		if(ct_pause == 2){
			if(wavmp3p.read_pause()){
				wavmp3p.pause(0);
				digitalWrite(PIN_LED0, LED_ON);
			}else{
				wavmp3p.pause(1);
				digitalWrite(PIN_LED0, LED_OFF);
			}
			ct_pause++;
		}else if(ct_pause < 2){
			ct_pause++;
		}
	}else{
		ct_pause = 0;
	}

	static int ct_skip = 0;

	if(SW_ON == digitalRead(SW_SKIP)){
		if(ct_skip == 2){
			wavmp3p.skip();
			digitalWrite(PIN_LED0, LED_ON);
			ct_skip++;
		}else if(ct_skip < 2){
			ct_skip++;
		}
	}else{
		ct_skip = 0;
	}
}


 

####

IFTTTが便利

IFTTTとは、Webサービス(Facebook,Twitter,メールなど)同士を連携させるWebサービスです。Web上(http://ifttt.com)でもアプリからでも設定ができます。 接続できるサービスは多岐にわたっていて、その中にArduinoを接続できる「MakerChannel」というものがあります。それを利用して、ArduinoからIFTTTを通じて、メールなどを送信できます。

北村トモミ

本業はWeb制作・保守運用、ITアドバイザー。

6年前ぐらいまでロボットのホビーユーザー(HN:miuママ)でロボコンマガジンの記事執筆などもしていました。第二子の妊娠をきっかけに電子工作を封印。

近年、障害者支援のNPO法人「ICT救助隊」のお手伝いと、長女(10歳)がロボットに目覚め始めたので活動を再開。

IT、IoTを、誰にでもできる簡単!なものにすべく研究中

技術メモ、日記:おかんとロボと時々育児

http://ameblo.jp/ktmrke/

NPO法人「ICT救助隊」
http://www.rescue-ict.com/wp/
Twitter:
https://twitter.com/tomomi_ktmr
Facebook:
https://www.facebook.com/kigyoujoshi.web
Instagram:
https://www.instagram.com/tomomi_ktmr/

フォローする

share