Androidのメモとか

ポキオの日記です。今日も遅延してない。

GR-SAKURAを触ってみる話

GR-SAKURAとは

IoTLTでがじぇるね賞をいただきました。

twitter.com

GR-SAKURAとは、ざっくり言うとArduinoのようなマイコンボードです。有線LANが付いていたり、GPIOの数が非常に多いです。桜色の基盤が印象的です。

GR-SAKURA

基本的にはArduinoとあまり変わらない?

GR-SAKURAはArduinoと違って、WEBコンパイラで実装ができます。たしかに便利なんですが、やっぱりローカルにIDEが欲しい。そんな人向けにIDE for GRが用意されています。Mac版もあるので素晴らしいですね。

gadget.renesas.com

とりあえずダウンロード。起動してみると、GUIも桜色。

IDE for GR

IDEの画面は、色味こそ違うものの基本的にはArduinoIDEと同じような感じ。違和感なく使えそうです。

IDE for GR

せっかくなんで何か作ります

余ってた7セグ液晶を光らせるべく、実装してみます。まぁ、ジャンパワイヤで配線するだけでも一苦労・・・。

GR-SAKURA

今回は、便利ライブラリを使わずに、ゴリゴリ実装してみます。

void setup() {
}

void loop() {
  displayNumbers(0, 2,3,4,5,6,7,8,9,10,11,12,13);
}

void displayNumbers(int numbers, int pin1, int pin2, int pin3, int pin4, int pin5, int pin6, int pin7, int pin8, int pin9, int pin10, int pin11, int pin12){
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);
  pinMode(pin5, OUTPUT);
  pinMode(pin6, OUTPUT);
  pinMode(pin7, OUTPUT);
  pinMode(pin8, OUTPUT);
  pinMode(pin9, OUTPUT);
  pinMode(pin10, OUTPUT);
  pinMode(pin11, OUTPUT);
  pinMode(pin12, OUTPUT);

  digitalWrite(pin1, HIGH);
  digitalWrite(pin2, HIGH);
  digitalWrite(pin3, HIGH);
  digitalWrite(pin4, HIGH);
  digitalWrite(pin5, HIGH);
  digitalWrite(pin6, HIGH);
  digitalWrite(pin7, HIGH);
  digitalWrite(pin8, HIGH);
  digitalWrite(pin9, HIGH);
  digitalWrite(pin10, HIGH);
  digitalWrite(pin11, HIGH);
  digitalWrite(pin12, HIGH);

  displayNumber(0,true,pin12,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3);
  displayNumber(0,true,pin9,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3);
  displayNumber(0,true,pin8,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3);
  displayNumber(0,true,pin6,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3);
}

void displayNumber(int number, boolean dot, int com, int a,int b,int c,int d,int e,int f,int g,int dp){
  digitalWrite(com, LOW);
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dp, dot ? HIGH : LOW);

  digitalWrite(com, HIGH);
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dp, HIGH);
}

本当は、任意の数字を表示する実装をしようと思ったんですが、途中で心が折れました。今度、テキトーに修正します。

ちょこっとだけGR-SAKURAを使ってみましたが、Arduinoとあまり変わらない感じが非常にうれしいですね。とくに困ること無く実装できました。まだ、有線LAN関係の実装ができていないので、おいおい実装してみたいと思います。

LINE DEVELOPER DAY 2016に参加してきた

LINE DEVELOPER DAY 2016に行ってきました

LINE DEVELOPER DAY 2016

linedevday.linecorp.com

開催日時 9月29日(木) 10時開場、18時半終了予定 場所 渋谷ヒカリエ9F ヒカリエホール 参加費 無料

去年に引き続きの参加となりました。今回の目玉は何と言ってもLINE NOTIFYとLINE MESSAGING APIではないでしょうか。

聞いた内容を端折ると・・・

