工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

カテゴリ:11.電子工作(IoT) > 11.0 その他

概要

Google HomeとIFTTTとIRKitで家電操作ができるか試し、無事動作することを確認した。


背景と目的

先日発売されたばかりのGoogle Homeを入手したが、残念ながら私の家には対応家電が1つもない。しかし、私の家にはIRKitがあり家電操作ができるようになっている。そこで、Google Homeの音声コマンドを活用し、家電操作をできるようにしてみる。


詳細

0.方法の検討

  • Google Homeは、IFTTTのGoogle Assistantチャンネルと連携し、音声コマンドをIFTTTのトリガとして利用できる
  • IRKitは、インターネット経由で赤外線発信を制御できる(IRKit Internet HTTP API)
  • IFTTTには、任意のURLにWebhookを送信するWebhookチャンネル(これは、少し前までMakerというチャンネルのアクションだった気がするが・・・名前変わった???)がある

したがって、

  • Google Assistantチャンネルをトリガーとし、音声コマンドでトリガーが発行されるように設定する
  • Webhookチャンネルをアクションとし、IRKit Internet HTTP APIにWebhookを送信する

となるAppletを作れば、家電操作ができそうだ。


1.IFTTTの設定

1.1 Google Assistantチャンネル

トリガーとしてGoogle Assistantチャンネルのトリガのうち、今回は一番左の"say a simple phrase"を選択する。

20171008134847

そして、下図のように音声コマンドと、応答音声、言語の設定をしてCreate triggerを押せば、設定完了。

20171008134836

1.2 Webhookチャンネル

次に、アクションとしてWebhookチャンネルのMake a web requestを選ぶ。

20171008135300

今回は、操作対象をテレビの電源とするため、あらかじめ読み取り済みのコード情報をBodyとして設定。なお、Content-TypeやBodyの記入の仕方はこちらを参照するとよい。

request


2.動作テスト

Google Homeに対して、"OK Google,テレビを消して"と呼びかけたところ、"わかりました"と応答音声が発せられ、テレビの電源が消えた!ちゃんと動いた!


まとめ

とりあえず自前の環境で既存の家電操作ができるようになった。今後、Googleから赤外線リモコンを学習できるデバイスも発売されるとのことだが、まずはこんな感じで音声操作ができることが確かめられてよかった。

概要

Windows10 PCで、iBeaconを受信するプログラムを作成し、動作することを確認した。


背景と目的

Windows8以降で、BLEに対応しているようなのだが、今までBLEを扱うWindowsプログラムを全く作ってこなかったので、一度手をつけてみたい。とりあえず、iBeaconを受信するプログラムを作成し、動作することを確認してみる。


詳細

0.環境

  • Windows10
  • Lenovo Idea Pad Yoga 13
  • Visual Studio 2017 Community
  • Visual C#を使用


1.参考サイト

Web上を探し回ったところ、こちらが非常によくまとまっていたので、参考にさせていただいた。


2.コーディング

2.0 Visual Studio

20170716201704

20170716201715

2.1 Windows.winmd参照の追加

まず、以下のファイルをメニューバー>プロジェクト>参照の追加で、参照ボタンから追加。(これは、参考サイトには詳しく書いてなかったが、こちらを参考にさせてもらった。)

  • C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.15063.0\Windows.winmd

これで、冒頭のusing Windows.Devices.***が、読み込める。


2.2 コード

プログラムは、C#で作成する。コードは、実は参考サイトそのまま。なので、詳細は割愛。ただし、アドバタイズメント受信時のイベントOnAdvertisementReceivedを、参考サイトにあるように、privateのインスタンスメソッドとして定義すると、Mainのwatcher.Received += OnAdvertisementReceived;でエラー。なので、staticに修正。(静的メソッドからインスタンスメソッドが参照できるわけないので、当たり前ですね。)

        // アドバタイズメント受信時
        // staticで定義する
        private static void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
        {
                :
        }

