Header Ads

Arduino温泉卵機の製作6(ソフトウェア設計)

どうも、とらです(๑´∀`) 前回の機械設計に引き続き、Arduino温泉卵機のソフトウェア設計を行うことにしました。テーマはIoT・・・じゃなくて家の中で LANoT (Local Area Network of Things) です。



仕組みはこうです。電気ケトルに差し込まれた熱電対から得られた温度データは、Arduinoを経由してMacBook Airが受け取ります。次にMacBook AirはLAN上のDBサーバ兼Webサーバに温度データを送信します。最後に人間がiPhoneでLAN上のWebページにアクセスすると、リアルタイムに電気ケトルのお湯の温度を知ることがでる、というものてす。

LANという閉じた世界でやっているので、これをIoTではなくLANoTと呼ぶことにしました。もしWebサーバをインターネットに公開したら、pseudo-IoTになるかもですね。

IoTにしない理由は色々ありますが、まずは温泉卵機だからです。熱電対の温度データをArduino経由でクラウド上のDBサーバにアップしても、そのデータを見て喜ぶ人はおそらく自分以外にいないですし、それなら別に家のネットワークでもいいんじゃないかと思いました。

今回はおいしい温泉卵ができて、温度データがリアルタイムに確認できて、のちのちデータ解析もできればいいので、わざわざIoTにしなくてもLANoTでいいのでは?と思ったのです。 何でもかんでも流行だからIoTにするのではなく、一つ一つの技術を勉強して、本当に役立ち、ビジネスになるIoTを考えたいと思っているとらなのでした。




Arduino制御プログラム(C/C++)



今回はArduinoを温度制御用コントローラーとして使うので、PID温度制御ロジックとSSR制御ロジックはC/C++で作ることになります。とは言っても既にArduino PID Libraryが公開されているので、それを使うことにして難しいコーディングはほぼなしになりそうです。

ライブラリのPID_RelayOutputというフォルダの中にサンプルスケッチが入っているので見てみます。Kp、Ki、Kdのパラメーターを設定する必要があるんですね。

 //Specify the links and initial tuning parameters
 double Kp=2, Ki=5, Kd=1;
 PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
 int WindowSize = 5000;



パラメーターがうまく決められない時はどうすればいいんでしょうか? PID Autotune Libray というPIDパラメータの自動設定のライブラリのもあるようなので、こちらを使うことになりそうです。



サンプルスケッチの void setup() の中に温度を設定する部分がありました。温泉卵なのでここを67℃とかにすればよさそうです。


 Setpoint = 100;   // (๑´∀`)っ Setpoint = 67;



そういえば、熱電対に関してはライブラリをインクルードしてピンを指定し、熱電対を用意してから


 #include <SPI.h>

 #include "Adafruit_MAX31855.h"
 #define DO 10
 #define CS 9  
 #define CLK  8
 Adafruit_MAX31855 thermocouple(CLK, CS1, DO);

void loop()の中で次のようにすればいいんでした。

  double temperature = thermocouple.readCelsius();



void loop() の中には現在温度の入力用変数Inputに値を代入しているところがあります。ここに熱電対の温度データを入れてやればよさそうです。


   Input = analogRead(PIN_INPUT);   // (๑´∀`)っ Input = thermocouple.readCelsius();



その下にはリレー制御のコードがありました。これはこのまま使うことにしましょう。


   if (millis() - windowStartTime > WindowSize)

   { //time to shift the Relay Window
     windowStartTime += WindowSize;
   }
   if (Output < millis() - windowStartTime) digitalWrite(RELAY_PIN, HIGH);
   else digitalWrite(RELAY_PIN, LOW);


以上でうまく動くはずですが、現在温度がどこにも表示されないのでシリアル通信を使って外に出せるようにしておきます。これでコンソールに表示したり別のプログラムから温度データとPID出力が受け取れますね。


 Serial.print(Input);

 Serial.print(",");
 Serial.println(Output);


ただしこのままだとすごい勢いで送ってくるので、以下のように遅延を入れることになりそうです。


 delay(1000);


遅延を入れるとPIDの制御に少なからず悪い影響を与えてしまいそうですが、その辺は実験してみてからですかね。もしくは
millis()を使って1秒おきにシリアル通信で温度データを送ればよさそうです。






データベース




LAN上にMySQLサーバを立てておき、Arduinoの温度データはそこに保存していこうと思います。ちょっとIoTっぽいですが、LANoTです(๑´ڡ`๑)

DB名はArduino、テーブル名はonsentamagoとします。フィールドはこんな感じにしようと思います。inputが熱電対で測定した温度、outputはPIDのアウトプットです。expidで実験を切り出せるようにして、timeに時刻を格納します。







温度受信およびDBへ温度送信するプログラム(Java)



温度データがArduino IDEのコンソール出力だと物足りないですし、IDEに何かあるとデータが消えてしまうので、自動でデータベースに保存できるようにします。ここはJavaでやります。ArduinoとUSBでつないだMacでJavaのプログラムを動かすイメージです。

実は過去にとらはArduinoのイーサネットシールドを買ったのですが、不良品だったか何だったかうまく動かず朝になってしまったので、でもどうにかデータを取り出したいのでArduinoとUSB接続したMac側でProcessingを使ってみたりした過去があります。でも、


JavaベースのProcessingを使うなら普通にJavaでやればいいじゃん


と気づいたのでJavaでやることにしたのでした。


Javaでのシリアル通信にはRXTXライブラリが必要です。Arduino and Javaのページにサンプルコード付きで詳しく説明してあります。ただし、リンク先のページのその先のリンクはドメイン切れになっていたりするので、RXTX wikiを参照するといいと思います。とらはMacでやろうとした時、


 gnu.io.PortInUseException: Unknown Application


という変なExceptionが出てつまづきそうになりましたが、MacのJavaでAVRとシリアル通信したい に助けられました。



Java上で動くようになってしまえばこっちのものです。サンプルコードを少しいじるだけで好きなようにできます。変更するのはシリアル通信用のポートの設定ぐらいです。


    private static final String PORT_NAMES[] = {

        "/dev/tty.usbmodem1411", "/dev/tty.usbmodem1421"
    };


あとはArduinoから送られてくる文字列を受け取って、その後にDBに接続して温度データを挿入するコードを書けばおkですね(๑´ڡ`๑)


 try {

              String inputLine = input.readLine();

    // (๑´∀`)っ Connect to DB and insert temperature data into table

     con = DriverManager.getConnection(url, user, password);
               Statement smt = con.createStatement();
               String sql = "INSERT into onsentamago … ";

               smt.executeUpdate(sql);
 }




温度表示プログラム(PHP、JS)





LAN上にApacheでWebサーバを立て、DBから温度データを読み込んで表示するサイトをHTML/JavaScript/CSS/PHPで作ろうと思います。まずはPHPでMySQLからデータを拾って来ます。

 $db="arduino";
 $link = mysql_connect('localhost', 'user', 'password');
 mysql_select_db($db , $link) or die("Couldn't open $db: ".mysql_error());
 $result = mysql_query("SELECT input FROM onsentamago WHERE ...");


このあとはGoogle ChartsとかEpochとかのリアルタイムグラフ作成の方法があるので、よさそうなのを使います。線グラフとメーターを組み合わせてダッシュボードみたいにしたいですね。それをiPhoneで見ながら温泉卵ができるのを待つのが楽しみです(๑´ڡ`๑)   取れたデータの解析はplotlyを使おうと思います。



以上でソフトウェア設計は終わりです。


つづく



0 件のコメント:

Powered by Blogger.