ニートの言葉

元ニートがやってみたこと・その過程で学んだこと・考えたこと・技術メモあたりを主に書いています。情報革命が起きた後に訪れるであろう「一億総ニート時代」の生き方を考え中です。

僕の「IoT」が電子工作の域を出なかった理由

こんにちは。あんどうです。

最近はArduinoRaspberry Piの登場によって様々なものを簡単にインターネットに繋ぐことができるようになりました。

いわゆる、モノのインターネット化(= IoT)です。

IoTとは

モノのインターネット(Internet of Things : IoT)とは従来は主にパソコンやサーバー、プリンタ等のIT関連機器が接続されていたインターネットにそれ以外の様々な"モノ"を接続する技術です。

モノのインターネットとは(IoT:Internet of Things) - モノワイヤレス株式会社

僕が作った「IoT」

僕は普段はWeb系の開発に携わっているのですが、趣味でIoTを始めてみたところすごく簡単に以下のようなものを作れるようになりました。

空調管理機能付きペットモニター

部屋の温度・湿度が確認ができ、スマホからエアコンの操作が出来るペットモニターです。

andoo.hatenablog.com

一人暮らしの高齢者見守りデバイス

祖母が遠くで一人暮らしをしているので、安否をゆるく見守るためのデバイスを作りました。

andoo.hatenablog.com

現地の様子を見ながら操作ができるラジコン

ニコ生のコメント動くラジコンなんかも作ってます。(動画はスマホから操作できるラジコン)

世の中の流れもIoTやモノ作りに向いているものの…

世の中の流れとしても「IoTや3Dプリンタの流行によって、ハードウェア・モノ作りがこれから来る」と言われていますが、個人的にはなんとなくピンと来ませんでした。

 

もう少し正確に表現すると

僕がやっている内容は「IoT」と称しているけれど、電子工作レベルだなぁ

と感じていました。

それはなぜか

IoTの本質は大量のセンサーをばら撒いて、大量のデータを集め、解析し、最適化することだと考えています。

例えば、電力消費のデータを集め、解析することで最適化することで省エネに結びついたり、人の行動のデータを集めることで健康になるようにフィードバックをしたり。

データを集めるためには当然ながら多くの人に使ってもらう必要があります。
つまり、広く普及している状態が必須なのです。

となると、センサーの量産が必要になるわけですが、ぼくは上記のものを作ったとき、量産するということを念頭に置いていませんでした

 

つまり、インターネットに繋がったものを一つだけ作るのであれば、それはただの電子工作(=趣味レベル)であって、IoTとは呼べないなと感じたのです。 

 

もちろん、学習の過程としては正しいのだと思いますが、購入したパーツを組み合わせ・て動かして・満足する、それだとArduinoやRaspberryPiの外の世界には触れられないような気がしていて、壁を感じているところです。

まとめ

以上の内容が、僕が最近感じている問題なのですが、それでは一体どうすれば良いのか?というものも自分なりに考えてみました。

しかし、わからないことだらけですので、アドバイスを頂けるとありがたいです。

今考えている「今後やるべきこと」

まずは量産を前提に、ハードの製造工程を学ぶ必要があります。
(売れるかどうかなどのマーケティングも、もちろん必要になってきます)

 

そのためには

 1.回路図の設計方法

 2.外注をする方法

この辺りを習得するべきなのかなと

 

外注に関しては、中国でPCBAというプリント基板の作成だけでなく、パーツの調達から組み立てまで行ってくれるサービスがあるようですので、そのサービスを使うことでクリアできそうに思います。

(もしかしたら、やりたいことを明文化して投げるだけで回路の設計段階から行ってくれる業者もあるかもしれませんが、この辺りに関しても無知なのでまだよくわかっていません。)

 

回路図の設計方法に関しても同様に無知ですので、関連する勉強会や学習サイト・参考資料などありましたら是非教えてください。というか、どなたか勉強会(オンライン・オフライン問わず)を開催しましょう。

 