3.動作確認

上記のプログラムを実行したのが、以下。使用したiBeaconは、手元にあったMamorio。アドバタイズの頻度が低いせいか30秒に一度程度だが、ちゃんと検出されている

20170717003026


まとめ

Windows10 PCで、iBeaconの検出ができた。とりあえず、開発環境は手に入ったので、今後はBLEデバイスとの通信などにも手を伸ばしていきたい。

概要

LINE Bot APIの使ってLINEからメッセージを送ることで自宅のエアコンの電源を入れられるようにするシステムを試作した。

キーワード : LINE Bot API, AWS, Lambda, API Gateway

背景と目的

LINE Bot APIというものに興味がわいた。しかし、実際に使ってみないとよくわからないので、試しに使い方を調べ、せっかくなので以前作成したスマホからエアコンの電源を操作するシステムと連携させてみる。

詳細

1.LINE Bot APIについて知る

Web上でいろいろ情報を漁った結果、こちらにあるとおり、>>あなたのサービスとLINEユーザーの双方向コミュニケーションを可能にする機能<<とのこと。最低限使用するためには、

  • LINE Business CenterでMessaging APIを利用するビジネスアカウントを作成
  • 自分のシステムにLINEサーバからのWebhookを受け取るWebエンドポイントを用意
  • Webhookを受け取ったときの動作を自分のシステム上に実装

という感じだ。というわけで、以下順を追ってやってみる。

2.システムの実装

2.1 Messaging APIを使うためのアカウントを作成

アカウント作成手順の詳細いは、こちらなどが詳しいので、それを参照するとして、最終的に以下のように

  • Channel Secret
  • Channel Access Token
  • QR code

が見られるDeveloperのページまで無事たどり着いた。

ここで、スマホのLINEの友達追加でQR codeを読み取りこのアカウントと友達になった。

Developer

図2.1 Developerページ

2.2 AWS側にWebエンドポイントを用意

次に、先ほど作ったアカウントから、Webhookを受け取るためのエンドポイントを用意する。今回は、以前作成したエアコンの電源操作システムに、API Gatewayを使っているので、そこにリソースを追加した。設定は、

  • メソッドはPOST
  • 統合リクエスト
    • 統合タイプはLambda関数(対象は2.3で作成する関数)
    • マッピングテンプレートは特に設定なし
  • 統合レスポンス、メソッドレスポンス、メソッドリクエストはデフォルトのまま

とした。そして、このAPIのデプロイされたURLを、以下のように2.1でたどり着いた画面のWebhook URLに入力する。VERIFYボタンを押して、API GatewayのログがCloud Watch等で残っていれば、ちゃんと呼び出されたことが確認できる。(2.3のLambda関数を実装してからのほうがわかりやすいが)

Developer2

図2.2 Webhook用URLを記入

2.3 Webhook受信時の処理を実装

Lambda関数の実装を行う。Webhookを受信すると、eventという引数に呼び出し元のデータ(LINEアプリから送信したテキストなど)が入ってくる。今回は、送信されたテキストが、

  • "電源入れて"だったら、"入れました"と返答し、エアコンの電源を入れる
  • "電源切って"だったら、"切りました"と返答し、エアコンの電源を切る
  • それ以外は、"ごめんなさい。を返答する

を実装してみた。エアコン操作部分は、以前作成したLambda関数があるので今回はそちらを呼び出すだけとする。

受け取る引数のjsonの構造は、APIのドキュメント等があるので詳細は割愛するが、基本的な流れは、入ってきたメッセージを解析して、リプライ用のAPIを叩くというだけだ。(メッセージの解析とリプライ文章作成をAIのようなもので実装すれば、はやりのAIチャットボットみたいなものができるはず。)

なお、LINE Bot APIには、Python向けのSDKが用意されているが今回はAPIドキュメント通りに実装してもそんなに大変でなかったので使わなかった。(これは状況に応じて使えばよいのだろう)

