FC2ブログ

格安VRゴーグルのチューニング

ドン・キホーテで格安VRゴーグルを買ってみた。
その価格980円である。いくら何でも安すぎるのではないか。

P_20180519_105104_BF.jpg

価格の安さに不安を覚えつつ。
早速、Zenfone3 5.5inch を取り付けて覗いてみた。

立体に見えないこともないのでが、ピントが合わず、視差が合わず、
慣れてくると、焦点を合わせられるが10秒もすると目が非常に疲れた状態になってしまう。
これは、レンズの性能が低いというより、視差等のセッティングがずれているイメージだ。

そこで、スマホ側でセッティングを変えてみた。
すると、長時間見ても目が疲れないようにできたのでその方法を記録しておく。

簡単にいうと、下記のサイトを開き指示に従って設定を進める。
(google の cardboard として使うことを前提としている)

VIEWER PROFILE GENERATOR

肝心なのは、VRゴーグル固有の設定値。
私の場合は下記のように設定すると、目の疲れが最小限になった。

~~~~~~~~~~~~ 設定値 ~~~~~~~~~~~~
Cardboard設定
~~~~~~~~~~~~ 以上 ~~~~~~~~~~~~

数値を入力して「Generate Profile」ボタンを押すと下記のようなQRコードが生成される。
これをスマホ側のCardBoardアプリのビューワー設定で読み込ませればOKだ。
同じゴーグルを使っている人は下記のQRコードを読み込ませることで目の疲れが軽減されるかも。(自己責任で)

qr_viewer_profile.png


スポンサーサイト



「GPS for VDS」で GPSバリオのログ IGCファイルを使う方法

XC Tracer というGPSバリオメーターを手に入れた。
ハンググライダーでのフライトで、IGCファイル形式でフライトログを取っている。

このログを「GPS for VDS」を使って動画に合成する方法をメモしておく。


①XC TracerをUSBでパソコンに接続し IGCファイル をコピーする

②カシミール3Dを起動し「ファイル→GPS各種ファイルを読む」でIGCファイルを開く

③編集→GPSデータ編集 でGPSデータエディタを開く

④トラックの中になる取り込んだトラックを「右クリック→交換→標高⇔汎用1」
 これで、高度のデータをGPS高度から気圧計由来の高度に書き換える

⑤トラックの中になる取り込んだトラックを「右クリック→ファイルへの書き出し」
 GPXファイル形式で書き出す

⑥aviutl + 「GPS for VDS」プラグイン から GPXファイルを読み込む

後は、「GPS for VDS」の使い方通り。

arduinoで使える気圧センサ01「BMP085」

arduinoで使える気圧センサの中で最も解像度の高いセンサを見つける企画。
今回は、「BMP085」を調べてみた。
BMP085.jpg
「BMP085」
メーカー:BOSCH
通信:I2C
電源:1.8-3.6V
消費電力:5μA(1サンプル/秒の時)
レンジ:300-1100hPa
分解能:16-19bit
ノイズレベルと計測に掛かる時間
0.06hPa(0.5m相当) 4.5msec
0.05hPa(0.4m相当) 7.5msec
0.04hPa(0.3m相当) 13.5msec
0.03hPa(0.25m相当) 25.5msec

ノイズレベルによって4つのモードがある。
低ノイズを狙うと計測に時間が掛かる。
例えば、ノイズレベル0.25mを狙うと 1/0.0255≒39.2Hz での計測になってしまう。
おそらく、平均を何回取るかということなので、実質どのモートでも精度は同じ。
BMP085側で平均化処理をするか、マイコン側でやるかが選べると考えれば良さそうだ。

高性能な気圧センサを探す(秋月で買える)

電子工作で出来るだけ高精度な高度計を作りたい。
そこで、電子部品の通販サイトで簡単に手に入る「気圧センサ」を調べて、性能を比較してみる。
今回は、まず、入手可能なセンサを入手先毎にリストアップする。

求めている気圧センサの条件は

