さて、弊社MC機には加工終了やエラーを知らせるメール送信システムを付けております。
これまでは、秋月電商メーラー・ボード Ver.2・キットを使用してきました。
先日、IchigoJam用のネットワークボードMixJuiceが発売されたのを機に、メール送信システムに「IchigoJam+MixJuice」を使用することにしました。
(秋月のメーラーボードだとLANケーブルを敷設しなくちゃならないってのも、IchigoJam+MixJuiceを採用した理由のひとつです)

ちなみに、IchigoJamとは「プログラミング専用こどもパソコン」の事です。
こどもパソコンと言っても簡単にI/Oポートを制御できるので、大人でも遊べそう色々な用途に使えそうです。

15mailer_1
現在、手持ちに 旧IchigoJam基板板(v1.0.1)のものと、IchigoJamU基板(1.1.1)のものがあり、工作のしやすさから言えばIchigoJamU基板なんですが、そちらは今後のプログラムに使いたいので、ここはあえて旧IchigoJam基板にしました。

15mailer_2
まずは、BTNポートをGNDに落として、電源投入時にSAVE番号0番のプログラムを自動実行するようにします。
次に、センサおよび、MixJuiceへのジャンパ線を配線します。
正常に動作することが確認できたら、MC機のシグナルタワーにへ適当にテープで取り付け。






ハードウェアの準備はこれでOKなので、次にソフトウェアになります。

問題点として、秋月のメーラーボードはwebブラウザからメールの内容や送り先の設定がですますが、IchigoJamでそれらを変更するなら、都度、モニタとキーボードをIchigoJamにつないでプログラムを書き直さなければなりません。
一度組み込んでしまった機器にモニタとキーボードを繋いでプログラム修正というのは非常に面倒な作業です。

そこで解決策として、アクセスポイントとの接続終了後に、webからIchigoJamに実行プログラムをダウンロードし、それを実行することにしました。

これにより、IchigoJamでは常に最新のプログラムを実行でき、かつプログラムの変更をネット上で行えるという仕様にしました。(ブラウザでの設定変更ではなく、Telnetでの変更になりますが)



IchigoJamが電源投入時に実行されるプログラムは、下記のような最小限のプログラムだけになります。
  1. アクセスポイントとの接続
  2. ダウンロードコマンドを送信
  3. ACK信号を待機
  4. プログラムのダウンロード
  5. ダウンロードしたプログラムを実行


cgi側では下記の処理を行っています。
  1. ダウンロードコマンドを受信 → IchigoJam用プログラムを送信
  2. メッセージ送信コマンドを受信 → sendmailでメッセージ送信


cgiからD/Lされるプログラムは下記の処理内容となっています。
  1. 各ポートを監視
  2. ポートに変化があったら、cgiにメッセージを送信
  3. 最初に戻る

上記の3つのプログラムにより、メール送信の処理を行っています。



IchigoJam側のプログラムは下記のようにしました。

プログラム説明
10 'IchigoJam IoT
20 WAIT1800
30 'PRINT "MJ APL"
40 PRINT "MJ APC AccessPint password" 
50 gosub80:?"DownLoad"
60 INPUT a:if a<>-1 goto60
70 end
80 PRINT" MJ GET www.hogehoge.hoge?15password&";:return
10 コメント行
20 MixJuiceの初期化待ち
30 アクセスポイントリスト(動作確認用のためコメントアウト)
40 アクセスポイントに接続
50 "DownLoad"コマンドでプログラムをD/L
60 cgiから戻り値が来るまでMixJuiceのコマンドを出力
70 プログラム終了
80 cgiへパスワ-ドを送信するサブルーチン

ネット上では、下記のようなcgiにしました。

プログラム
#!/usr/bin/perl
$PSWD = "15password"; # このcgiにアクセスするためのパスワード(IchigoJamに書いたパスワードと合わせる)

$text = $ENV{'QUERY_STRING'}; # GETメソッドの引数を得る