追記

この方の記事は非常に参考になりました。

qiita.com

 

追記 その2

力武健次技術士事務所の力武健次様より非常にご丁寧なアドバイスをいただきました。

ご本人様から転載の許可を頂きましたので、追記します。

  • 日本では幸いまだ日本語の書籍や情報が残っている(10年後はわかりませんけど)ので、一度大きな書店の電子工学関連で回路の製作記事の載っている本やムックや雑誌(のバックナンバー)を時間をかけて読み漁ってみる。必要だと思ったら買って隅から隅まで読む。都内ならジュンク堂や丸善がありますから困らないと思います。
  • 安定したプロトタイプはブレッドボードでは作れません。ハンダ付けは必修だと思います。いきなり表面実装から入らなくてもいいので、まずは2.54mmピッチのユニバーサル基板をどう使うかから入っていくといいかもしれません。幸いまだ手ハンダで付けられる部品は売っています。
  • 安定した回路にはバイパスコンデンサやコモンモードフィルタなど、動作を支えるための部品が入っています。これらの役割を学び、プロトタイピングで実証実験をすることが必要でしょう。
  • 量産を考える場合は、できるだけ部品の種類と数を減らしていくことが必要になります。特に機構部品や接点は不良の原因になります。抵抗よりもコンデンサ、コンデンサよりもコイルの方が扱いが難しくなります。半導体にも不良が出ます。
  • 他の方も書かれていますが、量産して何をするかによって、向かう方向は変わってくると思います。商品にするのであれば当然関連法規(PSE法や電波法など)を遵守しなければなりません。
  • 一見動いていても、実はとんでもない動作状況になっていることがあります。各種デジタル/アナログ回路の計測技術は知っておいても損はないでしょう。
  • ソフトウェア的視点からいうと、PCやスマホのようなわけにはいかない(消費電力にすぐに跳ね返る)ので、機能をどう削ぎ落すかが大事になってくると思います。あと、自分でできないことをどうやって他のモジュールに任せるかも重要でしょう。

【技術記事】PHPMailerでGmailのSMTP経由でメールを送信する際にSMTP connect() failed.と出て困った

今回は技術ネタです。

 

経緯 

PHPを使って、メールを送信したかったのですが、PHPで実装されているメーラー?を使うとよく迷惑メールに入れられてしまいます。

 

そこで調べたところ、GmailのSMTP経由で送ると大丈夫っぽかったので、新規でGmailアカウントを作成し、そのアカウントを経由して送信することにしました。

 

外部のSMTPを使って送れるライブラリを調べた

下記の二つが見つかりました。

 

qdmail

PHPMailer

 

初めはqdmailを使おうと思いましたが、随分前に更新が止まっていたのと、PHP5.5だと警告が出るという情報があった上に、軽く試した結果いろいろエラーが出た(詳細はメモし忘れました)ので、PHPMailerを使うことにしました。

 

参考にした情報

Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説 | エス技研

PHPMailer で GMail 送信 – Airwhite Memo

 

直面した問題

上記サイトのソースを参考に動かしてみたのですが、SMTP connect() failed.と表示され、送信できませんでした。

 

上記のサイトを見比べてもらえるとわかるのですが

・ポートが465だったり587だったり

・SSLだったりTLSだったり

この組み合わせを間違っているのが原因なのかなと推測したのですが、違ったようです。

ちなみに 

公式サイトには

ポート 465(SSL)とポート 587(TLS)

と書いてあるので、

・SSLを選択する場合はポート465を

・TLSを選択する場合は587を

選択するべきなようです。

 

解決方法

Gmailにはセキュリティの関係上、外部のサービスを使えないようにするような対策がされていたようです。

 

こちらにアクセスして安全性の低いアプリのアクセスをオンにするを選択してください。

https://www.google.com/settings/security/lesssecureapps

 

反映されるまで時間がかかる可能性も?

これは推測なのですが、この設定が反映されるまで時間がかかるかもしれません。

