わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

CBCentralManagerクラスリファレンス、日本語訳

これは、Apple社のCBCentralManagerクラスドキュメント http://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CBCentralManager_Class/から、CoreBluetooth開発の理解に必要最低限の情報を日本語に意訳したものです。

プロパティ

@property(assign, nonatomic) id delegate;

セントラル・マネージャのイベントを受け取るデリゲートを設定します。

@property(readonly) CBCentralManagerState state;

セントラル・マネージャの状態を表します。セントラル・マネージャをインスタンスしたときは初期値CBCentralStateUnknownです。この値が変化した瞬間に、デリゲートのコールバック - (void)centralManagerDidUpdateState:(CBCentralManager *)central が呼ばれます。

CBCentralManagerState列挙型は、以下の値を取ります。

1
2
3
4
5
6
7
8
typedef NS_ENUM(NSInteger, CBCentralManagerState) {
CBCentralManagerStateUnknown = 0,
CBCentralManagerStateResetting,
CBCentralManagerStateUnsupported,
CBCentralManagerStateUnauthorized,
CBCentralManagerStatePoweredOff,
CBCentralManagerStatePoweredOn
};
  • CBCentralManagerStateUnknown = 0,
    • 初期値です。すぐに更新されます。
  • CBCentralManagerStateResetting,
    • システムサービスとの接続が一時的に失なわれました。すぐに更新されます。
  • CBCentralManagerStateUnsupported,
    • Bluetooth Low EnergyのCentral/Clientをサポートしていません。
  • CBCentralManagerStateUnauthorized,
    • このアプリケーションは、Bluetooth Low EnergyのCentral/Client使う認可がありません。
  • CBCentralManagerStatePoweredOff,
    • Bluetoothがオフになっています。
  • CBCentralManagerStatePoweredOn
    • Bluetoothがオンで、かつ、いま利用できます。

インスタンスメソッド

- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;

ペリフェラルへの、ペンディング状態もしくは接続している接続を、キャンセルします。

connectPeripheral:options:
Establish a connection to the peripheral.

- (void)connectPeripheral:(CBPeripheral )peripheral options:(NSDictionary )options;

ペリフェラルへの接続を確立します。引数optionsで接続のオプションを指定出来ます。
CBConnectPeripheralOptionNotifyOnIiscoonectionKey を参照してください。

このメソッドはタイムアウトをしません。ペンディングされた接続をキャンセルするには、cancelPeripheralConnections: を使います。

- (CBCentralManager *)initWithDelegate:(id)delegate queue:(dispatch_queue_t)queue;

指定したデリゲートとディスパッチキューで、セントラルマネージャを初期化します。

  • queue
    • イベントを処理するキューを指定します。nilならばメインキューがデフォルトでつかわれます。

- (void)retrieveConnectedPeripherals;

システムに今在接続しているペリフェラルの一覧を取得するようにセントラルに問い合わせます。
問い合わせ結果はデリゲートを通して通知されます。

- (void)retrievePeripherals:(NSArray *)peripheralUUIDs;

UUIDで指定したペリフェラルの一覧をセントラルに問い合わせます。

  • peripheralUUIDs
    • 取得するCBPeripheralの CFUUIDRef のリスト。

問い合わせ結果はデリゲートを通して通知されます。

- (void)scanForPeripheralsWithServices:(NSArray )serviceUUIDs options:(NSDictionary )options;

セントラルにペリフェラルのスキャンを要求します。

  • serviceUUIDs
    • アプリケーションが興味があるサービスの CBUUIDs の配列。
  • options
    • スキャンを指定するオプションを指定した辞書。 CBCentralManagerScanOptionAllowDuplicatesKey を参照。

ペリフェラルそれぞれを発見する都度、デリゲートのコールバックが呼ばれます。”serviceUUIDs”でCBUUIDの配列が指定されている場合は、セントラルはそのサービス、もしくはそれらのサービスをアドバタイズしているペリフェラルのみを返します(推奨)。
“seriviceUUIDs”がnilの場合は、発見したすべてのペリフェラルを返します(非推奨)。
セントラルが、すでに異なるパラメータでスキャンしている場合は、指定したパラメータがそれを置換します。

- (void)stopScan;

セントラルにペリフェラルのスキャンを停止するよう問い合わせます。

定数

CBCentralManagerScanOptionAllowDuplicatesKey

このキーにはNSNumber(Boolean)の値が対応します。値がYESのとき、
ペリフェラルのスキャンで、重複したデバイスをフィルタリングをしません。デフォルトでは、同じペリフェラルを複数回発見したときは、1回の発見イベントに集約します。このフィルタリングを無効にすると、バッテリーの稼働時間に不利な影響をもたらすかもしれませんから、必要なときにだけ利用します。

scanForPeripheralsWithServices:options: を参照してください。

CBConnectPeripheralOptionNotifyOnConnectionKey

iOS6から有効です。

このキーには、NSNumber(Boolean)の値が対応します。値は、アプリケーションがサスペンドしている時に、
あるペリフェラルとの接続が確立したならば、
それをシステムがアラート表示すべきことを示します。

この設定は、アプリケーションが
bluetooth-central バックグラウンド・モード
を指定していないために、アプリケーションが自分でアラート表示できないときに便利です。

あるペリフェラルに対して、2つ以上のアプリケーションがこの通知を要求していたならば、フォアグラウンドで最も最近に要求をしたアプリケーションが、通知を受け取ります。

CBConnectPeripheralOptionNotifyOnDisconnectionKey

このキーには、NSNumber(Boolean)の値が対応します。この値は、アプリがサスペンドしている時に、
あるペリフェラルが切断したならば、それをシステムがアラート表示すべきことを示します。

この設定は、アプリケーションが
bluetooth-central バックグラウンド・モード
を指定していないために、アプリケーションが自分でアラート表示できないときに便利です。

あるペリフェラルに対して、2つ以上のアプリケーションがこの通知を要求していたならば、フォアグラウンドで最も最近に要求をしたアプリケーションが、通知を受け取ります。

CBConnectPeripheralOptionNotifyOnNotificationKey

このキーには、NSNumber(Boolean)の値が対応します。この値は、アプリがサスペンドしている時に、
あるペリフェラルから受信したすべてののティフィケーション(ここでのノティフィケーションは、iOSのそれではなく、Bluetooth Low Energyの規格でいうノティフィケーションを示す)に対して、
それをシステムがアラート表示すべきことを示します。

この設定は、アプリケーションが
bluetooth-central バックグラウンド・モード
を指定していないために、アプリケーションが自分でアラート表示できないときに便利です。

あるペリフェラルに対して、2つ以上のアプリケーションがこの通知を要求していたならば、フォアグラウンドで最も最近に要求をしたアプリケーションが、通知を受け取ります。

Macbook Airにお茶をこぼす前にできること

Macbook Airにお茶をこぼす前に、できることがあるのではと思ったので、写真をとってみた。

まず危険な状態。
手を前後に動かす、その動線上にお湯のみがあり、さらに、お湯のみが机の端に近いので、お湯のみを床に落として割る可能性も高い。

危険な状態:

  • お湯のみのお茶をMacbook Airにこぼす
  • お湯のみを床に落として割る

原因:

  • お湯のみが机の上に置いてある
  • 手の動線上にお湯のみがある

そもそも、開発しながらお茶を飲まない、お湯のみを机に置かない、という根本的な原因の取り除きもあるけれども、それは行き過ぎると、極端な話、死ぬ可能性があるから生きるのをやめる、になるので、ここではそこまでは問わない。

左上にお湯のみを移動した。動線にひっかからないので、トラブルは解消できそうだが、右利きなので、左にあるお湯のみまで手を伸ばすのが不便だ。

右上にお湯のみを移動した。動線は、あまり、ひっかからないだろう。左に置くよりもちょっと危険だが、お湯のみに手を伸ばすのは便利がいい。お湯のみの位置は、こうすることにした。

UTF-8なURLを書くとOctpressのページ生成で例外が発生する

