ソラコムサマーインターンシップ YoutubeLiveに出演しました!

YoutubeLiveに出ました。

いろいろなご縁があって、ソラコムサマーインターンシップ2020に出させていただきました。共に頑張ってIoTプロダクトを作った皆様方。ソラコム運営スタッフの皆さん。Liveをご覧になられた方々へお礼申し上げます。

発表の様子はこちらから

 皆さんのおかげで楽しい体験をさせていただきました。そしてインターン生からはたくさんのことを学ばせていただきました。まだまだ自分は未熟だなぁと気づき、これからも精進せねば、と思う所存でございます。

 さて手前味噌ではございますが、発表で使ったスライドや動画などをここに掲載しておきますのでぜひご覧ください。

 【発表用スライド】

  【発表用動画】

ソラコムサマーインターンシップ YoutubeLiveに出演決定しました!!!

先々週からひとりで盛り上がって作ってたIoTデバイス「HAGUKUMU」が評価され、ソラコムさんからファイナリストに選んでいただきました! わーパチパチパチ

 

www.youtube.com

こちらで見れるそうなので、ぜひ見てやってください!

 

「HAGUKUMU」サービスまとめ記事

「HAGUKUMU」についてまとめました

たくさんの記事があって、何を読んだらいいかわからないと思うのでまとめ記事を作りました。見ていってくれよな!

 

記事まとめ一覧

プロダクト概要編

プロダクトのすごいところ編

実装概要編

各種機能編 ~水耕栽培土台~

各種機能編 ~ラズパイセットアップと自作コンセント~

各種機能編 ~ポンプを制御する~

各種機能編 ~植物の高さを計測する~

各種機能編 ~写真をGoogleドライブにアップロードする~

各種機能編 ~取得した情報をスプレッドシートにまとめる~

各種機能編 ~Googleスプレッドシートとツイート~

各種機能編 ~定期実行編~

完成

番外編①LINE通知機能

番外編②ライト操作機能

そのほか

 「HAGUKUMU」構想資料

初期構想段階の資料。

 

最終成果物としての「HAGUKUMU」

以下は完成までと番外編を合わせて、最終的にどのようなものが出来上がったのかをまとめたものである。 

 

まずはちりやちゃんをフォローしてやってください

 

「HAGUKUMU」の外観

「HAGUKUMU」の全貌はこんな感じだ!(ドン)

f:id:udonnamerou:20200814095032j:plain

f:id:udonnamerou:20200814095036j:plain

めちゃくちゃメカニカルですね...。デザインに割く時間がなかったので許して。

 

ちなみに、図の中にあるモノリスのような黒い物体はカメラマウントです。そして、カメラで撮影する高さを本で調節しています。 

各種機能紹介

続いて「HAGUKUMU」の機能について説明していきたいと思う。「HAGUKUMU」には大きく分けて以下の6つの機能がある。

  1. 自動水やり機能
  2. 画像撮影機能
  3. 植物の高さ取得機能
  4. 様々な環境情報を集約して、ツイートを行う機能
  5. LINE通知機能
  6. ライトON/OFF機能

詳しい機能の説明や動作についてはこれまでの記事に書いてあるので、動画を交えつつ概観だけ述べていくことにする。

1.自動水やり機能

1時間おきに水をやってくれる。便利

 

2.画像撮影機能

写真を撮ってGoogleドライブにアップしてくれる。すごい

ちなみに画像がいくつか貯まればPillowライブラリを使ってGIF画像も作ってくれるので、ちりやちゃんが植物のタイムラプスGIF動画をアップしてくれる。

 

3.高さ取得機能

高さをはかってくれる。かっこいい。

測定した高さはちりやちゃんが報告してくれる。

 

4.自動ツイート機能

f:id:udonnamerou:20200814101751p:plain


スプレッドシートにある内容から自動でツイートしてくれる。ツイートの時刻などもスプレッドシート側で変更できる。やばい。

 

5.LINE通知機能

f:id:udonnamerou:20200814113449g:plain

LINEで植物の情報を通知してくれる。すげー

f:id:udonnamerou:20200814121603p:plain