・出来るだけ高分解能
・出来るだけ高サンプリングレート
・デジタル出力

<秋月電子通商>

BMP085
レンジ:300-1100hPa
通信:I2C
電源:3.3-1.8V
分解能:16-19bit

BME280

MPL115A1

MPL115A2

MS5607

LPS25H

SCP1000-D01

とりあえず、1社の取り扱いセンサーをリストアップした。
次回以降、別の店のセンサもリストアップして、性能比較を行う。

Corel VideoStudio が起動しない!!時の解決方法

2016/03/02 久日ぶりに Crel の 「VideoStudio Pro X6」 という動画編集ソフトを起動した。
いや、しようと試みたが起動しなかった。

スタートボタンから 「VideoStudio Pro X6」 を選んでクリックするが、
ソフトが一向に立ち上がらず、画面に何の変化もない。

原因は、2016年2月のWindowsUpdataが原因だった。
私のPCはWindows7 64bitである。

Crelのサイトに解決方法が書いてった。

■解決方法■

①コントロールパネル>プログラムのアンインストール>更新プログラムのアンインストール

②下記2つをアンインストール
・Microsoft Windows (KB3126587) のセキュリティ更新プログラム
・Microsoft Windows (KB3126593) のセキュリティ更新プログラム

③PCを再起動

これでとりあえずは起動するようになる。

「GPS for VDS」でMy Tracksのログを使うメモ

「GPS for VDS」でMy Tracksのログファイルを使うとしてちょっと苦労したのでメモ。

ログをkmlでエクスポートする

するとkmzという拡張子が付いたファイルが出てくる

拡張子を.zipに変更する(.kmz → .zip)

zipファイルを解凍

するとdoc.kmlが出てくる

「GPS for VDS」に突っ込む

GPXファイルでエクスポートすると解凍作業なしに直接読み込めるが、
なぜが上記の方法でないと速度がノイズだらけになる。

ExcelのVBAで処理中に画面が固まらないようにする方法

ExcelのVBAで時間の掛かるループ処理等を行うとエクセルの画面が固まってクリックに反応しなくなる。
これは、まるでフリーズしてエクセルが落ちがように見えるので精神衛生上よくない。

調べてみてその解決方法が分かったので、テンプレートとしてメモしておく。

Sub hoge()
'画面更新と自動再計算をOFFにする
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'多数行を処理する重たい処理ループ
For i = 1 To 100000
'重たい処理の内容
Worksheets("Sheet1").Cells(i, 1).Value = i

'1000ループに1回実行(フリーズ防止)
If i Mod 1000 = 0 Then
'ステータスバーへの表示更新
Application.StatusBar = i & "/" & MaxRow & "を完了"
'エクセルのイベント処理
DoEvents
End If
Next

'画面更新&自動計算ON  ステータスバーの表示削除
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.StatusBar = False
End Sub

arduino で 4CH 12BitADC[ ADS1015 ] を使う

仕事の関係で、arduinoでアナログ電圧を計測したいという事になった。

計測対象は min 2V max3V である。
出来るだけ高い分解能で計測したい。
また、計測のサンプリングレートは1kHzが必要だ。

arduinoはもとともADC機能を内蔵しているが、分解能が10bit (0~1023)である。
0~5Vを計測する場合の分解能は、5mV だ。
そのまま2V~3Vを計測すると、分割数は200である。
もう少し細かく計測したいので、12BitADCを試すことにした。

今回試したのは「ADS1015」。
12Bitで計測した電圧をI2C通信で出力してくれるというものだ。

スイッチサイエンス
「ADS1015搭載 12BitADC 4CH 可変ゲインアンプ付き」
https://www.switch-science.com/catalog/1136/


~使い方~

①Arduino の開発環境を起動

②ライブラリマネージャで「ADS1015」と検索してライブラリをインストール
ライブラリマネージャ

ADS1015のライブラリ


③ブレッドボードでテスト回路を組んで、下記のソースで動かす!