LINE DEVELOPER DAY 2016

  • LINEは今年で5周年、230カ国・2億3000万人のユーザーに使われている
  • LINEは先日、上場を果たした(http://www.nikkei.com/article/DGXLASFL28HEH_Y6A920C1000000/)
  • メッセージプラットフォームをベースとして、ゲームや音楽配信などのコンテンツプラットフォームと、決済やMVNOなどのライフインフラプラットフォームを展開している
  • プラットフォームのオープン化に精力的である

LINE DEVELOPER DAY 2016

  • LINE NOTIFYとLINE MESSAGING APIを正式リリースする

  • LINE NOTIFYは無料で外部サービスからLINEメッセージを送ることができる仕組み

  • OAuth2とHTTPSでの通信が基本だが、パーソナルアクセストークンにも対応していて、OAuth2を実装しなくても(たとえばシェルスクリプト)からでもメッセージを送ることができる
  • さらに、IFTTT・マカレル・Githubにも対応し、さまざまなサービスからの通知ができる

  • LINE MESSAGING APIは、いわゆるBOTのプラットフォーム

  • LINE BOTは、以前から一部の提携パートナー(ヤマトなど)で使われていた
  • 今回、そのプラットフォームを一般公開(DEVELOPER TRIALという無料プランもある)、SDKも多くの言語で提供される
  • LINE WEB LOGIN(ユーザー情報管理ができるプラットフォーム)や、LINE BEACON(BLEをつかったビーコンデバイス)をつかって、O2OBOTをつかった、自社ページへのユーザー導入が強化できる

気になったポイント

notify-bot.line.me

  • LINE NOTIFYによって、LINEがSlack的なツールとして使えるようになった
  • Slackでいいじゃん、と思うかもしれないが、非Devユーザーへの通知をSlackで行うのは抵抗があるが、LINEであればそういうユーザーでも使いこなせる
  • IFTTT対応により、MAKE系の工作がかなり捗る。(マイコン→IFTTT MAKER CHANNELS→LINEのような導線が)
  • (たとえばマイコンで家の消費電力を図って、しきい値を超えたらIFTTT経由でLINEに通知するみたいな使い方が簡単にできるようになる)

https://business.line.me/ja/business.line.me

  • LINE MESSAGING APIも一般企業からするとかなり魅力的なのかもしれない
  • コールセンターをこしらえなくても、LINEから時間や場所を気にせずユーザーとのタッチポイントを設けられるのはアツい

その他

入場の管理はQRコードが使われていました。予め、参加登録とLINEアカウントを紐付けておくと、事前にユニークなQRコードが送られてきます。

LINE DEVELOPER DAY 2016

コレを会場にある専用の読取機に読ませて、入場します。

LINE DEVELOPER DAY 2016

LINE DEVELOPER DAY 2016

入場手続きを済ませると、記念品等が窓口でもらえます。

LINE DEVELOPER DAY 2016

記念品は以下の通り。

LINE DEVELOPER DAY 2016

  • ステッカー
  • 食事代(ヒカリエで使える2000円分の商品券)
  • 入場証(記念品?)

LINE DEVELOPER DAY 2016

  • LINE DEV DAY 2016オリジナルLINEスタンプ

LINE DEVELOPER DAY 2016

LINE DEVELOPER DAY 2016

  • サーモタンブラー
  • 木製のデスクトップオーガナイザー
  • ケーブルオーガナイザー
  • BLE BEACON 開発キット

資料

http://www.slideshare.net/linecorp/a-1-opening-introduction http://www.slideshare.net/linecorp/a-2-new-world-by-the-line-bot https://www.slideshare.net/linecorp/a-3-difficult-challenges-that-line-has-overcome http://www.slideshare.net/linecorp/b-1-rinna-and-rinna http://www.slideshare.net/linecorp/a-4-line-login-line-platform http://www.slideshare.net/linecorp/b-2-line-game-cloud-our-personal-ec2 http://www.slideshare.net/linecorp/a-5-security-x-line-platform http://www.slideshare.net/linecorp/b-3-line-bot-live-coding http://www.slideshare.net/linecorp/a-6-group-app-platform https://www.slideshare.net/linecorp/b-4-gravty http://www.slideshare.net/linecorp/a-7-architecture-sustaining-line-live http://www.slideshare.net/linecorp/b-5-stellitequotapply-chromium-opensource-to-line-gamequot http://www.slideshare.net/linecorp/a-8-line-group-call http://www.slideshare.net/linecorp/b-6-new-stream-processing-platformwith-apache-flink http://www.slideshare.net/linecorp/a-9-line-shop-powered-by-armeria http://www.slideshare.net/linecorp/b-7-a-true-agile-team-global-line-news-66467006 http://www.slideshare.net/linecorp/a-10-working-environment-and-culture-for-line-engineers

ESP8266ボードとSDカードモジュールをつかってMicro SDの情報取得と読み書きをしてみる

SDカードモジュールをESP8266ボードに繋ぐ

ESP8266

こんな感じのSDモジュールを使います。

  • CS(⇔ボードのSS(D8)に接続)
  • SCK(⇔ボードのSCK(D5)に接続)
  • MOSI(⇔ボードのMOSI(D7)に接続)
  • MISO(⇔ボードのMISO(D6)に接続)
  • VCC(⇔ボードのVCC(5V)に接続)
  • GND(⇔ボードのGNDに接続)

端子はいわゆるSPIと電源/GND。これらをESP8266の端子につなぎます。CS(ChipSelect)端子は、ボードのSS(SlaveSelect)端子に接続。ジャンパワイヤで繋ぐと、こんな感じでキモくなります。

ESP8266

まずは接続されたSDの情報を引っこ抜いてみる

サンプルコードを参考に、こんな感じのコードを書いてみました。

#include <SPI.h>
#include <SD.h>

int chipSelect = D8;
Sd2Card card;
SdVolume volume;

void setup() {
  Serial.begin(115200);
  Serial.println("");

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("card.init : error");
    return;
  }

  Serial.println("card.init : success");

  if (!volume.init(card)) {
    Serial.println("volume.init : error");
    return;
  }

  Serial.println("volume.init : success");

  uint32_t size;
  size = volume.blocksPerCluster() * volume.clusterCount() * 512;

  Serial.println("size : " + String(size) + " [B]");

  size /= 1024 * 1024;

  Serial.println("size : " + String(size) + " [MB]");
}

