Hatena::ブログ(Diary)

滴了庵日録 このページをアンテナに追加 RSSフィード

2016/06/24(Fri)

BLE NanoのSerialクラスのバグ回避

BLE Nanombedで使う場合、シリアルポート(TXD=D1, RXD=D0)を使うとD2とD3のポートが機能しなくなるという不具合があります。たとえば、D3にLEDをとりつけて下記のプログラムを実行するとLEDが点滅するはずですが、実際には点滅してくれません。

#include "mbed.h"

Serial pc(USBTX, USBRX); // USBTX == D1, USBRX == D0
DigitalOut led(D3);

int main(void)
{
    pc.baud(115200);
    led = 0;
     
    while (true) {
        pc.printf("hoge\r\n");
        led = 1 - led;
        wait(1);
    }
}

これは、Serial pc(USBTX, USBRX) を宣言した時点で、D2がCTS、D3がRTSに割り当たってしまうためです。そこでフロー制御を無効にする下記のコードを加えてみましたが、「そんなメソッド無いです」という趣旨のコンパイルエラーが出ました。

    pc.set_flow_control(Serial::Disabled);

ライブラリのバグっぽいので、ライブラリを修正すべくソースを追ってみましたが、泥沼にはまってしまいました。結局、バッドノウハウになってしまいますが、下記のようにすれば解決しました。

// (1) #include "mbed.h" の前にこの定数を定義する
#define DEVICE_SERIAL_FC 1
#include "mbed.h"

// (2) Serial::set_flow_controlを実装する
void SerialBase::set_flow_control(Flow type, PinName flow1, PinName flow2) {
    FlowControl flow_type = (FlowControl)type;
    switch(type) {
        case RTS:
            serial_set_flow_control(&_serial, flow_type, flow1, NC);
            break;

        case CTS:
            serial_set_flow_control(&_serial, flow_type, NC, flow1);
            break;

        case RTSCTS:
        case Disabled:
            serial_set_flow_control(&_serial, flow_type, flow1, flow2);
            break;

        default:
            break;
    }
}

Serial pc(USBTX, USBRX);
DigitalOut led(P0_8);

int main(void)
{
    // (3) フロー制御を無効にする
    pc.set_flow_control(Serial::Disabled);
    
    pc.baud(115200);
    led = 0;
     
    while (true) {
        pc.printf("hoge\r\n");
        led = 1 - led;
        wait(1);
    }
}

2016/06/23(Thu)

iOSアプリ公開手順メモ

Androidアプリに比べて手続きが面倒なので手順をメモ。

前提

  • アプリは開発済み
  • Apple ID は持ってる(私用とは別の開発用IDが吉?)
  • 登録処理には Safari を使うこと (Chromeだと正常動作しない)

概要

  1. Apple Developer Programに登録 (ショバ代を払う)
  2. Certificateファイルの作成 (開発者と開発用Macを紐づけた証明書)
  3. Provisioning Profileファイルの作成 (証明書とアプリの紐づけ)
  4. iTunesで新規Appの作成・必要事項の入力
  5. アプリのリリースビルドアップロード
  6. 提出

Apple Developer Programに登録 (ショバ代を払う)

  • Apple Developer Programに登録する。年間 11,800円払う。
  • 名前は正式な氏名で登録。
  • ふだん私用しているApple IDとは別のIDを使ったほうが良い?(単に日本語の文字化け等の問題?)

Certificateファイルの作成 (開発者と開発用Macを紐づけた証明書)

  1. 開発用Macで、アプリケーション>ユーティリティー>キーチェーンアクセス.appを起動
  2. 認証局に証明書を要求…」を選択し、証明書署名要求ファイルを作成
    • 「ユーザーのメールアドレス」を入力
    • 「通称」には「iOSアプリのリリース用」的なこと
    • CAのメールアドレス」は空欄
    • 「要求の処理は」は「ディスクに保存」
  3. Apple Developer の「Certificates」>「Production」で「+」
  4. App Store and Ad Hoc」を選択
  5. 「Upload CSR file」で上記の証明書署名要求ファイルをアップロード
  6. Certificateファイル(*.cer)をダウンロードする
  7. Certificateファイルをダブルクリックしてキーチェーンに追加