サンプルソースコード


ここで1つ問題に気がついた。
このADCの計測レンジは、デフォルト設定では+/- 6.144V 1 bit = 3mV となっている。
でも、IC的に入力可能電圧は0~5V なので、フルレンジが使えない。
何のためにマイナス側にレンジを持っているかというと、
入力1と入力2を比較するモードがあるからだが、
単一の電圧が知りたい場合それは無意味だ。分解能を半分無駄にしている。

今回の場合、2~3Vと入力を出来るだけ細かく計測したいわけなので、
例えば、「8x gain +/- 0.512V 1 bit = 0.25mV」と設定して、
入力2に2.5Vの基準電圧を入れてやればいいのだが、
そんなに精度のよい基準電圧を作るのは面倒だ。

単純に、0~5Vを12Bitで計測できるようにしておいて欲しかった。。。


もう一つ注意点を発見した。

データシートではこのICは4CHであり、最大3300Hzで電圧を計測できると書いてあるが、
3300Hzで計測できるのは1CHだけである。
2CH以上の計測をしようとすると、1CHあたり2msec程かかってしまう。
例えば、2CH計測だと250Hz程でしか計測ができなかった。

HDDが壊れた?[FromHDDtoSSD]

ここ半年程パソコンの起動に頻繁に失敗する。

Windosを起動しています画面のままその先に進まない。
3度ほど電源長押で強制終了して、起動し直すとやっと起動する。

ハードディスクかメモリーかマザーボードが壊れかけているのかと予想。
可能性は上記の順番で高いので、まずハードディスクをチェックした。

下記の2つのソフトを使ったのでメモ。

CrystalDiskInfo
ハードディスク自体が記録しているエラー情報を読みだして表示するだけのソフトのようだ。
結果は、全く問題なし。

このソフトだけでは、ホントに問題がないのか信用できなかったのでもう1つソフトを試した。

FromHDDtoSSD
インストールせずに単一の実行ファイルで実行できる。好印象だ。
1つ目のソフトより詳細にドライブ全域の状態をチェックしてくれた。7時間ほどかかった。
結果はオールグリーン。原因はHDDではないようだ。


次はメモリーの状態を調べる必要がある。

Chrome だけインターネットにつながらない

2015年12月6日 いきなり、Chrome がインターネット繋がらなくなった。
正確には、例えばブックマークからYahooを開こうとしても、画面が真っ白のまま。
設計画面や、履歴画面も表示されない。
ただし、IE、FireFox 等の他のブラウザは普通に使えるし、ネットサイトも開ける。

結果的には、下記の方法で治った。


1.コマンドプロンプトを管理者権限で立ち上げる。

2.「netsh winsock reset」と入力しEnter押して実行する。


すると、パソコンの再起動を求められるので、PCを再起動したらChromeが使えるようになっていた。
スタックしてしまったソケット通信をリセット??するコマンドらしい。
用は、Chromeがどこかのサイトにアクセス中に何らかの原因で通信がクラッシュしてしまって、その通信エラーが残ってしまったようだ。

とりあえず治ったので良しとしよう。

自作バリオメータのソースコード公開

使用しているデバイスは。

arduino uno
BMP085
BlueSMiRF Silver
Grove-LCD RGB Backlight V2.0


/*
* Variometer V0.1
* Build by Yuita.
*//

#include "Barometer.h"
#include "rgb_lcd.h"
#include
#include
#include
#include

// アナログバリオメータの0点補正値(サーボの角度補正)
#define S_CENTER 79.0
// 気圧センサ制御用(BMP085)
Barometer myBarometer;
// RGB LCD用
rgb_lcd lcd;
// バックライトカラー設定
const int colorR = 255;
const int colorG = 255;
const int colorB = 0;
// サーボ制御用
Servo myservo;

// 高度補正用オフセット値
int altitude_offset;

