mbed application board+mbed LPC1768でセンシングとMilkcocoaを有線LANでつなげるメモ

mbedを調べていくにつれてGroveボードだけでなくmbedアプリケーションボードというセンサーがたくさんついて有線LANでネットにもつながる拡張ボードを見つけたのでセンシングを試したりMilkcocoaとつなげてみたりします。

mbed application boardにmbed LPC1768を装着

mbed application boardはこんな感じ。

image

スイッチサイエンスさんのページをみるとこんなのが載っているそうです。

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を装着します。

image

GND・VOUTの表記を合わせると間違いなく装着できます。

image

上手く装着されました。

センシングを試してみる

mbed application boardを選んだのは、実はCookbookも分かりやすかったのも理由です。

mbed application board – Cookbook | mbed

ここを見てみると、

image

とサンプル豊富です。

128×32 LCD

まず、上記リンクの「1. 128×32 LCD」から。ページにあるimageボタンを押して取り込みました。

image

すぐ表示されるので幸先いいですね!徐々にカウントが増えてききます。

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");
    }

}

実際動かしてみましょう。

image

無事表示されました!LCDちゃんと使ったのはじめてですがこれはよい!

ポテンシャルメーター

2つの青いダイヤルがポテンシャルメーターになっていてこれを取得します。

さすがにCookbookにはポテンシャルメーターなかったので

Potentiometer | mbed

からまずソースを拝借しつつ、プログラムを書いてみました。

#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もメーターのように反応します。

image

ポテンシャルメーターを動かすとインタラクティブに反応します!

他にも「2. Joystick」「5. Speaker」「6. 3 Axis Accelerometer」「9. RGB LED」も試してバッチリ動きました。

Milkcocoaも動かしてみる

有線LANも簡単に繋がりそうなので、勝さんの記事、

MilkcocoaSample_Eth – a mercurial repository | mbed

をインポートしてイーサネット版を動かしてみます。

image

image

あっさり動きました!

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);
}

このプログラムを書き込んで、

image

起動します。 Milkcocoa mbed ver demo! と表示されますね!

image

Node-REDで123456789という値を送るノードを書きます。

押してみると、、、

image

無事 display number : 123456789 と表示されました!

最近、IoTのいろいろをやっていると、Groveシステムのように色々付け替えれるようなプロトタイプな形と、このように多数のセンサーがある程度扱いやすくなっていて、ある程度の用途ですぐ先進できるマルチプロトタイプな形も多いので、無事体験できて良かったです。

それでは、よき mbed & Milkcocoa Life を!