PhoneGap 3.3.0でiOS開発する
PhoneGapとは
HTML5+CSS+JavaScriptのみでさまざまなスマートフォンプラットフォーム、例えばAndroid、iOS、Windows Phone7/8、BlackBerryに対応できるフレームワークです。
なんでこんなもん使おうと思ったのか
html5で本来ネイティブアプリケーションでないと操作が難しかった、ファイル、カメラ、GPS、近接センサ、電池残量検出といった機能を実装できる様になってきました。
もし、ブラウザで完結できるようなアプリであれば、わざわざXcodeをつかう開発しなくていいので、ブログやプレゼンでjsのコードだけ貼付けておけば手軽に試してもらえるかな、と思った訳です。
具体的にはマイクで音声信号を広い、デコードした内容に応じて結果をスピーカから音声で返すモデムの実装です。(一時期流行ったAudio Hi-Jackです)
でも、現実はそんなに甘くなく
ブラウザ経由でマイクからの音声を取得するのにgetUserMedia() APIを使いますが、これは2014年1月現在iOS Safariでは対応していないわけです。
というわけで、(Xcodeで開発しなきゃならないのは仕方ないですが)マイクの取得=ネイティブ or それに準ずる環境、それ以外=HTML5 + JSで実行する事になります。このような理由からPhoneGapを使いました。
導入まで
導入方法が書いてある書籍やブログに当たったんですが、3.3.0ではかなり変わっちゃったみたいで少し苦労しました。
以下はそのメモ。
まずPhoneGap本家サイト:
PhoneGap | Home
※ Xcodeの導入、iOSデバイスのプロビジョニング関連は完了しているものとする。またnode.jsは導入済みのものとする
本体のインストール
$ sudo npm install -g phonegap
作りたいアプリケーションをCompany Identifierとともに指定します。自分の場合はVoiceCoderと言う名前で、Identifierはcom.lynxeyed.voicecoderとしました。
$ phonegap create voicecoder com.lynxeyed.voicecoder "VoiceCoder"
ディレクトリに移動
$ cd voicecoder/
使用するプラグインを導入します。今回はMedia API、Media Capture APIを使うのでこちらを導入しました
$ phonegap plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-media.git $ phonegap plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-media-capture.git
iOS用にビルドします。
$ phonegap build ios
すると、XCode用プロジェクトが、[アプリケーション名]/platform/ios/ 配下に作成されます。
とりあえず、このプロジェクトファイルをダブルクリックして、Xcodeを起動します。
実行します。
実機を指定している場合はiOSデバイス本体、そうでない場合はシミュレータが立ち上がって
こんな感じになれば動作確認は終了です
とりあえずマイクから録音できるか確認する
Audio Hi-Jackネタではマイクが使えないといけないので、ここだけ確認します。
使うのはPhoneGapのMedia APIです。
以下のサイトのコードをほぼそのまま使っています。が、3.3.0ではiOS、AndroidでMedia APIの呼び出すメソッドの差異は無い模様なので修正しました。
ASCII.jp:JavaScriptで作れるiPhone用ボイスレコーダー (1/5)|古籏一浩のJavaScriptラボ
画面はこんな感じ。
以下を/www配下のindex.htmlに記述します。iOS以外でも動作するはずですがwebkit系のブラウザ以外ではスタイルが崩れるはずなので各自修正を。
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <style> .btn { font-family: Arial, Helvetica, sans-serif; font-size: 28px; color: #fff; padding: 12px 18px; background: #8893da; background: -webkit-gradient( linear, left top, left bottom, from(#8893da), to(#344c77) ); border-radius: 10px; -webkit-box-shadow: 12px 12px 12px rgba(000, 000, 000, 0.3), inset 0px 0px 0px rgba(255, 255, 255, 0); text-shadow: 10px 10px 10px rgba(000, 000, 000, 1), } </style> <script type="text/javascript" charset="utf-8" src="phonegap.js"></script> <script type="text/javascript" charset="utf-8"> var rec = null; var src = null; document.addEventListener("deviceready", init(), false); function init(){ src = "test.wav"; } function startRec(){ rec = new Media(src, // success callback function() { console.log("Audio Success"); }, // error callback function(err) { console.log("Audio Error: "+ err.code); }); // Record audio rec.startRecord(); document.getElementById("stat").innerHTML = "recording..."; } function stopRec(){ rec.stopRecord(); document.getElementById("stat").innerHTML = "stop recording"; } function playRec(){ rec.play(); document.getElementById("stat").innerHTML = "play..."; } function playStop(){ rec.stop(); document.getElementById("stat").innerHTML = "stop playing"; } </script> </head> <body> <h1>Using Media APIs</h1> <div> <button class="btn" onclick="startRec()">REC</button> <button class="btn" onclick="stopRec()">STOP REC</button> <button class="btn" onclick="playRec()">PLY</button> <button class="btn" onclick="playStop()">STOP PLAY</button> </div> <div id="stat"></div> </body> </html>
エナジーハーベストPLDボードRODSZEPTA進捗状況(その2)
デバイステストが終了
RODSZEPTAにはエナジーハーベスト用電源管理ICにLTC3330を試験的に採用しています。
LTC3588-1と基本的構造は同じですが、バックブーストDCDCとLDOの2電源を内蔵しているところが異なります。また取得できる電流が少し減っているようです。
詳しくは LTC3330 - 環境発電(エナジーハーベスト)バッテリ寿命延長回路を内蔵したナノパワー昇降圧DC/DCコンバータ - Linear Technology
この電源ICの内蔵LDOからMAX Vのコア電源1.8V、その他IO電源をDCDCから取得しようと計画していました。
下の写真は加速劣化試験後のRODSZEPTA
また振動発電を主なオルタネイティブ電圧源としてしているので、耐圧が低めの電気二重層コンデンサでも発電支援をしてくれるスーパーキャパシタバランサの特性も測定していました。
結果はほぼデータシート通りでしたので特筆する所は無いのですが、2電源欲しい場合、LTC3588-1に小電力タイプLDOを併用したときと比べてエネルギー損失にあまり差がないにもかかわらず、コストが倍近くかかることや、実装面積比の優位性が無いことなどがあり今回、LTC3330は一旦採用を見送りLTC3588-1を使ってみようと思います。
なお、一次電池によるバックアップはLTC3588-1でも可能です。
というわけで
LTC3588-1を試すのに便利なモジュールを買いました
秋月の環境発電モジュール
圧電環境発電(エナジーハーベスト)電源IC LTC3588−1: 半導体 秋月電子通商 電子部品 ネット通販
これに、MAXVのコア電源1.8VはマイクロチップのMCP1801
http://ww1.microchip.com/downloads/en/DeviceDoc/22051c.pdf
を使おうと思います。
省電力イメージセンサボードを作る
事の発端
今年の初めに友人と天王寺ミオで、
こんな↓ラジコンにラインスキャン乗せて映像撮ったら面白そうだねという会話
でも大容量Li-PO電池もたないといけないかも、ついでに重くなるから出力上げないと、という話をしてたときに、
「振動で発電すれば電池要らないんじゃね?」
ということになり、作ってみるかと。
その後、雑事に忙殺されてなかなか暇が取れませんでしたが思い出したように作ってみました。振動のみで発電するのは難しいことが分かったので、一次電池との組み合わせにしました
ボード外形
・エナジーハーベストイメージセンサ制御ボード "RODSZEPTA (ラセタ)"
プロセッサ:NXP LPC800シリーズ
コプロ:Altera MAX V CPLD 5M570ZT
「勝手にAltera30周年記念祭り」と称してのAlteraデバイスの採用ですが、Avalon-MM MasterBridgeと外部マイコンの組み合わせは仕事でも重宝しています。今回もこれを前提にシステムを設計しています。
イメージセンサと振動発電用ピエゾフィルムは交換可能なように別基板でマウントする方式です。
イメージセンサ、コプロは必要なときだけ起動し、撮影が終わったら省電力モードに。
プロセッサはタイマで必要なときに起床します。
基板おもて面
基板うら面(表面からの透過)
試作は2層、デバッグ終わり次第4層の基板で製作する予定です。
週明けに発注すれば、年明けには来るかな?
職を選ぶということと難儀
過去の話をば
技術的なことから少しだけ離れた記事ですが、よく同じ研究室やサークルだった愛すべき(笑)後輩たちから聞かれるのでここで参考がてら私の話をしましょう。
まず
(1) 今何してるの
溶接、車載機器の開発をする会社の画像処理担当 兼 車載電装事業部長
アクセサリ(カーナビ、カーオーディオ)からASR(スリップ抑制)のための画像処理による運転支援。主に後者の開発が部署のメインです。またタイヤ成分の化学分析も行います。
悪環境な場面で活躍する車載電装が得意なことから、風雨にさらされやすい、街路樹などのLED電飾の依頼もあり今年は3箇所での設計をしています。LEDの点灯パターンを人の流量や挙動で変えたりと、どこかに画像処理が入ってたりします。
(2) そこに至るようになった経緯は
1,2は同時にやっていました。というか2の会社に1の部門がやってきたわけですが、半年スパンで行ったりきたりしてました。
その部門はリーマンショック、震災と続いたのが影響して部門としては解散してしまいましたが、いまでもお仕事を頂いたりします。(この記事を書いてる時点でも1件頂いてます。ありがとうございます)
3. の会社。ここには正直難儀しました。
(i) 当日になるまで何するか決まってない。社長の気まぐれで始まる
(ii) 言ったことを次の瞬間に撤回、やっぱり別のことをやれと言い出す
(iii) しばらくしたら「アレどうなった?」と撤回前の件の進捗を聞く(当然やってない)
(iv) わめきだす。
さて対策を練るわけです。たぶんぼくの仕事の仕方が悪かったのでしょう。次の日も前日のことを忘れて同じパターンで始まります
(i) 当日になるまで何するか決まってない。社長の気まぐれで始まる
(ii) 言ったことを次の瞬間に撤回、やっぱり別のことをやれと言い出す
(iii) 撤回前の件と撤回後の件、そのプロセスに必要な要素を見つけ、どこから最優先にすべきか聞く
(iv) 返事「全部」
(v) 「全部」の真意を聞く
(vi) わめ(ry
コントです。お笑いやりにここに来たつもりはありません。
だいたい、優先度を聞いて「全部」という返事はなんですか、組み込みRTOSだってそんなのディスパッチ処理しないでしょう。
で、わめいたり、嫌味をならべたてて騒ぐわけです。40歳目前のオトナが何をしてるんだ。
こっちも仕事中は録音機を四六時中作動させるようになりました。*1
理由はメモするな、といわれたので思い出せなくなると困るからですが、今録音聞き直したら、院時代の研究内容を聞いてそれをバカにしたりなどしてましたね。技術士の倫理規範を逸脱した行為です。
複数のタスクがある場合はスケジューリングをするのは当然です。
この社長、昼過ぎに出社して、3時過ぎに帰る。
まぁ別にそれは1,2の職場でもあった事のなので別にかまわないでしょう。外部の仕事もあるはずです。仕事と金とってくるのが仕事です。
が、家に帰って夜中に起きて、散々スタッフにメール出して、真夜中に反応なくてイラついたのか知りませんが「明日AM9:30までに仕上げてください」ってそれどうなんですか。
はー。スカイプID教えなくてよかった。夜中にかかってくるぞ(笑
計画性のなさは仕事中にもよく現れました。あるプログラムを共同で作る必要がありました。gitもsvnも使わないとか言い出すわけです。
まぁいいでしょう。開発は2,3人です。diffとって慎重にやればできなくはないでしょう。
とおもったら、目で見て判断してただけだったようです。私の作業全部ぶっつぶれてました。
そんなわけのわからんもの使えるか、とでもいいたかったようですがやってることが訳分からん。
それの繰り返し。いい加減苦言を呈したところ、「技術がないものがいわゆる便利ツールにたよるのは御法度」などとのたまう。
まぁいいでしょう。向こうも僕に言いたいことは山ほどあるでしょう。
さて、とあるとき、Android、Windows Phone(iOSはJS関連の制約でやめたと記憶)でのサービスを提供するという話になったときがあり、端末側のアプリを担当することになっていました。
当時はAndroid StudioもありませんでしたのでEclipse for JavaやVS、Blender、xnaをインストールするわけです。
その後、別の案件が舞い込んできて2ヶ月ほど離れていましたが、その後そのPCの上記インストール物をみて「会社で遊ばないでください」
何いってんだホント。。。
Androidアプリが完成したときにもうこれ以上やりたくない。元気があるうちにここから去りたい、と心底思っていました。
そのころ、胃に穴があくことが度々あり、医者に20代の今はいい、40代以降になったときの癌の確率が大幅に上がる、いい加減身の振り方を考えろ。と助言をされていました。
また結婚を控えていて、これも少なからぬストレスにはなっていたと思います。
大幅なモチベーションの低下は仕事にも現れるわけで、当然できたことすら出来なくなっていくのを実感しました。
数社から(1,2含む)、「来いよ。待ってる」というオファがあったこともあり、会社都合によるドロップアウトをしました。
そして
で、就職活動を控えている後輩たちと、面接を控えてる皆さん。こんな脅しの文章書いて申し訳ない。
でも入ってみないと分からないのは事実です。面接官だって採用してしばらくたたないとその人が有用かどうか分からないはず。裏返せば、みんなも社内の風潮や面子を知りえることなどできない。
多くの約束をせよ。だがそれを果たすな。これが君主として振舞える条件である ― ナポレオン・ボナパルト (が言ったとされている)
ボーナス出る出るとか、待遇上がるよ、などとうそにならない程度にほのめかすと社員はがんばる、上手に半殺しにしておけ的な内容が「経営の上手な社長になるには」みたいな意識高い()啓蒙本に書いてありますね。なんなんですかねこれ。
ただ、言えることは「まじめ」の定義を曲じまげて皆さんに仕事を強要する組織にいる必要はありません。それこそ不真面目な組織なのです。
必ずその者たちは「常識」という言葉を使ってくるでしょう。なんですかそれは。
「説明できないけど、俺がお前たちにやらせたいことをお前の良心に訴えて無理やりやらせる口実」くらいに思っておいたほうがよいです。
お前は技術がない、お前は常識がない、お前は(ry
まぁ耳にタコができるくらいききましたわ。自分が知らないことを提示される焦りなのか知りませんが…これ、新人を蹴落とす洗礼のようですね。
看過できなくなる前に相談すべきと思う。研究室の教授、先輩、もし親がご健在なら親(もちろん、引退されてる方が多いでしょう。情勢は今と異なるので参考程度に)相談すべきです。
どこかで答えが返ってくるはず。後輩のみなさん、わたしも協力できるならその一助を担おうと思います。
今に至るにはもうワンステップあります、その話はまた別のときに。
*1:当然ですが、今も会議や商談では必ず録音します
PSoC4 Pioneer Kitでtelnet
何か作ろう
PSoC4 Pioneer KitキャンペーンPSoC 4 Pioneer Kitキャンペーン PSoC 4でデザインしよう!使ってみたいデザイン案を投稿して、無償でキットをゲット!の応募に当選しちゃいました。
ありがとうございます!!(中野の方角向きながら
Cortex-M0ということで、すこし遊べるでしょう。
UARTの出力がUSBからでてこない
動かなくてうんうん唸ってましたが、マニュアル見ろってはなしでしたw
http://www.cypress.com/?docID=43713のp.61~
ジャンパでPSoC5LPと配線してあげる必要があるみたいです。
ArduinoのD0(P0.4),D1(P0.5)以外にも接続可能な箇所があります。
Systickの割り込みってどうやれば
OSやらフレームワークやら移植するのにCortex-MシリーズはSystickから1msecタイマーを作ることが多いですが、PSoC4でどうやれば良いのか分からなかったので調べてみました。
PSoC4 SysTick interrupt-サイプレス
ここによるとVector#15がsystickの割り込みなので、1msecごとに割り込みを発生させてmsTicksをカウントアップするには以下の様にすれば良いはずです。メインルーチンからsetup_systickをコールしてやります。
int msTicks; void SysTick_Handler(void) { msTicks++; /* increment counter necessary in Delay() */ } void setup_systick (void) { CyIntSetSysVector(15,SysTick_Handler); // 1msecごとに割り込み if (SysTick_Config( (システムクロックの値) / 1000)) { while (1); /* Capture error */ } CyGlobalIntEnable; }
W5100のEthernetシールドで遊ぶ
Element14のページにEthernet shieldのWebServerのサンプルがあります。
PSoC 4 Pioneer Kit Community Project#031 – Ethernet Shield - element14
さくっと動かそうとしたのですが、動きません。動かなくてうんうん唸ってましたが、写真にあったw
イーサーネットシールドは6ピンのICSP端子からしかSPIは接続されていない模様。
※イーサーネットシールドの回路図
なので、6ピンを半田付けします。
さて、Element14のサンプルそのままでも使えない事は無いのですが、やたらめったらArduinoライブラリがくっついてくるので収拾がつかなく、他のプロジェクトに転用できない感じです。
ちなみに純正ドライバ↓
Innovative Embedded Networking : Device Server, WiFi, Ethernet | WIZnet Co. Ltd.
Wiznetの純正ドライバを元に、低レイヤーをC、アプリケーションに近いレイヤーをC++で記述しました。
lynxeyed-atsu/W5100_PSoC4_telnet_test · GitHub
他のデバイスに移植したい場合、device_depend.cを該当デバイス用ドライバに書き換えれば動作するはずです。
main.cppのIPアドレスはご自分の環境に書き換えてください。自分の場合は169.254.22.31にしました。
// Network Settigs uint8 mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA0, 0x8A }; uint8 ip[] = { 169, 254, 22, 31 }; // use port 23:Telnet Server server = Server(23);
動作中の図。I2Cポートから何やらジャンパーが生えてますが、PSoC4のUARTです。この箇所にUARTを割り当ててます。
■telnetループバック
TeraTermを立ち上げまして、
telnetでループバックします。キーボードの入力をディスプレーに出力します
はいバッチィです。
おしまい。
◆次回
PSoC4のCY8C4100シリーズはPSoCの特徴でもあったUDBが無く、今回のPioneer Kitに載っている4200も大幅に削減されてコストを抑える思い切ったデバイスになっています。UDBはVerilogでカスタムロジックの開発もできる尖ったデバイスですが、4200ではすぐにロジックが枯渇するでしょう。ここでCypressはシフト、加減算、バイトスワップなど単純なロジックはdatapath、それ以外の複雑なロジックはPLDベースのグルーロジックを使いわけることによってこの問題に対処することを提案しています。
次回はdatapath話題でも。
◆参考
PSoC CreatorでC++を使う方法
http://www.element14.com/community/servlet/JiveServlet/download/79763-114371/C%2B%2B%20In%20Creator.doc
ネットワークインターフェース部品の電子工作(W5100,ENC28J60,etc)
http://www.kako.com/neta/2009-003/2009-003.html
mbed LPC1768でJVM
RAMを豪快に使うだけのあそび
前回(RunnableインターフェースでマルチスレッドLチカ - Lynx-EyEDの電音鍵盤 新館)の続き。
JVMをmbedに移植しました。らくちん。mbedいいよmbed。
mbed LPC11U24/LPC1768には2MBのフラッシュがついています。classファイルをTest.claという名前にリネームしてmbedにコピー(←ファイル名が8.3形式にしか対応していない模様)すると、これを逐次解釈します。
↓こちらからフォークしてください。対応mbedはLPC11U24,LPC1768です*1
https://mbed.org/users/lynxeyed_atsu/code/FRDM_RaVem_JVM/
mallocとreallocがメモリーを取得できていないにもかかわらず、NULLを返さないコンパイラが一部にあったので、スタック領域に動的メモリを擬似的に確保するメモリプールマネージメントを実装しています。pool.hをご覧下さい。
今回作ったJVMはスレッドをnewするたびにメモリを動的に確保します。したがってメモリが少ないLPC812、LPC11U24、LPC1114だと1スレッド動作が現実的と言えます。
で、超ご無沙汰してるmbed LPC1768。LPC1768のCPUが使用できるRAMは比較的多いので4スレッドスーバーエコジャナイシステムを作りました。
上記のコードを2箇所修正します。
[device_depend.cpp]の5行目を
#define bc_str_length 2048 // from 32 to 1024
に変更(2048にする)。これはバイトコードをフラッシュからRAMにコピーするための領域です。(2048 = 2キロバイト)
[pool.h]の19行目。
#define pool_size 512 // 256 * (sizeof(int)) = 1kByte
に変更する。これはJVMが使うRAMのヒープ領域です*2。int型(=4バイト)アラインメントしてるので512 x 4 = 2キロバイトです。
コンパイルしてmbedに書き込みます。
Javaのコードの作成
(前回)のSoftBlinkLEDTest.javaを修正します。lpc800.javaも前回を参考に用意しておいてください。
public class SoftBlinkLEDTest implements Runnable{ private int x,y; public SoftBlinkLEDTest(int bit_num, int sleep_time_ms){ x = bit_num; y = sleep_time_ms; } public static void main(String[] args){ SoftBlinkLEDTest LED1 = new SoftBlinkLEDTest(0, 90); // LED1, half-cycle = 90msec SoftBlinkLEDTest LED2 = new SoftBlinkLEDTest(1, 100); // LED2, half-cycle = 100msec SoftBlinkLEDTest LED3 = new SoftBlinkLEDTest(2, 500); // LED3, half-cycle = 500msec SoftBlinkLEDTest LED4 = new SoftBlinkLEDTest(3, 1000); // LED4, half-cycle = 1000msec Thread th1 = new Thread(LED1); Thread th2 = new Thread(LED2); Thread th3 = new Thread(LED3); Thread th4 = new Thread(LED4); th1.start(); th2.start(); th3.start(); th4.start(); } public void run(){ int port_bit = x, time = y; while(true){ try{ Thread.sleep(time); }catch(Exception e){} lpc800.portWrite(port_bit, 1); //System.out.println("LED_on"); try{ Thread.sleep(time); }catch(Exception e){} lpc800.portWrite(port_bit, 0); //System.out.println("LED_off"); } } }
javacコンパイル。
$ javac SoftBlinkLEDTest.java
SoftBlinkLEDTest.classをリネーム
$ mv SoftBlinkLEDTest.class Test.cla
Test.claをmbed LPC1768にコピー。
mbedのマスストレージはこんな感じになってるはず。
リセットボタンを押してスタート。ロードに2,3秒かかります。
↓こんな感じに動作するはず。