Provisioning Profileの作成 (証明書とアプリの紐づけ)

  1. Apple Developer の「Provisioning Profiles」>「Distribution」で「+」
  2. 「Distribution」の「App Store」を選択
  3. 「App ID」でリリースしたいアプリのIDを選択
  4. 「Certificate」で上記のCertificateファイルを選択
  5. Provisioning Profileファイル(*.mobileprovision)をダウンロードする
  6. Provisioning ProfileファイルをダブルクリックしてXcodeインストール

iTunesに新規Appの作成

  1. iTunes Connectの「マイ App」で「+」
    • 「新規 App」を選択
    • バンドルID」はリリースするアプリの逆ドメイン、例えば「net.lipoyang.gppropo」
    • 「SKU」は任意の在庫管理IDなので適当に。バンドルIDと同じでもOK
  2. 「App 情報」の入力
  3. 「価格および配信状況」の入力
  4. 「iOS App 1.0」の入力

アプリのリリースビルドとアップロード

  1. Xcodeでアプリのプロジェクトを開く
  2. General>Identity>Bundle Identifier がiTunes Connect>App 情報>バンドルIDと一致しているか確認
  3. Build Settings>Code Signing>Code Signing Identity>ReleaseでiPhone Distributionを選択
  4. Build Settings>Code Signing>Code Signing Identity>Provisioning Profileで「iOSTeam Provisioning Profile:」でないプロファイルを選択
  5. Product>Archiveでリリースビルド
  6. ビルドが成功すると、Archives一覧ウインドウが出るので、「Upload to App Store」
    • 適切な「Provisioning Team」を選択
    • 確認画面で「Upload」
  7. iTunes Connectに戻り、App 情報>バイナリ で ビルドを選択して「終了」

提出

  1. 「審査に提出」する
  2. 「輸出コンプライアンス」「コンテンツ配信権」「広告ID」について回答する
  3. 送信」する。アプリのステータスが「審査待ち」になる。

参考URL

2016/06/13(Mon)

スクリーンショットの撮り方

ふだん使わないMaciOSのことはすぐに忘れてしまうので、いざというときにイラッとする。

Windows

  • 画面全体:PrtSc (ただしキーボードによってPrtScがFn+何かだったり)
  • ウィンドウ:Alt+PrtSc
  • クリップボードに画像がコピーされるのでペイントなどに貼りつける
  • Dropboxを使っていると、「スクリーンショット」フォルダに画像ファイルができる

Mac

  • 画面全体:Shift+Command+3
  • 選択範囲:Shift+Command+4
  • ウィンドウ:Shift+Command+4→Space
  • 画像ファイルはデスクトップにできる

Android

  • 電源ボタンと音量ダウンボタンを同時長押し
    • Xperiaシリーズの一部:電源ボタンの長押しからスクリーンショットを選択
    • GALAXYシリーズの一部:電源ボタンとホームボタンの同時長押し
  • 画像ファイルは Pictures/Screenshots フォルダにできる

iOS

  • 電源ボタンを押しながらホームボタンを短押し
  • または、ホームボタンを押しながら電源ボタンを短押し
  • 画像ファイルは DCIM フォルダにできる
  • Xcodeシミュレータの場合、Command+Sでデスクトップに画像ファイルができる

Ubuntu

  • 画面全体:PrtSc
  • 選択範囲:Shift+PrtSc
  • ウィンドウ:Alt+PrtSc (ただし環境によって効かない場合あり)
  • 保存先は実行時に選択できる
  • コンソールからgnome-screenshotコマンドでも実行できる
