• 検索結果がありません。

ビルド&実行

− 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の表示を反転させる.

機能4

NCES 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)

まとめ

関連したドキュメント