こんにちは、プラットフォームワンのyamakenです。普段はフロントエンド中心にDSP周りの開発をやっています。現在新卒2年目です。
広告会社のエンジニアブログということで皆さんビッグデータやインフラなどためになりそうな記事をあげていらっしゃいますが、今回は少し趣向を変えて電子工作チックな内容をお届けします。極めて初学者向けですので、電子工作初めてみようかな?と思っている方にとっては参考になると思います。
※今回使用するArduinoとProcessingのコードに関しては、オライリーの書籍「Arduinoをはじめよう」の内容を踏襲しつつ、できるだけ単純化・アレンジを加えています。興味のある方はぜひご覧になってみてください。
本日の成果物
[caption id="attachment_530" align="aligncenter" width="300"] The 簡素なつくり[/caption]
プラットフォーム運営に携わる者にとって、システムの稼働状況を監視するツールは必須です。
弊社サービスでもNagios等を用いてサーバーの監視とアラート通知を自動化しています。今回はアラートメールの有無をチェックし、未読のアラートがあればLEDを点灯させる簡易的なプログラムを組んでみます。
1.必要なもの
- Arduino Uno
今回の主役。オープンソースで拡張性の高いマイコンボードです。C++風のArduino言語で書いたプログラムを記憶できます。
「アルドゥイーノ」と読みます。たぶん。
- ブレッドボード
- USBケーブル
- LED
- ジャンパワイヤ
- 抵抗
このへんはAmazonや秋葉原で探せば、セットで売っているのが見つかるはず。
2.環境構築
Arduinoの統合開発環境です。コーディングからマイコンへの書き込みまでこれ一本。
Arduinoと親和性の高い、Javaライクな言語であり統合開発環境です。Arduinoのメモリはわりと貧弱なため、サーバーとの通信等はこちらで行い、シリアル通信を介してArduinoと連携します。
- 新着メールのRSSフィード
特に形式は問いませんが、basic認証等でアクセスし受信メールを参照できるURLが必要です。
参考: GmailフィードとGmailスクレイピング | trash-area.com
※セキュリティ対策は今回最小限に留めていますので、実際に使われる際はプラスアルファの対策をお願いします。
3.実装〜Processing編〜
「ある特定のメールアドレスと、あるキーワード(例:alert / critical )が検出されたら」シリアルポートに1を、条件に当てはまらなければ0を出力するようにします。
まずはコード。
[java] import processing.serial.*;
import java.net.URL; import java.net.URLConnection; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer;
String feed = "https://mail.google.com/mail/feed/atom";
int interval = 10; int lastTime;
int from = 0; int alert = 0; int critical = 0;
int res;
Serial port;
void setup() { String arduinoPort = Serial.list()[0]; //depends on your own env port = new Serial(this, arduinoPort, 9600);
lastTime = 0; fetchData(); }
void draw() { int n = (interval - *1;
res = (from * alert * critical > 0) ? 1 : 0;
if(n <= 0) { fetchData(); lastTime = millis(); }
port.write(res); }
void fetchData() { String data; String chunk;
from = 0; alert = 0; critical = 0;
try { Authenticator.setDefault(new Authenticator() { String username = "xxx"; String password = "xxx";
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.username,
(this.password.toCharArray()));
}
});
URL url = new URL(feed);
URLConnection conn = url.openConnection();
conn.connect();
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
while ((data = in.readLine()) != null) {
StringTokenizer st = new StringTokenizer(data,"\"<>,()[] ");
while(st.hasMoreTokens()) {
chunk = st.nextToken().toLowerCase();
if(chunk.indexOf("アラートメール@ドメイン.com") >= 0) from++;
if(chunk.indexOf("alert") >= 0) alert++;
if(chunk.indexOf("critical") >= 0) critical++;
}
}
} catch (Exception ex) { ex.printStackTrace(); System.out.println("ERROR. "+ex.getMessage()); } } [/java]
setup() が起動時に実行され、以後は draw() が繰り返し実行されます。
以下、書籍にないハマりがちなポイント。
- URLクラスなんてねぇよ!と言われる
→「Arduinoをはじめよう」のサンプル通りに書いていると、エラーが出てしまいます。こちらのサイトなどを参考に、必要なモジュール群を読み込んであげましょう。
→basic認証に関してはこんな感じでAuthenticatorクラスを使ってあげてください。javaがわかる人には基本中の基本なのでしょうか。
その他想定どおりに動かない場合は、適宜 System.out.println(); とかでデバッグしましょう。
4.実装〜Arduino編〜
回路図はこちら。
"GND"と"7番ポート(何番でもよい)"に線を挿して、LEDと抵抗を繋いだだけの超単純な回路です。
ON / OFFを切り替えるだけなので、まぁこれで十分ですね。
実行させるコードも至極単純なものです。
[java] const int LED = 7;
int l = LOW;
void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); }
void loop() { if(Serial.available() > 0) { if(Serial.read() > 0) { l = HIGH; }else { l = LOW; } } digitalWrite(LED, l); delay(1000); } [/java]
シリアルポートを読み込み、7番に指定したLEDのON/OFFを切り替えます。
上記のコードをコンパイル→ボードに転送してから前述のProcessingを実行すると、メールの監視を開始することができます。
今回はこれで完成です。簡単ですね。
以上、「シリアルポートを介した外部プログラムとの通信」に特化したArduinoプログラミングを試してみました。アドテク感ゼロの内容でしたが、今回作ったライトが常時点灯することの無いよう安全運転でプラットフォーム開発をしていきましょう。
ちなみにArduinoの魅力は Digital→Real だけでなく Real→Digital が簡単に実現できることにありますので、興味を持った方はぜひセンサーからの外部情報を用いるロジックを組んでみてください。まずは光センサ等の入力をanalogRead()で出力するだけでも、案外楽しかったりします。
当面の目標はArduinoを使って帰宅途中にスマホで部屋の空調をON/OFFするアプリ(これ)を作ることなので、引き続き趣味として色々と遊んでみようと思います。では。
*1:millis()-lastTime)/1000