void loop() {

}

SDライブラリを使うと簡単に実装できます。実際に、家にあった2GBのMicroSDの情報を読み取ってみました。

ESP8266

card.init : success
volume.init : success
size : 1986297856 [B]
size : 1894 [MB]

キッチリ容量を取得できてます。

次に書き込み

人間、誰しもがSDを見ると何かを書き込みたいという衝動にかられると思います。僕も書き込んでみます。とりあえず意味不明な文字列を書いてみます。

#include <SPI.h>
#include <SD.h>

int chipSelect = D8;
File file;
String testData = "hogehoge.fugafuga";

void setup() {
  Serial.begin(115200);
  Serial.println("");

  if (!SD.begin(chipSelect)) {
    Serial.println("SD.begin : error");
    return;
  }

  Serial.println("SD.begin : success");

  SD.remove("testdata.txt");

  file = SD.open("testdata.txt", FILE_WRITE);

  if (!file) {
    Serial.println("SD.open : error");
    return;
  }

  Serial.println("SD.open : success");

  file.println(testData);
  Serial.println("file.println : " + testData);

  file.close();
  Serial.println("file.close : success");
}

void loop() {

}

で、書いてみました。シリアルモニター的には書けてるとのころ。

ESP8266

SD.begin : success
SD.open : success
file.println : hogehoge.fugafuga
file.close : success

テキストデータを書き込んだSDをMacで読み込んでみると、たしかにファイルができています。

ESP8266