// Bluetooth用
int bluetoothTx = 2; // TX-O pin of bluetooth mate, Arduino D2
int bluetoothRx = 3; // RX-I pin of bluetooth mate, Arduino D3
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
long int value;

////////////////////////
// 起動時初期設定処理 //
////////////////////////
void setup(){
Serial.begin(9600);
myBarometer.init();

// LCD の初期設定、バックライトカラー設定、初期メッセージ表示
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);
lcd.print("Variometer V0.1 ");
lcd.setCursor(0, 1);
lcd.print("Build by Yuita. ");

// 起動音再生
tone(8,400,500);

// サーボ初期設定、0角度に向ける
myservo.attach(9);
myservo.write(S_CENTER);

// スイッチピン設定
pinMode(7,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(13,INPUT_PULLUP);

// EEPROMから高度補正オフセット値読み取り
altitude_offset = eeprom_read_int(1);

// Bluetooth用
bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps
/*
bluetooth.print("$"); // Print three times individually
bluetooth.print("$");
bluetooth.print("$"); // Enter command mode
delay(100); // Short delay, wait for the Mate to send back CMD
bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity
// 115200 can be too fast at times for NewSoftSerial to relay the data reliably
bluetooth.begin(9600); // Start bluetooth serial at 9600
*/

delay(1000);
}

////////////////////////
// メインタイムループ //
////////////////////////
void loop()
{
// 時間記録変数(昇降率計算用)
unsigned long time = 0;
unsigned long last_time = 0;
unsigned long time_diff;
// 移動平均計算用
float previous_altitude;
float current_altitude = 0;
float temperature;
float pressure = 0;
float current_pressure = 0;
float change;
float mean_change = 0;
// 昇降率計算間隔設定用(5回に1回)
unsigned char counter = 0;
// LCD表示間隔設定用(25回に1回)
unsigned char counter2 = 0;
// ビープ音なり始めタイミング用
bool flag_sound = true;
bool flag_sound2 = true;
String string_up;
String string_down;
// ボタン長押し検知用
int set_button_push_time = 0;
int up_button_push_time = 0;
int down_button_push_time = 0;
// 移動平均のサンプリング数
#define SAMPLES 100.0
#define SAMPLES2 10.0

// 初期計測 気温計測
temperature = myBarometer.bmp085GetTemperature(myBarometer.bmp085ReadUT());

// 初期計測 気圧計速(100回)
for (unsigned int i=0;i< SAMPLES;i++) pressure += myBarometer.bmp085GetPressure(myBarometer.bmp085ReadUP());
pressure = pressure / SAMPLES;
previous_altitude = myBarometer.calcAltitude(pressure);

last_time = millis();

//******************//
// メイン表示ループ //
//******************//
while(1){
time = millis();

// 気圧計速→移動平均計算
current_pressure = myBarometer.bmp085GetPressure(myBarometer.bmp085ReadUP());
pressure = ((pressure * (SAMPLES-1)) + current_pressure)/SAMPLES;

// ビープ音は0.2秒に1回鳴らす
if((time/100)%2 == 1 && !flag_sound2){
flag_sound = true;
flag_sound2 = true;
}
if((time/100)%2 == 0){
flag_sound = false;
flag_sound2 = false;
}

//Bluetoothに気圧送信(format is BlueFlyVario)
bluetooth.println("PRS "+String((long)pressure,HEX));
//--------------------------------------------------------------------------
// 5回に1回 1段階目
// 気温計測、昇降率計算→移動平均計算、ビープ音生成、アナログバリオ角度変更
//--------------------------------------------------------------------------
counter ++;
if (counter > 5){
counter = 0; // Reset counter

temperature = myBarometer.bmp085GetTemperature(myBarometer.bmp085ReadUT());
current_altitude = myBarometer.calcAltitude(pressure);
change = current_altitude-previous_altitude;
previous_altitude = current_altitude;

time_diff = time-last_time;
last_time = time;
change = change / (float)time_diff * 1000.0;

mean_change = ((mean_change * (SAMPLES2-1)) + change)/SAMPLES2;
if(flag_sound){
generate_audio(mean_change);
flag_sound = false;
}

myservo.write(constrain(S_CENTER-mean_change*12.0, -S_CENTER-4*12.0, S_CENTER+4*12.0));

//--------------------------------------------------------------------------
// 5回に1回 2段階目
// LCD表示、ボタン処理
//--------------------------------------------------------------------------
counter2++;
if(counter2 > 5){
counter2 = 0;
// LCD Display
string_up = "";
if(pressure/100 < 1000)string_up.concat(" ");
string_up.concat(String(pressure/100,2));
string_up.concat("hPa ");
string_up.concat(time_diff);
string_up.concat("ms");
string_down = "";
string_down.concat(String(current_altitude+(float)altitude_offset/10.0,1));
string_down.concat("m ");
if(mean_change >= 0)string_down.concat("+");
string_down.concat(String(mean_change,1));
string_down.concat("m/s");
//string_down.concat((float)altitude_offset/10.0);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(string_up);
lcd.setCursor(0, 1);
lcd.print(string_down);

//高度オフセットのボタン処理
//UPボタン処理
if(digitalRead(13) == LOW){
//string_down.concat("12");
up_button_push_time++;
if(up_button_push_time >= 5){
altitude_offset += 10;
up_button_push_time = 5;
}else{
altitude_offset ++;
}
}else{
up_button_push_time=0;
}
//DOWNボタン処理
if(digitalRead(12) == LOW){
//string_down.concat("13");
down_button_push_time++;
if(down_button_push_time >= 5){
altitude_offset -= 10;
down_button_push_time = 5;
}else{
altitude_offset --;
}
}else{
down_button_push_time=0;
}
//設定ボタンが長押しされたら、EPPROMに高度オフセット値記録
if(digitalRead(7) == LOW){
//string_down.concat("7");
set_button_push_time++;
if(set_button_push_time >= 5){
eeprom_write_int(1,altitude_offset);
set_button_push_time = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set alt offset.");
delay(2000);
}
}else{
set_button_push_time = 0;
}
} // 5回に1回 2段階目
} // 5回に1回 1段階目
} //メイン表示ループ
} //メインタイムループ