# coding: utf-8

import urllib2
import json

def lambda_handler(event, context):

    for ev in event["events"]:
        
        # メッセージ解析
        message = ev["message"]["text"]
        if message in u"電源入れて":
            t = u"入れました"
        elif message in u"電源切って":
            t = u"切りました"
        else:
            t = u"ごめんなさい。わかりません。"
    
        # リプライ用APIを叩く
        url = "https://api.line.me/v2/bot/message/reply"
        headers = {
            "Content-type": "application/json",
            "Authorization": "Bearer {Channel Access Token}"
        }
        body = {
            "replyToken": ev["replyToken"],
            "messages": [
                {
                    "type": "text",
                    "text": t
                }
            ]
        }
        req = urllib2.Request(url, data=json.dumps(body), headers=headers)
        resp = urllib2.urlopen(req)
        print resp.read()
        
        # エアコン操作用の関数呼び出し
        # 詳細は省略
        :

3.動作確認

というわけで、早速LINE上からメッセージを送ってみたところ、無事電源の操作ができた。また、LINE上に返信が来た!

IMG_3436

図3 LINE上でメッセージのやり取りがなされた様子

まとめ

LINE Bot APIを使って自分の作ったWebシステムと連携させることができた。今回は、エアコン操作というIoT的なものをやってみたが、これ以外にもいろいろアイディアが思いつきそうなので、思いついたら適宜試してみたい。

概要

GROVEの電流センサを使って、交流電流を測定してみた。

背景と目的

AC100Vの電子機器の使用履歴を取得する手段として、電流センサを使って消費電流を測るという方法が、Web上でよく見つかる。そこで、消費電流の測定をしてみる。

詳細

1.交流電流を測るための電流センサ

交流電流を測るには、カレントトランスという部品を使う。いくつか候補があったが、入手性を考慮し、GROVE電流センサにした。図1.1がGROVE電流センサ。私はマルツパーツで700円くらいで入手。

これは、二次側巻き線に800Ωの抵抗がついているので、出力電圧を読めばよい。

IMG_3424

図1 GROVE電流センサ

2.センサの装着

図2がセンサを付けた様子。手元にあったテーブルタップをばらし、コードの片方をカレントトランスの穴に通した。

IMG_3425

図2 センサを装着した様子

3.電流をお試し測定

今回は、17.5Wのはんだごての電源を入れているときの波形をオシロスコープで観測してみた。17.5Wのはんだごてなので、消費電流は175mAとなるはず。センサ出力波形は図3。かなり、波形が歪んでいる。これはトランスの歪かな?

まず、電圧の実効値は、およそ65mV。これが800Ωの抵抗の両端にかかっているから、二次側電流は65mV / 800Ω=0.08mA。コイルの巻き数比が2000:1なので、一次側電流はこの2000倍で、160mA。約10%誤差はあるが、まずまず。

20170309225939

図3 電流波形

まとめ

GROVEの電流センサを使って、交流電流を測定することができた。

概要

 当初の目的であるエアコンの電源を出先のスマホから操作可能となり、システムが完成した。


背景と目的

 前回までで、AWS上のLambdaからRaspberry Piへトピックをパブリッシュしてエアコンの電源を操作することができた。今回は、いよいよスマートフォン等から操作可能にし、システムを完成させる。


詳細

1.方法

 システムを完成させるには、

  • AWSのAPI Gatewayにて、操作情報を受け取りとLambdaの駆動をするWebエンドポイントを用意する
  • スマホ側の操作インターフェースとして、電源ボタン操作インターフェースとWebエンドポイントへの操作情報を送信機能を持つWebアプリを作成する

 が必要。それぞれ順にやっていく。

2.Webエンドポイントの作成

 API Gatewayにて、POSTメソッドを用意し、統合タイプを前回作成したLambda関数呼び出しとする。パラメータは、何でもよいが、Webアプリ側の実装が簡単なJSONでの受け渡しになるようにした。

