2012/11/05

ヘッドマウントディスプレイ

sonyのHMZ-T2を購入した。ソニーストアでAV機器10%割引クーポンを使って、62,820円。高いオモチャだが、、、
使ってみての感想は、さすが“Personal 3D Viewer”と言うだけあって3D映像は圧巻!3Dテレビの不自然さやチラツキも全くないし、映画館で見る3Dのなんか箱庭っぽい感じもなくて、奥行きが無限遠まで広がる感じで、かなり自然。自然すぎて3Dであることを忘れるぐらい(それって良くないのか?、、、)でも2Dとは明らかに違う感じ。
だた、これを着けているところを他人が見たら、かなり不自然で滑稽。。。

画面の大きさは、映画館の真ん中からスクリーンを見た時の大きさぐらい、もしくは2m先の65インチテレビを見た時の大きさぐらいに感じる。(画面までの距離感は全くつかめず気持ち次第)

買ってよかったと思える商品。wowowとかBSで3D放送を録画して楽しも!BDもレンタルしてこよう!

ちなみに3D放送の録画は、3Dに対応していない機器でも良いし、4倍モードとかでも全く問題なし。


2012/10/21

eeePCのAndroid化

ノートPCを買ったことで出番の無くなったネットブックのeeePC901-X。しばらく放っていたけどWeb閲覧とメールをサッと立ちあげてリビングで使うためにAndroidをインストールしてみた。

ここから「android-x86-4.0-RC2-eeepc.iso」をダウンロードして、「DD for Windows」でUSBメモリにisoイメージを書き込んで、eeePCに挿して起動すればインストールできた。

あとは、以下の手順で、android x86でARMをエミュレートできるようにすれば完了。
ここを参考にここからibhoudiniとlibdvm_houdini.so、houdini_armlibs.tgzをダウンロードして、libhoudiniとlibdvm_houdini.soを/system/lib/ディレクトリ以下にコピー。houdini_armlibs.tgzを解凍してできたファイルを/system/lib/arm/ディレクトリを作ってそこにコピー。再起動。
これで、「google日本語入力」とかが使えるようになる。



動作はサクサク、キーボード付きのアンドロイド4.0端末の出来上がり!
注意点はキーボード配列がUSなので@を入力する時は「Shift+2」

2012/10/14

グローバルデータ

北京出張中のデータ通信用にグローバルデータのMiFiをレンタルしていった。
実物がこれ。
これとWiFiでパソコンとかスマホを接続すれば、webサイトやメールを確認できる、はずだったのだが。。。持っていったPCとはすぐに接続できたのに、スマホと接続できない。
スマホは先日購入したXperia sola。全然接続できず、接続してもすぐに切断されてしまう。スマホと接続できなかったら、これをレンタルした価値が半減以下に。
ネットで調べたら、どうもXperia solaと繋がらないWifi機器がチョイチョイあるようだ。今回レンタルしたMiFiもそれだったようだ。
で、ちょっと強引なことやってみた!
レンタルしたMiFiからSIMカードをぶっこ抜いてXperia solaに挿してみたら、自動的にAPN設定をダウンロードして簡単に通信できた。(ちなみにSIMはChina Unicomだった)
流石SIMフリー!パソコンと繋げるときは、Xperia solaでテザリングすればOKだし、かなり快適なネット環境が手に入った。
(利用規約上、問題が有るかどうかは未確認なので同じことする時は自己責任で。。。)

2012/09/30

Xperia sola 購入

今まで使っていたXperia X10(SO-01B)の動きがもっさり遅くてイライラしてきたので、新しいスマホを購入。
Xperia SXがサイズ的にも機能的にもベストだったけど、値段が高すぎて手が出ない。安めで小さめサイズとなるとXperia solaがベターな選択になりました。
実際購入したのは、これ。液晶保護シート・送料・関税込みで24,480円でした。

海外モデルなので最初からSIMフリーなのはいいんですが、フォントが中華フォントでちょっと微妙、、、戻るとか直すがこんな感じ。


