•
ビルド&実行− do_make.bat/do_run.batでビルドと実行が行える
APPL_DIR += ./Grove_Ultrasonic_Ranger APPL_CXXOBJS += Ultrasonic.o
APPL_COBJS +=
IoTサーバーとの通信
• Wifiモジュールを用いたIoTサーバーとの通信のライブラリとサンプルを用意
− Bluemix
• IBMのサービス,様々な機能があるが使いこなすのは困難
− Milkcocoa
• MQTTによるPUB/SUB通信が可能
− ThingSpeak
• HTTPによるデータのUPと可視化と解析が可能
• Milkcocoaを例に説明
− IoT向けのリアルタイムなデータのやりとりやデータのストア及び可視化を
サポートするクラウドサービス
− PublishするとSubscribeしている機器にデータがブロードキャストされる
− Pub/Subの対象は,app_idとdatasoreで指定
−
データはkeyとvalueで構成されているMilkcocoa_basic
•
サーバー側の設定−
アカウントの作成,作成後app_idが表示される•
プログラム側の設定− ./example/examples_gdef.h にapp_idとデータストアを設定
•
ビルドして実行−
データ受信のみが有効になる− Milkcocoa Testerを使い,プッシュしたデータを
受信することを確認#define MILKCOCOA_APP_ID ""
#define MILKCOCOA_DATASTORE ""
Milkcocoa_basic
• setup()
− Wifiを有効にしてアクセスポイントに接続
−
データ受信時に実行するフック関数を指定• loop()
−
サーバーからのデータをチェックしデータが来ていればフック関数を呼び出す• onpush()
milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush)
milkcocoa.loop(1)
void onpush(DataElement *pelem) { char *data;
if(!pelem->getString("LED", &data)) {
Serial.print("onpush : key LED is not found.");
return;
};
Serial.print("onpush : {LED, ");
Serial.write(data);
Serial.println("}.");
Milkcocoa_basic
• pushのサンプルを実行する
−
マクロの定義を変更する• loop()
− DateElemntにKEYとVALUEをセットしてpush()する
#define MILKCOCOA_PUSH //#define MILKCOCOA_ON
void loop(){
DataElement elem = DataElement();
if(req_led_on) {
elem.setValue("LED", "ON");
}else {
elem.setValue("LED", "OFF");
} do {
push_ret = milkcocoa.push(MILKCOCOA_DATASTORE, &elem);
Zumo
•
タンク型のロボット−
ライントレース,相撲,迷路探索等が可能• Arduino UNO のシールドとして開発されておりライブラリが用意されている
− LED,ブザー,左右モータ,フォトリフレクタアレイ
−
三軸加速度センサ,三軸磁場センサ• Arduino M0 用にライブラリを整備し直した
−
一部ライブラリはUNO(AVR)を前提としていたため•
簡単にロボット制御を体験できる−
プログラム未経験の学部一年生でも理解して作成 できているZumo
• サンプルの一覧
− Basicと同様にマクロでどれかを有効にする
サンプル名 説明
BUTTON_BASIC
ボタンのサンプルMOTOR_BASIC
モーターのサンプルBUZZER_BASIC
ブザーのサンプルGYRO_BASIC
ジャイロによって起動時の方向からの差分を出力するサンプルREFLECTANCE_BASIC
フォトリフレクタアレイの値を出力するサンプルCOMPASS_BASIC
電子コンパスによって向いている方角の角度を表示.キャリブレーション値は固定値
RELECTORNCE_STOP
黒い線を見つけると止まるサンプルROTATIONRESIST
ジャイロを使って常に同じ方向を向くサンプルFORCEUPHILL
加速度センサを使って坂の上を見るサンプルLINEFOLLOWER
ライントレースのサンプルBORDERDETECT
相撲リングから出ないように走るサンプルPIXY + Zumo
• PIXY
−
色認識が可能なカメラモジュール− Arduinoに対して認識した物体の番号(事前に登録する)とサイズと場所を SPI経由で送信する
− SPI経由で2軸のサーボを制御可能
• PIXY + Zumo
−
色付きのボールを認識して追いかけ るロボット− PIXYの認識結果からPIXYのサーボ
とZumoのモータを制御− Wifiモジュールを組み合わせること
により,IoTサービスとの連携も可能NCESCan
NECSCANシールドによりCAN通信を行うサンプル
•
出来ること− CANによるデータの送受信
•
必要なハードウェアとセットアップ− Microchip社 MCP2515 を使用したArduino用シールド
• NCESCANシールド,SparkFun CAN-BUSシールド
• NCESCANシールド
− MCP2515とxbee互換コネクタを持つボード
− xbee互換のESP8266モジュールも開発
−
松浦商事から購入可能NCESCan
• 受信用メールボックス : 2個
− それぞれ2個と4個フィルターを設定可能
− 受信割込みを設定可能
• 送信用メールボックス : 3個
#include <SPI.h>
#include "mcp_can.h"
const int SPI_CS_PIN = 9;
#define CAN_INT_PIN 3
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin void setup()
{
CAN.begin(CAN_500KBPS) //受信用メールボックス設定
CAN.init_Mask(MCP_RXM0, 0x0f);
CAN.init_Filter(MCP_RXF0, 0x01);
CAN.init_Filter(MCP_RXF1, 0x02);
void loop() {
//
受信チェックif(CAN.checkReceive(0) != CAN_NOMSG) { CAN.readMsg(0, &id, &len, buf);
} //
送信CAN.sendMsg(0, ID, LEN, DATA);
}
Arduinoライブラリの移植
•
紹介したサンプルで使用しているライブラリは既存のArduinoライブラリを ベースにR2CA用またはM0用に変更している•
変更点の例− UNO(AVR)用の記述の変更
• AVRのタイマ等を直接使用している場合がある
− Arduinoの機種毎のifdefへの追加
• M0は新しいArduinoなため対応していない場合がある
−
共有リソースの使用をセマフォ等で排他制御を追加• SPI・I2Cはすでにサポートしている
−
割込み禁止許可をASPのAPIに変更•
コアライブラリは置き換えているTOPPERS活用アイデア・アプリケーション開発コンテスト・
貸し出し機材 : NCES IoT Package
• 機材
− Arduino M0
− NCS IoT ボード
− Grove Digital Light Sensor
− Grove OLED Display 0.96
− Grove - Touch Sensor
− Grove - Chainable RGB LED
− Grove – LED
− USBケーブル
NCES IoT Package : サンプルの実行
• R2CAにNCES IoT Package用のサンプルを用意
− example¥NCESIoT_RTOS
• Qiitaに記事をup済み
− Arduino M0 Pro でマルチタスクプログラミング : NCES IoT Base Shield : GROVE・RTOS機能
機能
•
機能1− LEDを1秒周期で点滅する
•
機能2−
周期的にDigital Light センサーの値を読み込んで,値をOLED Display に表示す る.•
機能3− Touch Sensorを押している間は,Light センサーの値の表示の更新を停止して,
OLED Displayの表示を反転させる.
•
機能4NCES IoT Package : ハードウェアセットアップ
• Grove Digital Light
− I2Cポートに接続
• Grove OLED Display
− I2Cポートに接続
• Touch Sensor
− D3に接続
• LED
− D4に接続
• Chainable RGB LED
− D8に接続
NCES IoT Package : プログラム
•
割込みを使用するかマクロで変更可能− //#define USE_INTERRUPT
−
本資料は割込みを使わない例で説明•
タスクの生成−
各機能を1個のタスクで実現するため合計4個のタスクを使用する•
ヘッダのインクルード−
使用するセンサーのライブラリをコピーして,ヘッダファイルをインク ルードする./example/NCESIoT_RTOS/rca_app.h
#define RCA_NUM_TASK 3
./example/NCESIoT_RTOS/rca_app.cpp
#include "rca.h"
#include <Wire.h>
#include <Digital_Light_TSL2561.h>
NCES IoT Package : 機能1の実現
• LEDを1秒周期で点滅する
• LEDを接続しているポートを指定して出力値を変更
#define LED_PIN 4 void setup()
{
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second
digitalWrite(LED_PIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second
}
NCES IoT Package : 機能2の実現
•
周期的にDigital Light センサーの値を読み込んで値をOLED Display に表示する.•
機能3の実現のため− is_update_oledが1の時のみ表示を更新 : 共有メモリによる通信
− OLEDの更新は排他制御を行う : セマフォによる排他制御
int is_update_oled;
void task1_setup() {
Wire.begin();
TSL2561.init();
SeeedOled.init();
SeeedOled.deactivateScroll();
void task1_loop() {
Serial.print("The Light value is: ");
Serial.println(TSL2561.readVisibleLux());
if (is_update_oled == 1) { wai_sem(OLED_SEM);
SeeedOled.clearDisplay();
SeeedOled.putNumber(TSL2561.readVisibleLux());
sig_sem(OLED_SEM);
}
NCES IoT Package : 機能3の実現
• Touch Sensorを押している間はLight センサーの値の表示の更新を停止して,OLED Displayの表示を反転させる.
• OLEDを操作する際にはセマフォを取得
• delay()を入れる
void task2_setup() {
pinMode(TOUCH_PIN, INPUT_PULLUP);
}
void task2_loop() { delay(1);
int TouchSensorValue = digitalRead(TOUCH_PIN);
if(TouchSensorValue==1) { is_update_oled = 0;
wai_sem(OLED_SEM);
SeeedOled.setInverseDisplay();
sig_sem(OLED_SEM);
}else{
is_update_oled = 1;
wai_sem(OLED_SEM);
SeeedOled.setNormalDisplay();
sig_sem(OLED_SEM);
}
NCES IoT Package : 機能4の実現
• Chainable LEDを周期的に色を変更する
•
サンプル通りの動作#define NUM_LEDS 1
ChainableLED leds(8, 9, NUM_LEDS);
void task3_setup() {
leds.init();
}
float hue = 0.0;
boolean up = true;
int count = 0;
void task3_loop() {
for (byte i=0; i<NUM_LEDS; i++) leds.setColorHSB(i, hue, 1.0, 0.5);
delay(50);
if (up)
hue+= 0.025;
else
hue-= 0.025;
if (hue>=1.0 && up) up = false;
else if (hue<=0.0 && !up)
まとめ
ドキュメント内
SpeC記述のC記述への変換 (SpecCによるソフトウェア記述の実装記述への変換)
(ページ 41-61)