3.操作用Webアプリ

 図3.1、3.2のように、電源ボタンの図をタップすると、ON/OFFが切り替わり、それに応じて2で作成したエンドポイントへリクエストを送るようになっている。

IMG_3363

 図3.1 OFF状態

IMG_3368

 図3.2 ON状態

4.動作確認

 最後に、動作確認を行った。スマホで、操作用Webアプリを開き、電源ボタンを押したところ、1秒程度で無事エアコンの電源が入った!結構素早い動きで驚いた。


 以上で、エアコンの電源をインターネット経由で操作することができるようになった。作業に要したのはおよそ2日だったが、出来上がったときはさすがにちょっと感動した。作ってよかった。

概要

 Raspberry PiがAWSから操作情報を受け取るためのプログラムの実装と、LambdaからRaspberry PiでON/OFF操作情報を送信するテストを行った。


背景と目的

 前回までで、疑似赤外線リモコンが完成した。今回は、Rapsberry PiがAWSから操作情報を受け取って疑似赤外線リモコンへ送信指示を出せるようにする。


詳細

1.方法

 AWSとRaspberry Piを連携させるには、AWS IoTを使う。操作情報を含むトピックをRaspberry Piがサブスクライブすればよさそう。

2.AWS IoTのコンソールでデバイスの作成

 デバイス作成は、AWS IoT上のコンソールのウイザードに従ってやった。コンソールのconnectから、Configuring a deviceのGet startedをクリックし、プラットフォームとSDKを選択する。プラットフォームはRaspbianなのでLinuxを選択。SDKは、いつの間にやらPythonができているのでPythonを選択。

SDK選択
図2.2 プラットフォームとSDKの画面

 次に、Thingの名前を決めてNext Stepに進むと、Download connect kitというものダウンロードボタンが現れるので、ダウンロード。

connection_kit
図2.3 connect kitのダウンロード画面

 次に、コマンドの指示がでるので、ダウンロードしたzipファイルをFTPでRaspberry Piに転送し、コマンドを実行。Start.shがうまく動けば、以下のようにコンソールに表示が出る。同時に、図2.5のようにAWSのコンソールにも表示が出る。

test
図2.4 コマンドを実行させた様子

command2
図2.5 通信がうまくいってるときのコンソール

 ここまでで、Raspberry PiとAWS IoTの接続ができた。

3.Raspberry Piで、トピックをサブスクライブする

 以下のリンク等を参考に、トピックをサブスクライブするためのコードを作成。

 最初、END_POINTというパラメータは何を指定すればいいか分からなかったが、こちらを見て、InteractのHTTPSという欄にあるRest API EndpointでOKだということが分かった。

# Import SDK packages
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

CLIENT_ID = "Thing名"
END_POINT = "xxx.iot.リージョン名.amazonaws.com"
PATH_CA = "配置先ディレクトリ/root-CA.crt"
PATH_KEY = "配置先ディレクトリ/Thing名.private.key"
PATH_CRT = "配置先ディレクトリ/Thing名.cert.pem"

# For certificate based connection
myMQTTClient = AWSIoTMQTTClient(CLIENT_ID)

# Configurations
myMQTTClient.configureEndpoint(END_POINT, 8883)
myMQTTClient.configureCredentials(PATH_CA, PATH_KEY, PATH_CRT)

# 接続
myMQTTClient.connect()

# サブスクライブ開始
myMQTTClient.subscribe("$aws/things/Thing名/shadow/update", 0, subscribe_callback)

# 受信待ち
while True:
    time.sleep(1)

 そして、subscribeメソッドの引数に渡したコールバック関数は、トピックが到着したときの処理を書けばよい。ここでは、詳細は省略するが、到着したペイロードの中に、ON/OFF操作情報があるとして、それに応じてGPIO18にパルスを送るようにしている。

def subscribe_callback(client, userdata, message):
    # データを受け取る
    payload = json.loads(message.payload)
    # payloadの内容に応じて、GPIO18にパルスを送る
    :
    :
