大阪近郊で活動するフリーランスエンジニアのブログです 技術情報とか趣味など

*

Raspberry Pi2を使ってリモートで餌やりをする

      2015/09/29

ブログからガレージの金魚にエサをやる

以前からやろうやろうと先延ばしにしてたエサやりのシステムが完成しました!
プラ船のページで完成品が見れます。
是非一度エサやりにきてください

以下にハウツーを残します

ハードウェア

まずはエサやり機を自作します
P_20150928_151827

材料

  • ホームセンターで売られてる端材の詰め合わせ
  • 100均の小さいタッパー
  • ペットボトル
  • トイレットペーパーの芯
  • サーボモーター SG90

P_20150928_151817
モーターにタッパーを取り付けて穴あけ
モーターが回ったときエサが飛び散るのでペットボトルを切ってカバーにします

P_20150928_151934_HDR
後はフタの隙間にエサが流れるように設置

配線やらソフトウェアの設定は前の記事を参考にしてください

ソフトウェア

続いてソフトウェア
無制限にボコボコとエサをやられたら水があっという間にダメになるので制限をかけます

仕様

  • 最後にエサをやった時刻から3時間経過していればエサがやれる
  • エサをやれる時刻は10時から20時までの間
  • 毎日10時に一度自動でエサをやる

Raspberry Pi2側

まずエサをやった時刻をさくらVPSのDBに保存します

// サクラVPS側
<?php
if (!array_key_exists('tbl', $_POST)) {
    exit;
}

require_once('./db_conf.php');
$pdo = getPDO();
$pdo->prepare('insert feed_log value()')->execute();
$pdo = null;
?>

ガレージのRaspberry Pi2からさくらVPSへ送信

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

require 'uri'
require 'net/http'

def http_request(method, uri, query_hash={})
    query = query_hash.map{|k, v| "#{k}=#{v}"}.join('&')        #ハッシュをオプションの書式に変換
    query_escaped = URI.escape(query)

    uri_parsed = URI.parse(uri)
    http = Net::HTTP.new(uri_parsed.host)

    case method.downcase!
    when 'get'
        return http.get(uri_parsed.path + '?' + query_escaped).body
    when 'post'
        return http.post(uri_parsed.path, query_escaped).body
    end
end

#POSTで送るだけ
http_request('POST', '送信先URL', {:tbl=> 'g'})

サーボブラスターを使ってエサの入ったタッパーを回転させる

#!/bin/sh
echo 3=100%  > /dev/servoblaster
sleep 1
echo 3=20%  > /dev/servoblaster

#さくらVPSへログ送信
/usr/local/bin/send-feed-log                                                                                                                                          

Sangoのサブスクライバに追記

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

require 'rubygems'
require 'mqtt'

MQTTHOST = "std1.mqtt.shiguredo.jp"
USERNAME = "ユーザー名"
PASSWORD = "パスワード"

# MQTTに接続するためのクライアントを作成します
client = MQTT::Client.new(
  MQTTHOST,
  :username => USERNAME,
  :password => PASSWORD,
  :keep_alive => 60
)

# 接続します
client.connect do |c|
  # Subscribeします
  TOPIC = "ユーザー名/#"
  c.get(TOPIC) do |topic, message|
    #
    # 他省略
    #
    #feed ←エサ用トピック追加
    if topic == "ユーザー名/feed"
       `/usr/local/bin/feed`
    end

  end

end

ブログ側

最後にエサをやった時刻と、次にエサをやれる時刻をJSONで出力する

require_once('./db_conf.php');
$pdo = getPDO();

$ret = array();

// エサやり最終時刻を取得
$sql_ret = $pdo->query("select *  FROM feed_log ORDER BY id DESC LIMIT 1")->fetchAll(PDO::FETCH_ASSOC);
$ret['latest'] = $sql_ret[0]['on_at'];
$pdo = null;