というのも、動かなかったソースが上記の設定変更してすぐは相変わらず動かなかったのに、半日ほど放置して再度確認すると動くようになっていたからです。

 

この設定が反映まで時間がかかるものなのか、それとも新規で作成したアカウントだったからなのか 原因はわかりませんが…情報として記載しておきます。

 

最後に動作したソースを貼っておきます

準備

この三つを同一フォルダに入れておきます。

・PHPMailerAutoload.php

・class.smtp.php

・class.phpmailer.php

 

ソース

ツイート数のカウントを再現してみた(停止中)

公式では廃止されたツイート数のカウント

ツイート数のカウントが廃止されました。

先月、Twitterの仕様変更でツイート数のカウント表示がでなくなりました。

 

Webサイトを運営している人やブログをやっている人にとっては、自分のページがどれくらいツイートされたのかって気になりますよね。

 

デザイン面の問題も

また、SNSでの共有ボタンのデザイン面でもツイート数だけ表示されず、見栄えが悪い

 

再現してみました

 

ちゃんと表示されました。

デザイン面は今後の課題ですね。

 

データの送信やCSSなどは、ひゃくそんさんのgithubを参考にさせていただきました。

github.com

 

テスト

はてなブログでも動くのかのテストをやってみます。

このボタンを押してツイートしてみてください->

記事下に設置しました。

停止しています。

twitterで特定の単語が含まれるツイートに最速で「いいね」する方法

Twitterを使っていると、特定の単語が含まれたツイートをいち早く知りたかったり
特定のハッシュタグの動向をチェックしたかったりすることがあります。  
 
 
そこで今回は特定のハッシュタグが付けられていたり、特定の単語が含まれるツイートに対して、出来るだけ早く「いいね」をするプログラムを作ってみました。
 
 
 
今回はtwitterAPIのstreamingAPIという、世界中のツイートをリアルタイムに監視するものを使いました。
 
 

ソースコード

var twitter = require('twitter');

//変更すべき設定
var client = new twitter({
    consumer_key: 'consumer_key',
    consumer_secret: 'consumer_secret',
    access_token_key: 'access_token_key',
    access_token_secret: 'access_token_secret'
});
var tag = '検索したいハッシュタグ・単語';
//変更すべき点はここまで

client.stream( 'statuses/filter', { track : tag }, function( stream ) {
    stream.on( 'data', function( data ) {
        var tweetid = data.id_str;
        client.post('favorites/create',{id: tweetid},  function(error, tweet, response){
                      if(error) throw error;
                      console.log(response);
              });
        });
});

githubにも公開しています。

使い方

1. twitterでアプリ作成・tokenなどの準備

こちらのページを参考にしてください。-> 参考

必要な情報は

1.consumer_key
2.consumer_secret
3.access_token_key
4.access_token_secret

以上の四つです。

2. node.jsをインストール

node.jsのインストールはこちら

3. twitterモジュールをインストール

このモジュールを使います

npm install twitter

4.下記の5箇所を修正

ソースコード内にある下記の5箇所を修正します。

  • consumer_key
  • consumer_secret
  • access_token_key
  • access_token_secret
  • var tag = '検索したいハッシュタグ・単語'

5.実行

$node filename.js

で実行します。  

実例

このプログラムを使って、#いいねした人全員フォローする というハッシュタグを監視し続けて、ツイートされた瞬間に「いいね」をするということをやってみました。
 
 
andoo.hatenablog.com  
 

まとめ

ツイッターのStreamingAPIを使うと、リアルタイムにいろいろなツイートを取得することが出来るので、色々な応用ができそうです。
 
使ってみたいけど、使い方がわからないという方がいらっしゃいましたら、気軽に連絡をくださいませー

本当にフォロワーは増えるのか?#いいねした人全員フォローする に「いいね」した結果

Twitterに登録して5年以上

 

5年も経つのに、ツイート数は5000以下と少なく

フォロワーもまだ300未満と少な…くはないけど、なんていうか…もっと友達が欲しい

 

