作品タイトル: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/