$ret['next'] = "";
// 次のエサやり時刻
if((date('Hi') + 0) > 2000 ) {
    $ret['next'] = date("Y-m-d", strtotime("+1 day"  )) . " 13:00:00";
}else if((date('Hi') + 0) < 1000 ) {
    $ret['next'] = date("Y-m-d") . " 13:00:00";
}else{
    $ret['next'] = date("Y-m-d H:i:s", strtotime($ret['latest'] . " +3 hour"));
    
    // 次にエサをやれる時刻が20時以降の場合は翌日の13時とする
    if(date("Hi", strtotime($ret['next'])) > 2000) {
        $ret['next'] = date("Y-m-d", strtotime("+1 day"  )) . " 13:00:00";
    }
}

header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
echo json_encode($ret, JSON_PRETTY_PRINT);

エサやりボタン押下でSangoを使ってガレージのRaspberry Pi2にキューを飛ばす

if (!array_key_exists('from', $_POST)) {
    exit;
}

require_once('./phpMQTT.php');
require_once('./db_conf.php');

$pdo = getPDO();

// エサやり時刻チェック 
$cnt = $pdo->query('select count(*) as cnt from feed_log where on_at > (now() - interval 3 hour)')->fetch(PDO::FETCH_ASSOC);
$pdo = null;

if($cnt['cnt'] === 0) {
    $mqtt = new phpMQTT("tcp://std1.mqtt.shiguredo.jp", 1883, md5(time()));
    if ($mqtt->connect(null,null,'ユーザー名', 'パスワード')) {
        $mqtt->publish("ユーザー名/feed","",0);
        $mqtt->close();
    }
}

これで一先ずやりたい事は実装できた感じ
やぶ蚊に刺されず屋内から金魚を眺めながらエサがやれるようになりました!
おかげで人には懐かずカメラに懐いてしまった・・・人が近づくと逃げますがカメラが動くとエサくれーしますw

 - php, Raspberry Pi, ruby, 金魚 , , , ,

  • このエントリーをはてなブックマークに追加
  • にほんブログ村 観賞魚ブログ 金魚へ

Comment

  1. pon より:

    こんにちは。初めまして。ponと申します。
    ラズパイを使った水槽への自動給餌機に興味があり、情報を探していたところ、こちらの記事に出会いました。
    いくつかお聞きしたいことがあるのですが、よろしいでしょうか?
    ご連絡お待ちしております。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  関連記事

RaspberryPi2で動画配信しながら写真も撮りたい

金魚デカくなった? 金魚にエサやってると4月の初頭から飼い始めた琉金が1周り大き …

穂竜水槽のフィルターを交換

穂竜が挟まる! 金魚水槽のページで配信している穂竜たちですが、非常にドン臭く よ …

金魚水槽の照明をパワーアップさせたい

金魚水槽のページでON/OFFできるようにしている照明ですが、 やっぱ1Wパワー …

プラ船の金魚がネコに襲撃された

ガレージに出してるプラ船がネコにやられました・・・ これはひどい どうもカメラを …

みんなのラズパイコンテストにて受賞しました

ラズパイマガジンと日経Linux、日経ソフトウエア様の みんなのラズパイコンテス …

Raspberry Pi2で外部から水槽のLEDを点灯する その3

前回で自宅のラズパイ側の準備が整ったので今回はWeb上から電灯のON/OFFをす …

Raspberry Pi ZEROをソーラーパネルで動かす

ソーラーパネルでラズパイ! 以前からソーラーパネルを使って電源の要らないRasp …

Raspberry Pi2に2台のカメラを繋いで同時配信する

水槽増えたんだけどまたパイ買うの? 先日新しく45cm水槽を買いまして買ったなら …

Raspberry Pi2で室温、水温を計測してグラフ表示する その2

前回でRaspberry PiからさくらVPSへ計測したデータを飛ばして登録でき …

プラ船 復活しました

先日ネコに襲撃され破られた金網ですが、1枚ものの塩ビ板でフタをすることにしました …