そんな時に見つけたのが、このハッシュタグ

 

 

#いいねした人全員フォローする

 

 

これは…!

これならフォロワーが増やせる!

 

 

手軽に「いいね」する方法を考える

ということで、このハッシュタグがついた全てのツイートに「いいね」をする方法を考えてみました。

 

普通に検索して、出てきたツイートに対して「いいね」をすれば良いだけの話なのですが

いちいち検索するのはめんどくさい

 

 

ということで

 

全てのツイートを「いいね」するプログラムを作ってみました

(プログラムのソースは後日公開します)

 公開しました。 

andoo.hatenablog.com

 

 

やってみた

朝10時に開始

開始時のフォロワーは296、いいね数は166です。

さて、この数字がどう変化していくのか。

 

夕方:17時頃 プログラム停止

夕方に様子を見ると、いいね数がキリの良い250になっていたので終了

この時点ですでにフォロワーは増えていますが、まだ増えるかもしれないのでもう少し様子を見てみましょう。 

 

夜:20時くらい 

順調に(?)増えていました。

 

結果

プログラムが「いいね」した数

84 いいね

 

増えたフォロワー

20人

 

フォロー率

20/84 * 100 = 24%

 

感想

今回「いいね」したツイートの中には

・同じ人が何度もこのハッシュタグを付けてツイート

・引用リツイート

このようなパターンでも反応してしまうため、正確な人数を計測することはできていません。

 

実際のフォロー率は50%くらいではないかと思います

 

もっと放置されると思っていたので、意外と多いですね。

 

しかも、個別にリプライをくれた方もいました。

 ご丁寧にありがとうございます。よろしくお願いします。

 

フォロワーを増やしたい人は是非このハッシュタグに「いいね」してみてください。

 

それでは

 

 

ドローン初心者におすすめ!1万円以下のカメラ付きドローンf182CSのレビュー

https://www.instagram.com/p/_Inb5fwsQW/

ドローンが届きました

最近何かと話題のドローンですが、Holy Stoneのf182CSという商品がamazonのタイムセールで7000円弱だったので衝動買いしてしまいました。 

商品名にも「ドローン」と名付けられていますが、プログラムで操作できるような高級品ではなく、実際はただのカメラ付きラジコンヘリです。

今回の内容

 

商品を開けてみる

外箱はボロボロ

amazonの段ボールに入っていたにも関わらず、外箱はボロボロの状態で届きました。

説明書もボロボロ

説明書。ギリギリ理解できるレベルの日本語で書かれています。

しかも最初からすんごい折れてます。

この雑さ…嫌いじゃない。

本体

エイリアンのイラストが書かれています。

羽の所に書いてあるWARNINGがちょっとカッコイイ。

意外と大きい

そして軽いです。

予備の羽

壊れやすいのでしょうか?予備の羽が入ってました。ありがたいですね。

そしてWARNINGがカッコイイ。

コントローラー

操作部分は発泡スチロール?スポンジ?に包まれてました。

丁寧であるべきところは丁寧。

予備バッテリーが一つ

バッテリー1つで10分程度の飛行が可能らしいので、合計20分遊べるということですね。あと4つくらい欲しい。

箱が入ってました。

箱の中身

中身はACアダプターでした。

マイクロSDカード付き

2GBのマイクロSDカードが付属していました。(少し飛び出ているところ)

カメラ部分 その1

カメラは角度を変えることが出来るようです。

一番上(真正面)を向けるとこんな感じ。

カメラ部分 その2

一番下を向けてもこの程度。斜め下までしか見れそうにない?

少なくとも、真下を見下ろす形での撮影は無理そうです。(下の部分を削れば真下も見れるかも)

LED

飛行中に見失わないようにでしょうか?

感想

室内でかるく飛ばしてみましたが、操作が難しすぎて泣きました。
後日、広い公園で遊んでみてその時に動画を撮影しようと思います。

