アクアリウム監視ロボット

IMG_0149

一部で有名なアクアリウム監視ロボットが教員部屋にあります.


複数の熱帯魚水槽の照明点灯,温度管理,自動餌やり,写真撮影を1台のロボットで行うプロジェクトです.
教員研究室には3本の水槽と1つの水鉢が置いてあり,それらで飼っている魚たちに不在時でも餌をやる必要があります.また,外からでも水槽の状況を見たいことがあるので,カメラでの映像撮影もしたいです.しかし,各水槽にカメラ付きサーバを置いたり,給餌器を置いたりするのは不格好です.そこで,Raspberry Piを用いた可動式ロボットを作り,4つの水槽・水鉢を巡回して餌をやったり,写真を撮ったりすることを可能にしています.また,照明を夜は消す,水温に応じて冷却ファンを回す,室温が高すぎる場合はエアコンを使う,などの処理も自動化するために,周辺装置を作成して,それらを全てRaspberry Piから集中的に制御できるようにしています.

現在の「あくあたん参号機」でできることを以下にまとめます.

  • 自動給餌装置の制御による給餌
  • ロボット台座の水槽間移動
  • 水槽の様子をカメラで撮影,動画・静止画で配信
  • 子機による各水槽の温度計測・室温計測
  • 子機による部屋の気圧計測
  • 子機による水槽照明の点灯・消灯
  • 室温に応じて子機のサーボでエアコンを制御
  • 水温に応じて子機の冷却ファンを回して水を冷却
  • 子機との通信にはBluetoothを使用
  • 室温,水温の閾値設定
  • 照明の点灯・消灯スケジュールの設定
  • 以上の命令は全てTwitterアカウントを通じたリプライで実行可能

IMG_0227

ハードウェア

カメラ・給餌ロボット (Raspberry Pi B+)

このロボットが本体になります.制御部はRaspberry Pi B+を利用,筐体はLEGOで組んでいます.モーターもLEGO mindstormの物を流用していますが,制御回路は自作しており,Raspberry Piから制御しています.Raspberry Piに直接繋いでいるハードウェアは次の通りです.

aquatan_pi

  • モーター:ドライバにはDRV8830を使っており,I2Cで制御します.モーターは3基接続しており,それぞれロボットの水平移動,リフトの垂直移動,給餌器の駆動を行います.
  • マイクロスイッチ: 土台とリフトの終端位置を判定するのに利用します.GPIOに接続されています.
  • フォトリフレクタ: RPR220を利用します.土台とリフトの現在位置を判定するのに利用します.LEGOの色違いブロックがあるのを検知し,現在位置を取得します.Raspberry PiのGPIOに接続されています.
  • サーボモーター:カメラをパン・チルトするためと,ロボットの操縦者を動かすギミックに利用します.Servoblaster を利用してソフトウェアPWMを生成し,三系統のサーボを制御しています.
  • TFT液晶パネル(320×240): Adafruit 2.2” TFT SPI LCDを利用しています.SPIで接続した液晶をフレームバッファとして利用し,水槽の現在の状況をリアルタイムに表示します.
  • WiFiドングル (Buffalo WLI-UC-GNM2): LANに接続します.
  • Bluetoothドングル (Planex BT-Micro4): Bluezを利用して,Bluetoothシリアル通信を水槽制御モジュールとの間で行います.
  • USBカメラ: 広角カメラと赤外線カメラを各1基搭載します.

aquatan_overview

以下にロボットの各部を紹介します.

  • 移動台車
    移動台車はレゴを用いてくみ上げてあり,水槽前に敷設されたレールの上をタイヤで移動します.レールは黒のブロックが基本で,途中に黄色いブロックが置いてある場所が,停止地点となります.この黄色い部分をフォトリフレクタで読み取りながら左右へ移動する仕組みです.

  • カメラ昇降リフト
    昇降リフトはカメラを積んで上下に移動します.柱に貼られた白いマーカーをフォトリフレクタで読み取って位置を調整しています.

  • 給餌装置
    給餌装置はモーターでネジ型の部品を回し,その部品の隙間から餌を下に落とす構造になっています.モーターを回す時間を調整して,水槽の魚の量に応じた餌の量を投下する仕組みです.

