Nexus7(2012)にAndroid 6.0(MarshMallow)をインストール

いまさらながら、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と

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

ブートローダが起動したら、音量ボタンでリカバリモードを選択して電源ボタンで選択すると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側から

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

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

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

ESP8266でSmartConfigを試してみた

長らく放置していた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のここから持ってきました。少しこの基板にあわせて修正したのが以下のファイルです。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

環境は以下の通り。

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

です。

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

1.Linux側(サーバ側)

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

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

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

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

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

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

3.x2vncのインストール

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

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

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

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

4.まとめ

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

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

IMG_20160809

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

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

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

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

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

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

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

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

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

4)udevルールを作成

内容はこんな感じ

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

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

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

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

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

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

7)イメージの書き込み

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

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

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

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

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

Raspberry Pi 3にAndroidから接続する

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側)で一応接続できているけど、使い勝手はイマイチっぽい感じです。もっとよい組み合わせがあれば知りたいところ。

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

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

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

比較対象は以下の4点。

ダイソータッチペン4種

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

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

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

<追伸>

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

GPS動かず・・・

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

IMG_3106s

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

<追伸>

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

<さらに追伸2/21>

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

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

以前購入した中華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を使用しました。

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

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

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スクリプトを置いておきます。

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

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

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

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

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

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

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