//=============== バリオのビープ音生成 =============================
#define alt_threshold 0.25
// ビープ音生成関数
void generate_audio(float change)
{
if ((abs(change)) < alt_threshold)
{
noTone(8);
return;
}
// Ignore normal decents
if ((change < 0) & (change > -0.1))
{
noTone(8);
return;
}
// Given that the change is bigger than a minimal threshold
// We need to constrain the values
change = 100*(constrain(change, -5, 5)); // to get +/-1000 as upper/lower limit
//change = map(change, -500, 500, 100, 4000);
// Standard short pause for going up
//tone(8,change,100);
tone(8,1000*pow(1.3,change/100),100);
}


//=============== EEPROM関連 =============================
// EEPROM に2Byte(int)を書き込み
void eeprom_write_int(int addr, int i) {
byte tmp;
tmp = lowByte(i);
EEPROM.write(addr, tmp);
delay(5);
tmp = highByte(i);
EEPROM.write(addr + 1, tmp);
delay(5);
}
// EEPROM から2Byte(int)を読み込み
int eeprom_read_int(int addr) {
int h, l, ret;
l = EEPROM.read(addr);
delay(5);
h = EEPROM.read(addr + 1);
delay(5);
ret = (h << 8) + l;
return(ret);
}

XCSoar に Arduino から送れるデータを調べる

ハンググライダーのために、フライトコンピューターアプリの「XCSoar」を使いたい。

「XCSoar」
https://play.google.com/store/apps/details?id=org.xcsoar&hl=ja


しかし、手持ちのスマホの xperiaZ2 には気圧計等のセンサがなく、GPSを元にしたデータしか表示できない。
それでは面白く無いので、いろんなセンサをArduinoにつなぎ、Arduinoからスマホ上の「XCSoar」にBluetooth経由でデータを送ることを考えた。