でも、うれしい誤算がこの記事SONYがXperia solaのICSアップデートにおいて、「手袋モード(glove mode)」なる新しい機能を追加します。
冬に手袋したままスマホを触れる!!寒くなるまでにアップデートしてほしいな。


2012/05/12

組込み用RTOS作成(μITRON風)3

rot_rdqとdly_tskの実装

/****************************************************/
// タスクの優先順位の回転
// 次のタスクに制御権を渡す
/****************************************************/
void rot_rdq(void)
{
int i_oldtaskid;
i_oldtaskid = iCurrentTaskID; // 現在の実行タスク番号を保存
iCurrentTaskID++; // 次の実行タスク番号へ
if(iCurrentTaskID >= TASK_MAX) iCurrentTaskID = 0; // タスク数以上なら先頭タスクへ
dispatch(&TCB[i_oldtaskid].iSP, TCB[iCurrentTaskID].iSP); // ディスパッチ
}

説明するほどではないが、現在実行中のタスクのスタックポインタ保存先アドレスと次に実行するタスクのスタックポインタ値をdispatchの引数として渡している。

/****************************************************/
// 自タスクの遅延
// int dly_time 遅延時間(0~)
// 単位:TAU0チャンネル0のインターバル時間
// dly_time時間以上実行を一時停止する
/****************************************************/
void dly_tsk(int dly_time)
{
TCB[iCurrentTaskID].iWaitTime = dly_time + 1; // 待ち時間をセット
while(TCB[iCurrentTaskID].iWaitTime){ // 0になるまで待ち
rot_rdq();
}
}

こちらも説明するほどではないが、タスクコントロールブロックの待ち時間に遅延時間をセットしてその値が0になるまでrot_rdqして待っている。dly_timeに1を足しているのは、μITRONの仕様が「遅延時間以上待つこと」となっている為とdly_time=0の時でも1回はrot_rdqさせる為。

TCB[iCurrentTaskID].iWaitTimeのカウントダウンはこんな感じ。

__interrupt void MD_INTTM00(void)
{
/* Start user code. Do not edit comment generated here */
/****************************************************/
// タスクの待ち時間をカウントダウン
/****************************************************/
int i;
for(i = 0; i < TASK_MAX; i++){ // 全タスクをループ
if(TCB[i].iWaitTime > 0){  // 待ち時間ありなら
TCB[i].iWaitTime--; // カウントダウン
}
}
/* End user code. Do not edit comment generated here */
}

インターバルタイマ割り込み(TAU0のチャンネル0)を使用してタスク待ち時間をカウントダウンしている。

最後にmain関数でタスクの生成とRTOSのスタート

void main(void)
{
/* Start user code. Do not edit comment generated here */
cre_tsk(0, tsk_task0);
cre_tsk(1, tsk_task1);
cre_tsk(2, tsk_task2);
sta_TmRtos();
while (1U)
{
;
}
/* End user code. Do not edit comment generated here */
}

タスク関数はμITRONと同じで無限ループにして、こんな感じで定義

void tsk_task0(void)
{
while(1){
P8.0 ^= 1; // LED0反転
rot_rdq();
}
}

void tsk_task1(void)
{
while(1){
P8.1 = 0; // LED1点灯
dly_tsk(200); // ms待ち
P8.1 = 1; // LED1消灯
dly_tsk(300); // ms待ち
}
}

void tsk_task2(void)
{
while(1){
P8.2 ^= 1; // LED2反転
dly_tsk(500); // ms待ち
}
}

シミュレータ実行画面はこんな感じ。

今回作成した、なんちゃってRTOSのソースファイルTMrtos.zipここからダウンロードできます。


組込み用RTOS作成(μITRON風)2

タスクのディスパッチは、出来そうなので次は初っ端のタスク呼び出しをどうするか?考えた。要は最初のディスパッチのときにタスク関数のアドレスがスタックに積まれていれば、そこに戻る(ジャンプする)のでタスクを生成した時点でスタックの中身をいじっておけば良い。
こんな感じ。

