趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • Nexus7(2012)にAndroid 6.0(MarshMallow)をインストール

    投稿日 2017年 2月 18日 コメントはありません

    いまさらながら、Nexus7(2012) 3GモデルにAndroid 6.0(MarshMallow)をインストールしてみました。

    1.準備

    環境は例によって Linux Mint 18 (64bit)です。 android-tools-adb とか、android-tools-fastboot などのandroid関連のパッケージは apt でインストール済みです。

    ダウンロードしておくものは以下のとおりです。Nexus7(2012) 3Gモデルは開発コードが tilapia というらしく、この tilapia 向けのものを用意しておく必要があります。

    • TWRP
      Term Win Recovery ProjectというソフトウェアでAndroidに内蔵されているリカバリプログラムを置き換えるものです。ROMイメージはTWRP用の物が多いので、TWRPがないと書き込めません。自分は twrp-3.0.2-0-tilapia.img をダウンロードしてきました。
    • ROMイメージ
      tilapia用のイメージを探します。だいたい xda-developper にたどり着くようですが、1つは pure AOSP というものですが、6.0.1 の r46 ベースのようです。もう1つは OmniROM というもので、 6.0.1 の r68 ベースのもののようです。(自信なしw)
      これらの記事からリンクされているROMイメージをダウンロードしておきます。
    • Gapps
      Google Playを始めとするデフォルトインストールアプリの詰め合わせのようです。Openソース版(かな?)がOpenGAPPSからダウンロードできます。PlatfomはARM、Androidのバージョンは6.0、VariantについてはNexus7(2012)はシステムパーティション(=リカバリ領域?)が650MBしかないので、最小限のnanoかpicoを選んでダウンロードします。

    2.TWRPのインストール手順

    音量ダウンボタンを押しながら電源ONしてブートローダを起動します。倒れたドロイドくんが出てくる画面(ブートローダ)になったら、PCと

    $ fastboot flash recovery twrp-3.0.2-0-tilapia.img
    sending 'recovery' (9514 KB)...
    OKAY [ 1.182s]
    writing 'recovery'...
    OKAY [ 0.386s]
    finished. total time: 1.568s

    としてTWRPを書き込みます。書き込んだら、ブートローダを以下の手順で再起動します。
    (ここで通常のシステム起動を行うと、リカバリが書き戻されるので、再度最初からやりなおし)

    $ fastboot reboot-bootloader
    rebooting into bootloader...
    OKAY [ 0.015s]
    finished. total time: 0.166s

    ブートローダが起動したら、音量ボタンでリカバリモードを選択して電源ボタンで選択するとTWRPが起動します。
    起動すると、画面上部に「Unmodified System Partition」と表示されて、システムパーティションの内容がTWRPが起動できるようになっていないことが表示されます。下の方の「Swipe to Allow Modification」のところをスワイプして、次へ進みます。(おそらく、この操作で常にTWRPが起動するようにシステムパーティションが修正されます)

    次回以降、リカバリを起動すると上記の青字の部分は聞いてきません。(システムパーティションを書きなおしたりすると、デフォルトのリカバリに戻ったりするので、再度インストールする必要がある場合があるようです)

    3.ROMイメージの書き込み

    今回は、PCからROMイメージを書き込みます。

    ブートローダ経由でTWRPを起動します。(ちなみに、充電ケーブルが挿さっていると、ブートローダで音量上下ボタンが効かないようです)
    「Advanced」⇒「ADB Sideload」を選択します。ROMイメージを書き込みする場合は「Wipe Dalvik Cache」と「Wipe Cache」にチェックを入れて、「Swipe to Start Sideload」をスワイプすると、ダウンロード待ちになるのでPC側から

    $ adb sideload omni-6.0.1-20160930-tilapia-HOMEMADE.zip

    として、ROMイメージファイルを書き込みます。(zipファイルがROMイメージファイルのファイル名です。)
    完了したら、Android側で「Back」を押して、もう一度「ADB Sideload」を選択します。今度は「Wipe Dalvik Cache」と「Wipe Cache」のチェックは外して、再度「Swipe to Start Sideload」をスワイプします。

    $ adb sideload open_gapps-arm-6.0-pico-20170217.zip

    として、Gapps を書き込みます。(zipファイルがGappsファイルのファイル名です。)

    完了したら、「Reboot System」でNexus7を再起動します。


  • ESP8266でSmartConfigを試してみた

    投稿日 2016年 11月 5日 3個のコメント

    長らく放置していたESP8266基板ですが、やっと動かしました。前回の記事から数えて約1年(ぉぃ)。回路図の定数に不適切な部分があってブートローダから先に進んでなかったのと、秋月のFT234X搭載の超小型UART変換基板だとなぜかLinux側が固まってしまうという事象に悩まされたためです(汗)。

    で、まだ最低限の機能しか試してないのですが、回路図はこんな感じです。回路図の電源周りにいろいろわけのわからないFETが入っていますが、これはソフトウェア制御で電源OFFできるようにするのと、電池使用時に電源電圧を自身で測定できるようにするためです。電池を使えば Amazon Dash Button 相当のことができる予定です。

    回路図

    UART変換基板は結局秋月のAE-TTL-232Rを使いました。

    開発環境はArduino IDE 1.6.12を使っています。昔調べた方法でボードマネージャでESP-8266を使えるようにして、ボードはGeneric ESP8266 Module、FlashメモリサイズはESP-WROOM-02に合わせて1M(64K SPIFFS)を選択しました。

    2016-11-05-02-29-33

    さらに1年間の進化は素晴らしいもので、smartconfigというWiFi周りの設定をAndroidスマートフォンでやる仕組みが登場していました。ArduinoのコードはGitHubのここから持ってきました。少しこの基板にあわせて修正したのが以下のファイルです。

    #include <ESP8266WiFi.h>
    #include <WiFiUdp.h>
    
    void setup() {
      int cnt = 0;  
    
      // set for STA mode
      WiFi.mode(WIFI_STA);
      
      // put your setup code here, to run once:
      Serial.begin(9600);
      
      // led status at pin16
      pinMode(12,OUTPUT);
      digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
      
      //configure pin0 
      pinMode(0, INPUT_PULLUP);
    
      // deplay for 2 sec for smartConfig
      Serial.println("2 sec before clear SmartConfig");
      delay(2000);
      
      // read pullup
      int isSmartConfig = digitalRead(0);
      if (isSmartConfig==0) {
        // bink for clear config
        blinkClearConfig();
        Serial.println("clear config");
        // reset default config
        WiFi.disconnect();
    
      }
    
      // if wifi cannot connect start smartconfig
      while(WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        if(cnt++ >= 15){
           WiFi.beginSmartConfig();
           while(1){
               delay(500);
               if(WiFi.smartConfigDone()){
                 Serial.println("SmartConfig Success");
                 blinkSmartConfig();
                 break;
               }
           }
        }
      }
    
      Serial.println("");
      Serial.println("");
      
      WiFi.printDiag(Serial);
    
      // Print the IP address
      Serial.println(WiFi.localIP());
    
    }
    
    
    void blinkSmartConfig() {
        digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
        delay(50);              // wait for a second 
        digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
        delay(50);
    }
    
    void blinkClearConfig() {
      int i=0;
      while(i<=3) {
        digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
        delay(100);              // wait for a second 
        digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
        delay(100);
        i++;
      }
    }
    
    void blinkStartConfig() {
      pinMode(13,OUTPUT);
      int i=0;
        digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    }
    
    
    void loop() {
      int isSW1 = digitalRead(0);
      if(isSW1==0){
        for(int i=5;i>0;i--){
          delay(1000);
          Serial.println(i);    
        }
        Serial.println("Power off");    
        delay(500);
        pinMode(15,OUTPUT);
        digitalWrite(15, HIGH);   // Power-off the board (HIGH is the voltage level)
        delay(5000);
      }
      delay(100);
      digitalWrite(12, 1-digitalRead(12));   // Blink the LED
    }
    
    

    修正したのは起動時のGPIO12のLEDの点灯と、ステータスのGPIOをGPIO16からGPIO13に変更、初期化が完了したら電源OFFする制御を追加したことです。これをコンパイルしてボードに書き込んでやります。

    シリアルモニタで動作を確認しながら、スマートフォンで「ESP8266 SmartConfig」というアプリを動作させてESP8266モジュールに接続させる先のSSID(スマートフォンがつながってるSSIDが勝手に表示されます)と、パスワードを入力してCONFIRMを押してしばらく待つとESP8266側の接続設定がされるという便利なものです。

    設定したSSIDとパスワードはフラッシュメモリ内に保存されて、次回は勝手にロードしてくれます。(上記のソースでは、起動後2秒たった瞬間にGPIO0がLレベルだと設定をクリアして再度設定待ちになります)

    <���������$�������ɕ����Ɂ�����
    �����5R�................SmartConfig Success
    .SmartConfig Success
    .SmartConfig Success
    
    
    Mode: STA
    PHY mode: N
    Channel: 4
    AP id: 0
    Status: 5
    Auto connect: 1
    SSID (17): xxxxxxx-yyyyyy-z
    Passphrase (10): xxxxxxxxxx
    BSSID set: 1
    ??.??.???.??
    5
    4
    3
    2
    1
    Power off

    上記は電源投入〜SmartConfigによる設定〜APへの接続〜シャットダウンまでのシリアルコンソールのログです。楽でいいですね!


  • 普通にはadbで認識できないAndroid機を認識させる

    投稿日 2016年 9月 10日 コメントはありません

    通常のAndroid機は /etc/udev/rules-d/51-android.rules にベンダIDを追加してやるとadbで操作できるようになるのですが、coviaのFLEAZ F4s/F4s+は認識することができません。いろいろ試してみたところ、わかってきたことをメモしておきます。環境は LinuxMint18 MATE edition 64bit です。

    まずはUSBのデバイスIDを調べます。(必要なもの以外は結果から削除しています)

    $ lsusb
    Bus 001 Device 016: ID 0a5c:e688 Broadcom Corp.

    BroadcomのチップのベンダIDそのままのようです。(これはF4sのもの。F4s+はデバイスIDはe681になるようです)
    とりあえず、/etc/udev/rules-d/51-android.rules にベンダIDを記載して再読み込みさせてみます。

    $ cat /etc/udev/rules.d/51-android.rules 
    SUBSYSTEM=="usb", ATTR{idVendor}=="05ac", MODE="0666", GROUP="plugdev"
    $ sudo udevadm control -R

    この状態で、USBを抜き差ししてから adb コマンドを叩いてみても、

    $ adb devices
    List of devices attached

    となって、デバイスが見つかりません。
    いろいろググると、~/.android/adb_usb.ini にベンダIDを書くとよい、というような記載をいくつか見つけたので試してみます。

    $ cat .android/adb_usb.ini 
    0x0a5c
    
    $ sudo service udev restart
    $ adb kill-server
    $ adb devices
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    List of devices attached 
    ???????????? no permissions

    状況が変わりました。この状態で TCP/IP 接続でデバッグする設定にしてみます。

    $ adb tcpip 5555
    error: insufficient permissions for device

    パーミッションで蹴られてしまいました。ルート権限で試してみます。

    $ sudo adb kill-server
    $ sudo adb start-server
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    $ adb devices
    List of devices attached 
    F4Sxxxxxxxxx unauthorized
    
    $ sudo adb tcpip 5555
    error: device unauthorized. Please check the confirmation dialog on your device.

    端末上にデバッグ接続可否のダイアログが出ていたので、許可してみます。

    $ adb tcpip 5555
    restarting in TCP mode port: 5555
    $ adb install xxxxxxx.apk
    2460 KB/s (261419 bytes in 0.103s)
     pkg: /data/local/tmp/xxxxxxx.apk
    Success

    となって無事にインストールできました。

    改めて /etc/udev/rules-d/51-android.rules を削除してやってみました。
    どうも、/etc/udev/rules-d/51-android.rules は必要ないようです。
    一般ユーザー権限では、

    $ adb devices
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    List of devices attached 
    ???????????? no permissions

    となってパーミッションエラーになりますが、通常の Android機はルート権限で adb server を起動すると認識できるようです。

    $ sudo adb kill-server
    $ sudo adb start-server
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    $ sudo adb tcpip 5555
    restarting in TCP mode port: 5555

    さらに、今回の covia FLEAZ F4s/F4s+ のようになにもしないと認識しない機種でも、 ~/.android/adb_usb.ini にベンダIDを書いてやれば認識できるようです。

    $ echo "0x0a5c" > ~/.android/adb_usb.ini
    $ cat ~/.android/adb_usb.ini 
    0x0a5c
    B ~ $ adb devices
    List of devices attached
    
    $ sudo adb kill-server
    $ sudo adb start-server
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    $ adb devices
    List of devices attached 
    F4Pxxxxxxxxx device
    
    $ sudo adb tcpip 5555
    restarting in TCP mode port: 5555

    ここで F4s+ を外して F4s を接続してみます。

    $ adb devices
    List of devices attached 
    F4Sxxxxxxxxx device
    
    $ sudo adb tcpip 5555
    restarting in TCP mode port: 5555

    となり、無事に認識しました。


  • AndroidタブレットをLinuxのサブディスプレイにする

    投稿日 2016年 8月 9日 コメントはありません

    外出時にノートPCで作業していると、1366×768の画面ではどうしても狭く感じます。・・・で、ぐぐってみたところ、AndroidをLinuxのサブディスプレイにする方法がある模様。どうやらVNCを使うようなので、やってみました。

    環境は以下の通り。

    • サーバ側はLinutMint18 x64
    • クライアント側はNexus7(2012) + Android4.4.4

    です。

    作業にあたってはこちらのサイトを参考にさせていただきました。

    1.Linux側(サーバ側)

    Synapticでvnc4serverをインストールします。vnc4serverを使うのはSynapticにあるからです。

    インストールしたらVNCサーバを起動します。

    $ vncserver :1
    You will require a password to access your desktops.
    Password: ********
    Verify: ********

    起動したら接続用のパスワードを設定します。パスワードは8文字までで、8文字を超える長さの場合には最初の8文字が使われるようです。

    2.クライアント側(Android側)

    クライアント側はGoogle PlayストアでVNC viewerをインストール。

    起動したら、接続先として「Linux側のIPアドレス:5901」、接続名を適当な名前を設定します。接続するとパスワードを聞かれるので、vncserverを起動する際に設定したパスワードを入力します。ポート番号の5901は5900に:1の1を足して5901となっています。

    3.x2vncのインストール

    Synapticでx2vncをインストールする。インストールしたら以下のようにして起動する。

    $ x2vnc -shared -west localhost:1
    x2vnc: VNC server supports protocol version 3.8 (viewer 3.3)
    Password: ********
    
    x2vnc: VNC authentication succeeded
    x2vnc: Desktop name "(ホスト名):1 (ユーザー名)"
    x2vnc: Connected to VNC server, using protocol version 3.3
    x2vnc: VNC server default format:
    screen[0] pos=1003
    Xinerama detected, x2vnc will use screen 1.
    x2vnc: pointer multiplier: 0.930491

    として起動します。この状態でマウスは行き来できるようになっています。
    が、ウインドウは行き来できません。ウインドウマネージャがいないような雰囲気です。しかし、サブディスプレイ側(Android側)ではコンソールウインドウが開いているので、そこでfirefoxを起動するとサブディスプレイ側にブラウザを開くことができました。とりあえずWebを参考にしながら何か作業したり、viやxedで設定ファイルを編集したりする分には十分です。

    ここで一旦終了させます。

    $ killall x2vnc
    $ vncserver -kill :1

    VNCのパスワードを変更します。

    $ vncpasswd
    Password: ********
    Verify: ********

    4.まとめ

    インストールが完了したら、以下の手順で起動できます。

    $ vncserver :1 -depth 15 -geometry 1280x800 -alwaysshared
    $ x2vnc -shared -west localhost:1

    画面サイズはNexus7(2012)の画面サイズです。Android側でフルスクリーンにしておけばちょうどよくなります。

    IMG_20160809

    サブディスプレイとして使っている様子はこんな感じです。USBケーブルは電源供給専用で、接続はモバイルルータ経由です。


  • Nexus7(2012)のファームウェアをLoliPopにアップデート

    投稿日 2016年 5月 21日 コメントはありません

    手元にあるNexu7(2012/3Gモデル)をAndroid 5.1.1(LoliPop)にアップデートしてみます。
    手順はFactory Images for Nexus Devicesに書かれているとおりです。下の方の使用条件に同意してチェックすると具体的なイメージやアップデートの方法が表示されます。

    下記にLinuxMint17(64bit)での手順を記載しておきます。言うまでもないことですが、ファームアップデートは自己責任で。

    1)ツールのインストール

    $ sudo apt-get update
    $ sudo apt-get install android-tools-adb
    $ sudo apt-get install android-tools-fastboot

    2)Android端末を開発者モードに変更する

    Android4.4.4ではUSBでPCに接続しても、PC側では認識されません。現在入っている
    設定→タブレット情報をタップして、タブレット情報を表示させ、ビルド番号を連打すると「開発者モードになりました」という表示がされ、設定メニューの中に「開発者向けオプション」が現れます。開発者向けオプションの中の「USBデバッグ」にチェックを入れてからPCに接続します。

    3)Android端末のUSBデバイスIDを確認する

    $ lsusb
    Bus 002 Device 091: ID 18d1:d002 Google Inc. 
    Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 004: ID 05e3:0605 Genesys Logic, Inc. USB 2.0 Hub
    Bus 001 Device 007: ID 2101:1406 ActionStar 
    Bus 001 Device 006: ID 046d:c534 Logitech, Inc. Unifying Receiver
    Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub
    Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

    この場合、最初の18d1:d002がNexus7(2012)デバイスIDです。(18d1がベンダID、d002がデバイスID)

    4)udevルールを作成

    $ sudo vi /etc/udev/rules.d/51-android.rules

    内容はこんな感じ

    SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

    5)パーミッションを変更して、udevを再起動

    $ chmod 644 /etc/udev/rules.d/51-android.rules
    $ sudo /etc/init.d/udev restart

    6)イメージのダウンロードと検証

    以降は、公式サイトの手順の「Flashing instruction」に沿って進めていきます。

    まずはイメージのダウンロードと検証です。適当なディレクトリにイメージをダウンロードして、

    $ md5sum nakasig-lmy47v-factory-b2d44613.tgz
    c30e5d3bd7cef9edde38ce58bf741857 nakasig-lmy47v-factory-b2d44613.tgz

    としてファイルの正当性をチェックします。正しいファイルがダウンロードできたら、展開しておきます。

    7)イメージの書き込み

    Nexus7をPCに接続して、ターミナルから

    $ adb reboot bootloader

    でリブートさせます。初回はNexus側にUSBデバッグを許可するか表示されますので、「常に許可する」のチェックボックスにチェックを入れてOKを押します。
    Nexus側にブートローダの画面が表示されますので、

    $ fastboot oem unlock
    ...
    (bootloader) Bootloader is already unlocked
    OKAY [ 0.020s]
    finished. total time: 0.020s

    として、ブートローダをアンロックします。自分の場合は、以前5.0.2から4.4.4に戻した際にアンロックしてありましたので、上記のように「already unlocked」となりました。

    引き続きファームウェアアップデートに入ります。当然ですが、端末に保存されている情報はすべて消えてしまいますので、十分注意してください。また、不慮の事故等で端末が文鎮化するかもしれませんので、自己責任で。

    ~/ダウンロード $ cd nakasig-lmy47v
    ~/ダウンロード/nakasig-lmy47v $ ./flash-all.sh 
    ...
    (bootloader) Bootloader is already unlocked
    OKAY [ 0.020s]
    finished. total time: 0.020s
    erasing 'boot'...
    OKAY [ 0.035s]
    finished. total time: 0.035s
    ******** Did you mean to fastboot format this partition?
    erasing 'cache'...
    OKAY [ 0.174s]
    finished. total time: 0.174s
    erasing 'recovery'...
    OKAY [ 0.035s]
    finished. total time: 0.036s
    ******** Did you mean to fastboot format this partition?
    erasing 'system'...
    OKAY [ 0.370s]
    finished. total time: 0.370s
    ******** Did you mean to fastboot format this partition?
    erasing 'userdata'...
    OKAY [ 12.177s]
    finished. total time: 12.177s
    sending 'bootloader' (2100 KB)...
    OKAY [ 0.270s]
    writing 'bootloader'...
    OKAY [ 1.225s]
    finished. total time: 1.495s
    rebooting into bootloader...
    OKAY [ 0.020s]
    finished. total time: 0.020s
    sending 'radio' (16384 KB)...
    OKAY [ 1.973s]
    writing 'radio'...
    OKAY [ 0.673s]
    finished. total time: 2.646s
    rebooting into bootloader...
    OKAY [ 0.020s]
    finished. total time: 0.020s
    archive does not contain 'boot.sig'
    archive does not contain 'recovery.sig'
    archive does not contain 'system.sig'
    --------------------------------------------
    Bootloader Version...: 4.23
    Baseband Version.....: 1231_0.18.0_0409
    Serial Number........: xxxxxxxxxxxxxxxx
    --------------------------------------------
    checking product...
    OKAY [ 0.040s]
    checking version-bootloader...
    OKAY [ 0.023s]
    checking version-baseband...
    OKAY [ 0.030s]
    sending 'boot' (5186 KB)...
    OKAY [ 0.642s]
    writing 'boot'...
    OKAY [ 0.253s]
    sending 'recovery' (5740 KB)...
    OKAY [ 0.706s]
    writing 'recovery'...
    OKAY [ 0.237s]
    erasing 'system'...
    OKAY [ 0.109s]
    sending 'system' (650039 KB)...
    OKAY [ 77.868s]
    writing 'system'...
    OKAY [ 36.357s]
    erasing 'userdata'...
    OKAY [ 4.903s]
    formatting 'userdata' partition...
    Creating filesystem with parameters:
     Size: 30063722496
     Block size: 4096
     Blocks per group: 32768
     Inodes per group: 8192
     Inode size: 256
     Journal blocks: 32768
     Label: 
     Blocks: 7339776
     Block groups: 224
     Reserved block group size: 1024
    Created filesystem with 11/1835008 inodes and 159204/7339776 blocks
    sending 'userdata' (139157 KB)...
    writing 'userdata'...
    OKAY [ 29.779s]
    erasing 'cache'...
    OKAY [ 0.088s]
    formatting 'cache' partition...
    Creating filesystem with parameters:
     Size: 464519168
     Block size: 4096
     Blocks per group: 32768
     Inodes per group: 7088
     Inode size: 256
     Journal blocks: 1772
     Label: 
     Blocks: 113408
     Block groups: 4
     Reserved block group size: 31
    Created filesystem with 11/28352 inodes and 3654/113408 blocks
    sending 'cache' (9052 KB)...
    writing 'cache'...
    OKAY [ 1.733s]
    rebooting...
    
    finished. total time: 152.918s

    完了すると、勝手に再起動します。
    最初しばらくは倒れたドロイド君の上に赤三角内に「!」が表示されていて動きがないのでびっくりしますが、しばらくすると画面が変わって起動時の画面(Googleカラーのつぶつぶがぐるぐる廻る)に変わります。この状態が長く(5〜10分位?)続いた後、Welcome画面とともに言語選択する画面に遷移します。


  • Raspberry Pi 3にAndroidから接続する

    投稿日 2016年 5月 5日 コメントはありません

    Raspberry Pi 3はWiFiを標準で搭載しているのでモバイルルータとAndroid端末があれば、どこでも結線なしでAndroidから接続することができます。(もちろん、Raspberry Pi 3には電源供給してやらなければなりませんが・・・)

    アクセスには適当なSSHクライアントとキーボードアプリ(標準のキーボードだとさすがにストレス溜まります)を使えば、簡単です。自分はConnectBotとHackers Keyboardを使っています。

    ただし、AndroidはmDNS/Avahi/Bonjourに対応していないのでIPアドレスを直打ちしなければなりません。できればRaspberry Pi 3側はDHCPのままにしたいところ。

    そこで、mDNS/Avahi/Bonjourでサービスを探してくれるアプリも必要になります。自分はBonjour Browserというのを使っています。

    手順を纏めると、こんな感じです。(Raspberry Pi 3側のWiFi設定はできている前提です)

    1. モバイルルータ、Raspberry Pi 3の電源を投入。
    2. Android側でBonjuor BrowserでRaspberry Pi 3のIPアドレスを調べる
    3. ConnectBotでRaspberry Pi 3にSSHログインする
    4. キーボードをHackers Keyboardに切り替える

    これでいつでもどこでもCUIベースの作業ができますw

    GUIベースもxrdp(Raspberry Pi側)とaFreeRDP(Android側)で一応接続できているけど、使い勝手はイマイチっぽい感じです。もっとよい組み合わせがあれば知りたいところ。


  • スマートフォン用タッチペン

    投稿日 2016年 1月 26日 コメントはありません

    とあるアプリケーションが指では操作しにくく困っていた時に、知り合いからタッチペンを借りたらなかなか良かったので購入してみようと思いました。

    ・・・が、電気屋さんで売っているタッチペンは1,500円〜4,000円くらいもするのでおいそれと手が出ません。そこでまず100円ショップのタッチペンを何本か購入して比較してみることにしました。

    比較対象は以下の4点。

    ダイソータッチペン4種

    いずれもダイソーで売っているものです。左から順に、

    • 「タッチペンボールペン付」
      細めのベールペンの後ろ側がタッチペンになっているものです。パッと見のデザインはなかなかいい感じ。ボールペンは黒一色でボール径1ミリ。
    • 「導電繊維使用タッチペン&2色ボールペン」
      1つ目より一回り大きい外観に2色ボールペンが入っています。1つ目同様に後ろ側がタッチペンになっていて、ここに導電繊維を使っているので「なめらかなペン滑り」というのが売りのようです。ペン本体もパール調の塗装が施されていてなかなかです。
    • 「タッチ&ボールペン」
      これは先端部分がタッチペンになっているのですが、穴が開いていて、ノック式のボールペンがそこから出てきます。これだけはダイソーの完全なプライベートブランド商品ではなくプラチナ万年筆株式会社の社名がパッケージに入っています。
    • 「スマートフォンストラップタッチペン」
      イヤホンジャックに挿して持ち運べるタイプのタッチペンです。見るからにチャちいです。

    タッチペンとしてのファーストインプレッションは、「導電繊維使用タッチペン&2色ボールペン」はタッチすると2点に認識されるケースがあるのか、かなりの頻度でズームしてしまいます。他の3点はタッチペンとしては基本的には使えそうです。もっとも、2台で試してみるとペン同士の差よりも2台での違いのほうが大きいかも?と感じます。もう少し使い込んでみて、感想を追加しようかと思います。また、外で手袋をした状態だとどうかというのも試してみたいと思います。

    <追伸>

    結局、使いやすさでは三番目の「タッチ&ボールペン」が一番かと思います。通常のボールペンと同じ持ち方でタッチできるのが意外にいい感じです。他のものは後端がタッチペンになっているので、結構違和感があります。さすがプラチナ万年筆株式会社の社名がパッケージに入っているだけのことはあるという感じでしょうか。


  • GPS動かず・・・

    投稿日 2016年 1月 24日 コメントはありません

    室内だったため測位できなかったと思われたGPSモジュールを外に連れだしてみました。

    IMG_3106s

    こんな感じで車のダッシュボード上に置いてみたのですが、結局測位できず・・・。アンテナが悪いのか、モジュールが悪いのかわかりませんが、ダメでした・・・。

    <追伸>

    よくみると、GPSのアンテナの裏側がシールドされています。パッシブアンテナでもシールドが要るもんなんだろうか?ひょっとして、アクティブアンテナなんじゃなかろうか?
    ・・・・ということで、3.3Vを47uHのマイクロインダクタを通してアンテナの芯線に供給してみました。結果、多少表示が変わりましたが、測位には至らず。外は寒いので手早くやってしまったので、もう少し放置すると変わるのかもしれません。

    <さらに追伸2/21>

    あらためて、車のダッシュボード上でしばらく放置していたら測位できました。インダクタの効果かどうかはわかりませんが・・・。


  • 中華タブレット用GPSを作ってみました

    投稿日 2016年 1月 24日 コメントはありません

    以前購入した中華Androidタブレットがあるのですがが、(WiFiタブレット全般に)GPSが付いていません。そこで、外付けのGPSユニットを作ってみました。

    IMG_3104s

    外付けGPSについて調べてみると、PL2303をUSB-UARTコンバータとして使用しているUSB接続GPS機器をAndroidで使うための「You Are Here GPS」というソフトがあることがわかりました。そこから察するにNMEA-0193フォーマットでUARTにデータを吐くGPSモジュールをPL-2303に接続すれば良さそうです。ただ、You Are Here GPSを動かしてみたところ、シリアルの速度は4800bpsか9600bpsしか選べません。ここはGPSモジュール選定の際の要注意事項です。

    実際の回路はGPSはaitendoでGM-242iというモジュールとGPSHMX-039というパッシブアンテナ、USB-TTL2303-5PというUSB-UART変換モジュールを購入して、小さな基板上に5VからGPSの電源の3.3Vを生成する三端子レギュレータとバックアップ用のコイン形リチウム電池を載せました。

    まずは、LinuxMintをインストールしたPCに接続してGM-242iのデフォルトの通信速度である38400bps、ビット長8、パリティなし、ストップビット1ビットで接続します。ソフトはmoserialを使用しました。

    $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 
    $GPGSV,1,1,00*79 
    $GPGLL,,,,,,V,N*64 
    $GPRMC,,V,,,,,,,,,,N*53 
    $GPVTG,,,,,,,,,N*30 
    $GPGGA,,,,,,0,00,99.99,,,,,,*48 
    $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 
    $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 
    $GPRMC,,V,,,,,,,,,,N*53 
    $GPVTG,,,,,,,,,N*30 
    $GPGGA,,,,,,0,00,99.99,,,,,,*48 
    $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 
    $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 
    $GPRMC,,V,,,,,,,,,,N*53 
    $GPVTG,,,,,,,,,N*30 
    $GPGGA,,,,,,0,00,99.99,,,,,,*48 
    $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 
    $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 
    $GPRMC,,V,,,,,,,,,,N*53 
    $GPVTG,,,,,,,,,N*30 
    $GPGGA,,,,,,0,00,99.99,,,,,,*48 
    $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30

    こんな感じのGPSメッセージが流れているのが確認できますので、以下のコマンドをASCIIで送信して速度を9600bpsに変更します。

    $PUBX,41,1,0007,0003,9600,0*10

    変更したら、moserial側も一旦切断して速度を9600bpsに変更して再接続します。引き続きHEXで以下のUBXコマンドを送って、コイン形リチウム電池でバックアップされるBBRAM領域に設定を保存します。

    B56206090D0000000000FFFF0000000000001731BF

    B5 62 06 09でCFG-CFGコマンド(コンフィギュレーションのクリア、保存、読み出し)を指定します。続く「0D 00」がリトルエンディアンなので0x000Dで長さ13を示しています。続く「00 00 00 00」=0x00000000でクリアするものはなし、「FF FF 00 00」=0x0000FFFFですべて保存、「00 00 00 00」=0x00000000でロードするものはなし、次の17で保存できるデバイスすべてを指定しています。

    参考まで、UBXコマンドのチェックサムを付加・算出するPythonスクリプトを置いておきます。

    #!/usr/bin/env python
    # coding: utf-8
    
    #              CLS  ID   LENGTH    clearMask           saveMask            loadMask            deviceMask
    CMDSAVE     = [0x06,0x09,0x0D,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x17]
    
    cmd = CMDSAVE
    CK_A = 0
    CK_B = 0
    STR = "B562"	# HEADER
    for x in cmd:
    	CK_A = CK_A + x
    	CK_B = CK_B + CK_A
    	STR = STR + format(x,'02X')
    STR = STR + format(CK_A & 0xff,'02X') + format(CK_B & 0xff,'02X')
    print STR

    これで電源をOFFしても電源投入時点から9600bpsで動作します。この状態で中華タブレットに接続し、 You Are Here GPSを動作させます。設定で通信速度を9600bpsにセットして「connect」を押すとNMEA-0193メッセージが1秒周期で表示されます。
    カタログスペックでは衛星捕捉-142dBm、トラッキング-159dBmの感度があることになっていますが、残念ながら鉄筋コンクリートの室内では測位できないようです(スマートフォンでは何とか衛星捕捉から可能なようなのですが・・・)。近いうちに外で測位させてみたいと思います。


  • Google Playストアが動かなくなった

    投稿日 2015年 8月 10日 コメントはありません

    Covia F4sでGoogle Playストアへの接続ができなくなってしまいました。「接続できません」という表示と再試行のボタンが表示され、アカウント選択の画面が出るばかりです。戻して「再試行」を押してみても変わりません。半日経っても変わりません。

    で、困ったのでぐぐってみてこちらのページを参考に以下のことをやってみたら接続できるようになりましたので、メモしておきます。

    「設定」⇒「アプリ」で「すべて」のアプリを表示させて、

    • 7番の「Google Playストアアプリのデータ削除」
    • 「Googleアプリ」のキャッシュを消去(参考にさせていただいたページにはありません)

    した後で、端末を再起動させたところ、Google Playストアに接続できるようになりました。どちらが効果があったのかわかりませんが、メモとして残しておきます。