「XCSoar」にはいろいろな市販のセンサデバイスからのデータを受け取れるドライバが入っている。
そのドライバを利用してデータを受け渡す必要があるので、現状どんなデータが受け渡せるかを調べた。

調べ方は、ソースコードを読む。
http://git.xcsoar.org/cgit/master/xcsoar.git/tree/src/Device/Driver

使えそうな物をリストアップしておく。

●C-Probe
ジャイロ?、3Dの加速度、RH?、気温、バッテリー残量、気圧
コンパス?
マニュアルがイタリア語かなにかであまり良くわからない(汗)
http://www.sky-dreams.com/documents/C-Probe_manuel_francais_19-06-12.pdf


●BlueFlyVario
気圧

●Borgelt B50/B800
速度、バリオ、マクレディー、バラスト、気温

●Digifly Leonardo
高度、バリオ、エアスピード、ネットバリオ、気温、風速、風向、コンパス

●OpenVario
バリオ、静圧、動圧、全圧、エアスピード、温度
http://www.openvario.org/doku.php?id=nmea_protocol


ちなみに、これ以外に NMEA 形式を受信することができるようだ。
この中から自分が渡したいデータが網羅されているドライバを選べば良い。

今回は、気圧センサとエアスピードセンサの値を送りたい。
フォーマットの簡便さから「OpenVario」のドライバを使うのが良さそうだ。

Arduino と Android をBluetooth で接続

Arduino と Android をBluetooth で接続してみよう。

ということで、まずは下記のデバイスを買ってみたのでメモ。

SparkFun Bluetooth Modem - BlueSMiRF Silver
https://www.sparkfun.com/products/12577


RN41というBluetoothモジュールを使いやすくした部品だ。

回路図へのリンク

まずは、これをArduinoに接続して通信をしてみる。

早速Anrdroidと通信しようと思って、いろんなサイトをあさったが、
結局下記のサイトを参考に接続することができた。
https://learn.sparkfun.com/tutorials/using-the-bluesmirf

IMGP0309.jpg


これを使って何をするかというと。
XCSoar というアプリに気圧センサの値を送って、高度を表示したいのである。

早速やってみた。

デバイス設定画面で、1つ新規デバイスを下記のように設定する。

ポート  : RNMT-E259
ドライバ : BlueFly Vario
K6Bt   : オフ

これで、arduino から Bluetooth 経由で下記のように気圧を送ると高度が表示された。
※表示前に、XCSoar側でQNHの値を設定しておく必要あり。

PRS 18BB4

18BB4 は16進数表示で、101300Pa を表している。
これは、BlueFly Vario とう製品と XCSoar が通信するときのフォーマットを使わせてもらっているわけだ。

この方法は、下記のXCSoarのソースコードを読んで発見した。
http://git.xcsoar.org/cgit/master/xcsoar.git/tree/src/Device/Driver


今回は、気圧をソースコード内に手打ちしたが、今後気圧センサの値を送るように改良したい。

KANAZAWAスマホアプリコンテスト

「KANAZAWAスマホアプリコンテスト」というスマホアプリのコンテストが開催中(アプリ募集期間中)である。

http://www4.city.kanazawa.lg.jp/11010/appcontest/

なんと優勝賞金は50万円!!

指定されたオープンデータを利用したアプリを開発すれば良い模様。

とりあえず応募だけでもしてみようかな~

無線アプリ「Zello」とは

「Zello」は無線機やトランシーバーの様に知り合いと一対一や複数人で同時に会話が出来るアプリです。
iPhone, Android, WindosPhone で使えます。

Screenshot_2015-07-08-20-02-50.png

便利そうなので、使い始めてみました。

無線機と同じで、発信ボタンを押している間話すことがで来ます。
その音声は一人の通信相手やグループ内の他のメンバーのスマホで再生されます。
タイムラグはだいたい2~10秒位です。

