android

2016年10月22日 (土)

ESP8266のアナログ入力とVCCの電圧測定方法

アナログ入力
ESP8266にはTOUT端子がありこの電圧のADC値を読み取ることができます。
TOUT端子の電圧を測定するためには以下のようにA0をanalogReadすれば読み出せます。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  int v=analogRead(A0);
  Serial.println("VCC="+String(v/1000.0)+"V");
  delay(1000);
}

読み取り値は10ビットの0から1023の値で、TOUT端子が1Vのとき1000となります。

次にVCCの測定方法

以下のようにADC_MODEをADC_VCCに変更するとVCC電圧を測定できます。この値を1/1000すると電圧値になります。

#include <ESP8266WiFi.h>
ADC_MODE(ADC_VCC)

void setup() {
  Serial.begin(115200);
}

void loop() {
  int v=ESP.getVcc();
  Serial.println("VCC="+String(v/1000.0)+"V");
  delay(1000);
}

TOUTピンは何も接続しないでください。チップ内でVCCを1/4し1Vの基準電圧で測定し、ライブライ内で4倍した結果がESP.getVcc()から返ってきます。

ADC_MODEはマクロで以下のように定義されています。

enum ADCMode {
    ADC_TOUT = 33,
    ADC_TOUT_3V3 = 33,
    ADC_VCC = 255
    ADC_VDD = 255
};

#define ADC_MODE(mode) extern "C" int __get_adc_mode() { return (int) (mode); }

マクロで定義されいる__get_adc_mode()は以下のように使用されている

extern int __wrap_register_chipv6_phy(uint8_t* unused) {
    phy_init_data[107] = __get_adc_mode();
    return __real_register_chipv6_phy(phy_init_data);
}

ADC_VCCとADC_VDDを指定したときVCCの値が返ります。それ以外は1023が返ります。
anaroguRead()もESP.getVcc()も同じADCを使っていて、動作中のモード切り替えは出来ないと思われます。

調査には以下を使いました。

2015年6月30日 (火)

AndroidのGmail 「この送信者からの画像を常に表示する」を解除

AndroidのGmailで画像表示許可を解除する方法

「メニューボタン」
一番下の「設定」
「全般設定」
右上「メニューボタン」
「画像の許可の取り消し」

2013年8月12日 (月)

Android アプリケーションのテストサンプル

Android アプリケーションをテストするプログラムのサンプル

まずターゲットとなるAndroidアプリケーションを作成する。
このアプリケーションはボタンとテキストビューが1つづつありボタンを押すとテキストビューに"Button Click"と表示する。

ターゲットのAndroidプロジェクトの作成
Eclipsewを起動し
・[ファイル][新規][その他]を選択
・[Android アプリケーション・プロジェクト]を選択(クリック)し[次へ]ボタンクリック

Abc1

Abc2

Abc3

Abc4

Abc5

Abc6

完了ボタンクリックしプロジェクト生成完了

Activityにボタンとテキストビューを追加する

---activity_main.xml---
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:text="Button" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_centerHorizontal="true"
        android:text="TextView" />

</RelativeLayout>

MainActivityにボタンクリック時の処理を追加する

---MainActivity.java---
package com.example.abc;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView)findViewById(R.id.textView2);
        Button mButton = (Button)findViewById(R.id.button1);
        mButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                mTextView.setText("Button Click");
            }

        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

以上でターゲットアプリケーションは完了。
アプリケーションを起動しボタンを押すと"Button Click"と表示することを確認する。

次にテスト用プログラムを作成する

テスト用プロジェクトの作成
・[ファイル][新規][その他]
・[Android テスト・プロジェクト]を選択(クリック)し[次へ]ボタンクリック

Abctest1

Abctest3

Abctest4

以上でプロジェクト作成完了。

テストプログラムの作成
・srcのパッケージを選択し
・[ファイル][新規][クラス]選択
・[名前]="TestActiviteyTest"
 [スーパークラス]="android.test.SingleLaunchActivityTestCase<MainActivity>"

Abctest5

Abctest6

以上でクラス生成完了

ボタンを押し、テキストビューの文字を確認するテストコードを追加する。

---TestActiviteyTest.java---
package com.example.abc.test;

import android.test.SingleLaunchActivityTestCase;
import android.test.UiThreadTest;
import android.widget.Button;
import android.widget.TextView;

import com.example.abc.MainActivity;

public class TestActiviteyTest extends SingleLaunchActivityTestCase<MainActivity> {
    private MainActivity mMainActivity = null;
    private TextView mTextView = null;
    private Button mButton = null;

