mbedを調べていくにつれてGroveボードだけでなくmbedアプリケーションボードというセンサーがたくさんついて有線LANでネットにもつながる拡張ボードを見つけたのでセンシングを試したりMilkcocoaとつなげてみたりします。
mbed application boardにmbed LPC1768を装着
mbed application boardはこんな感じ。
スイッチサイエンスさんのページをみるとこんなのが載っているそうです。
mbed LPC1768用2列ピンソケット 128 x 32グラフィックLCD, SPIインターフェース 三軸加速度センサ, +/- 1.5g, I2Cインターフェース 温度センサ, I2Cインターフェース 5方向ナビゲーションスイッチ(サムジョイスティック) 2 x ポテンショメータ(アナログ入力) RGB LED(PWM 出力) ミニチュアスピーカー(PWM出力) Xbee/Zigbeeモジュール用ピンソケット 2 x 3.5mm オーディオジャック(アナログ入出力) Mini-USBコネクタ(キーボード,マウス, MIDI) USB-Aコネクタ(Flash drive, Bluetooth) USBホスト/デバイス切り替えスイッチ RJ-45イーサネットコネクタ 1.3 mm 6~9 VDCジャック(USB-AやServo用ヘッダーに電源供給)mbed LPC1768用2
6,480円とちょっとお高いですが、この拡張ボードでハンダ付けなしでセンシング出来ると思えば結構アリなんじゃないかなと思います。
mbed LPC1768を装着します。
GND・VOUTの表記を合わせると間違いなく装着できます。
上手く装着されました。
センシングを試してみる
mbed application boardを選んだのは、実はCookbookも分かりやすかったのも理由です。
mbed application board – Cookbook | mbed
ここを見てみると、
とサンプル豊富です。
128×32 LCD
まず、上記リンクの「1. 128×32 LCD」から。ページにあるボタンを押して取り込みました。
すぐ表示されるので幸先いいですね!徐々にカウントが増えてききます。
mbedのオンラインコンパイラでおこなうので、Arduino IDE的な初動の「このライブラリ動くのかな…」的な不安な感じがゼロなのが良いです。
つづいて「11. LM75B Temperature sensor」で温度が読めたので、ちょっと追加実装をして先ほどのLCDに表示させました。
#include "mbed.h" #include "LM75B.h" #include "C12832.h" C12832 lcd(p5, p7, p6, p8, p11); LM75B sensor(p28,p27); Serial pc(USBTX,USBRX); int main () { //Try to open the LM75B if (sensor.open()) { printf("Device detected!\n"); while (1) { lcd.cls(); lcd.locate(0,3); lcd.printf("Temp = %.3f\n", (float)sensor); wait(1.0); } } else { error("Device not detected!\n"); } }
実際動かしてみましょう。
無事表示されました!LCDちゃんと使ったのはじめてですがこれはよい!
ポテンシャルメーター
2つの青いダイヤルがポテンシャルメーターになっていてこれを取得します。
さすがにCookbookにはポテンシャルメーターなかったので
からまずソースを拝借しつつ、プログラムを書いてみました。
#include "mbed.h" #include "C12832.h" DigitalOut _led1(LED1); DigitalOut _led2(LED2); DigitalOut _led3(LED3); DigitalOut _led4(LED4); AnalogIn pot1(p19); AnalogIn pot2(p20); C12832 lcd(p5, p7, p6, p8, p11); void PrintLCD(float v1,float v2){ lcd.locate(0,3); lcd.printf("pot1 value : %f",v1); lcd.locate(0,15); lcd.printf("pot2 value : %f",v2); } void PrintLEDGraph(float value){ _led1 = (value >= 0.2) ? 1 : 0; _led2 = (value >= 0.4) ? 1 : 0; _led3 = (value >= 0.6) ? 1 : 0; _led4 = (value >= 0.8) ? 1 : 0; } int main() { float v1; float v2; lcd.cls(); while(1) { v1 = pot1; v2 = pot2; PrintLEDGraph(v1); PrintLCD(v1,v2); wait(0.1); } }
LCDに文字を表示しつつ、ポテンシャルメーター1(p19)は4つのLEDもメーターのように反応します。
ポテンシャルメーターを動かすとインタラクティブに反応します!
他にも「2. Joystick」「5. Speaker」「6. 3 Axis Accelerometer」「9. RGB LED」も試してバッチリ動きました。
Milkcocoaも動かしてみる
有線LANも簡単に繋がりそうなので、勝さんの記事、
MilkcocoaSample_Eth – a mercurial repository | mbed
をインポートしてイーサネット版を動かしてみます。
あっさり動きました!
Milkcocoaに文字も送ってみる
せっかくLCDがあるので文字を送ってみましょう。
LCD用の表示プログラムと、データを mbed_send という名前で受けて、JSONの値も d にします。
#include "mbed.h" #include "MQTTEthernet.h" #include "MQTTClient.h" #include "Milkcocoa.h" #include "MClient.h" // LCD #include "C12832.h" C12832 lcd(p5, p7, p6, p8, p11); // The default setting is for the Simple IoT Board(mbed LPC1114FN28) // Please change to fit the platform Serial pc(USBTX, USBRX); DigitalOut myled(LED1); /************************* Your Milkcocoa Setup *********************************/ #define MILKCOCOA_APP_ID "MILKCOCOA_APP_ID " #define MILKCOCOA_DATASTORE "mbed" #define MILKCOCOA_DATASTORE_SEND "mbed_send" /************* Milkcocoa Setup (you don't need to change this!) ******************/ #define MILKCOCOA_SERVERPORT 1883 /************ Global State (you don't need to change this!) ******************/ const char MQTT_SERVER[] = MILKCOCOA_APP_ID ".mlkcca.com"; const char MQTT_CLIENTID[] = __TIME__ MILKCOCOA_APP_ID; extern void onpush(MQTT::MessageData& md); int main() { // void setup() { pc.baud(9600); MQTTEthernet *ipstack = new MQTTEthernet(); MClient *client = new MClient(ipstack); Milkcocoa *milkcocoa = new Milkcocoa(client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID); pc.printf("Milkcocoa mbed ver demo\n\r\n\r\n\r"); // LCD lcd.cls(); lcd.locate(0,3); lcd.printf("Milkcocoa mbed ver demo!"); milkcocoa->connect(); pc.printf("\n\rEther connected\n\r"); pc.printf("connect : %d\n\r",milkcocoa->on(MILKCOCOA_DATASTORE_SEND, "push", onpush)); // } while(1) { // void loop() { milkcocoa->loop(); pc.printf("loop\n\r"); DataElement elem = DataElement(); elem.setValue("v",rand()); elem.setValue("r",rand()); milkcocoa->push(MILKCOCOA_DATASTORE, elem); wait(7.0); } } void onpush(MQTT::MessageData& md) { MQTT::Message &message = md.message; DataElement de = DataElement((char*)message.payload); pc.printf("onpush\n\r"); pc.printf("%d\n\r",de.getInt("d")); int d = de.getInt("d"); lcd.locate(0,15); lcd.printf("display number : %d",d); wait(1.0); }
このプログラムを書き込んで、
起動します。 Milkcocoa mbed ver demo! と表示されますね!
Node-REDで123456789という値を送るノードを書きます。
押してみると、、、
無事 display number : 123456789 と表示されました!
最近、IoTのいろいろをやっていると、Groveシステムのように色々付け替えれるようなプロトタイプな形と、このように多数のセンサーがある程度扱いやすくなっていて、ある程度の用途ですぐ先進できるマルチプロトタイプな形も多いので、無事体験できて良かったです。
それでは、よき mbed & Milkcocoa Life を!