/****************************************************/
// タスクの生成
// int taskID タスクID(0~TASK_MAX-1)
// void (*func_task)() タスク関数のアドレス
/****************************************************/
void cre_tsk(int taskID, void (*func_task)())
{
// スタック初期化
char* taskSP; // スタックポインタ
taskSP = &cTaskStack[taskID][0]; // スタック先頭アドレス
taskSP += TASK_STACK_SIZE; // スタック領域の終端
// 最初のdispatch用にタスクの先頭アドレスをスタックにセット
*--taskSP = (char)((long)func_task >> 24); // PUSH 戻りアドレス
*--taskSP = (char)((long)func_task >> 16); // PUSH 戻りアドレス
*--taskSP = (char)((long)func_task >> 8); // PUSH 戻りアドレス
*--taskSP = (char)((long)func_task); // PUSH 戻りアドレス
// 最初のdispatch用にダミーのレジスタ値をスタックにセット
*--taskSP = 0xa0; // PUSH A (dummy)
*--taskSP = 0x0a; // PUSH X (dummy)
*--taskSP = 0xbb; // PUSH B (dummy)
*--taskSP = 0xcc; // PUSH C (dummy)
*--taskSP = 0xdd; // PUSH D (dummy)
*--taskSP = 0xee; // PUSH E (dummy)
*--taskSP = 0x50; // PUSH H (dummy)
*--taskSP = 0x05; // PUSH L (dummy)
// TCB設定
TCB[taskID].iSP = (int)taskSP; // スタックポインタ保存
TCB[taskID].iWaitTime = 0; // 待ち時間設定
}

※ *--taskSP がわかりにくい表現だが、ポインタをデクリメントしてから値を代入している=スタックにPUSHする動作と同じ

これで、最初のディスパッチの時にタスク関数へ戻る(ジャンプする)準備ができた。
では、最初のディスパッチをしてみよう。
こんな感じ。

/****************************************************/
// リアルタイムOSのスタート
// 全タスク生成後1度だけコールする。
// コール後はタスクを起動し戻ってこない
/****************************************************/
void sta_TmRtos(void)
{
int i_dummy_sp; // OS起動前のスタックポインタ値保存用
TAU0_Channel0_Start(); // TmRtosOS用タイマ起動
iCurrentTaskID = 0; // TaskID = 0からスタート
dispatch(&i_dummy_sp, TCB[iCurrentTaskID].iSP); // ディスパッチ
}

※TAU0_Channel0_Start();は、これから作成するdly_tsk()で使用するインターバルタイマの起動。

タスク関連の変数などの定義はこんな感じ。


#define TASK_MAX 3 // タスク数
#define TASK_STACK_SIZE 128 // タスクスタックサイズ

typedef struct _TaskControlBlock{
int iSP; // スタックポインタ保存用
int iWaitTime; // 待ち時間
}TaskControlBlock;

TaskControlBlock TCB[TASK_MAX]; // タスクコントロールブロック
char cTaskStack[TASK_MAX][TASK_STACK_SIZE]; // タスク用スタック領域
int iCurrentTaskID; // 実行中タスクID

extern void dispatch(int* pSaveSP, int iRestoreSP);


次はrot_rdqとdly_tskを実装しよう。
続く


組込み用RTOS作成(μITRON風)1

仕事で開発ツールCubeSuite(マイコン:78K0R)を使うことがあったけど、このCubeSuite、Freeでコードジェネレータが付いていてシミュレータまで付いている!!
これは、趣味や組込みC言語の勉強に持って来いだ。こことか見て勉強したらどうだろう。ただ対応したマイコンボードが秋月とかであんまり売ってないが、、、
とりあえずなんか作ってみようと思ったが、ソフトを組むのにやっぱりOSがないと組みにくい。と言ってもゴリゴリに使うわけではないし、趣味で組むのにRTOSを購入なんて出来ない。なので自作のなんちゃってRTOS(μITRON風)を作ってみた。
機能はとりあえず、cre_tskrot_rdqdly_tskだけ。
タスクのディスパッチをどう実現するか?
タスク毎にスタック領域を持っておき、ディスパッチの時にレジスタ値をPUSHして、スタックポインタの値はタスクコントロールブロックに保存する。次に実行するタクスのスタックポインタを保存先からリストアしてレジスタ値をPOPすれば、元の状態に戻るのでRET命令でリストアしたスタックポインタに積まれた戻りアドレスに従って戻っていく。
こんな感じにしてみた。(dispatch.asm)

