Androidの振動強度の制御について。続

気が付いたら7月になっていました。セミの鳴き声が聞こえてきてびっくりです。

さて、今回は過去二回にわたって考察してきたAndroidのバイブレーション機能の振動強弱の制御についてです。
原理的には
「PWMのような疑似的に0-1のデジタル信号から中間値を生成し、これを使って中間強度の振動を生み出す。」
ということでなんとなく方向性は間違ってはいない。と思いたい。

しかし、単位がms(ミリセコンド)なので、通常の組み込み的なPWMで使うus(マイクロセコンド)と比べるとやはり大雑把になりがちです。
APIが「ミリ」で提供しているのでこれを「マイクロ」にするのはさすがにきつそうだなと。
自前でここの部分もスレッドを切ったりなんやりすればもっと細かい振動の制御ができそうではある。と思う。

何かうまい方法を模索中です。(Vibratorクラス以外で振動子を制御できたりするのかな?

Vibratorクラスを使ったAndroidの振動強弱の制御 その2

あれから振動パターンを事前に用意しなくてもバイブレータの強さを設定することができました.
2行ほどで書けてしまうのでなかなか短くなりました.


//振動の強弱制御用関数
private void TriggerHapticPulse(int durationMicroSec, int power) {
long[] pat = {0, power, durationMicroSec - power};
vib.vibrate(pat,0);
}



関数名から察せるとは思いますがもとはHTCVIVEの振動制御をAndroidでもやりたかったのでなんとか実現できてよかったです.
実際に使ってみた結果,機種によるとは思いますが10~20ms周期が現実的です.それ以上だと強くなっても違いがわからないです.

使い方としては,音声に同期させた振動触覚提示を行いたかったので,以下のようにしてあげると比をとって最大値を振動側に合わせられます.

//FFTの最大値から比を求める
power = power * durationMicroSec / (int)(FFT_PEAK_VALUE);


ちなみにFFTのピーク値って128*√2なんですね.まだまだ分からないことが多い…

Vibratorクラスを使ったAndroidの振動強弱の制御(Android vibration Control for strength)

Qiitaとかにのせてみたいと思ってます。でもなんだか怖いのでここにまとめておきます。

さて、おおよそすべてのスマートフォンには振動子、バイブレータが内臓されており主に通知などに使われています。

また、AndroidのAPIではVibratorクラスが用意されており開発者は
「自由」に振動機能を使うことができます。

用意されているのは「振動」「何秒間」維持させるかのみ。
また、ネットを探してみても振動の強さのコントロールを実現している人はいません。

ということでAndroidの標準APIを使って振動の強弱をつくりだしてみました。
※基礎的な振動のさせかたなどは他のサイト等を参考にしてください。





動作環境
Windows10 Home x64
Android Studio 2.3.2
HTL21 Android 4.1
Xperia Z3 Android 5.0


AndroidのAPIで用意されているのは、どのタイミングで振動をON-OFFにするかということになります。
したがって振動の強弱を作り出すためには、直接電圧やらをさげて振動子の回転、および強弱をコントロールするやりかたは取れません
(探してみた範囲ではありませんでした。)

そこでPWMという手法を用います。

ざっくり説明するとON(1)とOFF(0)を高速で入れ替え、周期ごとの平均値によって疑似的に0.5など0,1以外の値を作り出すことができるようになります。
工学系ではLEDの明るさやモータの回転数制御などによく使われ、ぼんやりとした明かりや速度の調整ができるようになります。


よって、本題です。
Androidの振動のオンオフをPWMの考え方を使って制御します。
まず、Vibratorクラスの「void vibrate()」を使います。
  このとき、引数が2つあるものを利用します。

これは第1引数に振動パターンを入れ、
  このときの振動パターンにはPWM的な考えを利用したパターンを入れます。
第2引数にリピート回数を入れます。
  なぜかいまいち分かっていませんが、0を入れても動きます。また、1を入れるよりも0を入れたほうが振動が弱くなります。

振動のパターンは次のようにします。
     long[] pattern = {0, s, t-s};  s(振動の強さ) t(周期,ms)
たとえば、周期を20ms,強さを2段階目とした場合、
     long[] pattern = {0, 2, 18};  s(振動の強さ) t(周期,ms)
と、なります。
第1引数の配列は{待ち時間、振動時間、待ち時間、振動時間、、、、}となっており、ループすることを前提とした場合最初の待ち時間は0msで固定し、以後二つの数値で決めます。

端末によっては振動子の挙動が違うため、振動の強さが小さすぎると振動しない場合もあります。
以下は周期20msで三段階の振動の強さに調整できる簡易スクリプトです。

long[] pat1 = { 0, 1, 19 };
long[] pat10 = { 0, 10, 10 };
long[] pat20 = { 0, 20, 0 };

switch (Value)
{
case 0:
vib.cancel();
break;
case 1:
vib.vibrate(pat1, 0);
break;
case 10:
vib.vibrate(pat10, 0);
break;
case 20:
vib.vibrate(pat20, 0);
break;
}



vibrate()関数の挙動を完璧に追えているわけではありませんが、一応振動の強弱をコントロールすることができました。
周期を変えることで振動の強さの段階を自由に変えることができます。
また、挙動が若干怪しいです。自己責任でお願いします。

VRノートパソコンレビュー、というか使いつぶしました。(G-tune NEXTGEAR-NOTE i5702)

どうも、ということで次回です。自分の中でDK2→VIVEを乗り切った名機の紹介です。
買ってベンチしたよ!記事なんて正直どうでも(

今回はOculus DK2時代の、元祖VR対応ノートPC

「NEXTGEAR-NOTE i5702 」
NEXTGEAR-NOTE i5702


を使いつぶしたのでその感想を書いていきます。

まず、基本スペックですが、

■OS : Windows 10にアップグレード済み
■CPU : インテル® Core™ i3-4170
■グラフィックス : NVIDIA® GeForce® GTX™ 970M(6GB)
■メモリ : 24GB
■SSD : 128GB

と、デフォルトの状態からちょいちょいいじっています。
特にメモリは最終的にこんなに増えました。

なぜこんなにもメモリが増えたかというと、こいつのマザーボードはメモリが4スロットタイプの鬼アツモデルだからです。
なので構成的にはノートPCなのに8GBx3枚みたいな感じになってます。

こういう特殊モデル(マウスコンピューター御用達)につよいメーカー「Clevo」製であり、このi5702はP750zmモデルが元となっています。
なのでBIOS関連やらパーツやら説明書はすべてP750zm仕様なため色々ごにょごにょできます。

買ったのは2015/9だったような気がします。同時期にDK2も手に入れてウハウハしてました。(この2か月後くらいにGTX980のMなしモデルが発表されたはず)

買うきっかけになったのはこちらの記事を読んだからですね。
Oculus Rift DK2が完全動作する「変態ノートPC」はどうやって生まれたのか? マウスコンピューター 杉澤氏に聞いた誕生秘話

当時としては、Optimusの問題にたぶんみんな悩んでいて、どうしてもVR=デスクトップみたいな風潮ができつつあったと思います。
そこにデスクトップCPUを積んだノートPCとは!昔Pen4搭載爆速!(笑)ノートPCを中古で買ったのを思い出します。
そこからDK2を半年くらいいじって酔ってを繰り返していたら
クレカでHTCVIVE買ってました

その後VR開発チームを結成し、おおよそ7か月間がっつりHTC VIVE+Unityを開発したノートPCになります。
意外にも、そこまで激しくスペック不足を感じることなくたまにデモ展示機としても活躍しました。

…しかし、相次ぐ開発と展示による負荷がたまったのか2016年の年末に熱暴走をおこします。
その後再起動しかしてくれなくなりあえなくご隠居しました。


ここからは基本的な使い心地です。
キーボード配列は最近流行りのCtrl、Fn、Win(だったはず)で普段ノートPCを使ってこなかった自分としてはまったく問題ありませんでした。
また、キーストロークは深く、Macみたいなパスパスの浅めが嫌いなので使いやすかったです。
重さに関してですが重すぎてカバンがちぎれました
肝心の熱ですが普通に使ってもやばいです。

いやほんとにファンが回ってるのか疑うレベルで、電源プランを最大パフォーマンスにしているとモニターのヒンジ(左側)部分が触れないほど熱くなります。おそらくCPU側の排熱ですね。
底面から吸気するタイプなのでファン搭載のノートPC台が必須になります。なければなんでもいいので底面に隙間を作る必要があります。
CPU温度は80度を余裕でマークします。その代りGPUは70度前後なので「まだ」平気です。

と、いろいろ書きましたが総評としていい買い物だったと思います。
VR対応ノートPCは今でこそかなり増え、軽くなり、GTX10シリーズにより発熱もパフォーマンスも劇的に改善されました。
加えてThunderbolt 3によって外付けGPUなんてものもできてます(夢にまでみたノートPCのGPU交換!

デスクトップを持ち運んでいるかのような重さとスペックでしたが、その分見返りも大きかったと思います。

ラピッドプロトタイピングな時代にビルド遅いからその間暇ぶっこいてると気分も落ちてきます。少なくとも自分は。
このPCで作った試作品は数知れず、みたいな感じなので、思いついたら速攻コード書きたいしマシンパワーでごり押したい人にはおすすめです。


長くなりましたがこの辺りで締めようと思います。
ちなみに、こういうPCは途中でCPUグリスを塗り替えておくと後々寿命が延びます。
次はThunderbolt 3搭載ノートPCかな?

次回にこうご期待!

さて、2017年あけてました。(三か月

久しぶりにこちらにきました。
なかなか前回の記事からいろいろありまして、いろいろありました。

まず、この間に国際賞を2つほど連続で受賞しました。
また、フランスにいって展示したり、秋葉で展示したり、イオンで展示したり、渋谷で展示したりと
引きこもらずにめちゃめちゃ色んな人に展示してきました。
フランスはテロの脅威がめちゃめちゃ感じられた、だって軍人がファマス的なのもって歩いてるし…

自分のスキル的にもそれなり…?に上がったかなと。
少なくともWiiリモコンの記事を上げていたころよりは成長しているのでよかった。

GPSで走るロボット作りではなかなかGPSの値が安定しないのでセンサーの不良を疑ってました。
気づいたら時間ぎれ…
最後はAndroidのGPSをmbedに送ってAndroidをGPSセンサー代わりに使いましたがそれでもなぜか安定せず場所が悪いってことで結論付けました。
高い建物には狭れているとどうしてもむりだよね…(自作アプリを別の場所で起動させると問題ないため)


と、まあ国際コンテストにでて、お台場→渋谷→秋葉→埼玉→フランスで展示できたのはとても面白かったです。
(LAは辞退しました。)
こんなに書くと特定されるかも、と思いますがそろそろ解禁してもよいかな?
過去記事でエミュの話してたりするのがちょっと怖いけど(PSPの〇〇起動できました!記事のときのアクセス数は忘れない)


記事量はたまってませんが、ここ10年近い?記録はたまってるので完璧にただの日記です。
そろそろバシッと技術的なこと書いて浮上したいですね。特に意味はないけど。
趣味全開でいろいろやっていきたいと思います。とくにこの一年。(いぇい

拍手

web拍手

FC2カウンター

現在の閲覧者数:

検索フォーム

Twitter...

プロフィール

Head

Author:Head
どもこんにちわHeadです
ゲームのこととか書こうとブログやり始めたら、
もっぱらギターばかりになってました。
最近はVR関連に興味がむいてます。それとunity

{ギター歴:2010.6/27~現在}
{unity:2014.8月~現在}


連絡用のメアド貼っておきます。何かあったら送ってください
head399★gmail.com(★は@に変えてください)

最新トラックバック

ブロとも申請フォーム

QRコード

QRコード