数値がおかしい場合はエラー通知もしてくれるよ。 

 

6.ライトON/OFF機能

ライトをLINEで操作できる。きれい!

 

おわり

「ラズパイ」と「スプレッドシート」で全自動水耕栽培器をつくって女の子にTwitterで実況しながら栽培してもらう:番外編②ライト操作機能

あれ、なんかIoTっぽいことしてなくない?(2回目)

なんかこう、IoTってスマホやパソコンから指示を出したらその結果が通知されたり、家電が動いたりするっていうイメージがあるじゃないですか?(あるよね?)

友達に聞いたところ、水耕栽培ではLEDを証明に使って栽培するイメージがあるようで、ライトの実装をすることにした。

そこで番外編②では、IoTっぽくスマホからライトを操作して植物に光を与える作業を行うことにする。

 

実装

早速実装する。まずはLINEからスプレッドシートに書き込む処理を行う。 参考記事

function doPost(e) {

  // 投稿されたメッセージを取得
  var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
   
  if(userMessage == "on") {
    //continue
  } else if (userMessage == "off"){
    //continue
  } else if (userMessage == "ちりやちゃーん"){
    lineAssigned()
    return
  }
   
  var response = e.postData.getDataAsString();
  var spreadsheetId = "your_sheetname";
  var sheetName = "yoursheet";
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
   
  var arr = userMessage.split(/\s/);
  var lastRow = dsheet.getLastRow();
  sheet.getRange(lastRow,D_LSH,1,1).setValue(arr);
 
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

こうすることでLINEからスプレッドシートに値が書き込まれるようになるので、あとはラズパイ側からon/offを読み取って動かしてあげればいける。

 

main.py

function doPost(e) {
 import _light as li
 import _gspread as gs
 import RPi.GPIO as GPIO
 import datetime 

 GPIO.setmode(GPIO.BCM)
 GPIO.setup(16, GPIO.OUT)

 _isOn = gs.retonff()

 try:
    while True:
        dt_now = datetime.datetime.now()
        
        #now hour
        curhour = int(dt_now.strftime('%H'))
        cursec  = int(dt_now.strftime('%S'))
        
        if(_isOn == "on"):
            li.light_on()
        elif(_isOn == "off"):
            li.light_off()
        elif(curhour > 4 & curhour < 6):
            break
        #あまりにリクエストが多いとスプレッドシート側でエラーを出すので、10秒おきに処理を実行する
        if(cursec % 10 == 0):
            _isOn = gs.retonff()
            print("get")
 except KeyboardInterrupt:
    print("forced")
    
 GPIO.cleanup()
 print("owata")

 

light.py

import RPi.GPIO as GPIO
import time

def light_on():
    GPIO.output(16, GPIO.HIGH)

def light_off():
    GPIO.output(16, GPIO.LOW)

gspread.py

import gspread
from oauth2client.service_account import ServiceAccountCredentials

def retonff():
    key_name = 'abs/path/credentials.json' 
    sheet_name = 'console' 
    terminalID = "time"
     
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(key_name, scope)
    gc = gspread.authorize(credentials)

    wks = gc.open(sheet_name).sheet1 
    records = wks.col_values(14)       
    curinfo = records[-1]  
    return curinfo

 

結果

成功。最初の起動に時間がかかっているのは10秒おきにon/offを判断するためなので問題なし。

 

前回:番外編①LINE通知機能

「ラズパイ」と「スプレッドシート」で全自動水耕栽培器をつくって女の子にTwitterで実況しながら栽培してもらう:番外編①LINE通知機能

あれ、なんかIoTっぽいことしてなくない?

なんかこう、IoTってスマホやパソコンから指示を出したらその結果が通知されたり、家電が動いたりするっていうイメージがあるじゃないですか?(あると思います)

「HAGUKUMU」ではその辺の機能ってないなーと思ったので、番外編①では、LINE Notifyを使って水耕栽培の現在の状況を知らせる機能を作る。

 

実装してみる

実装に当たって必要なのはLINE Notifyの登録とGASでプログラムすること。

まあ大体のやり方はここの記事にあるのでそれを見ながら実装する。

 

function lineAssigned() {  
  //最終行の番号を取得する
  var lastRow = dsheet.getLastRow();
   
  //最新情報を取得
  var table = dsheet.getRange(lastRow,1,1,D_DUM).getValues();
  
  array = {
  "date":table[0][0],
  "temp":table[0][1],
  "humi":table[0][2],
  "weth":table[0][3],
  "lat" :table[0][4],  
  "lon" :table[0][5],
  "mage":table[0][6],
  "sunr":table[0][7],
  "suns":table[0][8],
  "batt":table[0][9],
  "img" :table[0][10],
  "gimg":table[0][11],
  "heit":table[0][12],
  "lswh":table[0][13],
  }
 //LINEで送信したい文章
  var content = '\n\n川上ちりやが今の状況をおしらせします!' 
              + '\n' + array.date + 'の環境情報は以下になります。'
              + '\n気温:'       + array.temp
              + '\n湿度:'       + array.humi
              + '\n天気:'       + array.weth
              + '\n植物の高さ:'    + array.heit + 'cm'
              + '\n日出:'       + array.sunr
              + '\n日没:'       + array.suns
              + '\n月齢:'       + array.mage
              + '\nライトON/OFF:'   + array.lswh + ' (ライトは19時以降点灯、6時に消灯)'
              + '\nMUバッテリー残量:' + array.batt              
              + '\n緯度:'       + array.lat
              + '\n経度:'       + array.lon;
 
  sendHttpPost_lineAssigned(content);
  
  if (array.heit == 'err'){
    errmsg = '\n\n植物の高さの数値が異常です。以下の要因が考えられます' +
              '\n\n・植物が植えられていない' +
              '\n・植物が計測可能なサイズではない' +
              '\n・サーボモーターの異常' +
              '\n・サーボモータのジャンパピンが刺さっていない';
    sendHttpPost_lineAssigned(errmsg);
  }
}
  
function cron_lineAssigned() {
  var now = new Date();
  
  lineAssigned(now);
}


// LINE Notifyへの通知
function sendHttpPost_lineAssigned(content){
  //LINE Notifyのトークンを入力してください
  var token = ["yout_token"];
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + content,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
 
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

こんなかんじ。

 

それではご覧いただこう

f:id:udonnamerou:20200814113449g:plain


できた。

ちなみに高さが計測できていない場合は

f:id:udonnamerou:20200814121603p:plain

このようにエラー通知してくれる。

前回:⑫完成

次回:番外編②ライト操作機能

 

 

「ラズパイ」と「スプレッドシート」で全自動水耕栽培器をつくって女の子にTwitterで実況しながら栽培してもらう:⑫完成

言うは易く行うは難し

いろいろアイデアを出す段階ではノリノリだったものの、いざ最後までつくってみるとこれがまた大変。今もどこか遠い目をしながら記事を書いている。もちろんすごく楽しかったが。

というわけで、今回が一応最終回。「HAGUKUMU」のサービス概要とその機能をお見せしよう。

 

「HAGUKUMU」の外観

「HAGUKUMU」の全貌はこんな感じだ!(ドン)

f:id:udonnamerou:20200814095032j:plain

f:id:udonnamerou:20200814095036j:plain

めちゃくちゃメカニカルですね...。デザインに割く時間がなかったので許して。

 

ちなみに、図の中にあるモノリスのような黒い物体はカメラマウントです。そして、カメラで撮影する高さを本で調節しています。

f:id:udonnamerou:20200814095501j:plain

高さ調節につかっている本は僕のおすすめの本たちです。お近くの書店へGO。

 

各種機能紹介

続いて「HAGUKUMU」の機能について説明していきたいと思う。「HAGUKUMU」には大きく分けて以下の4つの機能がある。

  1. 自動水やり機能
  2. 画像撮影機能
  3. 植物の高さ取得機能
  4. 様々な環境情報を集約して、ツイートを行う機能

詳しい機能の説明や動作についてはこれまでの記事に書いてあるので、動画を交えつつ概観だけ述べていくことにする。

1.自動水やり機能

1時間おきに水をやってくれる。便利

 

2.画像撮影機能

写真を撮ってGoogleドライブにアップしてくれる。すごい

 

3.高さ取得機能

高さを図ってくれる。かっこいい。

 

4.自動ツイート機能

f:id:udonnamerou:20200814101751p:plain


スプレッドシートにある内容から自動でツイートしてくれる。ツイートの時刻などもスプレッドシート側で変更できる。やばい。

 

といったところ。以上で今回一連の記事をいちおう終わりにしようと思う。

最後に、我らが美少女川上ちりやちゃんの可愛い画像で記事を締めくくることにする。

f:id:udonnamerou:20200814102030j:plain

おわり。

 

前回:⑪各種機能編 ~定期実行編~ 

次回:番外編① LINE通知機能

「ラズパイ」と「スプレッドシート」で全自動水耕栽培器をつくって女の子にTwitterで実況しながら栽培してもらう:⑪各種機能編 ~定期実行編~

人間は習慣の生き物である。機械は?

第十一回目は、cronやスプレッドシートの定期実行機能で今まで作ったものを定期的に実行させてとりあえず完成させてしまうことにする。昨日は半日かけて10記事くらいを投稿したのだが、気が付いたら床で寝てしまっていた。腰が痛い。

 

cronでラズパイを定期実行させよう

そもそもcronってなんだ→こちらの記事をよろしく

今までの記事の中では以下の機能を実装してきた。

  • 自動水やり機能
  • 高さ情報取得機能&高さ情報送信機能
  • 画像撮影機能&画像送信機能

なので、これらの情報が定期的に実行するようにしよう。

crontabに設定する

以下のように設定する。設定の仕方はこちらを参照されたい

*/60 * * * * python /abs/path/pump/pump.py
*/60 * * * * python /abs/path/high/_main.py
*/60 * * * * python /abs/path/image/_main.py

これで1時間おきに実行されるようになる。やったーこれで完成だー。と思いきや、こちらのリンクにあるようにはプログラムコードのパス指定で絶対パスを求められるので、だいたい初回設定時にはうまく動いてくれない。

しかもcronは我々の見えないところで定期的に実行してしまうので、どんなエラーが出たのかもさっぱりわからない。

先ほどの記事の下部にあるcronのログの設定を確認しながらエラーログを確認して、ひとつひとつつぶしていこう。だいたいno such file or directoryエラーが出ている。

*/60 * * * * python /abs/path/pump/pump.py 2> /home/hoge/script5.log

 

あとラズパイ3Bの場合はMTAエラーが出てしまうので、こちらの記事で確認しよう。

 

スプレッドシートの定期実行機能を設定する。おすすめはこちらの記事

こちらのほうについては大変豊富に記事があるので若干割愛。

今までの記事で取り扱っていないものもあるが、「HAGUKUMU」では以下の情報をスプレッドシートに取得している。

  • 現在時刻(Date関数から取得)
  • 気温・湿度(SORACOMGPSマルチユニットからAPI経由で取得)
  • GPSマルチユニットのバッテリー残量(同じくソラコムAPIから取得)
  • 天気(OpenweathermapAPIから取得:記事にしていない)
  • 日の出・日の入・月齢(おはこん番地わAPIから取得:記事にしていない)
  • 植物写真,Gif写真のパス(ラズパイからGoogleドライブ経由で取得)
  • 植物の高さ情報(ラズパイからdoGetで取得)

こんな感じである。

f:id:udonnamerou:20200814010725p:plain

 

スプレッドシートのほうが有効に動いているようで、ちりやちゃんのほうも問題なくつぶやいている。かわいい。すき。

f:id:udonnamerou:20200814093923p:plain

 

さて、次回は最終回。最終的にできたプロダクトの動作と反省点などを述べていこうと思う。とは言っているが、開発の途中で実装したくなった機能などもあるので番外編も設けようと思う。もうちょっとだけ続くんじゃ。

前回:⑩各種機能編 ~Googleスプレッドシートとツイート~

次回:⑫完成