4.Lambdaによる確認

 最後に、LambdaでAWS IoTのThing Shadowに、トピックをパブリッシュしてみた。実装は、boto3を使った。参考になったサイトは以下。payloadという辞書に、送信したいデータを入れる。

# coding: utf-8
import boto3
import json

iot = boto3.client("iot-data", リージョン名)

def lambda_handler(event, context):

    # 送信データを作成
    payload = {
        "state": {
            "desired": {
                キー : 値,
                :
            },
            "reported": {
                キー : 値,
                :
            }
        }
    }
    
    # パブリッシュする
    iot.publish(
        topic='$aws/things/Thing名/shadow/update',
        qos=0,
        payload=json.dumps(payload)
    )

    # TODO implement
    return {}

 この結果、正しくトピックが受信され、無事エアコンがON/OFFできた!

 というわけで、AWS IoTとRaspberry Piが接続され、操作情報を載せたトピックをパブリッシュすればエアコンの電源がON/OFFできるところまできた。次回は、最終段階であるAPI Gateway⇒Lambda部分を構築し、スマホの操作を完成させる。

概要

 疑似赤外線リモコンのソフトウェアコーディングと動作確認を行った。


背景と目的

 前回に続き、疑似赤外線リモコンのソフトウェアコーディングと動作確認を行う。


詳細

1.概要
  • TrinketというArduino互換マイコンを使い、GPIOから赤外LEDを駆動する。そのため、コーディングはArduino言語。Arduino開発環境セットアップは、以前行ったのでOK。
  • 私の家のエアコンのリモコンコードは、手持ちの赤外線リモコン受信モジュールとオシロスコープを使って調べたところ、家電協会フォーマットのようだ。(フォーマットは、こちらが詳しい。)
2.疑似赤外線リモコン ソフトウェアのコーディング

 まず、38kHzのサブキャリアとなるパルスを出力する関数。

// 38kHz, デューティ1/3のパルスを出力
// delayMicrosecondsの精度がいまいちなので26usになっていない
void output_pulse(){

  digitalWrite(PIN_DRIVE, HIGH);
  delayMicroseconds(4);
  digitalWrite(PIN_DRIVE, LOW);
  delayMicroseconds(7);
  
}

 次に、データ1ビット分を出力する関数。

// データビット1つを出力する
void output_databit(int high_or_low){

  int i;

  // HIGH期間
  for (i = 0; i < DATABIT_PULSE_COUNT; i++){
    output_pulse();
  }

  // LOW期間
  if(high_or_low){
    delayMicroseconds(DATABIT_PULSE_T * DATABIT_PULSE_COUNT * 3); // 3周期
  } else {
    delayMicroseconds(DATABIT_PULSE_T * DATABIT_PULSE_COUNT); // 1周期
  }
  
}

 リモコンコード先頭のリーダー部を出力する関数。

// リーダーを出力
void output_leader(){

  int i;
  
  // HIGH期間
  for (i = 0; i < DATABIT_PULSE_COUNT * 8; i++){
    output_pulse(); // 8周期 * 8T
  }

  // LOW期間
  delayMicroseconds(DATABIT_PULSE_T * DATABIT_PULSE_COUNT * 4); // 4T
}

 1バイト分のデータを出力する関数。

// データを出力
void output_data(byte databits, int bits_len){

  // 上位ビットからbits_len個を出力
  int i;
  for (i = 0; i < bits_len; i++){
    int x = (databits & B10000000) >> 7; // 最上位を取り出す
    output_databit(x);
    databits = databits << 1; // 1ビットシフト
  }
  
}

 リモコンコード1フレーム分を出力する関数。

