GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
GR-CARRYをフルフルしたり、星型タッチセンサーに触るとBLE送信が行われるBLEファームです。
※9月24日版では、フルフルすると加速度センサー、タッチセンサーで温度が送信され、スマホから何か書くとLEDが光るように変更しました。
※9月25日版では、アドバタイズの際のデバイスアドレスをランダムにするよう設定し、またペアリング解除後に再度アドバタイズするようにしました。
メイカソン当日は加速度センサーや温度センサーの値を送信できるようにしたBLEファームをご用意、またはその場でオリジナルなファームを作成できるように準備いたしますが、現時点でお手元のGR-CARRYとお手元のスマホで通信を確認されたい場合にご活用ください。
書き込みに関しては、USBシリアル変換モジュールが必要で、方法についてはこちらのKURUMI用をご参照ください。
メイカソン当日はGADGET LAB.にご用意しており、スタッフも書き込みサポートを行います。
以下、BLEファームのスケッチ部分で、ジーニー藤本がGCCからCA78K0Rに移植してくれたArduinoライクなライブラリでコードを作成しています。
すみません、メールでご案内の通り、Webコンパイラではご用意できませんでしたが、およそのセンシングとBLE通信はすぐにできますので、アイデア実現がスムーズにできればと思います。なお、画像はiPhone用のLight Blueで動作確認用にはすごく役立ちますが、メイカソン当日はNexus7(Android)をご用意しますので、アプリを作成される方はAndroid Studioを事前にインストールしていただけるとありがたいです!
#include "myArduino.h"#include "my_pins_arduino.h"#include "csWire.h"#include "csKX022.h"
extern void g_send_data();
// Pin 11,12,13 are assigned to RGB LEDs.int led_r = 11; // LOW activeint led_g = 12; // LOW activeint led_b = 13; // LOW active
// the setup routine runs once when you press reset:void setup() {
// initialize the digital pin as an output. pinMode(led_r, OUTPUT); pinMode(led_g, OUTPUT); pinMode(led_b, OUTPUT); // turn the LEDs off. digitalWrite(led_r, HIGH); digitalWrite(led_g, HIGH); digitalWrite(led_b, HIGH); // for touch sensing. pinMode(19, OUTPUT); digitalWrite(19, HIGH); digitalWrite(led_g, LOW);
if (initKX022() == true) { } else { digitalWrite(led_r, LOW); while(1); }}
// the loop routine runs over and over again forever:void loop() { float accdata[3]; float fullfull;
readAccelData(accdata); if (accdata[0] < 0) accdata[0] = -accdata[0]; // x if (accdata[1] < 0) accdata[1] = -accdata[1]; // y if (accdata[2] < 0) accdata[2] = -accdata[2]; // z fullfull = accdata[0] + accdata[1] + accdata[2];
if ((fullfull > 2) | (analogRead(A4) < 900)) { //pink digitalWrite(led_r, LOW); digitalWrite(led_g, HIGH); digitalWrite(led_b, LOW); g_send_data(); printf("Temperature = %d\n", getTemperature(TEMP_MODE_CELSIUS));
delay(100); } else { //off digitalWrite(led_r, HIGH); // turn the RED LED off digitalWrite(led_g, HIGH); // turn the GREEN LED off digitalWrite(led_b, HIGH); // turn the BLUE LED off }}
A0やA1に接続された外付のアナログセンサーの値をBLEで送りたいのですが、汎用的な送信ルーチンは準備いただけますか?
例えば、Serial_BLE.print("TEMP="); や Serial_BLE.print(temp); のような...
はい、汎用的なものをご用意します。送受信は以下の4通りをご用意いたします。なお、送信時の受け側のスマホでは単なるバイトの羅列にしか見えないため、例えばキャラコードを送る場合などは意図的にキャラコードであるようなフラグも一緒に送り、スマホ側でフラグを読んで対処する必要があります。それぞれ専用のBLEサービスの特性を用意すればいいと思いますが、それについては今回見送ります。
void bleSendByte(uint8_t data);void bleSendArray(uint8_t* data, uint8_t len);void bleReceiveByte(uint8_t data); ★コールバックvoid bleReceiveWord(uint16_t data); ★コールバック
以下は最新BLEファームのサンプルコードです。
#include "myArduino.h"
#include "my_pins_arduino.h"
#include "csWire.h"
#include "csKX022.h"
// Pin 11,12,13 are assigned to RGB LEDs.
int led_r = 11; // LOW active
int led_g = 12; // LOW active
int led_b = 13; // LOW active
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led_r, OUTPUT);
pinMode(led_g, OUTPUT);
pinMode(led_b, OUTPUT);
// turn the LEDs off.
digitalWrite(led_r, HIGH);
digitalWrite(led_g, HIGH);
digitalWrite(led_b, HIGH);
// for touch sensing.
pinMode(19, OUTPUT);
digitalWrite(19, HIGH);
digitalWrite(led_g, LOW);
if (initKX022() == true) {
} else {
digitalWrite(led_r, LOW);
while(1);
}
// the loop routine runs over and over again forever:
void loop() {
float accdata[3];
float fullfull;
readAccelData(accdata);
if (accdata[0] < 0) accdata[0] = -accdata[0]; // x
if (accdata[1] < 0) accdata[1] = -accdata[1]; // y
if (accdata[2] < 0) accdata[2] = -accdata[2]; // z
fullfull = accdata[0] + accdata[1] + accdata[2];
if (fullfull > 2) {
//pink
digitalWrite(led_b, LOW);
bleSendArray((char*)&accdata, sizeof(accdata));
delay(100);
} else if (analogRead(A4) < 900){
//white
bleSendByte(getTemperature(TEMP_MODE_CELSIUS));
printf("Temperature = %d\n", getTemperature(TEMP_MODE_CELSIUS));
else {
//off
digitalWrite(led_r, HIGH); // turn the RED LED off
digitalWrite(led_g, HIGH); // turn the GREEN LED off
digitalWrite(led_b, HIGH); // turn the BLUE LED off
void bleReceiveByte(uint8_t data){
void bleReceiveWord(uint16_t data){