カメラの画質は良くないみたいですので、おまけ程度と捉える必要がありそうですが、1万円以下で買えるので、ドローンの入門機としては悪くないかもしれません。

 

それでは

 

 

 

【IoT】myThings + milkcocoaで高齢者見守りデバイスを作ってみた

本記事は myThings Advent Calendar 2015

Milkcocoa Advent Calendar 2015
の10日目の記事です。

今回は一人暮らしの祖母の安否をゆるく確認できるデバイスを作ったことの記録を書きます。
初のAdvent Calendarですので、不足がありましたら是非コメントでお知らせいただければと存じます。

目次


背景・抱えていた問題

僕の祖母は遠くで一人暮らしをしています。
高齢の一人暮らしなので両親は心配しており、祖母に近くに引っ越してくるように・もしくは同居するように提案したものの、引っ越すことは嫌だということで、何か出来ることはないかと悩んでいました。

解決案

そこで、ゆるくでも良いので安否確認ができたら両親が少しは安心するかもと考え、何かしらの動きを検知して、毎日決まった時間に通知をするものを作ることにしました。

何を作るか

動きの検知という意味ではポットの使用状況から安否を確認できるという商品もありますが、僕の祖母が毎日ポットを使っているかがわからない
そこで、まずは「誰でも・毎日使っている」トイレの扉の開閉のログを取ります。
そして、毎日朝8時・夜8時の時点で安否(動きがあったかどうか)の通知をしてくれるようにします。

技術的課題

さて、作るものは決まりましたが技術的な課題が色々とあります。

課題その1 : 通信環境をどうするか
課題その2 : サーバーをどうするか
課題その3 : 通知をどうするか

課題その1.通信環境をどうするか

祖母の家には電気はかろうじて通っているものの、インターネットなんていう現代的なものは当然ありません。
しかし、新しくインターネットの契約をするというのは今回の利用目的を考えるとコスパが悪い。

そこで、simフリーのポケットWiFiを購入し、ヨドバシで契約した月額500円・低速・無制限のsimを入れて使うことにしました。(なんとか通信できました。)

課題その2.サーバーをどうするか

データを受け入れたり取り出したりというサーバー側のプログラムを書くのは意外と面倒です。

そこで、今回は

自前でサーバを準備せずに、クライアントSDKを介してデータの保存、更新、取得またPub/Sub通信を行うことが出来る

というmilkcocoaを使いたいと思います。

課題その3.スマホへの通知をどうするか

アプリの知識は0なので、スマホへのプッシュ通知のさせ方がわかりません。ということで、myThingsを使います。

改めて作るものの説明

だいたいこんな流れです。

実際の製作の流れ

さて、前置きが長くなりましたが、製作の流れの説明に入ります。 ざっくりとした流れはこんな感じです。

  1. raspberry_piのセットアップとmilkcocoaに登録
  2. IDCFクラウドに契約とmyThingsセットアップ
  3. 扉の開閉データをmilkcocoaに送信
  4. 開閉データの有無を確認して、mythingsに通知するようデータをセット
  5. myThingsでプッシュ通知を受ける

では、一つずつ見ていきます

1.raspberry_piのセットアップとmilkcocoaの登録

この辺りはこちらの記事を参考にしました。 http://blog.mlkcca.com/iot/realtime-data-visualization-with-raspberry-pi-1/

2.IDCFクラウドに契約とmyThingsセットアップ

IDCFクラウド契約・myThingsのセットアップはこちらの記事を参考にしました。 myThingsを始めよう

3.扉の開閉をmilkcocoaに送信

さて、ここまでのステップで環境ができたので、プログラムを書いていきます。

今回は扉の開閉を監視するので、リードスイッチ(磁石の接近でon/offが切り替わるスイッチ)を使います。

こちらの記事スイッチ入力を受け付けるという箇所のサンプルを書き換えて、milkcocoaにデータを送信する仕組みを追加しました。

このプログラムはバックグラウンドで実行し続けます。

$ sudo node door_check.js &