同時に発信が出来るのは一人だけで、他の人は聞いてるだけになります。
これも無線機と同じですね。

注目の音質は、当然アマチュア無線のようにノイズはありません。
電話よりはわるいく、Lineの無料電話よりも少し悪いです。

でも、複数人にむけて同時に発信できるのが便利でこれは使えそうです。

これから使い方をマスターするぞ!
グループの作り方等を調べていきたいと思います。

「Zello PTT Walkie Talkie」 Zello Inc
Get it on Google Play

「ギアシフトインジケータ」を公開

新しいアプリを公開しました。

まずはご一報。




Gear_icon.png
GooglePlay 「ギアシフトインジケータ」
https://play.google.com/store/apps/details?id=com.taketech.car.gearshiftindicator&hl=ja


今後詳しい使い方を紹介したいと思います。

Android開発で画面を横方向に固定(上下方向は可変)にする

Android開発で画面を横方向に固定するには、

AndroidManifest.xml に下記を記載すればいい。

<activity
android:name=".HogeApp"
android:label="HogeAppName"
android:screenOrientation="landscape" >



これで、アプリ起動中の画面は横方向に固定される。
でも、思っている方向に対して上下反対に表示されることがある。

基本的にはスマホ側を上下逆に持てば解決するが、
充電中等はUSB端子の位置の関係で、逆に持ちづらい時も有る。

とこで、横方向に固定はするけど、上下方向は加速度センサに従ってほしい。

その場合は下記のようにすれば良いことが分かったので、メモっておく。

<activity
android:name=".HogeApp"
android:label="HogeAppName"
android:screenOrientation="sensorLandscape" >

Android で GPS を利用するときのメモ

Android で GPSセンサーの値を利用するときにすることをメモっておく。

①AndroidManifest.xml にGPS用のパーミッションを追加
内直下に下記を追加。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



②LocationListener のインターフェースを実装等
public class MainActivity extends ActionBarActivity implements LocationListener {

//GPS用
private LocationManager locationManager;

- - -

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//GPSデータ取得準備
locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setSpeedRequired(true);
criteria.setSpeedAccuracy(Criteria.ACCURACY_COARSE);

}

@Override
protected void onResume() {
if (locationManager != null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0,
0,
this);
}
Log.e("Status", "Resume");
super.onResume();
}

@Override
protected void onPause() {
if (locationManager != null) {
locationManager.removeUpdates(this);
}
super.onPause();
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

@Override
public void onLocationChanged(Location location) {
Log.e("Status", "緯度:" + location.getLatitude() + "経度:" + location.getLongitude());
Log.e("Status", "速度:"+location.getSpeed());
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}
}

Androidで使えるデジタル速度計を作ってみた

久しぶりにGPSを使ったアプリを作ってみようと思いたた。

とりあえず簡単な物を作ろうと思ったので、
デジタル速度計を作ってみたので紹介したい。

fc2blog_20150423005043c0a.png←デカデジ速度計(Google play)

スクリーンショット


車のアナログ速度メータよりは正確だ。

この手のアプリはよくあるが、速度表示が小さいという不満があった。
そこで、出来るだけシンプルに大きく表示するようにした。

ヘッドラップディスプレイにも対応している。

Android開発ActionBarを動的に非表示にする

Android のActionBar を動的に消そうと思ってつまづいた。

スタイルを変更すれば消すことは簡単だが、
出したり消したりしたいので、ソースコードから非表示にしたい。

どのサイトを見ても、下記のようにすれば消せると書いてある。

ActionBar myAction = getActionBar();
myAction.hide();


しかし、これを onCreate 内に書いて実行すると何故かエラーで強制終了してしまう。

結局、公式サイトのリファレンスを見て解決した。
下記のようにすれば無事にActionBarを消すことができたのでメモっておく。
詳細原因はふめいだが、APIのバージョンがうんぬん見たいだ。

ActionBar myAction = getActionBar();

ActionBar myAction = getSupportActionBar();