;-----------------------------------------------------------
; void dispatch(int* pSaveSP, int iRestoreSP)
;  AX = pSaveSPのアドレス
;  SP+0 = 戻りアドレス(LL)
;  SP+1 = 戻りアドレス(LH)
;  SP+2 = 戻りアドレス(HL)
;  SP+3 = 戻りアドレス(HH)
;  SP+4 = iRestoreSPの値
;-----------------------------------------------------------
PUBLIC _dispatch

@@LCODEL CSEG
_dispatch:
PUSH AX
PUSH BC
PUSH DE
PUSH HL
MOVW DE,AX ;pSaveSPのアドレスをDEに保存
MOVW AX,SP ;SP値取り出し
MOVW [DE],AX ;*pSaveSP に SP値を保存
MOVW HL,AX ;SPをHLに保存
MOVW AX,[HL+4+8] ;iRestoreSP値取り出し
MOVW SP,AX ;SPにiRestoreSPをセット 
POP HL
POP DE
POP BC
POP AX
RET


END

これでタスクの切り替えが可能になった。後はタスクの初っ端をどうやって呼び出すか?
とりあえず、アセンブラが必要そうなのはここまでなので後はすべてC言語で書くとする。
続く

2012/04/29

ケータイ・スマホ2台持ち

以前、「スマホ半額導入記」で書いたが、現在でもケータイとスマホの2台持ちをしている。理由はそのほうが安いから。。。
スマホの方は、b-mobile(U300)のSIMを使って、
ケータイの基本使用料1200円ぐらい+ b-mobile 1ヶ月あたり2300円=3500円。
今回、b-mobile(U300)の期限が切れた&やっぱり300kbps通信では遅いと感じるので
So-netモバイル3Gに乗り換えることにした。
キャンペーン中で2年縛りながら、1年間は2,455円+210円(モバイルコース)、その後も2,770円+210円(モバイルコース)と3,000円以下で14Mbpsの3G環境が手に入る。
ついでにほとんど使用しなくなったi-modeの契約を解除して-300円。
結果、
ケータイの基本使用料900円ぐらい+ So-net2,665円=3,565円!
キャンペーン終了後で、
ケータイの基本使用料900円ぐらい+ So-net2,980円=3,880円!
やっぱり安い2台持ち。。。

2012/02/19

blog記事をfacebookに自動投稿する

ここ」を参考に設定。
facebookの検索欄に「rss graffiti」と入力してRSS Graffitiアプリをクリック。
「Click here to authorize RSS Graffiti」をクリックして、許可したら
「Add feed」をクリックして、feed URLを入力。
Bloggerの場合「ブログのURL」+「/rss.xml」を入力。
うまくPreview表示できたら「save」で完了。

Twitterのつぶやきをfacebookへ自動投稿する

ここを参考にして設定。
facebookの検索欄に「twitter」と入力してTwitterアプリで設定するだけ。

2012/01/18

Lenovo G570 購入

最近、ディスクトップPCの調子が悪いし、寒いのでコタツでぬくぬくネットサーフィンしたいのでノートPCを購入。

Lenovo G570 433497J
CPU:Core i5 2430M
HDD:320G
MEMORY:2G
モニタ:15.6インチ(1366x768)

で、なんと38,456円。安くなったものだ!
メモリを8Gに交換。これが3,480円
合計:41,936円

日本語キーボードなのだが、メーカサイトや量販店サイトには英語キーボードの写真をそのまま使っている事が多く購入前に少し不安だったのでアップしておきます。
購入を検討中の方のお役にたてれば幸いです。