var fs = require('fs');

var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('*******.mlkcca.com');
var ds = milkcocoa.dataStore('door');

fs.writeFileSync('/sys/class/gpio/export', 21);
fs.writeFileSync('/sys/class/gpio/gpio21/direction', 'in');

var pre_value = 1;
loop();
function loop() {
    var value = parseInt(fs.readFileSync('/sys/class/gpio/gpio21/value', 'ascii'));
    if ( value != pre_value  ) {
        console.log(value);
        ds.push({DoorOpenFlag:value});
        pre_value = value;
    }
     setTimeout(loop, 1000/10);
}
動作中の動画

以前pythonで書いたバージョンなので、微妙に挙動が違いますが大体こんな感じです。 IMAGE ALT TEXT HERE

4. 開閉データの有無を確認して、mythingsに通知するようデータをセット

下記のプログラムを朝の8時と夜の8時にcronで回します。

var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('********.mlkcca.com');
var history = milkcocoa.dataStore('door').history();
var execSync = require('child_process').execSync;


var myD = new Date();

var myYear = myD.getFullYear();
var myMonth = myD.getMonth();
var myDate = myD.getDate();
var yesterday = beforeDay(myYear,myMonth,myDate);

if(myD.getHours() >= 19){
    var myYear_start = myYear_end = myYear;
    var myMonth_start= myMonth_end = myMonth;
    var myDate_start = myMonth_end = myDate;
    var myHour_start = 8;
    var myHour_end = 20;
}else{
    var myYear_start = yesterday['year'];
    var myMonth_start= yesterday['month'];
    var myDate_start = yesterday['date'];
    var myYear_end = myYear;
    var myMonth_end = myMonth;
    var myDate_end = myDate;
    var myHour_start = 20;
    var myHour_end = 8;
}

history.sort('desc');
history.size(1);
history.limit(1);
history.span(new Date(myYear_start,myMonth_start,myDate_start,myHour_start,0,0).getTime(), new Date(myYear_end,myMonth_end,myDate_end,myHour_end,0,0).getTime());
history.on('end', function(data) {
    if (data) {
        console.log('data_exists');
        execSync('curl -X POST "https://***.***.***.***/data/UUID" --insecure --header "meshblu_auth_uuid: UUID" --header "meshblu_auth_token: TOKEN"');
        process.exit();
    }else{
        console.log('data_nothing');
        execSync('curl -X POST "https://***.***.***.***/data/UUID" --insecure --header "meshblu_auth_uuid: UUID" --header "meshblu_auth_token: TOKEN"');
        process.exit();
    }
});
history.run();


function beforeDay(year, month, date) {
    var d = new Date(year, month, date);
    d.setDate(d.getDate() - 1);
    return {
        year: d.getFullYear(),
        month: d.getMonth(),
        date: d.getDate()
    };
}

内容としては 実行された時間が朝の8時であれば「前日の20時から当日の8時までのデータ」を、実行された時間が20時であれば「当日の8時から20時までのデータ」を確認しに行きます。

データが入っていたらmyThingsのトリガー1にデータを送信。
データが入っていなければトリガー2にデータを送信。

という感じです。

5. myThingsでプッシュ通知を受ける

myThingsで下記のように設定をしました。

トリガー1の時は無事であることの通知

トリガー2の時はデータが無いことの通知

使ってみた・感想

ソースの書き方や仕組みについて怪しい部分は多々あるものの、なんとか動作しました。
便利かどうかで言うと、まだ微妙です。
朝の通知に関しては祖母が起きているかどうかがわかるのは便利ですが、昼〜夕方に関しては夜にならないと安否がわからないので改善が必要だと感じています。

今後

認知症になった時を考え、扉のセンサーだけでなく人感センサーなどを追加して部屋の中にいるかどうかも確認できるようにしようと考えています。
また、データを通知だけではなく、Web上から見れるようにします。

github上で更新していますので、もしよければご覧ください。

それでは、長文を読んでいただきありがとうございました。