ファイル名は、Arduinoのコード上では全て小文字のtestdata.txtとしていたはずですが、Mac上で見るとTESTDATA.TXTという感じですべて大文字になっています。そして、ファイル作成日時も2000年の元日になっています。

ESP8266

ファイルを開くと、たしかに書き込めています。こちらは小文字のままでした。

最後に読み込み

やっぱり書けたら読みたくなるのが性というもの。

#include <SPI.h>
#include <SD.h>

int chipSelect = D8;
File file;
String testData = "hogehoge.fugafuga";

void setup() {
  Serial.begin(115200);
  Serial.println("");

  if (!SD.begin(chipSelect)) {
    Serial.println("SD.begin : error");
    return;
  }

  Serial.println("SD.begin : success");

  file = SD.open("testdata.txt", FILE_READ);

  if (!file) {
    Serial.println("SD.open : error");
    return;
  }

  Serial.println("SD.open : success");
  
  String str = "";

  while (file.available()) {
    str += (char)file.read();
  }

  Serial.println("file.read : " + str);

  file.close();
  Serial.println("file.close : success");
}

void loop() {

}

Stringのまま読む方法が分からず、Char1文字ずつ読み込んで、Stringにappendしています。他にいい方法があれば教えてください。

ESP8266

SD.begin : success
SD.open : success
file.read : hogehoge.fugafuga

file.close : success

取り敢えず読めてそうです。

ESP8266で自宅での電力消費量を測ってみようと思った(パート4)

ESP8266のDeepSleepに対応する電源を探す

前回。 relativelayout.hatenablog.com

ESP8266

ESP8266の目玉であるDeepSleepモード。低消費電力で処理をサスペンドできる。それは良いのだが、あまりにも低消費電力というのが仇となり、最近のモバイルバッテリーでは給電が止まってしまう。

本当はCheeroさんがだしているIoT機器対応のモバイルバッテリーを使えば良いのだが、もしかしたら手持ちのモバイルバッテリーでも対応しているものが有るかもしれない。そういうことで、家中のモバイルバッテリーを試してみた。

ESP8266対応のモバイルバッテリーはこれだ!

まずは前回のエネループ。単3のエネループを2本使うタイプ。意外と単3×2だと心もとないような。

SANYO eneloop USB出力付ハンディ電源(単3形2個セット) KBC-D1BS

SANYO eneloop USB出力付ハンディ電源(単3形2個セット) KBC-D1BS

  • 発売日: 2010/10/21
  • メディア: エレクトロニクス

次に、ソニーのモバイルバッテリー(2台!)。意外と使えました。ただし、容量に関しては一昔前ということもあり少々少なめ。もしかしたら経年劣化で若干ヘタってるかもしれませんが。。。

ソニー バッテリー内蔵型USB ACチャージャー AC-UP100

ソニー バッテリー内蔵型USB ACチャージャー AC-UP100

  • 発売日: 2011/02/10
  • メディア: Personal Computers

どのくらい耐久性が有るか実験

SONY

前回作成した、1分おきに配電盤から消費電流を測るガジェットを使って、バッテリーがどのくらい持つか確認しました。

SANYO eneloop USB出力付ハンディ電源(単3形2個セット) KBC-D1BS ソニー バッテリー内蔵型USB ACチャージャー AC-UP100 SONY スマートフォン用USB出力(2口)機能付 ポータブル電源(高容量リチウムイオン) CP-A2LS
40時間 29.5時間 63.5時間

まぁ、こんなもんでしょうか。どれも数日程度持ちそうということがわかりました。ただ、配電盤監視という用途を考えると、1週間くらい持って欲しい気はしなくもないですが、そこはロジック自体見直しが必要かもしれません。

IoT縛りの勉強会! IoTLT vol.19 @ 三菱総研で登壇してきました

IoTLTとは

iotlt.connpass.com https://codeiq.jp/magazine/2016/03/38409/codeiq.jp