// フレームを出力
// customercode = { 上位8bit, 下位8bit };
// parity = パリティ4bit + 0000;
// data_bytes = { data0, data1, ... };
void output_aeha_frame(byte customercode[], byte parity, byte data_bytes[], int data_len){

  int i, k;

  // リーダー
  output_leader();

  // カスタマーコード
  output_data(customercode[0], 8);
  output_data(customercode[1], 8);
  
  // パリティ
  output_data(parity, 4);

  // データ
  for(i = 0; i < data_len; i++){
    if (i == 0){
      k = 4;
    } else {
      k = 8;
    }
    output_data(data_bytes[i], k);
  }

  // ストップビット
  output_data(B10000000, 1);
  
}

 入力を検出する関数が以下。これは、Raspberry Piからの送信指示がGPIO#0に来たかを検出する。パルス幅5msecならON、パルス幅10msecならOFF、それ以外は無視という単純な送信指示パルスなので、ノイズによる誤動作もなくはないが、問題になったら改めるとして、とりあえずこれにする。

// 入力を検出
// 戻り値 : ONのときは1, OFFのときは0, 検出なしは-1
int detect_input(){

  int pw;
  int result;

  // いきなりHIGHのときは検出なし
  if (digitalRead(PIN_INPUT) == HIGH){
    return -1;
  }

  // 開始検出
  while (digitalRead(PIN_INPUT) == LOW) {
    delay(1);
  }

  // パルス幅をカウント
  int i;
  pw = 0;
  for(i = 0; i < 15; i++){
    if(digitalRead(PIN_INPUT) == HIGH) {
      pw += 1;  
    }
    delay(2);
  }
  if(4 <= pw && pw <= 6) {
    result = 1; // 5msecのときON
  } else if (9 <= pw && pw <= 11){
    result = 0; // 10msecのときOFF
  }
  
  return result;
  
}

 定数と初期設定たち。

const int DATABIT_PULSE_T = 26; // 26us
const int DATABIT_PULSE_COUNT = 15; // 26us*15周期
const int PIN_DRIVE = 1; // LED駆動
const int PIN_INPUT = 0; // 送信指示信号入力

// 送信データ
byte CC_FUJITSU[] = { B00101000, B11000110 }; // カスタマーコード
byte data_on[] = { B00000000, B00001000, B00001000, B01111111, B10010000, B00001100, B10000010, B00100000, B00000000, B00000000, B00000000, B00000000, B00000100, B11010110 };
byte data_off[] = { B00000000, B00001000, B00001000, B01000000, B10111111 };

boolean on_off = true;
 
// the setup routine runs once when you press reset:
void setup() {
  pinMode(PIN_DRIVE, OUTPUT);
  pinMode(PIN_INPUT, INPUT);
}

 メインのループ

// the loop routine runs over and over again forever:
void loop() {

  int input;

  // 入力検出
  input = detect_input();
  if (input == 1) {
    output_aeha_frame(CC_FUJITSU, B00000000, data_on, 14);
  } else if (input == 0){
    output_aeha_frame(CC_FUJITSU, B00000000, data_off, 5);
  } else {
    delay(100);
  }
  
}
3.動作確認

 動作確認は、Raspberry PiのGPIO18から送信指示のパルスを出力することで行った。
その結果、送信指示を受け取り正しいリモコンコードが発出され、エアコンの電源がON/OFFできた。

 ということで、リモコン部分は完成。次は、AWS側の設計・製作に入る。


概要

 エアコンの電源を出先のスマホから操作するためのシステム構想とハードウェア製作を行った。


背景と目的

 私の家のエアコンは、オンタイマーが30分刻みでしかセットできない。なので、何か解決案はないかといろいろ考えを巡らせるうちに、インターネット経由で電源をON/OFFできるようにしたくなった。そこで、まずシステム構想とハードウェア部の製作を行う。


詳細