    public TestActiviteyTest() {
        super("com.example.abc", MainActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        //setActivityInitialTouchMode(true);
        mMainActivity = getActivity();
        mTextView = (TextView) mMainActivity.findViewById(com.example.abc.R.id.textView2);
        mButton = (Button) mMainActivity.findViewById(com.example.abc.R.id.button1);
    }

    /***
     * テスト前提条件チェック
     * !!!このテストが必ずしも最初に実行される訳ではない!!!
     */
    public void testPreConditions() {
        assertNotNull(mMainActivity);
        assertNotNull(mTextView);
        assertNotNull(mButton);
    }

    @UiThreadTest
    public void testAvtivityxxx02() {
        assertEquals("TextView", mTextView.getText());
        // Button をクリック
        mButton.performClick();
        // TextView2の値チェック
        assertEquals("Button Click", mTextView.getText());
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

}

テストプログラムの実行

実行の構成

・[実行]メニュー[実行の構成]選択
・[android JUnit Test]選択

Abctest7

Abctest8

Abctest9

Abctest10

[適用]をクリックし

[実行]にてプログラム起動

2013年7月29日 (月)

Android のアプリケーションテストの自動化

Android のアプリケーションテストをテストプログラムにより自動化する。

Javaのテスト環境の JUnit の Android 拡張版で Android のプログラムのテストをプログラムにより自動化できます。

クラスの単体テストから対象ビューにテスト値をセットしボタンをクリックし結果のビューの値をチェックしたり出来ます。

以下の「入門 Androidアプリケーションテスト」にて勉強中です。

2012年12月25日 (火)

ISW11F Android 4.0 アップ後の空きメモリー

ISW11F を Android 4.0にアップしてみて全体的に動作が遅くなった。

動作は安定していて100時間程度は問題なく(というかこれまでプログラムのデバッグ関係以外で再起動はしていない)動作している。
4.0にて動作がとても遅くなっり使い物にならないという書き込みを見るが、私の場合はもんだいない。ただ私の場合プログラムはほとんどインストールしていないのでRAMに空きがあるのだと思う。それでも、再起動直後はRAMの空きが300MB程度あるが100時間程度動かしていると100MB強になり、こうなるとプログラムの起動など遅くなります。RAMを食うプログラムがインストールしてある場合最初からこの状態になります、使い続けるともっと遅くなるわけですね。これでは4.0にアップしないほうが良いでしょう。
また、開発ツールのエミュレータは2.0xに比べると4.0xは明らかに遅いです。5分で立ち上がらないです。
以上、私はそれほど遅くならず、安定しているのでAndroid 4.0にアップして正解でした。

2012年12月16日 (日)

ISW11F を Android 4.0(ics) にアップしてみて

安定性の向上

これまでソフトウェアによると思われる不安定な動作がほとんどなくなりました。
E-mail(ezweb.ne.jp)で起動時のエラーや送信完了したと思える動作後実際には送信されていないなどがなくなった。
スタンバイ時の電池持ちの向上
操作を行わないときの電池の持ちが格段にこうじょうしました。自作のバッテリー量表示プログラムで1時間1%程度から3から5時間1%程度に向上しました。ただし、逆に操作時の電池消費は微増のような感じがします。
充電時間・放電時間が短くなったよう気がして1年使用してきて電池容量が少なくなっているのかと考え新品電池に入れ替えてみました。旧・新電池で10~20%程度良くなった気もしますがあまり変らない感じです。
結局操作しなければ1日以上2日くらい持ちそうです。でもそれだけの時間無操作の状態がないので確認できていません。

動作速度が遅くなった

システムの安定性は向上したのですが動作が遅くなりました。Android 4.0が大きくなり遅くなったのはSDKのエミュレータでも感じられます。というか私の使用しているPCではエミュレータの起動をまってられません。デバッグや動作確認には現物を使うかAndroid 2.0xのエミュレータをしようしてます。
また、Android 4.0が大きくなりメモリー使用量が増えました。これによりユーザプログラムの利用可能メモリがすくなり、メモリー不足によるガベージコレクションが増え動作が遅くなります。
かつ、システムが安定になり再起動回数が少なくなることにより開放されずに残ったごみデータが増えてメモリーを圧迫しています。再起動すると動作が早くなるので確認できます。
そんな色々な状況が重なり動作が遅くなっています。

GPSが少しよくなった

GPSのつかみが少し良くなったように感じる。左右から木の枝がのび上空をふさいでいるような場所で、ちょっとした枝でもGPSがつかめなくなっていたのが何とかつかめるようになった。
1SW11Fの位置情報は3つの方法により取得しています。
1.携帯基地局基地局による位置特定
これは数キロの誤差があります。GPSで数キロずれているというのはこの方法により位置を特定した場合とおもいます。GPSではこんなにずれることは無く位置を特定できた場合は数十メートルからせいぜい百数十メートルの誤差です。それ以上は位置を特定できなくなります。
2.WIFI基地局による位置特定
WiFiがオンになっている場合WiFi基地局のマックアドレスが取得できます。このアドレスが登録されているサーバがありそこに問い合わせると基地局の位置を取得できます。それにWiFiの電波の強さなどにより位置を特定するようです。WiFi電波の届く範囲の誤差が発生します。
3.GPS衛星による位置特定
2000年ごろまで湾岸戦争かなにかによりGPS位置情報にスクランブルがかかり位置情報のずれがありました。その後スクランブルがなくなったので格段に確度が向上しました。現在では数十メートルくらいですね。

ちょっと内容がずれてしまいましたが、送信メールが未送信になるなど不安定要素がなくなりAndroid 4.0にアップして正解でした。

2012年11月26日 (月)

Android 4.0(ICS) 顔認証停止方法

Android 4.0(ICS)でロック画面解除に顔認証が利用できるようになった。

設定は「設定」「セキュリティ」「画面ロックの認証設定」「暗証番号の確認」でチェックを付け「セキュリティの解除方法」で「顔認証」をタップするとウイザードが動き出し設定できる。
設定後に顔認証を止めるには「画面ロックの認証設定」をタップすればチェックが外れて顔認証が動作しなくなる。再度チェックを付ければ顔認証が使えるようになる(と思う)。
ただし、これでは一時的に動作をしなくなっただけのようで、プログラムは動いていた。
「設定」「電池」を開くと「顔認証」がリストされる。
停止方法
「セキュリティの解除方法」にて「顔認証」以外を選択(「パスワード」を選択で確認)する。これで、「電池」で「顔認証」がリストされなくなった。

2012年11月22日 (木)

ISW11F Android 4.0(ICS) アップデート

ISW11F を Android 4.0(ICS) にアップデートした時の状況を記述

作業手順については公式手順書を参照してください。
  ARROWS Z ISW11F OSアップデート情報

*backup(spritebackup)でバックアップしたファイルで拡張子に番号が付いたファイル(.s01、.s02・・・)は.sbfの続きのファイルのなので一緒にコピーしておきましょう。これが無いとリストアできません。FAT32なのでファイルを2Gバイト未満に分割しているようです。

ネットワークは WiMAX を使いました。
時間は本体やパソコンの時間を見ましたので大体の目安です。解凍開始以降はネットワークに接続していないようです(機内モードになっていました)。
ここではダウンロードを開始したところからの記述です。
この前にバックアップなどでデータを保存してくだし。私は、マイクロSDにコピーしたバックアップデータをPCコピーしておいてから開始しました。
基本的にアップデートプログラムが勝手に進めているところで操作の必要はありません。

20:45 ダウンロード開始
20:58 解凍開始
21:16 再起動
21:30 Success completeのメッセージを表示し再起動
21:31 Arrows Z ロゴを表示して再起動
21:31 Android アップグレード中...
        91個中xx個のあぷりを最適化し
    ています。
21:32 プロセス system は・・・
     [待機] [停止]
        を表示したのでほっておく
21:35 再起動
    00:00
    2012年1月1日(日)
     初期化中です。しばらくお待ちください。
    を表示
21:37 再起動(単純に画面が消えただけかもしれない)
21:45 ロック解除
    ソフトウェア更新通知
               [OK]

以上、ちょうど1時間ですね。
データはすべて保存されていてリストア作業はしていません。

Android 4.0(ICS) でアプリケーションを無効化する

Android 4.0(ICS) でアンインストールできないプログラムを無効化できます。

そこでプログラムを無効化しようとしてもメニューが出てきません。

結果は単純なことに気が付かなかっただけです。

では無効化するための手順です。

  1. 「設定」
  2. 「アプリケーション」
  3. アプリケーションタイトルのした「ダウンロード済み」などの行を左にスクロール
  4. 「すべて」をタップ
  5. プログラムをタップ
  6. 「無効にする」をタップ
    アンインストールできるアプリは「アンインストール」になります。
    「アップデートのアンインストール」もあったような、この場合アップデートのアンインストールすると「無効にする」が出てくるとおもう。

左にスクロールしないと「すべて」が出てこない。これではまりました。

2012年11月20日 (火)

AU ISW11Fの各フォルダ(Android 4.0(ICS))

Android 4.0(ICS) アップデートして見ましたので 4.0 版です

AU ISW11Fのプログラムのデータやバックアップデータのフォルダ

スクリーンショット保存フォルダ
/mnt/sdcard/Pictures/Screenshots/

今はこれだけ!

ちょっと内容違いだけど

Eメール(ezweb.ne.jp)で一覧から拒否リスト登録を呼び出せるようになった。
アップデータ前はメールを開きFromのアドレスをタップしなければならなかった。