名前の通りIoT関係のLT大会です。去年初めて参加させて頂いた時は若干のむさ苦しさを感じましたが、最近の会はとにかく女性が多い印象。そんなIoTLTで、人生初のLTでの登壇をさせていただきました。

まずは腹ごしらえ

いきなりステーキ

同期といきなりステーキ@新橋。腹が減っては戦はできぬとか言いますよね。すばらしいUXです。何も飲んでませんよ。

いざ溜池山王

twitter.com

とにかく溜池山王ダンジョン怖い。アレは駅ではない、地獄である。ただ、歩いているOLは品川より確実にキラキラしていた。間違いない。

三菱総研

そしてついに三菱総研到着。首相官邸の裏側なんですね・・・マジ東京。いや、実は受付票を印刷していったんですよ。

twitter.com

間違えてA3に印刷しちゃったんですが。全く使うこと無くゲストカードをもらうというアレ。

三菱総研

意外とスーツ姿の人が多くて焦る。そして意外と静か。焦る。

いざLT

三菱総研

初めてのLTなのでかなり緊張しましたが、なんとか喋ってきました。京急は神的存在なんだということは周知できたと思います。

twitter.com

そして、なんと、がじぇるね賞も頂けました!ありがとうございます。またLTをしにお伺いいたしますのでよろしくお願いします。

ポストモーテム

  • 予めプロジェクターの接続確認を行えたのは良かった(常識ですが)
  • 発表時間を守れなかった、今後はきっちり守っていきたい
  • 意外と下品な話題もイケるということが分かった(ダメ)
  • 京急の認知度が低いということが分かった
  • LTするためだけにラップトップを持っていくのがだるい
  • 東京遠い

ESP8266で自宅での電力消費量を測ってみようと思った(パート3)

前回。

relativelayout.hatenablog.com

まずはIFTTT MAKERチャネルの登録

IFTTT

前回までに、任意のタイミングで配電盤を流れる電流値(っぽい値)を測定することができました。せっかく測定した値をそのままにしておくのはもったいなかったので、まずはIFTTTを使ってGoogle DriveのSpreadsheetsに値をアップするようにしました。

コードは後ほど載せますが、あるURLにJSONをHTTP POSTすると、それがトリガーになり、任意のアクションを割り当てることができます。

Google Drive

Google Drive上で、取得できた値を整形すると、こんな感じでグラフ化できます(手動ですが)。とりあえず1日の消費電流量の遷移を見ることができました。

問題は電源

ESP8266

ここまではいい感じに実装を進めてきたのですが、ここで問題が。配電盤の近くにコンセントがなく、ESP8266ボードの電源をどうするのかという問題が。最近のモバイルバッテリーは、電力の出力先の負荷があまりにも低くなると、給電を止めてしまう賢い(賢くない)機能があるので使えず。悩んだ挙句、ちょっと前に使ってた、エネループ(単3×2)をUSBの5Vに昇圧してくれるデバイスを使うことに。

SANYO eneloop USB出力付ハンディ電源(単3形2個セット) KBC-D1BS

これだと給電が止まることが無くいい感じに動作。

さらなる問題

このエネループ、あんまり電池が持たず・・・。ESP8266のDEEP SLEEPを使っているものの、半日持たないというポンコツっぷり。悔しいので以下の仕様変更を敢行。

  • LEDは常時消灯
  • 30秒間隔での測定→1分間隔に
  • 休止中は今までどおりDEEP SLEEPを活用

すると、40時間ほどエネループが持つようになりました。ただ、逆にまだ40時間ほどしか持ちません。1分おきに測定をしていますが、その度にAPに接続するのがダメなのかも・・・。

クソコード

こんな感じです。 MAKERチャネルは、JSONにデータを一気に3つまで詰め込むことができるようです。が、今は1つしか詰めていません。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

char ssid[] = "XXXXXXXX";
char password[] = "xxxxxxxx";