本文にURLを入れていると http://tmpurl.com/何か のように、リンク先URLにUTF-8の文字が入っていると、rake generate してもページ生成に失敗します。その時のエラーメッセージは:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
unchanged sass/screen.scss
/usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/maruku-0.6.0/lib/maruku/input/parse_doc.rb:22:in `<top (required)>': iconv will be deprecated in the future, use String#encode instead.
Configuration from ~/_config.yml
Building site: source -> public
~/plugins/raw.rb:11:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
from ~/plugins/raw.rb:11:in `unwrap'
from ~/plugins/octopress_filters.rb:18:in `post_filter'
from ~/plugins/octopress_filters.rb:33:in `post_render'
from ~/plugins/post_filters.rb:124:in `block in post_render'
from ~/plugins/post_filters.rb:123:in `each'
from ~/plugins/post_filters.rb:123:in `post_render'
from ~/plugins/post_filters.rb:151:in `transform'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/convertible.rb:84:in `do_layout'
from ~/plugins/post_filters.rb:167:in `do_layout'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/post.rb:189:in `render'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:193:in `block in render'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:192:in `each'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:192:in `render'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:40:in `process'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/bin/jekyll:250:in `<top (required)>'
from /usr/local/bin/jekyll:23:in `load'
from /usr/local/bin/jekyll:23:in `<main>'

対処方法は、URLをエンコードしておけばよいです。私は以下のTwitter投稿用ブックマークレットでリンク先をTwitter投稿フォームに表示させて、そのエンコードされたURLを使うことにしました。

1
javascript:(function()%7Bwindow.twttr=window.twttr%7C%7C%7B%7D;var%20D=550,A=450,C=screen.height,B=screen.width,H=Math.round((B/2)-(D/2)),G=0,F=document,E;if(C%3EA)%7BG=Math.round((C/2)-(A/2))%7Dwindow.twttr.shareWin=window.open('http://twitter.com/share','','left='+H+',top='+G+',width='+D+',height='+A+',personalbar=0,toolbar=0,scrollbars=1,resizable=1');E=F.createElement('script');E.src='http://platform.twitter.com/bookmarklets/share.js?v=1';F.getElementsByTagName('head')%5B0%5D.appendChild(E)%7D());

エラーメッセージからは、どのページがエラー原因なのかが分かりません。原因元の切り分けには、commentやdateなどがある投稿のヘッダにpublished: falseと書いて、そのページを生成対象から外して、エラーが生じるかを見ます。

iOS Bluetooth Low Energyの開発 その1

これは、岐阜人材育成講座でおこなった、CoreBluetoothフレームワークの解説の要約です。
白板は、以下の画像です:

Bluetooth Low Enerygとは

Bluetooth Low Energy(以下、BLEと省略)は、Bluetooth4で追加された超低消費電力の通信仕様です。例えば直径20mm 厚み3.2mmのコイン型1次リチウムイオン電池 CR2032 (3V 220mAh)で1〜2年間、接続してデータを送信し続ける状態での連続動作時間が得られます。

超低消費電力のRF通信規格には、BLEの他にANT, ANT+, ZigBeeなどがあります。BLEはBluetoothのブランド力、およびいち早くiPhoneおよびMacに採用されていることから、超低消費電力の通信規格として強い普及力があります。iPhoneに採用されたこと、またBluetoothに含まれることから、スマートフォンとの接続ではBLEが標準です。

Bluetooth4はBluetooth3にLow Energyの技術を追加したものです。Low Energyの技術は、それまでのBluetooth3とは全く別の技術です。そのため、Bluetooth3までの技術をクラシックBluetoothと呼び、Bluetooth Low Energyと区別することがあります。ここでもBluetooth3までの技術をクラシックBluetoothと呼びます。

クラシックBluetoothとBLEの使い分けは、必要な通信速度、製品製造コスト、電池の充電および交換が製品の利用場面に適しているか、などを考慮して決めます。

BLE、規格の狙い

BLEは

  • 超低消費電力
  • ペリフェラルが安価に作れる
  • BLEの認証のものとで、多種多様なペリフェラル開発が可能

を主眼に規格が作られています。

###超低消費電力
超低消費電力は、BLEの最も大きな狙いです。クラシックBTはリチウムイオン電池でも2週間程度で電池容量を使い果たすため、都度電池の交換もしくは充電が必要でした。この電池の交換および充電を実現するハードウェアは開発と製造にコストがかかります。またユーザに電池交換/充電を求めることが、クラシックBTが使える利用場面を狭めることがあります。

コイン型1次リチウムイオン電池 CR2032 (3V 220mAh)で1〜2年間、接続してデータを送信し続けるられるほどの超低消費電力であれば、電池が切れる=製品寿命とすることができますから、(ゴミの分別はおいておいて、いわゆる)使い捨てすら可能です。

BLEの超低消費電力は、クラシックBTと全く同じ機能を超低消費電力とするものではありません。物理的に電波を出して1ビットのデータを送受信するために必要な電力は、クラシックBTでもBLEでも、そうは違いはありません。

BLEは、例えば1秒に20バイト程度のデータを送受信するような、データのやり取り頻度は低いけれども、無線接続自体は長期間維持できる応用分野を想定した規格です。データ通信速度も物理層で1Mbpsです。クラシックBTは、ヘッドセットやパーソナル・エリア・ネットワーク(PAN)のような、特定の端末と接続すること(ペアリング)、常時データ通信があること、また高いデータ・レート(~3Mbps)が必要とされる、場面を想定した規格です。

このため、クラシックBTとBLEは、利用場面が全く違います。BLEは、Keyfobのように、常時スマートフォンと無線接続をし続けなければならないもの、またフィットネスの心拍センサーやセンサーネットワークのように、データ量は多くないが一定時間ごとにデータを収集し続ける応用分野に、非常に適しています。

###ペリフェラルが安価、また多種多様な開発が可能
BLEには、セントラルとペリフェラルという概念があります。通常、iPhoneがセントラル、心拍センサーなどの周辺装置がペリフェラルになります。無線通信をするためには、接続状態の管理や、パケットの送受信のタイミング制御などが必要になります。これには、CPUを使いますし、また電波の送信受信の電力も必要です。BLEは、ペリフェラルが安価に製造できるように、演算や電池を消費する機能をセントラルに寄せて、ペリフェラルが極めて簡単な構造ですむようにしています。

BLEのネットワークは、1つのセントラルに多数のペリフェラルが接続するピコネット、です。

クラシックBTとBLEでは、プロファイルの考え方が違います。クラシックBTは、通信の振る舞いとハードウェアの振る舞いをあわせてプロファイルとして定義していました。一方で、BLEはハードウェアの振る舞いは何も定義しません。

BLEはサービスという概念で、値の読み出しと書き出しの基本的な振る舞いのみを定義します。例えば電池残量のサービスは、電池残量の値読み出し方法と、その値の意味(ビット割り当てなど)の定義が与えられています。この電池残量のサービスは、様々なBLEデバイスが利用します。例えば、keyfobならば内蔵電池の残量通知に使います。これがもしも、電気自動車ならば、それは電気自動車の主電池残量を意味するでしょう。サービスという概念で、ハードウェアと切り離して定義されているので、抽象化され、サービスを多くの機器で横断して利用することができます。Custom Profile Development

BLEでは、128-bitのGUIDを割り当てたサービスを、開発者が独自に定義して実装することができます。従って、BLEは認証のもとで“任意のハードウェア”が開発できます。BLEでは、一般には定義されていない多種多様なハードウェアでも、独自に定義をすることで開発ができます。

BLEは、サービスを識別するIDに、16−bitのIDと128−bitのIDのいずれかを割り当てできます。16-bitは、BluetoothのSIGが定義したサービスに割り当てられます。このIDは勝手に定義して使うことは許されません。

クラシックBTでは、ハードウェアの振る舞いまで含めてプロファイルが定義されています。このため、プロファイルに定義されていないハードウェアの開発では、シリアルポートプロファイル(SPP)という、シリアル通信のプロファイルを使います。

クラシックBluetoothとBLE

クラシックBluetoothとBLEは、2.4GHzという同じ周波数帯を使っていますが、物理層の変調方式からして方式が違います。ですが、電波を送受信する回路(以下、RF回路)は、クラシックBluetoothとBLEで共用できます。したがって、BT3にBLEを追加したBT4の半導体は、コストの高いRF回路を別に設ける必要がなく、開発コストの利点があります。

Bluetooth SMART READYとSMART

BLE対応デバイスには、Bluetooth SMART READYとSMARTという2種類のロゴがあります。

BLEは、BT3にBLEを追加したものです。iPhoneのように、従来のクラシックBTとBLE両方に接続できる、いわゆる通常のBT4デバイスが、Bluetooth SMART READYになります。一方で、BLEしか実装していないデバイス、心拍計やkeyfobのようなペリフェラルも、BT4対応デバイスです。これはBLEでしか通信ができないので、Bluetooth SMARTと呼びます。

Bluetooth SMARTの製品は、Bluetooth SMART READYの製品と接続できます。ですがBluetooth(BT3以前のクラシックBT)とは接続ができません。Bluetooth SMART READYの製品は、すべてのBluetooth対応機器と接続ができます。ややこしいのですが、BLEだけ、を搭載したペリフェラル相当の機器にもBluetoothロゴをつけるための、区別です。

Bluetooth SMART READY/SMART対応機器のリストは、http://www.bluetooth.com/Pages/Bluetooth-Smart-Devices-List.aspx にあります。

シングルモードとデュアルモード

BLEでペリフェラルに対応する機器は、シングルモードとデュアルモードの2種類があります。シングルモードは、BLEのみを搭載したものをいいます。デュアルモードは、BLEに加えてクラシックBTにも接続できるものをいいます。デュアルモードは、通常、クラシックBTのシリアルポートプロファイル(SPP)でも接続できるように設計します。半導体メーカから、シングルモード、デュアルモード、それぞれのICが開発、提供されています。

シングルモードとデュアルモードのいずれにするかは、 接続する対応機器の範囲で決まります。もしもクラシックBTしか対応していない機器にも接続したい場合は、デュアルモードを選択するほか、手段はありません。また、連続してデータを送り続ける場合にも、デュアルモードを採用するかもしれません。BLEの通信速度は、物理層で1Mbps、実際の通信速度は~50kbps程度です。一方でクラシックBTは物理層で3Mbps(WiFiの物理層を使わないものであれば)で、~500kbps程度です。そもそも、そのような連続かつ高速のデータ送受信をし続ける応用例には、BLEを選択すること自体が、BLEの規格の狙い目からはずれていますから、クラシックBTのみで設計すればよいでしょう。

デュアルモードにすると決めると、自動的に、クラシックBTが要求する電池容量、また充電可能にするなどの、ハードウェアの設計要件が決まります。

もしも開発するハードウェアが、常時センサーを働かせるために電池の消費量が大きいならば、デュアルモードで設計しても、電池まわりはさほど違ったものにはならないでしょう。ですが、間欠的にセンサーを動作させるもので、電池交換や充電が不要で長期間動作することが、ユーザからみた装置の使い勝手や印象に影響するものであれば、デュアルモードにすることは、簡単ではないでしょう。

iOSのBLEデバイス開発

書くのがめんどくさくなったので、箇条書きで:

  • 2011年以降発売されたApple製品はBluetooth4対応。BLEデバイスと接続できる。
  • BLEデバイスの販売にMFiプログラムは必須ではない。ただしロゴを掲載したいなら参加が必要。
  • BLEデバイスと接続するアプリのストア承認にMFiは不要。ただし、アプリの動作を確認するために、BLEデバイスの提出が求められる、かもしれない。

BLEデバイスと接続するアプリケーションは:

  • 一般開発者ライセンスで提供されているCoreBluetoothフレームワークで開発する
  • アプリはバックグラウンドで動作させられる
  • iOS5までは、iPhoneはセントラルのみで動作する。
  • iOS6からは、iPhoneはセントラルおよびペリフェラルになれる。

つまり、テレビにもしもBLEリモコンがあったとすれば、iPhoneは任意のBLEリモコンを模倣できる。

応用例

コネクションレス型とコネクション型。BLEは基本コネクションして使うもの。

アドバタイズメント・パケットを利用して、近接検出のコネクションレスな利用ができる。同じデバイスからのアドバタイズメント・パケットを都度受信処理するためには、DuplicatesKeyをYESに設定する:

1
2
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
[centralManager_ scanForPeripheralsWithServices:nil options:options];

はまりどころ

通常のコネクションする使い方ならば、ハマるところはない。
強いて言えば:

  • CBPeripheralは自分でretainしないといけない
    • scanForPeripheralsWithServicesで取得したCBPeripheralはアプリ側でretainしないといけない
  • デバイスから強制定期にBluetoothの接続切断をすると、iOS6では、CoreBluetoothが例外を飛ばしてくる
    • try~catchして処理

このほか:

  • iPhoneが接続したことがないBLEデバイスのUUIDは、アドバタイズメント・パケット受信時はnull
    • iPhoneが、任意のアプリで一度でも接続したことがあれば、UUIDが取得できる。iPhoneの電源On/Offをしてもクリアされない。どっかにキャッシュをもっているのだろう。
  • iOS6では、iPhoneからBLE接続を切断しても、iPhoneは30秒〜1分程、BLE接続をもっている。このためBLEデバイスからアドバタイズメント・パケットが送出されない
    • アドバタイズメント・パケットを利用する場合は、デバイス側から強制的にBLE接続を切断する。

このように、細かい所で、iOS5とiOS6で振る舞いが違うところ、タイミングのパラメータ値が違うような些細だけど、使い方によっては致命的になる、ところがある。しらないと、はまるので、事前の確認をしっかりすること。

開発方法のおすすめ

BLEのハードウェア開発は、次章で述べるように、組み込み開発が必要になるために、どうしてもiOS単体で閉じた開発に比べて、時間がかかる。

iOS6では、たぶん、ペリフェラル側もiPhoneでプロトタイピングするのが、よいのではと思っている。BLEデバイスの開発には、ハードウェアそれ自体が特別なセンサーを利用しているか、またBLEの開発の中心は、ハードウェアなのかそれともデータ処理のアルゴリズムなのか、で区別してみる。

まずBLEが特殊なハードウェアを使うものであれば、iPhoneにそのハードウェアの機能がないので、プロトタイピングにはならない。しかしダミーデータを流す程度には使える。

BLE開発が、データ処理に価値がある場合がある。例えばフィットネス関連のBLEデバイスは、ほとんどが、加速度を使う。加速度から消費カロリーや歩数、高度の変化などを算出するのは、データ処理になる。このような、iPhoneにもあるハードウェアを利用し、その開発の工数の多くがデータ処理の場合には、iPhoneでのプロトタイピングは絶大であろう。

iPhoneでプロトタイピングしたソースコードをマイコンに移植すればよい。そのソースコードは、当然ながら、マイコンの性能に合わせて書きなおさなければならないかもしれないが。

BLEのデバイス自体は、とても簡単な回路ととても単純なデータ処理をする設計が多い。電力消費量とデバイスの大きさを考えれば、そのほとんどの処理はiPhone側に持たせたほうが、合理的で利点があるから。

BLEのハードウェア開発

BLEのデバイス開発は、組み込み装置の開発そのものです。ARM Cortex-M0のようなマイコンに、BLEのプロトコルスタックとユーザのアプリケーションを入れて、周辺のスイッチやLED、そしてセンサーを動かすハードウェアを開発していきます。

マイコンを利用する開発の難易度は、何を作りたいか、どう作るかの構想により、大きく違います。構想をたてる時点から、組み込み会社と協業していくことを、おすすめします。マイコン用の開発環境(IDE)があり、C言語で開発していきます。

ここでは、BLEのデバイス開発について、見ていきます。試作では、むき出しの基板に組み上げた回路でもよいでしょうが、実際には、筐体や商品パッケージ、取扱説明書など付随するものも必要です。ここでは、それらは考えません。

フルカスタム開発

半導体チップを購入して、ゼロから設計と開発をすることを、フルカスタム開発と呼びます。フルカスタム開発の設計の流れは:

  1. 半導体チップメーカからBLEの半導体を購入
  2. 半導体チップメーカの推奨設計例をもとにして、基板回路などを設計
  3. 電波法の認証 (試作では1台単位、製造では製造設備単位で認証が必要)

となります。製造まで考慮すると、製造時試験の手順決定と技術文書の作成など、多くの項目がありますが、ここでは省略しています。

BLEの半導体には、BLEの通信機能だけがあるものと、BLEの通信機能に加えてマイコンまで内蔵した、いわゆるSoC(システム・オン・チップ)の2種類があります。いずれを採用する場合でも、通信の制御にマイコンは必須です。

BLEの通信機能だけがあるものを使う場合は、その半導体とマイコンの間は、ホストコントロールインタフェースというBluetoothの規格に従ったプロトコルでやりとりをします。既存の製品にBLEを追加する場合で、すでに製品の中にあるマイコンで通信制御まで実現する場合には、この形を取ります。

SoCは、BLEのプロトコルスタックとユーザのアプリケーションが、BLEの半導体に内蔵された1つのマイコンで実行されます。回路面積を小さく、かつ消費電力を最小にできる利点があります。BLEデバイスをゼロから企画する場合で、大きさや電池の持ちに注目するときには、こちらを採用します。

CC2540を使ったファームウェア開発で、TI社のファーム焼きソフトを使っている場合、”データフラッシュの消去”をすると、CC2540のユーザ書き込みMACが0に初期化される。ドキュメントには、ユーザ指定のMACが0なら、メーカ書き込みのMACを使うとあるが、実際には、使っていない。ユーザのMACが0もしくは0xffいずれの場合も、その値を使ってしまう。すべてのデバイスのUUIDがおなじになり、個別識別ができない。ロット単位のエラッタなのかどうかは知らない。なので、フラッシュをクリアしてしまったときは、メーカ指定のMACをコピペで書き込んでおく。

モジュール

BLEの通信部分を入出力端子が外部に出ている小さな基板に収めたモジュールという部品があります。いろいろな会社からモジュールが出ています。

モジュールを採用する利点は、Bluetoothや電波法の認証を自社で取得する必要がないことです。一方で、モジュールの基板(大変小さくて、1cm角ですが)の形と大きさに製品が制約される場合があります。小型あるいは細長いようなBLEデバイスを開発するときには、モジュールの外形確認が必要になります。

モジュールは、Bluetoothの相互接続認証と電波法が求める工事認証を取得しているため、これを採用すればフルカスタム開発のファームウェア開発を除く手順が省けます。

2012年8月までは、モジュールの工事認証の条件に、モジュールが用意に着脱できること、という条件がありました。これを満たすため、モジュールには“コネクタ”がありました。しかし、2012年8月に、この条件が撤廃されたことで、直接ハンダ付けで固定する表面実装タイプの工事認証が通るようになっています。

BluetoothとMFiのロゴを掲載するには

Bluetooth対応のロゴ、およびMade for iPhoneのロゴを商品に掲載するには、それぞれBluetoothの相互接続認証の取得とMFiプログラムの参加が必要です。

Bluetoothは、認証費用自体は実費で5万円程度ですが、Bluetoothのメンバーに登録するための年会費が1万ドル必要です。自社で設計開発する場合は、自社でBluetoothの相互接続認証を取る必要があります。たいがいのモジュールは、Bluetoothの相互接続認証を取得しています。この場合は、そのモジュールを利用した派生製品であるとBluetooth対応製品のリストに無償で登録ができます。

Bluetoothのロゴを掲載しなくても、正体不明のRF装置として販売はできますが、iPhoneのようなBluetooth SMART READYな装置に接続することを表示するためには、Bluetoothのロゴは必要です。

iPhoneはBluetooth SMART READYなので、BLEデバイスはiPhoneに接続できます。このBLEデバイスの販売およびアプリのストア認証にMFiプログラムは必須ではありません。しかし、MFiのロゴを製品に掲載したいならば、MFiプログラムへの参加が必要です。

半導体チップについて

Bluetooth4対応デバイスは、従来の3までのBluetoothとLow Enery両方と接続できるデュアルモードと、 Low Energyだけに対応するシングルモードの2つにわけられる。iPhoneとBLEで接続するデバイスは、BLEのみに対応する、シングルモードデバイスになる。
シングルモードデバイスは、無線および制御回路を1つにした集積回路として、テキサス・インスツルメンツ、CSR、およびノルディック社の3社から販売されている。
TI社はCC2540およびCC2541の2つのシングルモード集積回路を販売している。価格は2ドル。8051マイコンを内臓しており、BTLEプロトコルスタックをIAR Embedded Workbench IDEのライブラリとして提供している。GPIOおよびADCなどの豊富なIOもあり、BLE接続センサーがワンチップで実現ができる。 CC2541は、BLEに加えてTI社およびノルディック社の独自2.4GHzデータ通信方式も対応している。この独自の無線通信は、例えばマウスやキーボードで独自の2.4GHzの通信仕様を利用している製品をBLEに移行するときに、従来の独自通信技術に対応させつつ、かつBLE対応が求められる場合に使われる。チップサイズは6mm角。

CC2540/2541の開発は、IAR Embedded Workbench 8051を使う。モバイルライセンス、フルセットで 35万円ほど、機能限定版で 25万ほど。また、保守(更新)は、最初3ヶ月は無料、年間更新料として購入価格の20%がかかる。
CSR社は、ウェブサイトで概略しか情報を公開していない。TI社のCC2540同じようなマイコンを内臓したものを販売している。BLEの開発部門はサムスンの出資をうけている。このため、純粋な半導体メーカとして続くのかは、不安に感じるところがある。
ノルディック社は、nRF8001およびnRF8002を販売している。nRF8001は、TI社のものと違い、BLEの プロトコルスタックまでを提供しており、制御はACIインタフェースをとおして別のマイコンで実現する。 nRF8002はnRF8001に、キーレスエントリーのようなキーホルダーに使われる近接等のプロファイルを実 装したもので、BLEで最もよく使われるキーホルダー的な機能が実現できる。チップの価格は3ドル程度 (Mouserで274円、80円/ドルより)。チップサイズは5mm角。
またCortex-M0+を搭載したSoC、nRF51シリーズを発表している。ノルディック社が提供してきた独自規格の2.4GHz通信とBLEに対応したものが出荷されている。この開発環境はKeil MDK-ARMを使います。このライセンス料金は、30万円程度です。このSoCのファームウェア開発方法は、ARM Cortex-M0+の手順そのままです。

モジュール

この他に、BlueGiga社はTI社のCC2540を採用したモジュールを販売しています。このモジュールは、IAR WorkbenchのようなC言語開発環境の代わりに、BASICのようなスクリプト開発環境を独自に提供している特徴があります。また、FCCとCEを取得しており、Bluetoothの相互接続認証を取得しています。ですからBluetooth対応の製品リストに無償で登録ができるので、Bluetoothのロゴを表示して販売ができます。

許認可の取得

Bluetooth4 Low Energy機器を販売するためには、販売国での認証取得が必須です。この認証は、電波を 放出する機器が他の機器の動作を阻害しないことを承認することで、無線局免許がなくても電波を発する無 線装置を運用してよいという制度が求めるものです。この認証なく電波を発した場合は、日本では使用者が 電波法違反を問われます。
Bluetoothのロゴを掲載するには、Bluetoothの団体に加入して、機器相互接続試験をクリアしなければな りません。ロゴを掲載せずBluetooth機器だといわないならば、これを取得していなくても、販売は可能で す。プロファイルによりますが、150~250万円程度がかかります。
この認証は、米国ではFCC、日本ではTELEC、欧州ではCE、と呼ばれます。FCCおよびCEは、一般的な 電気機器にもとめられるEMC(電磁両立性、電気機器などが備える、電磁的な不干渉性および耐性)も必要になります。

EMC試験および無線機器の認証取得代理を提供している会社がいくつかあります。試験および書類申請までを一貫してサービスとして提供しています。回路や電波の技術と法律の両面の知識が必要で専門職でなければ対応は難しいので、設計段階から、相談をしておくことが大切です。

電波を出す製品を米国、日本、欧米で販売するための許認可は、それぞれFCC、工事認証、CEになります。設計したものが基準を満たせず再試験になった場合には、その追加費用など、付随する費用発生がありますが、最低限必要な費用なの目安は:

  • FCC 165万円くらい
    • EMC(9kHzを超える) 40~50万円
    • 無線に関わるもの(Part15 sub C、電磁障害なきこと) 80万円
    • 米国への書類提出など 25万円
  • 日本 48万円くらい(書類作成、申請代行費用は含まず)
    • 工事認証(工場生産単位での認証) 48万円
  • CE 合計220万円くらい
    • EMC 100万円
    • 無線関連(障害なきこと) 80~90万円
    • 電気機器の安全性確認 30万円
      • 認証に提出するデータは、量産と同じもので計測されたものを提出します。

製造設備および体制に対して、 求められるものは:

  • FCC
    • 特に無い
  • 日本
    • 製造されたものの特性が同一であること、そのために品質が管理されていることを書類で明らかにする。
    • 具体的にはISOを取得している、出荷時検査の装置や測定手順が決められていてデータが保存されているなどの、体制の整備が審査対象になる。
  • CE
    • 特に無い
    • しかし、各国で抜き取り調査をしている。もしも違反している場合は、製品の全数回収の義務が生じる。また罰金が課せられる。

ここでは書いていないこと

ぶっちゃけです。

AndroidとWindows Phone8でのBLE対応アプリ開発

BLEのAndoridのプロトコルスタックは、Googleから公式に提供はされていない。ADK2.0でBLEをつけているのにと思っても、ぶっちゃけあれはデュアルモードなので。モトローラなど、半導体もやっているところや、BLE開発を先行して進めている会社がそれぞれ自社の名前空間でBLE対応のプロトコルスタックを出している。BT4対応のハードか否かも、機種依存で、プロトコルスタックもカオス。近づいたら火傷しそうな落とし穴を、考えつく限り散りばめた、カオスすぎる状況。

Windows Phone8は、ハードウェア要件にBT4必須がない。Windows8のハードウェア要件にはBT4必須があるので、Phoneでは違うんだ、に気をつけておかないと、混同しやすくて危ない。スタックは、Windowsと同じなので、使いやすいかも。特定プロファイルの実装はあったけど、128-bitな独自のサービスにも対応できるかは調べがついていない。

会社の作り方

法人を作ってみる

個人事業主として、http://d.hatena.ne.jp/feb-hare/20110710/1310263186:titlehttp://d.hatena.ne.jp/feb-hare/20120224/1330062063:titleのように、3年間やってきたのですが、この先10年20年を考えると、自分が動かなければ何も動かない個人という立ち位置は、事業としてはやりにくいかなと思えてきました。

アイディアに比重が大きい開発などの属人性が強いものは今後も個人事業主としてやっていくとして、そのライセンス販売や商標などの権利の管理と運用は、個人とは切り離した存在、法人、でやっていきたいと思いました。

そこで、法人を作ってみることにしました。

法人のメリットは:

  • 所得が1000万円程度を超えるなら、必要経費と課税金額が、個人よりも小さい
  • 社会の扱いでも法律のうえでも、個人と事業を分離できる
  • 個人は無限責任だが、(株式もしくは合同なら)法人は有限責任

個人事業主が法人を作ることを、法人成りといいます。事業所得が1000万円ほどになると、個人よりも法人のほうが税金が安くで済むようになるので、個人で稼げる人は節税目的で法人を作る事が多いそうで、それを将棋の駒に例えて法人成りと呼びます。

法人は、法律では、ふつうの生きている人、自然人と同格の存在です。憲法の生存権や選挙権はないですが、財産を所有し、労働をして、納税をする存在です。将来、人格をもつ人工知能と人間のような外観のロボットが実用になったとき、ロボットそれぞれが法人格をもつだろうなと思っています。

法律上は、法人は自然人と同格の存在ですから、そこに集めたお金をそこに持たせて、そのお金で、人を組織し、物を動かして、何かしらの価値を生み出す器として使えるわけです。Fate stay nightでいう、万能の願望を叶える器として、利用できるわけです。

法人の詳細は、国ごとの法律で異なります。日本に、平成17年に改定された会社法で、株式、合同、合資、合名会社の4種類が述べられています。このうち株式と合同の2つは、もしも会社が解散したり借金をしても、出資をした社員は、出資金以上の責任を負わない有限責任です。個人事業主は無限責任です。負うべきリスクが出資金として明確に見えるのは、法人の大きな利点でしょう。

また、ハードウェアを製造販売しようとすると、PL法は避けて通れません。そしてPL法に対応して万が一の場合に備えて保険をかけようとすると、個人ではできず、法人格が必要になります。このように、どうしても法人格が必要になる場面もあるので、このような利点もあります。

株式会社と合同会社

平成17年の改定により、一人でも株式会社が設立できるようになりました。また資本金の最低額が撤廃されたので資本金1円でも会社を設立できます。

株式会社は、会社の所有(資本)と経営を分離して運用される会社です。会社の価値を、株、という小口の証券にして、そして集めた資本を経営者が運用して余剰利益を配当していくのが、株式会社です。会社の価値が株という形で小口化してあるので、外部から資本を入れて事業を大きくしていくのに向いています。この運用のための様々な工夫が、機関の設計や、株式の種類などとして、会社法に規定されています。

合同会社は、この資本と経営が分離されていない会社です。社員はそれぞれ資本を持ち寄り、合同で事業をすすめます。また経営の進め方や利益配分などのルールを、自由に設計できます。ですから、外部から資本を集める必要がない場合、また、お金はないけれど知恵や腕がある人と、対等の利益配分率で事業をすすめる場合など、株式会社の形でやる必要がない、またはやりにくい事業が、合同会社としての運用が適しています。ですが、成長すると、ほぼ間違いなく、もめるか、株式会社にするかするでしょうが。

設立の時点あるいは設立してから、資金を出すだけの人(もしくは法人)が出てくると思うなら、最初から株式会社で設立するのが、よいでしょう。

個人で規模の拡大をしないのであれば、合同会社でいいでしょう。会社は、合同会社を株式会社にしたり、逆に株式会社を合同会社にする組織変更ができます。まずは合同会社で創立して、めどが付いたら株式会社にしても、いいかもしれません。

登記の実際、いかに家から出ないか

ここでは、実際に合同会社を作るまでの手順を紹介します。テーマは、いかに家から外に出ないか、を目的とします。会社登記は、自分でやるか、他人の申請を代理できる資格である司法書士や弁護士の方に依頼するか、のいずれかです。法律の知識が必要で、また登記は1度やればそう滅多とするものではないので、専門家に依頼するのが、時間と費用でメリットがあります。

特におすすめなのは、http://www.hitodeki.com/:titleです。ここは、法律の知識がない人では対応が難しい書類作成と申請手順の一部分を定額かつとても安価に提供しています。また、申請手順もウェブで丁寧に説明されています。合同会社の事務手数料は1万円です。以下の手順を自分でやると、1週間はかかりますから、自分でやることが楽しい、あるいは挑戦してみたい人以外は、ここを使うほうがメリットがあるでしょう。

このサイトは、登記の書類をオンラインで作成して、その書類をユーザがプリントアウトして窓口に提出する手順を踏みます。登記の書類は、必要な項目をウェブで埋めていけば、テンプレートに流しこみ生成されます。あとは、行政書士が電子署名をした印紙代がかからない電子定款と、印刷して提出するだけの書類一式の電子ファイルが入手できるので、それを窓口に持っていくだけです。また、設立後は、税務、労務それぞれの専門家が必要ですが、それも紹介してくれるので、すぐに事業を始めたい場合には、よいと思います。

自分で登記をするコストの利点

自分で登記をすれば、行政書士の方に支払う費用が不要で安いのですが、法律に従った書類を準備するための学習時間と電子署名をする準備とその署名の手間を考えると、先ほどのオンラインのサービス等を利用したほうが、よいでしょう。http://www.hitodeki.com/:titleなら1万円、街の行政書士に依頼しても、5万円かその程度です。

ここでは、登記にかかる費用を簡単に説明します。まず、定款、にかかる費用があります。

株式会社の定款は、会社法により、定款を公証人に承認してもらわなくてはなりません。この費用は5万円ですhttp://www.koshonin.gr.jp/tei.html#05:title。また定款を紙文書にした場合は、http://law.e-gov.go.jp/htmldata/S42/S42HO023.html:title 別表1の4万円の印紙が必要です。定款を電子ファイルにしたときは、この印紙は不要です。

公証人役場で定款の認証をうけるときは、必ず対面で本人であることを確認してから、渡すことが、決められています。これは、紙書類でも電子ファイルでも、同じです。電子ファイルで定款を提出するときは、まず定款を作成して、それに電子認証局が発行する鍵で電子署名をして、公証人役場に提出します。この”電子認証局”の鍵は、いわゆる住基カードの公的個人認証サービスとは別のものです。民間業者から鍵を発行してもらうと2年間有効なものが費用1.5万円かかります。(訂正:2012年11月15日。公的個人認証サービスの電子署名で、受け付けてもらえるそうです。)

そして、公証人役場への電子ファイル送付は、法務局の登記ねっとのソフトを使い、オンライン申請できます。ですが、先ほどのように対面で本人と確認してから手渡すため、電子ファイルを提出した後に、公証人役場に電話連絡をして、その日時や手順を相談して決めなければなりません。そして、電子認証局で電子署名した定款を公証人役場に送付した後、リアルに窓口にいくと、公証人役場で認証した定款の電子ファイルを、フロッピーディスクもしくはCD-R(公証人役場によってはDVD-Rは受け付けないところもあるみたいです。まさかと思うようなことですが、使える媒体は電話した時に確認しておくほうがいいです)に入れてもらって、受け取り完了です。

株式会社の定款は、このような手間がかかるのと、行政書士が持っている電子署名が必要なので、定款作成とセットで依頼したほうが楽です。

ネットの定款作成で、やたら費用がかかるようにいっているのは、1)電子署名にかかるソフトや鍵の費用、2)印紙代、をごちゃまぜで言っているようです。まず電子署名はAdobe Acrobatをつかうほかありません (法務局が出しているプラグインがAdobe Acrobat対応のプラグインなので)。これが5万円ほどです。そして、一般人が電子認証局の鍵を買うと、2年有効なものしかなく、これが1.5万円です。あわせて、6.5万円します。また印紙税は、紙書類であれば必要ですが、電子署名にすれば不要です。

ですから、一般人であれば、紙で出せば4万円、電子署名なら6.5万円(+ソフト設定の手間)のいずれかの選択になるが、行政書士に依頼すれば、電子署名は日常業務でやっているので、電子定款を作り、それで浮いた印紙代4万円くらいを、手間賃でもらいます、という感じです。[http://www.hitodeki.com/:title]だと、その電子署名の手間賃が5000円なので、定款を受け取る側からすれば署名自体に意味はない、仕組みでしか無いので、それでいいだろうと思いますが。

ですから、株式会社は定款作成と認証に、5万円+定款作成と電子署名費用(5000円~)が必要です。

合同会社は、定款の認証が必要ありません。ですから、この認証費用5万円は不要です。また、法務局に登記ねっとで自分でオンライン申請する場合は、定款の電子署名を自分の住基カードの公的個人認証サービスでかけることで、定款の電子署名のコストも必要ありません。Adobe Acrobatは、インストールしてから1ヶ月はお試し期間で使えるので、登記の期間がそれを超える場合は、購入のための費用が必要ですが。

ですから、合同会社は定款作成は、0円です。

登記の残りのコストは、登記の必要書類の作成手間賃、そして登録免許税です。登録免許税は、株式会社で15万円(あるいは資本金の0.7%のいずれか大きい方)、合同会社で6万円(もしくは資本金の0.7%)です。登記ねっとでオンライン申請する場合、平成25年度まで、3000円減じる特例処置があります http://www.moj.go.jp/content/000011324.pdf:title

これらの合計が、登記のコストです。株式会社なら、定款と書類作成で手間賃1万円+電子署名0.5万円+認証5万円+登録税15万円で、21万円くらい。合同会社なら、定款作成手間賃1万円+登録税6万円で7万円くらいです。

登記と維持費

法人を作った後の維持費は、税金と、事務手数料です。税金は、個人事業主と同じく、所得に対する課税、消費税、住民税、があります。個人事業主では、赤字の場合は住民税は免除されますが、法人は赤字でも7万円の住民税が発生します。

事務手数料には、税理士報酬があります。個人事業主の延長の規模であれば、毎月1.5~3万円程度、決算は月料金の3倍程度が目安です。年間30万円ほどでしょう。

もしも普通自動車を所有していれば、その年間維持費用は(重量税5+保険5+車検10/2+車両本体償却150/10)=30万円、ですから、自動車1台持っていると思えば、いいでしょう。

登記の流れ

ここでは、法務局の登記ねっと、を利用してオンライン申請をします。必要な手順は、1)登記の書類を作る、2)オンラインで申請する、の2点です。前者は、申請手段が、窓口かオンラインかにかかわらず、必要な手順です。後者は、申請の手順です。

はんこを作る

会社の実印を作っておきます。実印は、法的な契約に万能の威力を持つので、おいそれと人の目に晒すわけにはいきません。ですから、銀行口座のための銀行印、そして見積書などに押す角印も一緒に作っておきます。法人設立の3本セットとして、5000円から、1万円もしない程度で製作してもらえます。製作期間は1週間はかからないでしょう。私は、印章をメールで事前確認ができて、お安かった、はんこの森、を利用しました。

登記の書類を作る

説明がめんどくさいので、説明を端折ります。ググってテンプレを入手するなり、会社法なり解説本で勉強するなりして、以下の書類を作ります。書類の作成順序は、定款を作ってから、資本金を決定して、払い込む、流れなので、書類の日付がその順番になっている(同じ日でもいいが、前後しない)ことに注意します:

  • 定款
  • 資本金決定書
  • 代表者印の印鑑証明書
  • 払込証明書
  • 資本金の額の形状に関する証明書

まずは定款と、資本金決定書のファイルを作って日付を入れてPDFファイル化しておきます。そして、適当な通帳を空っぽにして、通帳にだれが振り込んだか、名前を残すために、そこに資本金を銀行振込します。

家から1回外に出る

翌日、通帳に振込が完了してから、市役所に行き以下の手順を行います:

  • 住基カードを作る、電子証明書を入れてもらう(手数料、1000円)
  • 印鑑証明書を取る
  • カードリーダを購入する
  • 通帳のコピーを取る
  • (印章のコピーを取る)

まず、住基カードのICチップに電子証明書を入れてもらいます。役場により、住基カードは、接触と非接触に対応したコンボ型か、接触のみのものか、いずれかです。住基カードの説明書に、カードのタイプは明記されています。そのカードのタイプに対応した、カードリーダを入手します。私の場合は、非接触も対応していたので、e-taxに使うかと思って買っておいた、手持ちの非接触ICカードリーダが使えました。SUICAカードが読める、ソニーとかの製品であれば、大抵使えるでしょう。

市役所に行ったついでに、個人の印鑑証明書を1通取得します。もしも印鑑登録をしていないなら、実印登録のための個人の印鑑を準備して、印鑑登録しておきます。

最後に、資本金の支払い証明のために通帳のコピーを、表紙、裏表紙、払込記録部分、の3枚を取ります。500円ほどで作ったもらえる残高証明書でもよいです。私は、コンビニの白黒コピーをとって、それを書類スキャナで取り込みました。セブンイレブンのコピー機なら、コピー機から直接メモリカードにPDFで保存するサービスがあります。もしも家に書類スキャナがない場合は、このサービスを利用します。価格は1枚30円です。またPDFファイルを保存するための、USBメモリを忘れず持っていきます。また、通帳は余白部分が多いと、自動で空白削除されかねないので、コピーはA4サイズ指定、かつA4の領域の真ん中に通帳をおいて、確実に通帳全体のコピーを取ります。

もしも書類スキャナがないなら、印章のコピーもとっておきます。

申請する

必要書類をPDFで作成しておきます。

定款だけは、電子署名します。法務局の登記ねっとから、PDF署名プラグインをダウンロードして、住基カードをリーダに設定してから、プラグインを設定します。署名時に印章の画像を入れられます。これは印章のPDFファイルを指定しておこないます。このプラグインだからか走りませんが、このPDFの印章は170mm角の領域に収まる前提らしく、私は印章を600dpiで取り込み、MacのiDrawでdpi指定してPDF出力して。170mm角に収まるようにしてPDF出力しました。べつに、印章を画像貼り付けしておき、その領域の上に電子署名をしておけば、目的は満たすと思いますが、あえてツールの使い方にこだわってみました。

あとは、登記ねっとのガイダンスどおりに、申請項目を埋めて、作成したPDFファイルを添付して、申請ボタンを押せばOKです。申請時点で、申請書および添付ファイルにたいして、住基カードの公的個人認証サービスの電子署名がされて、送信されます。

書類を送信してから、翌日から3営業日以内に、登録免許税を支払います。私は電子納付をしました。ジャパンネット銀行およびソニー銀行といった、ネット専業銀行は使えなかったので、ネットバンキングが使えるようにしてあった三井住友銀行の個人口座を利用しました。

家から2回目の外に出る(150円の差額で、出なくてもすむ)

申請と振込が完了したら、残るは個人の印鑑証明書と、法人の印鑑申請を、法務局に申請します。印鑑(改変)届書は、PDFを印刷、必要箇所を記入します。登記の個人の印鑑証明と併用するために、真ん中より下あたりのレ点(注意1のぶぶん)をチェックしておきます。

登記ねっとのソフトの、メニューの、アクションから、”書面により提出した添付情報の内訳表の印刷”でHTMLファイルを出力して、その項目リストのうち、印鑑証明だけを残して、後の項目を削除したものを作ります。これを印刷して、先ほどの印鑑届書と、個人の印鑑証明書を重ねて、左側をホッチキスで止めます。これを、法務局の管轄支部に郵送します。

印鑑証明書は信書に分類されるため、ヤマト運輸のメール便、もしくは宅配便は郵便法により利用できません http://www.soumu.go.jp/menu_kyotsuu/important/topics091210.html。郵送は、郵便局窓口から、(簡易)書留でだします。簡易書留の料金は、総量120円+書留料金300円で、420円です。レターパックだと、500円ですが、集荷してくれるので、家からでなくてもすみます。350円のレターパックライトだと、集荷をしてくれないので、窓口に行く必要があります。

家から外に出て郵便局窓口にいくなら、350円のレターパックライト、集荷を依頼するなら500円のレターパックを利用しましょう。

設立後の手続き

法人を設立したら、税務関係の届出、社会保険事務局に健康保険と厚生年金への加入の届出、もしも人を雇うなら労働基準監督署への届出、が必要です。
税務署関連は:

  • 法人設立届 (設立2ヶ月以内)
  • 青色申告の承認申請 (設立から3ヶ月経過した後か、事業年度終了日のいずれか早い方の前日)
  • 減価償却資産の償却方法の届出書 (第1期の確定申告の提出期限)
  • 棚卸資産の評価方法の届出書(第1期の確定申告の提出期限)
  • 給与支払い事務所の開設届出書 (支払事務所の設立から1ヶ月以内)
  • 源泉徴収の納期の特例の承認に関する申請書 (特例を受けようとする月の前月末まで)

の届出や申告があります。
このうち、法人設立届出をまずはします。

法人設立届出書をだす

法人設立届出書は、e-Taxでも出せると書いてありました。試しに試みると、e-Taxのウェブアプリでは申請項目がありません。e-Taxソフトで申請書類を送信できました。しかし、送信する権限がないと、メッセージで通知されました。公的個人認証サービスの電子署名では、通らないのかもしれません。
仕方ないので郵送しました。国税局のサイトから、PDFの申請書類を印刷して、必要書類を揃えて、所轄の税務署に提出すれば、よいだけです。必要な書類をどう書けばいいのかは、ネットで調べると、ひな形などの情報が出てきます。
法務局への郵送の時と同じく、これらの届出や申請書は信書に相当するので、クロネコヤマトメール便は使えません。普通郵便もしくはレターパックを利用します。
申請書のコピーと返信用封筒を同封して、コピーに受付印を押してもらって返信をくださいと一筆書いておくといいです。
この届出には、登記簿謄本が必要です。これはhttp://www1.touki.or.jp:titleを利用すると、オンラインで登記簿を取得できます。手数料は400円です。オンラインで受け付けるものは、これを利用すると便利です。
紙の登記簿謄本を入手する方法は、法務局窓口で紙の登記簿謄本を取得すると700円、予め登記ネットで登記簿の発行を申請してから窓口で受け取ると570円、郵送を依頼した場合は+送料、の費用になります。

iOSデザイナのキャリア設計

12月27日のiOSアプリの講義は、iOSアプリのUI/UX設計の漫談です。UI ユーザ・インタフェース, IT用語辞典 e-Words, UX ユーザ・エクスペリエンス, IT用語辞典 e-Words

深津さんの”使ってもらえるアプリの考え方”を見ながら、漫談をしました。

iOSアプリ開発の技能の使い所

まず、自分にとっての、iOSアプリ開発の技能の使い所を考えてみます。

フルタイムとパートタイム

最初に、仕事としてのiOS開発に、自分の時間の割り振り割合で、区分します。

  • フルタイム
    • 雇用
      • 専業開発者 (コーディング、デザイン)
      • 企画、保守、運用の担当者
    • フリーランス
      • 専業開発者 (コーディング、デザイン)
      • 開発情報のエバンジェリスト(講演、著作、セミナー)
  • パートタイム
    • 雇用
      • 社内でのアプリ企画の作成
      • アプリ外注のやりとり、社内での担当者
    • フリーランス
      • クラウドワークスなどで、都度案件を取る
      • 開発情報のエバンジェリスト(講演、著作、セミナー)
  • たまに使うかも?
    • 雇用
      • なんか、企画出すときの知識くらい?
    • フリーランス
      • 場面を思いつかない。たまにしか使わないなら、iOSなんて時間のかかる学習に時間をかけるの、正直、無駄でしょ。

フルタイムとなると、絵や音楽、画面設計やコーディングを含めた専業開発があります。専業開発者の雇用形態は、企業もしくはフリーランスのいずれでも、ありうります。ここでのフリーランスは、個人で事業をする個人事業主の意味です。自分で会社をたちあげて起業した場合でも、法人のなかで経営者(ひょっとすると開発者も)をするので、これは雇用に分類して、ここでは区別はしません。

事業のためのiOSアプリならば、その企画保守運用の担当者も、フルタイムに区分できるでしょう。これは、フリーランスでは、まずありえない形態です。

###収益の流れをみてみる
次に収入で考えてみましょう。まず一人が生活する最低限の収入は、地域格差はありますが、病気や老後への備えを無視しても、最低でも年間400万円は必要でしょう。

収益の仕組み、を考えておくことが重要です。

  • 開発の成果物を収益とするもの
    • AppStoreで販売
      • 新規ユーザが増えてる場面なら、既存アプリが売れる。
      • 飽和した時が、考えもの。運用保守で、あるいは利用される都度、収益が取れるアプリでなければ、潰れる。
    • どんなアプリでも開発しますな受託
      • 開発し続けなけばならない。
      • 都度発生する顧客との打ち合わせコストなど、効率は最低。
      • 自社の得意分野があり開発リソースを使いまわしできない限り、長続きは、しない。立ち上げ期の一時的な収益確保には使える。
  • アプリを使ってもらうことで、収益が発生するもの
    • いわゆるソーシャルやゲーム、広告表示など
    • 自社事業のアプリ
      • 賃貸の物件検索など、本質、販売者と購入者をつなげる手数料が収益源の事業は、iOSアプリと相性がいい

専業開発者かつフリーランスでiOSアプリのストア販売収入であれば、有料85円のアプリを年間6.7万DLする必要があります。ユーザ数が爆発的に伸びている間は、新規ユーザがアプリを購入するため、伸びしろが期待できます。ユーザ数が飽和すると、バージョンアップで新規購入が期待できない場合は売上が急速に激減します。またアプリがサーバを利用する場合は、広告やユーザの行動履歴が収益になるものでなかれば、その保守運用費用で潰れます。

受託開発は、いまのiOSではSDKの機能が多くなり、現時点で、すでに個人で開発できる規模を超えていると思います。サーバとクライアント、iOSアプリと画面設計が全て独りでできる人は、とても数が少ないですし、またそのような人は、すでに仕事を沢山抱えていて、半年以上の待ちだったりします。外注先として、その人でなければならない、よほど特殊な合理的な理由がないかぎり、待ってられないでしょう。

数人で開発会社を起業した場合、デザインと開発と営業で担当を分けて、それぞれの領域で、時間あたりの案件処理件数を効率化して拡大することになります。複数人で事業として運営するならば、受託開発はありでしょう。1回開発したものを顧客ごとにちょっとカスタムすれば製品になる立場が得られれば、収益率が上がるでしょう。

###事業のアプリ活用に関わってみては?
賃貸やピザ配達などで、iOSアプリを活用する事例があります。賃貸の手数料が、家賃1ヶ月分で仮に6万円とすれば、極端な表現をすればアプリでワンクリックされれば6万円の収益が得られるわけです。これは、85円のアプリを1000本販売したのと同じ収益です。

自社の事業のためのアプリは、今後、あって当たり前になるでしょう。現在はまだ、ウェブサイトでネイティブ同等の使った時の快感が出せるほどの応答速度は出ません。クーポン発行も、まだ10年は電子メール併用でしょうが、そのうちに、アプリ連動でプッシュするあなただけの特別な個人にカスタムした発行が当然になっていくでしょう。それらは、アプリをインストールしないと、実現できないものです。

社内でのiOSアプリ担当では:

  • 企画、見積りと予算確保
  • 開発、導入、運用
  • 破棄

があります。ソフトウェアの企画は、それが使われて、破棄されるまでの流れで、とらえます。ライフサイクルのソフトウェア・ライフサイクル・プロセス, IT用語辞典 e-Wordsなど規格もあります。

iOSアプリの開発は、Windowsのアプリ開発とは、全く違います。外注で外に出して納品されれば数年は小さな改修だけで使い続けるようなものではありません。外にいるお客向けの店舗のように、必要に応じて全く違うものを開発する必要すら、生まれるでしょう。

そのようなアプリを運用していくには、その事業をよく知っている社内の人間が関わるほか、ありません。現在のiOSアプリとの関わり方としては、コーディング自体はできなくても、企画から破棄までの流れを自社事業視点で説明ができる能力を身につけ、部署を立ち上げ、そこのヘッドとして立ち位置を強めていくのが、最良でしょう。その会社の事業が継続する限り、顧客への情報流通という、最強の立場が得られます。取締役への確実かつ最短の経路です。

このほか

9ページ目からアプリの設計のプレゼンがはじまります。色々話しましたが、冒頭30分だけでこの分量になり、残り4時間分を書くのは大変なので、ここで筆を置きます。

発想法

  • KJ法
    • 文化人類学者川喜田二郎がデータをまとめるために考案した方法。収集した情報を小さなカードに書き、それをグループ化、分類する過程を通して、知見を得ていく発送方法。得られる結果がぼんやりしているときに、収集したデータから浮き彫りにするときなどに役立つ。
  • マインドマップ
    • 発想を木構造に広げて書き出す思考・発想の表現方法。私には、木構造を色や太さで絵的に表現するところに価値があるように思うので、PCなどのソフトウェアもあるが、手書きが一番だと思う。
  • ファシリテータの道具箱
    • ファシリテーションとは、会議やミーティングで、発現や参加の促進、話の流れの整理や認識のまとめなどをすること。そのための分析や可視化の手法が列挙されている。

デシケータで真空脱泡(メモ)

前職で実験室でちょっと脱泡するときに真空デシケータ+真空ポンプを使っていたので、メモ。

ググると自作している人がいる:

デシケータは実験用の樹脂製のもの。ポリカーボネートがもたない溶媒や高温なものには使えない。

デシケータには、穴が開いた板が底に欲しい。泡で樹脂が溢れても、その樹脂が下に流れていれば、容器が樹脂に沈まずに取り出せる。真空計があると、動作を目視できるので便利。

デシケータとポンプを組み合わせるのもあり:

デシケータは、いろいろある。

真空ポンプは、オイルレスがいい。ミストフィルタをつけておくのもありだけど。

ポンプは、オイルを使うロータリーポンプと、ダイアフラム型のものがある。ロータリーポンプは安価でよく引く。オイルミストを入れれば、オイルの飛沫が舞うこともないし、逆流防止機能がついているから、オイルが装置側に逆流することもないのだけど、油が入ってるのが心理的に抵抗感がある。ダイアフラム型は、その点は、安心。脱泡用途なら十分引く。

真空ポンプというほど引かないけど、真空ピンセットとかに使ってたやつ:

  • リニコン真空ポンプ
    • 2万円くらい
    • -33kPaで、大気圧の1/3くらいしか引かないけど、サンプルのチャックとかに使ってた。手のひらサイズで外付けのコンデンサもないので、手軽ではある。

デシケータとポンプは、チューブでつなぐ。間にT字バブルを入れて、排気したあと、ポンプにつながっているチューブを大気圧に戻す(オイルを使っていないなら、不要かもだけど)、またデシケータを大気圧に戻せるようにしておく。

StoryBoardとAutoLayout

  • StoryBoard
    • 画面設計と画面遷移
    • セグエ
  • AutoLayout

ドキュメント

AutoLayout

メモ:

  • WWDC 2012 Session 202, Introduction to Auto Layout for iOS and OS X

    • View階層に関係なく、見た目の任意のView間で制約をかけられる
      • View階層の共通の親がConstrainを持つ
    • 優先度が設定できる(デフォ 1000)
    • 35:23,コーディングで制約をASCIIアートで表現可能( H:[View1]-10-[View2] みたいに)
  • WWDC 2012 Session 228, Best Practices for Mastering Auto Layout

    • コードでViewを移行する
      • [view setTranslateAutoresizeMaskIntoConstrains:NO]
      • -(void)layoutSubviews { フレームサイズや位置の設定 }
    • デバッグ
      • IBは制約の矛盾や不足を自動で手当。手動コーディング時は、ログを見るなど。
      • [view hasAmbigousLayout]
      • [view exerciseAmbiguityInLayout]
      • [window visualizeconstrains:@[]]
      • [view constrainsAffectingLayoutForOrientation/Axis:…]
    • 矛盾する制約はサイズを0にする
      • foo.height = foo.width * 2
      • foo.width = foo.height * 3
      • この制約を満たす値は、0。Viewは表示されない。
    • アニメーション
      • CoreAnimation、Layout制約、いずれか。
      • Layout制約でアニメすると、制約を守ったまま、遷移する。
    • インターナショナル
      • 言語の向きに合わせて、制約の方向が自動切り替え
        • ボタンのテキストサイズとか、制約により自動で幅設定
        • 左から右に書く言語での制約なら、逆の向きに書く言語なら、左右対称で反転

更に進んだ話題:

  • Session 219 Advanced Collection Views and Building Custom Layouts

棚のような表示をするCollectionViewControllerのレイアウト部分をカスタムにすることで、円形に並んだ要素や、写真のフロー表示など、自在な表示をさせている。

AutoLayoutを使うべき?

現在のiOSの開発でのメリットは、

  1. iPhone5とiPhone4S以前の縦方向のサイズを、コードで区別する必要がなくなる
  2. 縦向きと横向きの画面を、レイアウトと制約ベースの設計にすると、楽かもしれない

適当なタイミングで切り替えてもいいのでは?程度。
ただし、Appleは、大きな切り替えが必要になるフレームワークを、それが必至になるハードウェアが出てくる前に、2年ほど先駆けて公開してくる。

おそらく来年、遅くても再来年には、AutoLayoutを使わないとやってられない、画面サイズの種類の多様化(縦方向サイズが3種類以上になる、あるいはベゼル部分までピクセルが拡張されて横幅比率が非整数なものが出る)、状態になるだろう。

ゲーム開発のように、OpenGLやCocos2dなどで、独自の画面設計をするものならば、使わない画面領域を黒色にしておくなどで、対応ができるだろう。

iOSのViewを使う通常アプリは、メインのViewの高さをAutoLayoutで可変にする手順を、テンプレ化して、使っていけばいいだろう。

CoreAnimationの概要理解と解説

  • Blocks
    • 概要の理解、さらりと。CoreAnimationで必要になれば、また戻って。
  • UIViewクラスのアニメーション
    • 基本のアニメーションを押さえます。
  • ViewControllerの紹介
    • アニメーション効果をふんだんに使っているCollectionViewControllerを紹介します。
  • CoreAnimation
    • 文書ベース、WWDCのデモ動画で動いてるところを見ながら理解
    • タイミングとパターンの指定方法。作りこみに必要っぽいのでそこを重点的に。

白板

ドキュメント

Blocksの概要

UIViewのアニメーションをするなら、Blocksを使うほうが圧倒的に便利。Delegateとの違いは:

  • アニメーションの処理を、その場 でかける
    • この部分はbeginAnimation/commitAnimationで囲むだけのdelegate利用と同じ
  • アニメーション終了時の処理を、その場でかける
    • ここが大きい。イベント処理の連結にBlocksは便利。
    • 次のアニメーションにつなげるなど。
    • delegateは、処理完了が1つのメソッドに集中する。そのため、コンテキストを渡して、どの文脈のアニメーションかをメソッド内部で判別しなければ、ならない。とても手間&コードの場所が別れるため、コードがとても読みにくい。
  • 変数を渡せる
    • Blocksは、変数を渡せる。デフォルトで読み込みのみ。書き戻したい時は__blocks修飾子をつける。
      • 変数は、値型(intやdoubleなど)と参照型(インスタンスなど)がある。
      • 値型を書き戻す用途は、多分ない(変更タイミングがわかんない書き戻しはしないだろう)
      • 参照型(インスタンス)は、そのメモリポインタからのメソッド呼び出しは自由だから、書き戻しを意識することなく、普通に使えばいい。

UIViewのアニメーション

WWDC 2010 Session 123 Building Animation Driven Interface

アニメーションを書く場所。View内部のアニメーションなら、View自体に書いたほうが、すっきりする。複数のViewを動かしたいなら、ViewControlleに書く方がいい。

やり方は、[viewController layoutIfNeeded]で-(void)layoutSubViews {} ?(やったことないから、わかんない)

ViewController

今では、ViewControllerで、必要な表現は間に合うようになっています。UIViewでは実現ができないアニメーションが必要になる場面は、ほとんどありません。ViewControllerは、次の2つのドキュメントを参照します:

UIViewCollectionController

iOS6から、iBooksのような、グリッドのレイアウト・コントローラが導入されました。その解説スライドは:

  • WWDC 2012 Session 205 Introducing CollectionViews
  • WWDC 2012 Session 219 Advanced Collection Views and Building Custom Layouts

です。Session205は、グリッドレイアウトの使い方を解説しています。APIはUITableViewと同じ、DataSourceを提供して、Cellは再利用されます。Cellは同じ幅である必要はありません。レイアウトを柔軟に配置をしてくれます。
TableViewででもですが、iOS6から、セル名をクラス名にしておけば、reusablel cellは、内部でインスタンスが作られるので、nil判定をする必要はなくなります。

Session219は、更に進んだCollection Viewの使い方です。レイアウトの制御コードを与えることで、グリッド以外の、写真やCDアルバムの表示に使われるフリップや、アイテムを円形に並べるなど、アイテムの任意のレイアウトが実現できます。

このCollection Viewと同等の表示を自分で実装するのは、大変です。それは、これがレイアウトに加えて、その表示のアニメーション、必要な数だけCellをつくり、またCellを再利用するという、付属の制御部分がかなりの量があり、UIViewでアニメーションで作れる、といった類のものではないからです。

コレクションの表示の時に、活用してください。

CoreGraphics(描画)

CoreImage

WWDCの動画を見るのが、てっとりばやい。CoreImageは、動画のフィルタ効果にも使える汎用の画像処理フィルタの仕組み。
CoreImageを使うなら、QuartzComposerを使うのもいいかも。CoreImageのフィルタを適用した時のプレビュツール。

4.5.2のXcodeでは、デフォルトでははいっていなくて、別にインストールする。

の一番下のを選ぶとブラウザが開く。
Graphics Tools for Xcode(いくつかあるので最新版を選んで)ダウンロードして展開すると、QuartzComposerがある。いっしょにOpenGLの最適化ツールもあるので、グラフィックな開発をするなら落としておくのがいいかも。

CoreAnimationをマスターしたい方には

Githubにあるサンプル・コード:

  • Core-Animation-Demos 基本のアニメーションが押さえてあるので、これ1つでOKだと思う。

静電容量分布を測るのに便利なmtouch、製品ラインナップ一新しすぎですorz

お手軽静電容量の評価

iPhoneを始めとするスマートフォンが身の回りにわんさと溢れかえり、タッチパネルが当たり前となっていますが、いまどきなタッチパネルが採用している方式は、ほぼ静電容量方式です。iPhoneサイズで5点、iPadサイズで10か11点検出がデフォルトとなっています。

液晶とタッチパネルが一緒だったのが、今はインセルタイプという、液晶と一体化したものまで登場していて、お金が動いている市場があれば、なんでも作ってきちゃうものだなと思うこのごろです。

ガジェット開発のために面分布を知りたい

さて、そんなiPhoneのタッチパネルと連携するガジェットを開発していると、“いまの静電容量の面分布はどれくらいだ?”と客観的に知りたくなるわけです。iOS SDKで取れるタッチ情報は、タッチした/していないの0/1情報だけです。そんな0/1情報だけでは、この作りがいいのか、わるいのか、どっちの方向に進めばいいのか、まったく判断のあてになりません。

できればiPhoneのパネルを使って、パネル評価に使ってそうな測定装置を買ってきて、実機相当の測定がそのままできればいいのですが、まずiPhoneのタッチパネルのコネクタピン配置なんて、ググっても出てこず、見つけるのが一苦労しそうです (コネクタは見つけたので、今度やってみようと思いますが) そして静電容量の測定装置も、お手軽価格とはいえず…

静電容量方式のタッチパネルの開発キットのゲット、結構大変

そうなれば、静電容量方式のタッチパネルの開発キットをゲットして、その生データ引っこ抜けばいいじゃんと思って探すのですが、一般に販売してくれるところがないのです、これが。Cypress、 ATMEL、Texus Instruments、いろんな会社がタッチパネルのコントローラを販売しています。TI社なんて、代々iPhone採用されるくらいですiPhone 3GS Uses TI Touch Screen Chip

それで、開発キットをくださいません?と問い合わせをすると、年間んー万個売るのが最低条件ね♡、と素敵な返答が返って来ました。そりゃそうですよね、囲い込みたい技術情報を、小口一般を相手に公開するわけがないですよねorz

そんななかで、唯一、一般に開発キットを販売していたのが、Microchip社です。mtouchというブランドで。素敵>ω<

10月にPIC16F707の開発キットmTouch Projected Capacitive Development Kitをゲットしてて、これが3.5インチのタッチパネル+センサーで、デモソフトが自己容量と相互容量の生データ表示と、まさにこれが欲しかったのよの、素敵すぎる仕様です。

PCからはUSBシリアルで見えてるから、あとはシリアルからデータをひっこぬいて表示する独自アプリを作れば、なんでもできると思っていました、10月までは。

ラインナップ一新してますがなorz

それが12月になってみたら、mtouchのラインナップ一新してて、ソフトまで統合されてて、素敵な状況にorz
10点タッチ検出&3Dジェスチャー検出の素敵な石が開発されてて、2013年2月から開発デモキットが出荷される状態みたいです。なんて、はざまにはまったのでしょうかorz

いや、開発キットだから、なくなれば自分で作れっていうものなので、これくらいの変化は仕方ないんでしょうけどね…

オーバレイのタッチパネルなら3Mのが便利

余談ですが、タッチパネルを簡単に使いたいなら、3MのMicro Touch Systemがおすすめ。
3Mは抵抗方式のもだしているけれど、それではない方式のもの。Digikeyで購入できるのが、素敵です。

http://www.digikey.com/scripts/dksearch/dksus.dll?FV=fff40008%2Cfff802ca%2Cfffc0013&k=3m+touch&vendor=0&mnonly=0&newproducts=0&ptm=0&fid=0&quantity=0&PV-5=22891&PV-5=22892

原理は、容量検出のはずだけど、説明を読んでても、実物を見ても、よくわからない。
サイズは、7インチから32インチまで、タッチは20~60点の同時検出。
コントローラはシリアルとUSB接続があって、どっちも信はシリアルなデータ垂れ流し状態。

タッチ情報を、ドライバ経由でWindowsに持って行く事もできるし、3Mが出している開発キットを使ってタッチ点やジェスチャのデータをWindowsを介さず直接とりだすこともできる。(C++のサンプルとlibがある)。なかなか便利。