1.システム構想

 今回は、手持ちのラズベリーパイと、アカウントがあるAmazon Web Service(以下、AWS)とを使ってシステムを構成した。ポイントを書き出すと、以下の感じ。

  • エアコンの操作は、疑似赤外線リモコンでリモコンコードを送信することで行う
  • ラズベリーパイでAWS側からエアコン操作情報を取得し、それに基づき疑似赤外線リモコンに送信指示を出す
  • AWSでは、Webエンドポイントを用意し、リクエストに応じてAWS IoTを経由してラズベリーパイに操作情報を与える
  • スマートフォン等にて、WebエンドポイントにアクセスできるようにWebサイトを用意しておく
システム図
図1 システム構成図

2.疑似赤外線リモコン ハードウェアの設計・製作

 疑似赤外線リモコンは、以前遊んだTrinket(Arduino互換マイコン)と赤外LEDを使って構成する。また、リモコンに対する送信指示をRaspberry Piから出すようにした。Trinketを併用する理由は、Raspberry PiのGPIOではリモコンコードの再現に必要な時間精度を出すのが難しいから。

回路
図2.1 回路図

 また、回路への実装パターンは図2.2のような感じ。

回路パターン
図2.2 回路パターン図

 製作した疑似赤外線リモコン部は以下。そこそこ小さく作れた。

IMG_3362
図2.3 疑似赤外線リモコン部

 というわけで、ハードウェアは完成。次は、Trinketで、リモコンコードを出力するためのソフトウェアを書く。


概要

 ついに、発注した基板が製造され、手元に届いた。動作チェックをして問題ないことを確認した。


背景と目的

 前回発注した基板が製造され、ついに手元に届いた。動作チェックをしてちゃんと使えるか確認する。


詳細

1.ついに到着

 発注したのは、12月4日。届いたのが、12月21日。というわけで、2週間以上かかったが、もともと2週間~3週間と言われていたので予定通りと言えるだろう。届いた基板は以下の写真の通り。外観は、おかしな点はなさそうだ。

IMG_3223
図1.1 基板(部品面)

IMG_3224
図1.2 基板(半田面)

2.パターンチェック

 チェックといっても、私は基板の専門知識がないので、見た目とテスターで導通をチェックするだけだ。
基板が小規模なので、ほとんどの部分がテスターでチェックできた。間違いなく設計通りである。
しかし、実はねじ穴周りのベタGNDが逃げていない設計ミスがあり、見事にそのまま出来上がってしまった。まあ、自分のミスなのでしょうがない。

3.実装して動かしてみる

 部品を実装してみた様子が図3。ちょっと部品交換したりして汚いが、動作はOKだ。
写真では、マイクで音を拾うとビーコン信号が発信されるようにしてある。

IMG_3222
図3 実装した様子

4.まとめ

 以上、設計通り問題なく動く基板ができた。
実は、この話を知り合いの回路設計エンジニアにしたところ、料金が安すぎてやばいんじゃないか?と、かなり強い疑いの視線を向けられたが、そんな心配も吹き飛ばされた。
というわけで、これからの工作でどんどん使っていけそうだ。(趣味の範囲では十分OKということで)


まとめと今後の課題

 スイッチサイエンスの基板製造サービスを使って、無事基板を作ることができた。料金が安いので趣味の工作でどんどん使っていけると思う。

概要

 小型BLE開発ボードBLE NanoをArduinoでプログラム開発し、動作を確認した。


背景と目的

 今まで、私は、Arduino+BLEモジュール(例えば、Arduino Nanoと浅草ギ研のBLE Serial2)という組み合わせでBLEデバイスを作って遊んだりしてきたが、この2つが一緒になっているものがあればもっと簡単に作れるのではないかと考えていたのだが、スイッチサイエンスで売っているRedBearLab BLE Nanoというものがまさにそのようなものであることがわかった。そこで、このデバイスをBLEデバイスとして動かしてみる。


詳細

1.概要

 今回やることの全体の流れを書き出すと、以下のような感じ。

  • 購入と外観の確認
  • ドライバのセットアップ
  • Arduino IDEでのボードのセットアップ
  • Lチカ
  • iBeaconとして動作させてみる