char host[] = "maker.ifttt.com";
char url[] = "/trigger/xxxx/with/key/xxxxxx";
int port = 80;

void setup() {
  Serial.begin(115200);
  Serial.println("");
}

void loop() {
  connectWifi();
  httpPostJson(getCurrent());

  ESP.deepSleep(60 * 1000 * 1000, WAKE_RF_DEFAULT);

  delay(1000);
}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("connected!");
}

double getCurrent() {
  Serial.println("get current...");
  long total = 0.0;
  int sample = 1000;

  for (int i = 0; i < sample; i++) {
    int sensorValue = analogRead(A0);
    float voltage = sensorValue * (3.2 / 1023.0);
    int voltageInt = voltage * 100;
    int current = (voltageInt - 158) * 30;
    total += current * current;
  }

  float result = total / sample / 10000.0;

  return sqrt(result);
}

void httpPostJson(double data) {
  WiFiClient wifiClient;
  String json = "{\"value1\":\"" + String(data) + "\"}";


  if (!wifiClient.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }

  Serial.println("http post...");
  wifiClient.println(String("POST ")  + url + " HTTP/1.1");
  wifiClient.println(String("Host: ") + host);
  wifiClient.println("Cache-Control: no-cache");
  wifiClient.println("Content-Type: application/JSON");
  wifiClient.print("Content-Length: ");
  wifiClient.println(json.length());
  wifiClient.println();
  wifiClient.println(json);
}

Learning Esp8266: Build the Internet of Things With the Arduino Ide and Raspberry Pi

ESP8266で自宅での電力消費量を測ってみようと思った(パート2)

前回。

relativelayout.hatenablog.com

二乗平均平方根を使うことにしました

クランプ式電流センサで得られる電圧を、前回は一定サンプルの総和をサンプル数で割っていましたが、二乗平均平方根を使う世の中の流れに身を任せてみようと思います。(要は理論がわかっていない)

void setup() {
  Serial.begin(115200);
}

void loop() {
  long total = 0.0;
  int sample = 1000;

  for (int i = 0; i < sample; i++) {
    int sensorValue = analogRead(A0);
    float voltage = sensorValue * (3.2 / 1023.0);
    int voltageInt = voltage * 100;
    int current = (voltageInt - 158) * 30;
    total += current * current;
  }

  float result = total / sample / 10000.0;
  Serial.println(sqrt(result));
}

電圧を100倍して、Integerに丸めて、それの2乗の総和をサンプル数で割ってルートを取っています。もうよくわからないです。力率とかなんなんですかね。もう知らないです。

コーディングの妥当性を検証する

先に言っておくと、完全に言い訳ですが、なんとなく電流の使用量の遷移が見える化できればいいので、精度とかそういうのは求めていません。が、ちゃんと実際の値と大きなズレがないか確認します。

はんだごて

今回はもうどうにでもなって構わないハンダゴテを使って見ます。

はんだごて

100Vで30W、めんどくさいことを抜きに、単純計算で0.3A。電源コードを割いて、片方にセンサーを噛まして、流れている電流を測ってみます。

はんだごて

こんな感じ。そして、実行結果をシリアルモニターで見てみると・・・

シリアルモニター

0.25A・・・(真顔) 微妙にずれてますが、もう知りません。

念の為に、配電盤でもチェック。

配電盤

こんな感じにつないで、いつも家で使っている電気ケトルをOFF→ON→OFFしてみました。

ティファール 電気ケトル 「アプレシア プラス」 コンパクトモデル メタリックノワール 0.8L BI805D70

定格消費電力は1250W。単純計算で12.5A。さぁ、シリアルモニターはどうなったかというと・・・

シリアルモニター

大体、2.85→14.27。11.42Aか・・・ 微妙にずれてますが、もう知りません。 (大切なことなので2回言いました)

こんな感じですが、今後も粛々と実装を進めます。

Learning Esp8266: Build the Internet of Things With the Arduino Ide and Raspberry Pi

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。