$text =~ /(.*)&(.*)/; # 引数をパスワードとメッセージに分ける
$passwd = $1; # 第1引数はパスワード
$message = $2; # 第2引数は送信メッセージ

#print "pswd=", $passwd, "<br>\n";
print "message=", $message, "<br>\n";

if( $passwd ne $PSWD ){
  return; # パスワードが不一致なら処理を終了
}

if( $message eq "DownLoad" ){ # メッセージが"DownLoad"なら
  print "-1\n"; # ACK信号("-1")を送信後、以下のプログラムをIchigoJamに送信

  print '100 if in(1)=0 gosub 130:PRINT"message1":gosub 150'; # ポート1に信号が入ったらcgiに"message1"を送信
  print "\n";
  print '110 if in(4)=0 gosub 130:PRINT"message2":gosub 150'; # ポート4に信号が入ったらcgiに"message2"を送信
  print "\n";
  print "120 goto 100\n";
  print '130 PRINT"MJ GET www.hogehoge.hoge/get.cgi?15password&";'; # cgiへパスワ-ドを送信するサブルーチン
  print "\n";
  print "140 return\n";
  print "150 if in(1)=0 or in(4)=0 goto 150\n"; # ポートへの入力信号が変化するまで待機
  print "160 return\n";
  print "wait60:goto100\n"; # このプログラムをD/L後、自分自身を実行する
  return;
}

if( $message eq "message1" ){
  print "1\n";  # Success
  $sendmail = '/usr/bin/sendmail';
  open(SENDMAIL,"| $sendmail -t -i");
  print SENDMAIL "From: hoge\@hoge.hoge\n";
  print SENDMAIL "To: fuga\@fuga.fuga\n";
  print SENDMAIL "Cc: hoge\@hoge.hoge\n";
  print SENDMAIL "Subject: IchigoJam Mail\n";
  print SENDMAIL "IchigoJam auto mail sender.\n";
  print SENDMAIL $message, "\n";
  print SENDMAIL "END\n";
  close(SENDMAIL);
}

if( $message eq "message2" ){
  print "1\n";  # Success
  $sendmail = '/usr/bin/sendmail';
  open(SENDMAIL,"| $sendmail -t -i");
  print SENDMAIL "From: foo\@foo.foo\n";
  print SENDMAIL "To: bar\@bar.bar\n";
  print SENDMAIL "Cc: foo\@foo.foo\n";
  print SENDMAIL "Subject: IchigoJam Mail\n";
  print SENDMAIL "This mail from IchigoJam.\n";
  print SENDMAIL $message, "\n";
  print SENDMAIL "END\n";
  close(SENDMAIL);
}

こんな感じです。
言わずもがなですが、下線の文字(パスワードやコマンド)や、URLは適宜変更してください。

上記のcgiでは英語メールしか送れません。
もし日本語のメールにしたい場合は、 文字変換する必要があります。
(それについてはPerlに詳しいページに説明を譲ります) 

IchigoJam側では、Wi-Fi接続に失敗した場合の処理を作っていませんが、度々接続に失敗するようでしたらリトライ処理を書き加えてください。

以上で、IoTとまでは行かずとも、機械監視システムができあがりました。

最初から、MixJuice搭載のIchigoJamがあると助かるなぁ。



2016/05/23 追記

昨晩思いついたんですけど、D/Lプログラムを下記のように変更すれば、ローダー自身も更新できますね。
ローダー更新後、cgiを直してIchigoJamを再起動すれば、新たなローダーが実行されるはずです。
(思いついただけで、まだ試してません。あしからず)

自動実行プログラムの更新
< 省略 >

if( $message eq "DownLoad" ){ # メッセージが"DownLoad"なら print "-1\n"; # ACK信号("-1")を送信後、以下のプログラムをIchigoJamに送信  < 更新用プログラム(省略) >
print "WAIT60:SAVE0\n"; # このプログラムをD/L後、自分自身を番号0に保存する
return; }

< 省略 >