子機: 水槽制御モジュール (Arduino)

子機は温度センサー四系統,気圧センサー一系統,冷却ファン三系統,ACリレー三系統を制御するためのモジュールです.水槽に温度計を引き込んだりするために,移動する親機とは分離して実装しています.Raspberry PiとはBluetoothにより通信し,センサーから得られた情報を返したり,照明用のリレーを動かしたり,冷却ファンを動作させたりします.

  • 気温センサー: DS18B20+を1wireで4つ利用しています.
  • 気圧センサー: MPL115A2をI2Cで利用しています.
  • 冷却ファン: DCファンを3基MOSFETで制御しています.PWM制御によりファンの回転速度を調整できます.
  • リレー: AC電源のon, offを行います.照明に使っている蛍光灯の制御をしています.
  • Bluetooth: Microchip RN-42をシリアルポートとして使い,Raspberry Piとの通信に使います.

制御しているマイコンはArduinoを使っていて,これらセンサーの制御のみに特化したモジュールとなっています.以前はこの子機に相当する機能をもう一台のRaspberry Piに担当させていたのですが,より構成をシンプルにするために,今の形の子機になりました.

子機: 室内制御モジュール (Raspberry Pi)

2台目の子機はRaspberry Piによるエアコン制御機です.部屋のエアコンパネルが埋め込み式で,リモコンなどの無いシステムのため,物理的にサーボで電源スイッチを押す仕組みで室温を制御します.具体的には,センサー子機が収集した室温を監視して,室温が既定の閾値を越えた時に,スイッチを押します.また,冬季はエアコンよりもオイルヒーターのほうが効率が良いため,エアコンよりも優先してオイルヒーターを制御します.オイルヒーターには赤外線リモコンで信号を送れるので,赤外線照射モジュールを実装しており,lircを利用して信号を発射しています.

ソフトウェア

親機のRaspberry Piで動作しているソフトウェアは以下のようになります.

サーバ

  • 移動台車・リフト・給餌器制御サーバ
    サーバとして常駐し,クライアントから送られる命令を台車移動・リフト昇降・給餌コマンドに変換する仲立ちをします.クライアント間の通信はTCPポートを利用するので,同一ネットワーク内のコンピュータ全てから命令を送ることができます.

  • 子機制御サーバ
    サーバとして常駐し,Bluetoothシリアル通信を子機との間で張り続けます.また,クライアントに対してTCPポートを開放し,クライアントからの温度取得や照明点灯といった命令を子機へ送り,その結果を受け取る仲立ちをしています.

  • 液晶モニタ表示サーバ
    データベースから各種情報を取得し,SPI液晶モニタに描画します.

クライアント

  • 台車移動・リフト昇降コマンド
    モータードライバとI2Cで通信を行い,台車とリフトの移動方向・移動距離を決めて動作させます.また,動作中はソフトウェア割り込みでフォトリフレクタを監視し,距離に応じたマーカー位置に来た時点でモーターを停止させます.移動台車・リフト・給餌器制御サーバのクライアントです.

  • 給餌コマンド
    モータードライバとI2Cで通信を行い,給餌装置のモーターを指定された時間回します.移動台車・リフト・給餌器制御サーバのクライアントです.

  • 照明制御コマンド
    三系統の照明それぞれに対して曜日・分単位での点消灯スケジュールを設定できます.また,点消灯を日の出・日の入時刻を基準に行うようにも設定可能です.子機制御サーバのクライアントとして動作します.

  • ファン制御コマンド
    一定時間おきに温度センサーからのデータを取得して,設定温度よりも高くなっていればファンを起動して水温を下げます.子機制御サーバのクライアントとして動作します.

  • 温度・気圧取得コマンド
    一定時間おきに温度センサー・気圧センサーからデータを取得し,mysqlデータベースに格納していきます.子機制御サーバのクライアントとして動作します.

  • カメラ画像配信コマンド
    mjpgstreamerを利用し,ライブ配信(動画),静止画の取得が行えます.また,カメラは広角カメラと赤外線カメラの2機を搭載しており,照明が消えた状態では赤外線カメラに切り替えます.照明が点くと広角カメラになります.