2.詳細
2.0 購入と外観の確認

 購入は、スイッチサイエンスから。
書き込みボードとセットになっているキットを購入。図2.0にあるように、非常に小さい。※購入後、実験用にいろいろ線出しした。なお、ハードウェアの情報はこちらにまとまっている。

IMG_3195
図2.0 BLE Nano キット

2.1 ドライバのセットアップ

 基本的な手順は、こちらの参考サイトが詳しいので、これに従った。
まず、いきなりPCのUSB端子に挿してみたところ、図2.11のようにドライバがインストールされた。(PCはWindows7を使用)しかし、mbedのシリアルポートドライバだけがインストールできなかった。そこで、参考サイトの指示に従い、こちらからドライバをダウンロードしてインストールした。

図2.11 USB端子に挿した時

2.2 Arduino IDEでボードのセットアップ

 Aruduino IDEで、新しいボードを使用する場合はだいたいお決まりの手順ではあるが、

  • メニューバー>ファイル>環境設定>Additional Boards Manager URLsにhttps://redbearlab.github.io/arduino/package_redbearlab_index.jsonを追加
  • Menu: Tools -> Board -> Boards Managerで、RedBear nRF51822 Boardsをインストール
  • メニューバー>ツール>ボード>BLE Nano(v1.5)を選択

 である。これで、セットアップは完了。

環境設定
図2.21 URLの追加

ボードマネージャー
図2.22 ボードマネージャー

ボードの選択
図2.23 ボードの選択

2.3 Lチカ

 とりあえず、動くか確認するため、Lチカ。コードは以下。難なく動いた。素晴らしい。ただし、ボード搭載のLEDは、裏側についているので非常に確認しづらい。

const int LED_BUILTIN = 13;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}
2.4 iBeaconとして動かす

 次は、せっかくなのでBLEデバイスとして動かしたいのだが、簡単な例としてiBeaconとして動かすサンプルを見つけて使ってみた。これは、Arduino IDEで、メニューバー>ファイル>BLE Exsamplesにある。UUID、Major、Minorはいい加減だが、iPhoneのiBeacon検出アプリでちゃんと検出された!ApplixのMB005が無くなってしまった今、簡単かつ自由度高くビーコン応用機器を作るなら、これがいいかもしれない。

#include <BLE_API.h>

BLEDevice ble;

const static uint8_t beaconPayload[] = {
  0x4C,0x00,                                                                       // Company Identifier Code = Apple
  0x02,                                                                            // Type = iBeacon
  0x15,                                                                            // Following data length
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Beacon UUID
  0x00,0x0F,                                                                       // Major
  0x00,0x0F,                                                                       // Minor
  0xC5                                                                             // Measure Power
};

void setup() {
  // put your setup code here, to run once
  // close peripheral power
  NRF_POWER->DCDCEN = 0x00000001;
  NRF_TIMER1->POWER = 0;
  NRF_TIMER2->POWER = 0;
  NRF_UART0->POWER  = 0;

  
  
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
  
  ble.init(); 
  // set advertisement
  ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
  ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, beaconPayload, sizeof(beaconPayload));
  // set advertise type  
  //  ADV_CONNECTABLE_UNDIRECTED
  //  ADV_CONNECTABLE_DIRECTED
  //  ADV_SCANNABLE_UNDIRECTED
  //  ADV_NON_CONNECTABLE_UNDIRECTED
  ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
  // 100ms; in multiples of 0.625ms
  ble.setAdvertisingInterval(160); 
  // set adv_timeout, in seconds
  ble.setAdvertisingTimeout(0);
  // start advertising
  ble.startAdvertising();
}

void loop() {
  // put your main code here, to run repeatedly:
  ble.waitForEvent();

  
}

まとめと今後の課題

 BLE Nanoが動かせるようになった。次は、センサをつないでセンサ値をBLEで飛ばしたり、周りからコントロールできるようにしてみたい。

このページのトップヘ