gnome-screenshot #画面全体
gnome-screenshot --area #選択範囲
gnome-screenshot --window --delay=5 #5秒後の選択ウィンドウ

2016/06/08(Wed)

パワポにソースコードを貼り付ける

  1. 以下のいずれかの方法で、ソースをお好みにハイライト表示させる。
  2. パワポに「元の書式を保持」でコピペする。

Macで隠しファイルを表示する

ターミナル(Finder>アプリケーション>ユーティリティ)で、下記を実行

defaults write com.apple.finder AppleShowAllFiles TRUE

非表示に戻すには、

defaults write com.apple.finder AppleShowAllFiles FALSE

2016/04/08(Fri)

歩くミニ四駆をWebからコントロール

Webブラウザからインターネット経由で歩くミニ四駆をコントロールできるようにしてみました。

Web系・クラウド系はまったくの未経験なので、お手軽に使えるともっぱらの噂のMilkcocoaを使うことにしました。GPduinoにはBLEしか通信機能がないので、Android端末を介してネットワークに接続しています。

D


先日の大阪版IoT縛りの勉強会!IoTLT大阪 Vol.2で発表してきました。


送信側 (Webブラウザアプリ/JavaScript)

HTMLUIを記述し、milkcocoa.js と アプリのスクリプト(ここではcontroller.js)を読み込みます。

<script src='https://cdn.mlkcca.com/v2.0.0/milkcocoa.js'></script>
<script src="controller.js"></script>

スクリプトはいたって簡単です。

  1. MilkCocoaのオブジェクトを生成する
  2. データストアのオブジェクトを生成する
  3. ボタンが押されたらデータをsendする

これだけです。

window.onload = function(){
  var buttonUp    = document.getElementById('up');
  (中略)
  var milkcocoa = new MilkCocoa("アプリのID.mlkcca.com");
  var ds = milkcocoa.dataStore('gpduino');
  (中略)
  buttonUp.onclick = function() {
    (中略)
    ds.send({direction: 'up'});
    (後略)

つまらないものですが、ソースを置いておきます。使うときはアプリのIDを書き換えてください。

ソース


受信側 (Androidアプリ/Java)

KonashiのSDKを使う都合上、WebアプリではなくJavaのネイティブアプリで実装しました。

JavaでMilkcocoaにアクセスするためにMilkcocoa SDK for Androidを利用します。こちらからダウンロードします。


GitHubにもあがっていますが、2016年4月日現在、メンテが滞っており最新版ではないようです。こちらを使うとsendのイベントリスナーでヌルポインタ例外が発生します。かならず、上記のページからダウンロードしてください。


とりあえず、使うクラスは4つだけ。

import com.mlkcca.client.DataElement;
import com.mlkcca.client.DataStore;
import com.mlkcca.client.MilkCocoa;
import com.mlkcca.client.DataStoreEventListener;

public class MilkKoshianUI extends ActionBarActivity implements View.OnClickListener, DataStoreEventListener {
  private MilkCocoa m_milkcocoa;
  private DataStore m_dataStore;

はじめに以下の処理をします。

  1. MilkCocoaのオブジェクトを生成する
  2. データストアのオブジェクトを生成する
  3. イベントリスナーを登録する
  4. sendを監視する
  (中略)
  public void onCreate(Bundle savedInstanceState) {
       (中略)
    m_milkcocoa = new MilkCocoa("アプリのID.mlkcca.com");
    m_dataStore = m_milkcocoa.dataStore("gpduino");
    m_dataStore.addDataStoreEventListener(this);
    m_dataStore.on("send");
  }

そして、sendがあったらデータを取り出します。あとはBLEでミニ四駆に送信するだけです。

  public void onSended(DataElement dataElement) {
        
    String direction =
      dataElement.getValue("direction");
    (後略)
  }

こちらもソースを置いておきます。使うときはアプリのIDを書き換えてください。

ソース