;

スポンサーサイト

0

    一定期間更新がないため広告を表示しています

    • 2019.10.15 Tuesday
    • -
    • -
    • -
    • by スポンサードリンク

    Raspberry Pi3 でペット監視システムをつくってみる(その6)

    0

      前回までは、twitterでつぶやくためのスクリプトの作成を行いました。

      これまでの作業で、各パーツはそろったので、これらを繋ぐためのメインプログラムを書いていきます。

       

      メインプログラムとはいっても、一からつくり上げるわけではありません。(面倒くさいので)

      第二回のところで、使用したライブラリ(htu21dflib)のテストプログラムが、無限ループで温度・湿度を標準出力に表示しつづけるというものでしたので、これに各条件分岐やスクリプト呼び出しなどの肉付けをすることで、機能を実現していきます。

       

       

      htu21dflib.c を改良

       

      #ifdef HTU21DFTEST 以降の行(main関数の入っている範囲)を修正していきます。

       

      
      static const char I2CDEV[] = "/dev/i2c-1";  // raspberry pi
      static const uint8_t I2CADDR = 0x40;        // htu21df i2c address
      #define INTERVAL_HTU_GET_SEC 60 // 60 second
      #define INTERVAL_TWEET_SEC 3600 // 1 hours
      #define INTERVAL_EMARGENCY_EVENT_TIMES 15 // 15 times 
      enum {
        E_GREEN = 0,
        E_YELLOW,
        E_RED,
      
        E_COLOR_NUM
      };
      
      static const char* const str_color[E_COLOR_NUM] = {
        "green",
        "yellow",
        "red",
      };
      /* 温度湿度を3段階で判定。
         0:green(快適), 1:yellow(注意), 2:red(危険) */
      static int judgementEnv(float temperature, float humidity)
      {
        if ((temperature > 18.0) && (temperature < 28.0) &&
            (humidity > 40) && (humidity < 70)) {
          /* うさぎの場合、温度は18-25度、湿度は40-60%がベスト */
          return E_GREEN;
        }
        else if ((temperature > 30) || (temperature < 16)) {
          return E_RED;
        }
        else if ((humidity < 35) || (humidity > 80)) {
          return E_RED;
        }
        else {
          return E_YELLOW;
        }
      }
      
      static int reg_tweet_flg[24] = {0,0,0,0,1,1, /*  0, 1, 2, 3, 4, 5時 */
      				1,1,1,1,1,1, /*  6, 7, 8, 9,10,11時 */
      				1,1,1,1,1,1, /* 12,13,14,15,16,17時 */
      				1,1,1,1,1,1  /* 18,19,20,21,22,23時 */};
      int main(int argc, char *argv[])
      {
          int rc;     // return code
          int i2cfd;  // i2c file descriptor
          int color;
          float temperature, humidity;
          char *i2c_devname;
          char buff[128] = {'¥0'};
          char media_name[128] = {'¥0'};
          time_t timer;
          struct tm *local;
          struct timeval myTime;
          int hour, min, sec;
          int ignore_rest = 0;
          
          i2c_devname = I2CDEV;
          if (argc > 1) {
              i2c_devname = argv[1];
          }
      
          printf("opening %s¥n", i2c_devname);
          i2cfd = i2c_open(i2c_devname);
          if (i2cfd < 0) {
              printf("i2c_open(%s) failed %d¥n", i2c_devname, i2cfd);
              return -1;
          }
      
          rc = htu21df_init(i2cfd, I2CADDR);
          if (rc < 0) {
              printf("i2c_init failed %d¥n", rc);
              return -2;
          }
      
          min = 0;
          while(1) {
            /* 時刻を取得 */
            timer = time(NULL);
            local = localtime(&timer);
            min = local->tm_min;
            hour = local->tm_hour;
            sec = local->tm_sec;
      
            /* 温度湿度読み出し(I2C) */
            rc = htu21df_read_temperature(i2cfd, &temperature);
            if (rc < 0) {
      	printf("i2c_read_temperature failed %d¥n", rc);
      	return -3;
            }
            rc = htu21df_read_humidity(i2cfd, &humidity);
            if (rc < 0) {
      	printf("i2c_read_humidity failed %d¥n", rc);
      	return -4;
            }
      
            /* 緊急発信の残りが1以上の場合は、カウントダウン */
            if (ignore_rest >= 1) {
      	ignore_rest--;
            }
            /* 温度、湿度の判定 */
            color = judgementEnv(temperature, humidity);
      	
            printf("[htu21dlib]%02d:%02d:%02d temp=%.1f humi=%.1f (color=%s, rest=%d)¥n"
      	     , hour, min, sec, temperature, humidity, str_color[color], ignore_rest);
      
            /* 定時発信 */
            if (min == 1) {
      	/* ファイル名生成(motion.confによる) */
      	sprintf(media_name, "/home/pi/rabbit/motion/%4d%02d%02d%02d0000-snapshot.jpg",
      		local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, local->tm_hour);
      	
      	/* フラグが有効な時間のみツイート */
      	if (reg_tweet_flg[hour]) {
      	  printf("[htu21dlib]%4d-%02d-%02d-%2d:%02d:%02d Regulary Transmission.¥n",
      		 local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
                       local->tm_hour, local->tm_min, local->tm_sec);
      	  /* メディア付きツイート。*/
      	  sprintf(buff, "python ../../twython/twitter_media.py %.1f %.1f %s",
                        temperature, humidity, media_name);
      	  rc = system(buff);
      	  if (rc < 0) {
      	    printf("[htu21dlib]internal error(%s,%d)¥n", __FILE__, __LINE__);
      	  }
      	}
      	
      	/* 内部ファイル削除 */
      	rc = remove(media_name);
      	if(rc < 0) {
      	  printf("[htu21dlib]media remove error %d, %s", rc, media_name);
      	}
            }
            /* 緊急発信(color がyellow, red かつ 前回から所要分が経過した場合) */
            else if ((color != E_GREEN) && (ignore_rest <= 0)) {
      	  sprintf(buff, "python ../../twython/twitter_emergency.py %.1f %.1f %d",
                        temperature, humidity, color);
      	  rc = system(buff);
      	  if (rc < 0) {
      	    printf("[htu21dlib]internal error(%s,%d)¥n", __FILE__, __LINE__);
      	  }
      	  /* カウント設定(緊急発信を連続ツイートさせないため一定間隔を設定する) */
      	  ignore_rest = INTERVAL_EMARGENCY_EVENT_TIMES;
            }
            else {
      	/* do nothing */
            }
      
            /* 7-segment 表示 (各2桁ずつ使用のため int に丸め込み)*/
            sprintf(buff, "python ../../7-seg/7segment_2arg.py %d %d",(int)temperature, (int)humidity);
            rc = system(buff);
            if (rc < 0) {
      	printf("[htu21dlib]internal error(%s,%d)¥n", __FILE__, __LINE__);
            }
            
            /* 時刻再取得 */
            gettimeofday(&myTime, NULL);
            local = localtime(&myTime.tv_sec);
            sleep (INTERVAL_HTU_GET_SEC - local->tm_sec -1);
            usleep (1000000 - myTime.tv_usec);
      
          } /* infinity loop */
      
      	
            
          rc = i2c_close(i2cfd);
          if (rc < 0) {
              printf("i2c_close failed %d¥n", rc);
              return -5;
          }
          return 0;
      }
      
      

       

       

       

       

       

       

      プログラムのポイント

       

      • 温度湿度の判定

       judgementEnv関数で、3段階(0:green(快適), 1:yellow(注意), 2:red(危険))で評価するようにしました。

      値は決め打ちなので、設定を変える場合は再コンパイルが必要です。

       

      • メインループの時刻管理

      whileは1分間隔(長すぎず短すぎずの調度良い間隔かなと)で回すようにしました。

      定時ツイート(1時間に1回)の処理があるので、ループの最初で時刻を取得する必要が有ります。

      ループの終わりでは、sleepで1分待つのも良いですが、より正確にどうささせるため、次の分までの残り秒数をマイクロ秒単位で待つようにしました。

       

      • 定時ツイート(1時間に1回)の処理

      motionでのスナップショットが毎時0分0秒に保存されるので、ツイートは毎時1分0秒に処理をするようにしました。

      スナップショットのファイル名は、同じくmotionの設定に合わせて、sprintfで生成します。(初歩的なところですが0埋めに注意しましょう)

      コマンドは、buff 配列に入れて、system関数で呼び出すようにします。

      system関数の使用については賛否あると思いますが、今回の程度のスクリプトを実行するような場合は簡単なので採用しました。

       

      また、夜中など、ツイートさせたくない時間帯を指定できるように、reg_tweet_flg配列のフラグをチェックするようにしています。変更したい場合には再コンパイルが必要です。

       

      • 緊急ツイート(随時)の処理

      温度や湿度がyellowやred になった場合に随時ツイートさせるための処理です。

      sprintfでコマンド文字列を作成してsystem関数で実行するという大まかな流れは定時ツイートの処理と同様です。

       

      考慮すべき点は、1分間隔の監視なので、温度や湿度が規定に収まらない場合、1分ごとに連続ツイートしてしまうという問題です。

      連続ツイートを避けるため、一度緊急ツイートをした場合は15分間(INTERVAL_EMARGENCY_EVENT_TIMES)は再ツイートさせないようにカウンタ(ignore_rest)を入れました。

       

       

      最後に

       

       コーディングはこのレベルでいいのか、と思うところが多々あります(多分、バグもあります)が、「まずは動くものを、最短経路で作る」という目標はおおよそ達成できたと思います。

       

       ハードの調達からソフト実装までを含めると、一つ一つは大したことないレベルかもしれませんが、なかなか大変でした。

       それでも試行錯誤しながらモノを作っていくのは楽しいですし、目指すモノができたときの喜びは他には代えがたいです。

       

       

       

       


      Raspberry Pi3 でペット監視システムをつくってみる(その5)

      0

        前回までは、motionの設定を行いました。

        今回は、プログラム内からツイッターでつぶやくためのTwitter Application Managementの導入と、そのスクリプトの作成です。

         

         

        Twitter Application Management

         

        こちらの記事を参考にさせていただきました。

        Twitterと他のプログラムやサービスを連携させるには、この設定が必須です。

         

        Apprication Setting, Your Access Token の内容は、特に重要になるので必ず控えておきましょう。

        特に、以下の4つのパラメータはプログラム上で必要となるため、重要です。

         

        • Consumer Key (API Key)
        • Consumer Secret (API Secret)
        • Access Token
        • Access Token Secret

         

         

        必要ソフトのインストール

         

        twitter + python = twython なのでしょうか。

        その名の通り、python用の twitter操作ライブラリです。

        sudo pip3 install twython

         

        実装プログラム

         

        1.写真なしツイート

         

        写真を添付しないツイートプログラムです。

        今回のシステムでは、温度や湿度が危険範囲に達した時にその値だけをツイートしたいので、まずはこれを作成します。

        • auth.py

        # ' ' 内にApplication Management で表示された文字列を入れる

        consumer_key  = ''
        consumer_secret = ''
        access_token = ''
        access_token_secret = ''

        • twitter_emergency.py

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

                                                                

        from twython import Twython
        from auth import (
            consumer_key,
            consumer_secret,
            access_token,
            access_token_secret
        )
        import sys

         

        twitter = Twython(
            consumer_key,
            consumer_secret,
            access_token,
            access_token_secret
        )

         

        args = sys.argv
        argc = len(args)

         

        if argc != 4:
          sys.exit(1)

         

        temp = args[1]
        humi = args[2]
        color = args[3]

         

        if color == '1':
          msg = '早めに対処してください。'
        elif color == '2':
          msg = 'すぐに対処してください。'
        else:
          sys.exit(0)

         

        message = "【緊急発信】気温"+temp+"℃、湿度"+humi+"%です。"+msg
        twitter.update_status(status=message)

         

        スクリプトの内容は、第一引数で気温、第二引数で湿度、第三引数で緊急度を受け取って、それをつぶやくというものです。

         

        実行結果は以下です。

         

        # python twitter_emergency.py 20.9 38.3 1

         

         

        2.写真付きツイート

         

         

        写真を添付する場合のツイートプログラムです。

        twython APIを使用する方法がわからなかったので、やや複雑な記述となってしまいました。(今後のリファクタリング課題です・・・)

         

        • oauth.py (注:auth.py と同階層におくこと)

        from requests_oauthlib import OAuth1Session
        from auth import (
            consumer_key,
            consumer_secret,
            access_token,
            access_token_secret
        )

        def CreateOAuthSession():
            return OAuth1Session(consumer_key,consumer_secret,access_token,access_token_secret)

        • twitter_media.py

        #!/usr/bin/env python                                                           
        # coding: utf-8  

                                                                       

        import sys
        import json
        import oauth
        from requests_oauthlib import OAuth1Session

         

        url_media = "https://upload.twitter.com/1.1/media/upload.json"
        url_text = "https://api.twitter.com/1.1/statuses/update.json"

         

        args = sys.argv
        argc = len(args)

         

        if argc != 4:
          sys.exit(1)

         

        temp = args[1]
        humi = args[2]
        fname = args[3]

         

        # OAuth認証 セッションを開始                                                    
        twitter = oauth.CreateOAuthSession()

         

        # 画像投稿                                                                      
        files = {"media" : open(fname, 'rb')}
        req_media = twitter.post(url_media, files = files)

         

        # レスポンスを確認                                                              
        if req_media.status_code != 200:
            print ("画像アップデート失敗: %s", req_media.text)
            exit(2)

         

        # Media ID を取得                                                               
        media_id = json.loads(req_media.text)['media_id']
        print ("Media ID: %d" % media_id)

         

        # Media ID を付加してテキストを投稿                                             
        params = {'status': "現在の気温は"+temp+"℃、湿度は"+humi+"%です。", "media_ids": [media_id]}
        req_media = twitter.post(url_text, params = params)

         

        # 再びレスポンスを確認
        if req_media.status_code != 200:
            print ("テキストアップデート失敗: %s", req_text.text)
            exit(2)

         

        print ("OK")

         

        スクリプトの内容は、第一引数で気温、第二引数で湿度、第三引数でファイルパスを受け取って、それをつぶやくというものです。

         

        実行結果は以下です。

        # python twitter_media.py 25.8 54.3 test.jpg

         

         

         

        3.まとめ

         

        実は私、twitter をやったことがなかったので、アカウントを登録するところからはじめました(笑)

        当然ながら Application Management も初めて使いましたが、なるほど世間のtwitterのボットはこういうのを使って実装されているんだろうな、と勉強になりました。

         

        次回はいよいよ最終編。

        htu21lib (第2回で動作確認した温度・湿度の監視ライブラリ)のメインルーチンに手を加えながら、最終的な監視プログラムを作っていきます。

         


        Raspberry Pi3 でペット監視システムをつくってみる(その4)

        0

          前回、温度・湿度センサーと7セグLEDまでのハードウェアが準備出来たので、

          ここからはソフトウェアということで、Webカメラと接続するためのソフト(motion)を準備していきます。

           

          motion

           

          ラズパイで監視カメラといえば、motionです。

          このブログでも扱ったことがありますし、導入事例はWeb上にもたくさん公開されているので、設定ファイルのみ記載しておきます。

           

          1./etc/motion/motion.conf

           

          • Daemon(デーモンの設定)

          daemon on

          • Capture device option (WEBカメラの設定)

          # キャプチャ画像の幅と高さを好みに応じて設定する

          width 640

          height 480

          • Image File Output (画像出力の設定)

          # 動き検知時の画像出力は、今回不要なので無効にする

          output_pictures off

          • Snapshots (スナップショット。今回主に使う機能)

          # スナップショットを撮るインターバル。3600とすることで、一時間に一回(毎時0分0秒)にスナップショットが保存される

          snapshot_interval 3600

          • Target Directories and filenames For Images And Films (保存するディレクトリ・ファイル名等の設定) 

          #画像保存先を/var/lib/motionから好みに応じて変更。

          #変更する場合は、変更先ディレクトリの権限にも注意。

          target_dir /home/pi/rabbit/motion 

           

          #スナップショットのファイル名を好みに応じて変更。 

          snapshot_filename %Y%m%d%H%M%S-snapshot

          ここで指定するディレクトリ名とファイル名は、後で作成するプログラムで使用します。

           

           

           

           

          2./etc/default/motion

          start_motion_deamon=yes

           

          3.今回使う機能について

           

          motion は、設定ファイルから様々なカスタマイズができます。

          今回実現したいのは、「ツイッターでペットの状態を定期ツイートするときの画像を保存すること」なので、これが容易にできるスナップショット機能を使用します。

          ディレクトリやファイル名を自在に変えることができる点も非常に使い勝手が良いですね。

           

          次回は、プログラム内からツイッターでつぶやくためのTwitter Application Managementの導入と、そのスクリプトの作成です。


          Raspberry Pi3 でペット監視システムをつくってみる(その3)

          0

            前回、温度・湿度センサーの動作確認までできたので、

            今回は、その値を出力するための7セグLEDの調達と実装、動作確認までを書きます。

             

            7セグLED

             

             

            Adafruit I2C通信の7セグメント4桁ディスプレイ (赤色)(スイッチサイエンス) を使用します。

            温度・湿度センサー同様、I2C(アドレスは0x70から0x77の間)を使用して通信を行います。

             

             

            1.ピンヘッダとBackpack 基板(4箇所)、Backpack基板とディスプレイ(14箇所)をはんだ付けする。

             

             はんだ付けの手順等は、チュートリアルが参考になります。

             

             

            2.Raspberry pi と センサーをブレッドボード等で接続。

             

             Raspberry pi の 3.3V, GND, SDA, SCL のそれぞれの端子を、基板の + , - , D, C

             に対応するようにつなぎます。

             

             前回記事の HTU21D-F と合わせると、以下のような接続になります。

             

             

              

             

            3.アドレス確認

             

             

             i2cdetect コマンドで見ると、アドレス0x70 が表示されます。

             0x40 は前回のHTU21D-F のものです。

             $ i2cdetect -y 1

                 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
            00:          -- -- -- -- -- -- -- -- -- -- -- -- --
            10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            70: 70 -- -- -- -- -- -- --    
                               

             アドレスは0x70から0x77までが使用できるようですが、衝突していなければ変える必要はないと思います。

             今回は、このままでいきます。

             

            4.ライブラリのダウンロード、セットアップ

             

             https://github.com/adafruit/Adafruit_Python_LED_Backpack からダウンロードします。

             

             ダウンロードしたファイルを解凍し、セットアップを行います。

             

            $ unzip master.zip

            $ sudo python setup.py install

             必要ソフトをインストールします。

            $ sudo apt-get install -y git build-essential python-dev python-smbus python-imaging python-pip python-pil

             

            5.動作確認

             

             現在の時刻を表示させる python のサンプルプログラムを実行してみます。

            $ cd examples/
            $ sudo python ex_7segment_clock.py

             

             4桁のLEDが光って、時刻が表示されれば完璧です!

             

             

             また、ライブラリのセットアップ〜使用方法は、Adafruitのページが参考になります。

             

             

            6.プログラム改造(表示させる数値を引数で渡す)

             

             ライブラリを使って動作を確認するだけ・・・では終わりません。

             ex_7segment_clock.py をベースにして、2つの引数を渡してその値を上位2桁、下位2桁にそれぞれ表示させるプログラムを書いてみます。

             

            • 7segment-2arg.py

            #!/usr/bin/python

             

            import time
            import datetime
            import sys
            from Adafruit_LED_Backpack import SevenSegment

             

            # ===========================================================================
            # Clock Example
            # ===========================================================================
            segment = SevenSegment.SevenSegment(address=0x70)

             

            # Initialize the display. Must be called once before using the display.
            segment.begin()

             

            args = sys.argv
            argc = len(args)

             

            if argc != 3:
              sys.exit(1)
            #else:
            #  print('argment:'+args[1]+' '+args[2])

             

            left = int(args[1])
            right = int(args[2])

             

            if left > 99:
              left = 99
                
            if right > 99:
              right = 99

             

            segment.clear()
            # args[1]
            segment.set_digit(0, left / 10)     # Tens
            segment.set_digit(1, left % 10)     # Ones
            # args[2]
            segment.set_digit(2, right / 10)   # Tens
            segment.set_digit(3, right % 10)   # Ones
            segment.set_colon(1)

             

            segment.write_display()

            • 実行

            $ sudo python 7segment_2arg.py 24 55

             引数で渡した 24 と 55 が表示されればOKです。

             

             あとは、前回の温度湿度センサーのプログラム内部から、センサで読み取った値を引数にしてコマンドを実行するだけ。

             これで温度湿度計はほぼ完成になります。

             

             次回は、Webカメラの監視ソフト(motion)のセットアップを行います。

             


            Raspberry Pi3 でペット監視システムをつくってみる(その2)

            0

              まずはじめに、ハードウェアの調達、実装から行います。

               

              必要となるのは、

              • 温度・湿度センサー
              • 7セグメントLED
              • Webカメラ

              の3つ。Webカメラについては、一般的なものでよいので割愛します。

               

              以前にラズパイでI2Cを使った経験があるので、今回もI2Cを使ってみたいと思います。

               

              I2Cを使うために

               

              Raspberry Pi の設定を変更しておく必要があります。

              $ sudo raspi-config
              

              コンフィグが開くので、Interfacing Options -> I2C -> enable に設定。finish で再起動。

               

               

              温度センサー

               

              Adafruit HTU21D-F 温度/湿度センサ(I2C通信)(スイッチサイエンス)を使用します。

              I2C接続が可能です。

               

              1.ピンと基板をはんだ付けする。

               

               やけどしないようにしましょう!

               

              2.Raspberry pi と センサーをブレッドボード等で接続。

               

               ピン配置は以下になります。

              Raspberry Pi HTU21D-F
              3.3V(1) Vin
              GND(6) GND
              SDA(3) SDA
              SCL(5) SCL

               

              3.アドレス確認

               $ i2cdetect -y 1

                   0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
              00:          -- -- -- -- -- -- -- -- -- -- -- -- --
              10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              70: -- -- -- -- -- -- -- --    
                                   

               

               アドレスは、0x40ということが分かります。

               

               

              4.ライブラリのインストールとビルド

               

               GitHubに公開されているものがあるので、これをダウンロード・解凍して、ビルドします。

              $ wget https://guihub.com/bbx10/htu21dflib/archive/master.zip
              $ unzip master.zip
              $ ./build.sh

               

               多少warning がでますが、htu21dflib という実行ファイルができれば成功です。

               

              5. 実行

               

               htu21lib を実行してみると・・・

              $ ./htu21dflib
              opening /dev/i2c-1
              27.6 57.0
              27.6 58.1
              27.6 58.4
              27.6 58.2
              27.6 58.0
              27.6 57.8
                 :
                 :

               1秒間隔で、センサから取得した温度と湿度を表示します。

               もしエラーになる場合は、先述のI2Cアドレスが取得できているかどうか、ピンの接続は正しいか、確認しましょう。

               

               

              6. まとめ

               

              今回は、温度湿度センサーをラズパイにつないで、動作を確認しました。

              動作確認といっても、ライブラリをビルドして実行しただけですが、目的の値を取得できると楽しくなります。

               

              このライブラリは、ソースコードは c で書かれており、main関数の入っている htu21dflib.c に手を加えていくと色々なことが実現できそうです。

              7セグの表示や、ツイッターとの連携も、このプログラムを起点に行っていく予定です。

               

              次回は、7セグLEDの調達と実装を行っていきます。

               

               

               


              Raspberry Pi3 でペット監視システムをつくってみる(その1)

              0

                最近、自宅でペットとしてうさぎを飼い始めました。

                 

                とてもかわいく初心者にとっても飼いやすいですが、暑さに弱いので、温湿度の管理には注意が必要なのだそうです。

                (夏場は24時間エアコン稼働です。)

                 

                そこで、定番であるが、Raspberry Pi3 でこれら条件とついでにペットの様子が監視できないかと思い、作ってみることにしました。

                 

                ざっくりとした要望は、以下。

                 

                • 温度・湿度をセンサーから取得して、7segment LED 上に表示させたい(温度・湿度計としての役割)
                • Webカメラを繋いで、LANネットワーク内でペットの映像が見れると嬉しい(※インターネットには公開しない)
                • 自宅外にいるときにペットの様子がわかるよう、温度・湿度とカメラのスナップショットをツイッターで定期的につぶやくようにしたい。
                • また、危険な温度・湿度となったときには定期的なつぶやきとは別に、ツイートするようにしたい。

                 

                 

                写真1)システム外観

                 

                写真2) 気温・湿度をツイートする。

                 

                 

                 

                基本的なスタンスは、

                 

                「不要な労力はかけず、あるもの(ライブラリ等)は最大限活用する」

                 

                個人的な事情として、私自身IT業界から離れて2年以上経つため、完璧なものを作る自信はありませんが、まずは動かすところまでを目指してつくっていきます。

                 

                #細かいコードの記述等、ツッコみどころもあるかもしれませんが、ご容赦を。

                 

                まずは次回、ハードウェア(温度・湿度センサ、7seg-LED)の調達、実装から。

                 


                Raspberry Pi + Durio Sound でハイレゾ再生環境を作る(その2)

                0

                  Durio Sound を接続したはいいものの、音を出すには I2S を使わないといけない。
                  Raspbian ではカーネルの再構築が必要でハードルが高いので、色々調べて便利そうな Volumio を使うことにした。

                  Volumio のインストール

                  1) イメージの焼き込み
                  Raspbian のときと同じ。micro SD を用意して、イメージを焼きこむ。
                  このページを参考にするといい。

                  2) 起動
                  ネットワークケーブルを繋いで、電源 ON。
                  volumio で名前解決してくれるので、 IP アドレスを意識する必要がない。
                  webサーバや samba など各種サービスもデフォルトで動いているので、何も設定しなくても以下ができる。
                  • エクスプローラから samba 共有フォルダの閲覧
                  • ssh 接続 (ユーザ名:root , パスワード:volumio)
                  • http://volumio で GUI にアクセス


                  ssh でログインも "volumio" で。
                  ロゴはちょっとダサい(笑)

                  Volumio で音楽を再生するまで

                  3) 音楽を再生するための設定
                  http://volumio でアクセスして、ライブラリの設定や DAC の設定をしていく。

                  3-1) ライブラリの設定
                  音楽ファイルがないことには再生しようがないのでその準備。
                  Menu > Library から、DB を作成します。
                  USB でもできますが、私は Ubuntu サーバーに音楽ファイルを置いているので、NAS mounts を選択。

                  [SAVE MOUNT] で、設定を保存。
                  [UPDATE LIBRARY] で ライブラリ(DB) が生成される。


                  Browse タブから NAS を掘っていくと、再生したいファイルが見える。
                  # ちなみに再生するのは Kalafina の ハイレゾ音源です。

                  3-2) Audio 設定
                  DAC (Durio Sound Basic) から音を出したいので設定をする。
                  設定は、Menu > Playback から。
                  Audio Output を sndrpihifiberry に設定します。



                  Mixer Type を software にすると VOLUMIOからボリューム制御をができるようです。
                  ただ、but affects audio quality とあるので、微妙かもしれません。

                  3-3) 聴いてみる!
                  ライブラリから再生したいファイルを選んで、いざ再生。
                  Durio Sound から音が出れば成功。




                  無線ネットワークにつなげば、スマホからも制御可能。当たり前だけど、ちょっと感動。
                  # スマホ標準のブラウザだと表示が崩れたので、firefox を使いました。

                  まとめ

                  ◇VOLUMIO について

                  samba や web サーバーがはじめから動いているし、もはや IP アドレスも設定する必要はないという親切設計。
                  Raspberry PI で音楽を再生させるなら VOLUMIO 一択と言っても過言ではないほど、素晴らしいです。
                  (Linux を勉強しようとする人には不向きですが...)

                  ◇ハイレゾについて

                  以前の記事で、普通の音源と変わんないなーとか書いてしまったことを全力で後悔。
                  今回の環境で聴いてみると、「明らかに音が違う!」と感じました。
                  ハイレゾ対応プレーヤーが欲しいと思っている方は、Raspberry Pi を使ってみてはどうでしょうか。
                  Raspberry Pi + Durio Sound の場合は1万2000円程度。コストに見合う満足感はあると思います!

                   

                  Raspberry Pi + Durio Sound でハイレゾ再生環境を作る(その1)

                  0
                    折角買ったハイレゾ音源だけど、音の違いが分からなくて悔しかったので、ちゃんと再生環境まで整えたい。
                    でも簿給サラリーマンには高価な機材を用意する財力はないのでどうするか...
                    我らが庶民の味方、Raspberry Pi を使って作ってしまえばよいのです。

                    DAC 選び

                    オンボードの DAC は音楽の再生環境としては貧弱なので、Raspberry Pi とは別に DAC を用意する必要があります。
                    種類としては、
                    • USB DAC
                    • I2S DAC
                    の2つ。
                    USB の方が親近感あるので楽そうですが、価格帯としては I2S の方がお手頃そうなので、I2S で探してみる。
                    ちなみに I2S は、Inter-IC Sound のことで、IC間でデジタル音声データをシリアル転送する規格のこと。
                    I2C と似ているけど全く別物なので間違えないようにしましょう。(間違えたのは私だけではないはず…ぼそ)

                    IrBerryDAC が有名っぽいけど、手持ちの Raspberry Pi は B+ で対応していないのでダメ。
                    SabreBerry は安かったけど、スイッチサイエンスで在庫切れ。
                    そんな中、白羽の矢が立ったのが、Durio Sound Basic


                    192kHz/24bit に対応していて、Raspberry Piで高音質のサウンドを楽しめる、とのこと。
                    要求仕様はバッチリ満たしてますね!
                    Raspberry Pi と同サイズでスタックするので見た目的にもなかなかいい感じ。

                    Basic と Pro の2タイプがあったけど、Pro は売り切れだったので Basic を購入。
                    値段や見た目だけじゃなく、電源を Raspberry Pi からもらうか自分でつなぐかの違いもあるみたいです。

                    Raspberry Pi とつないでみる

                    付属のネジとスペーサーを使って、Raspberry Pi に接続。
                    わずか5分でハードウェアの完成。


                    あとは、I2S 経由でオーディオ信号を Durio Sound に出力すれば、音が鳴るはず。
                    続きはこちらの記事で。
                     

                    RaspberryPi と motion で Webカメラの映像を監視する

                    0
                      書籍やネットでよく紹介されていて、Raspberry Pi でまずやりたくなるのが『監視カメラ』のシステム。
                      motion というアプリケーションを使って、Web 経由で見るのがどうやら一番簡単なようだ。

                      ◆ motion のインストール、設定
                      1. インストール

                      $ sudo apt-get install -y motion

                      2. 設定ファイル (/etc/motion/motion.conf) の編集
                      必須の変更箇所は、2つ

                      webcam_localhost off
                      daemon on


                      framerate とか width / height とか、その他の項目はお好みで。
                      locate を on にすると、動物体を枠で囲ってくれるので楽しい。

                      3. サービスの再起動

                      $ sudo /etc/init.d/motion restart


                      ◆ Web 経由で見てみる
                      方法1) http://(Raspberry Pi のアドレス):8081 にアクセス
                      → 自分の環境 (firefox)では、見れなかった
                       調べたところ、motion JPEG という形式は直接見られない というのが原因らしい。

                      方法2) html ファイルを作ってみる
                      → ググってみると html ファイルを作ってそこから関連付ければ上手く行くことがわかった。
                       最も単純に書くなら、こんなんでいい。

                       <html>
                       <body>
                       <img src="http://(Raspberry Pi のアドレス):8081">
                       </body>
                       </html>


                      方法2)の結果、、、


                      映った!!!
                      動いているところも検出できている。

                      ◆ SDカードの記録回数 に関する注意
                      たまに知らない人がいてびっくりするが、フラッシュメモリや SDカードは、書き変え回数に制限がある。
                      耐久性を求めるのが筋違いではあるが、少しでも長く持たせるためには、不必要な書き換えは極力避けるしかない。

                      ところが motion には、静止画や動画を、所定の領域に保存する機能が付いている。
                      何も気にせず有効にして使い続けると、知らず知らずのうちにその寿命を縮めることになるので注意が必要だ。
                      対処法としては、大きく二つある。

                      1) 保存しないようにする
                      Webブラウザで見たいだけなら、これがベストだと思う。
                      motion.conf で下記2つを off にする。(静止画と動画と2種類の出力がある)

                      output_normal off
                      ffmpeg_cap_new off


                      2) 保存する場所を工夫する
                      別の媒体に記録先を分けるとか、RAM領域に書くようにするとか。
                      motion.conf で記録先を指定するのはここ。

                      target_dir /tmp/motion


                      ちなみに、デフォルトのパーティション構成だと、/tmp は SDカード上にある。

                      pi@raspberrypi ~ $ df -h
                      ファイルシス   サイズ  使用  残り 使用% マウント位置
                      rootfs            15G  3.8G   11G   28% /
                      /dev/root         15G  3.8G   11G   28% /
                      devtmpfs         215M     0  215M    0% /dev
                      tmpfs             44M  376K   44M    1% /run
                      tmpfs            5.0M     0  5.0M    0% /run/lock
                      tmpfs             88M     0   88M    0% /run/shm
                      /dev/mmcblk0p1    56M  9.7M   47M   18% /boot


                      ◆ 使ってみた感想
                      CPU リソースの占有率は低い反面、動画の検出精度は悪い(フレームレートを上げてもカクカク) と感じた。
                      非力な Rapberry Pi の環境でどこまでできるか悩ましいが、設定は細かく検討する必要がありそう。

                      とはいえ、手間をかからない上に、カスタマイズ性は高く、全体的には非常に使いやすいと思う。
                      「動物体を検出したら何かアクションを起こす」という設定を使えば、可能性は無限に広がるし。
                       


                      Raspberry Pi の 環境構築と LEDテスト

                      0
                        前々から欲しいなーと思っていた、Raspberry Pi (Model B+) を購入した。

                        ◇ 購入品

                        • Raspberry Pi(Model B+)
                        • micro SD カード(Trancend 16GB)
                        • スマートフォン用 AC 充電器

                        ◇ 環境構築
                        OS のインストールと、ssh 経由でリモートログインするための最小限の設定をする。
                        Raspberry Pi の推奨OS として、Raspbian(ラズビアン?)が配布されているので、それを使用。
                        その名の通り Debian 系の Linux OS なので、Ubuntu などが使い慣れていれば設定は苦労しないはず。

                        1) OS(Raspbian) のイメージ取得とインストール
                        •  ディスクイメージの取得

                        http://www.raspberrypi.org/downloads/
                        Raspbian Download ZIP から取得

                         

                        •  microSD に書き込み

                        Win32 Disk Imager を使用
                        http://win32-disk-imager.jp.uptodown.com/


                        2) 起動
                        • Rasberry pi 本体に、SDカード、LANケーブル、キーボード、マウス、モニタを接続
                        • 電源を投入(ACケーブルを接続)

                        3) 初期設定
                        いろんな設定をはじめにできるので、必要に応じて変更する。
                        以下の項目をチェックしたと思う。

                         
                        • SDカードの使用領域の設定
                        • デフォルトユーザ(pi)パスワード変更
                        • ssh接続を許可するかどうか
                        • X window を使うかどうか

                        必要ないので、日本語設定とかキーボードの設定とかはしていない。

                        4) ネットワーク設定と samba の導入
                        •  固定IP の設定
                         SSH 経由で使うのなら、毎回 IP アドレスが変わってしまうのは都合が悪い。
                         そのため、毎回同じ IP を取るように設定する必要がある。

                        $ sudo emacs /etc/network/interfaces

                        # ネットワーク環境に応じて書き替える
                        iface eth0 inet static
                        address 192.168.24.53
                        netmask 255.255.255.0
                        gateway 192.168.24.1

                        # ファイルを保存し、ネットワークの再起動
                        $ sudo /etc/init.d/networking restart

                        •  samba のインストールと設定
                         他のコンピュータ(windowsなど) のエクスプローラからアクセスできるようになり、作業がしやすくなる。

                        $ sudo apt-get install -y samba

                        # 設定ファイルを開く
                        $ sudo emacs /etc/samba/smb.conf

                        # 例えば下記を追加。書き終わったら保存する。
                        [pi]
                        comment = RaspberryPi
                        path = /home/pi
                        browsable = yes
                        writeable = yes
                        guest ok = no

                        $ sudo pdbedit -a pi
                        -> 設定するパスワードを聞かれるので入力

                        # サービスを再起動
                        $ sudo /etc/init.d/samba restart


                        5) SSHでログインできるかどうかを確認
                        たとえば、Windows PC の Teraterm などを使う。
                        これで、キーボードやマウス、モニタを接続することなく、アクセスすることができる。

                        ◇ LED テスト
                        GPIO ピンが載っているということで、まずは簡単な回路で遊んでみる。
                        大学の実習で使ってたブレッドボードやら抵抗やらを引っ張り出してきて、接続。

                        1) 回路作成



                        抵抗と LED を直列に繋いだだけの簡単な回路。電源側は 25 番、GND はその左側 を使用した。

                        ※ GPIO ピンのマップは、下記の早見シートを参考にした。
                        http://blog.livedoor.jp/victory7com/archives/39656774.html


                        2) スクリプト作成
                        1秒周期で LED の ON / OFF を送るスクリプト LedTest.sh

                        #!/bin/sh
                        while [ 1 ]
                        do
                            sleep 1s
                            echo 1 > value  # LED ON
                            sleep 1s
                            echo 0 > value  # LED OFF
                        done


                        3) 出力ピンの設定
                        # 25 番 を出力ポートに設定する

                        $ sudo su
                        $ echo 25 > /sys/class/gpio/export
                        $ cd /sys/class/gpio/gpio25
                        $ echo out > direction

                        4) 実行
                        # シェルスクリプトは /home/pi にあるとする

                        $ /home/pi/LedTest.sh



                        LED 消灯

                        LED 点灯

                        1秒ごとに Led On/Off を繰り返した!


                        ★ ★ ★

                        Linux サーバとしても使るし GPIO ピン使って電子回路も楽しめる Raspberry Pi、こいつはすばらしい。
                        何より小さい。多少の突起はあれど基板は本当に名刺サイズなので、今まで置けなかった場所にコンピュータが設置できる。
                        全世界で売れるのも納得。Intel の NUC 然り、時代は小型コンピュータということなんだろうなー。

                         

                        | 1/2PAGES | >>

                        PR

                        calendar

                        S M T W T F S
                           1234
                        567891011
                        12131415161718
                        19202122232425
                        262728293031 
                        << July 2020 >>

                        counter

                        ブログパーツUL5

                        books

                        ひろの最近読んだ本

                        selected entries

                        categories

                        archives

                        recent comment

                        links

                        profile

                        search this site.

                        others

                        mobile

                        qrcode

                        powered

                        無料ブログ作成サービス JUGEM