趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • 秋月のLPC11U35マイコンボードを動かしてみた

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

    久しぶりに秋月へ行ったら、「USBメモリにファイルを書き込むのとほぼ同様の手軽さでプログラムを書き込むことができます」という触れ込みのマイコンボードが安く売っていたので、買ってみました。

    で、動かしてみるべく、Linuxマシン(環境はいつものLinux Mintです)へ接続すると、確かにマスストレージデバイスとして認識します。で、秋月のWebサイトにある動作確認用ファームウェアを書き込んで、リセットしてみても、再びマスストレージデバイスとして認識されて、LEDが点滅する気配がありません。

    mbedとしても動作する、というのでサンプルプログラムを作って同様に書き込んでみてもサッパリです。linuxではドラッグアンドドロップでの書き込みはうまく行かないのかと思って、コマンドラインで cp コマンドでコピーしてみてもダメです。

    で、ぐぐってみたら、どうやら linux ではそもそもファイル書き込みではうまくいかないようで、こちらの情報によると先頭の4ブロック(2キロバイト?)を削ってddで書き込むとうまく行くようです。

    ただ、デバイスファイルなんていろんな要因で変わってしまうので、毎回やるのは面倒ですし、事故のもとなので、pythonのスクリプト化しました。

    lsblkコマンドで見た時に、転送方法が usb で、モデルが’LPC1XXX IFLASH  ‘となっているデバイスファイルを探して、そのデバイスファイルをアンマウントして、ddコマンドで書き込むだけです。スクリプトファイル⇒mbedにlinuxから書き込むためのスクリプト

    ルート権限が必要なのは変わらないので、sudo 付きで python スクリプトを実行します。

    $ sudo python ./write_mbed.py firmware.bin 
    mbed device is /dev/sdc
    umount /dev/sdc
    dd if=firmware.bin of=/dev/sdc seek=4
    16+1 レコード入力
    16+1 レコード出力
    8456 bytes (8.5 kB, 8.3 KiB) copied, 0.387457 s, 21.8 kB/s

    みたいな感じで使います。(途中の umount とか dd コマンドの行はこのスクリプトの処理内容を表示しているだけで、書き込みに必要な操作は最初の1行目だけです)

     


  • 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を再起動します。


  • ESP32を動かしてみた

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

    ふと秋月のWebサイトをみていたら、ESP-WROOM-32が発売になっていました。早速、秋月へ行ってゲットしてきました。

    で、とにかく動かしてみます。すでに先達もいるようなので、参考にさせてもらいながら、なるべく手抜きして動かします。開発環境はESP-WROOM-02の時と同様にArduinoで動かします。

    使用した部品

    使用した部品は以下の通りです。

    • ESP-WROOM-32
      まずこれがないと、ですね。
    • FT-232RQ USBシリアル変換キット
      最近のお気に入りのUSBシリアル変換基板です。Linuxでも安定して動作するのでGoodです。
    • NJU7223DL1
      3.3Vのレギュレータです。データシートの回路図だと入出力のコンデンサが小さくて済みそうなので、選びました。
    • 0.1uF 1608 チップコンデンサ✕3
      三端子レギュレータの入出力に各1個、USBシリアルのRTS端子とEN端子の間に1個
    • 22uF 1608 チップコンデンサ✕1
      ESP-WROOM-32の資料では電源入力に10uFが付いているので、手持ちの22uFのチップコンを使用
    • 10kΩ 1608 チップ抵抗✕2
      1個はEN端子のプルアップ、もう1個はIO0端子のプルアップ
    • 0.022uF 1608 チップコンデンサ✕1
      EN端子の入力とGND間に接続
    • 適当なタクトSW✕1
      IO0端子をGNDに落としてダウンロードモードに移行させるのに使います
    • ユニバーサルプリント基板
      これを使いました。最近は軽量化を目指して薄めの基板を使ってます。この基板は両面なのですが、内面がスルーホール処理されていないので表裏の接続ができていない箇所があってハマリました。
    • その他
      適当なピンヘッダ・ピンソケット、ポリウレタン被覆線、スズメッキ線

    ハードウェアの組み立て

    こちらの回路を参考に手抜きして作りました。

    • GND端子はUSBシリアル基板のGNDに接続
    • 3V3端子は三端子レギュレータの出力端子に接続
    • EN端子は10kΩでプルアップ、GNDとの間に0.022uF、USBシリアル基板のRTS端子との間に0.1uFを接続。この0.1uFによりPC側でRTSを制御するとESP-WROOM-32側にリセットがかかります。
    • IO0端子はプルアップ、および、タクトスイッチを接続して、ボタン押下でGNDに落ちるようにします。ボタンを押しながらArduino IDEで書き込み操作をすることで、書き込みモードへ移行できます。
      (注:IO0のプルアップは不要らしい。タクトスイッチによるIO0のコントロールがうまく行かなかった際につけたが、外してOKかは試していない。ちなみに、タクトスイッチでIO0がコントロールできなかった原因はノンスルーホール基板を使ったので基板の表裏で接続ができてなかったため。)
    • TXD0端子はUSBシリアル基板のRXDへ接続
    • RXD0端子はUSBシリアル基板のTXDへ接続

    回路図はこんな感じです。15ピンのGNDは手抜きで接続していませんが、動いています。

     

    こんな感じになりました。

    ESP-WROOM-32は裏返しに両面テープで基板に貼り付けてあります。基板を作りなおす時も多分無事に剥がせると思います。

    無計画に作ったので、裏側は汚いですw。左上のレギュレータ周りがどうしようもないですね。

    まずはハードウェアの動作確認

    Arduinoで書き込みをする前に、ハードウェアの動作確認をしておきます。
    といっても、よくよく結線を確認した後、電源を投入(USBケーブルで接続)するだけです。
    電源を投入したら、スマートフォンのWiFiアナライザなどアプリケーションで、「ESP-xxxxxx」というSSIDが見えることを確認しておきます。SSIDが見えればとりあえずESP-WROOM-32はアクセスポイントとして動作しているはずです。(注:Arduino環境の構築ができていれば、Arduinoのシリアルモニタで /dev/ttyUSB* を115200bpsでモニタすればブートローダなどの表示も確認できます)

    Arduino開発環境の構築

    PCはLinux Mint 18の64bit版です。

    まず、arduino IDE をインストールします。その前に、古いバージョンをアンインストール。

    $ cd arduino-1.6.12
    $ ./uninstall.sh 
    Removing desktop shortcut and menu item for Arduino IDE... done!

    arduino.cc から最新版の arduino-IDE をダウンロード。今回ダウンロードしたファイルは arduino-1.8.1-linux64.tar.xz です。

    $ cd ~
    $  xzcat ダウンロード/arduino-1.8.1-linux64.tar.xz | tar xvf -
    $ cd arduino-1.8.1/
    $ ./install.sh
    Adding desktop shortcut, menu item and file associations for Arduino IDE... done!

    次に、arduino-esp32 をインストール。このページのコマンドをコピペ。

    $ sudo usermod -a -G dialout $USER && \
    > sudo apt-get install git && \
    > mkdir -p ~/Arduino/hardware/espressif && \
    > cd ~/Arduino/hardware/espressif && \
    > git clone https://github.com/espressif/arduino-esp32.git esp32 && \
    > cd esp32/tools/ && \
    > python get.py
    [sudo] xxx のパスワード: 
    パッケージリストを読み込んでいます... 完了
    依存関係ツリーを作成しています 
    状態情報を読み取っています... 完了
    git はすでに最新バージョン (1:2.7.4-0ubuntu1) です。
    アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 39 個。
    Cloning into 'esp32'...
    remote: Counting objects: 2799, done.
    remote: Compressing objects: 100% (10/10), done.
    remote: Total 2799 (delta 1), reused 0 (delta 0), pack-reused 2785
    Receiving objects: 100% (2799/2799), 54.67 MiB | 3.44 MiB/s, done.
    Resolving deltas: 100% (1152/1152), done.
    Checking connectivity... done.
    Checking out files: 100% (903/903), done.
    System: Linux, Info: Linux-4.4.0-45-generic-x86_64-with-LinuxMint-18-sarah
    Platform: x86_64-pc-linux-gnu
    Downloading xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
    Done
    Extracting xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
    Downloading esptool-fe69994-linux64.tar.gz
    Done
    Extracting esptool-fe69994-linux64.tar.gz
    Done
    ~/Arduino/hardware/espressif/esp32/tools $

    いよいよ起動します。デスクトップ上のArduino IDEのアイコンをダブルクリックして、Arduino IDEを起動。
    起動したら、「ツール」→「ボード:xxx」→「ESP32 Dev Module」を選択でESP32モジュールを選択します。

    サンプルを動かしてみる

    次にサンプルを動かしてみます。シリアルに結果が表示されるものが良いと思うので、WiFiScanを動かしてみます。
    「ファイル」→「スケッチ例」→ESP32 Dev Module用のスケッチ例の下の「WiFi」→「WiFiScan」選択すると、サンプルプログラムが表示されます。「ツール」⇒「シリアルポート」⇒「/dev/ttyUSB0(環境によって変わります)」でシリアルポートを選択した後、「ツール」⇒「シリアルモニタ」でシリアルモニタを起動しておきます。

    準備ができたら「⇒」ボタンをクリックして、書き込んでみます。「⇒」をクリックする際にはIO0に接続したタクトスイッチを押しながらクリックすることでダウンローダを起動します。「Wrting … 」という表示が出たら、タクトスイッチのボタンを離します。

    書き込み完了後はこんな感じ。

    書き込みが終わると、シリアルモニタの方に表示が始まります。

     

    こんな感じでSSIDのリストが表示されれば成功です。


  • 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画面とともに言語選択する画面に遷移します。


  • LinuxMint17.2でUSBメモリ環境を構築

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

    久々にUSBメモリにLinux環境を構築しました。作業的には慣れたもののはず・・・と思ったのですが、すっかり忘れてました。なので、作業ついでにメモを作り直します。

    1.環境

    PCはCore2Duo E7400(VT-x未対応版。E7400はVT-xは途中から対応しているので、初期のものはVT-xがOFFになっていて仮想化支援機能が動かないんです。)で、メモリは4GB、HDDにはWindows8.1が入ってますが、全然使ってない。
    LinuxMint17.2をインストールするUSBメモリはSanDisk Cruzer Fit 16GB。遅いUSBメモリですが、小さいので邪魔になりません。

    2.インストールイメージの準備

    とりあえず、LinuxMint17.2の32bit版をダウンロード。UNetBootinで別の4GBのUSBメモリにインストールイメージを書き込みました。(ライブCDの代わりとして使うならこのままでもいいんでしょうが・・・)
    他の環境ではUSBイメージライタを使ってUSBメモリに書き込む、あるいはDVD-Rにイメージを焼いて・・・でも構わないでしょう。ただ、SATAを禁止する関係で内蔵DVDROMドライブは使えないので、DVDROMに焼いて起動する場合には外付けのUSB-DVDドライブが必要になります。

    3.インストール環境のブート

    4GBのUSBメモリを接続して、電源ON。BIOSを起動して

    • SATAインタフェースをDisable(内蔵HDDを見えなくする)
    • 起動順序をUSB-HDDを最初にする(しなくてもいいと思うけど、癖で設定)

    とします。CTRL-ALT-DELでリブートさせて、USBメモリからブートさせます。ブート時にUNetBootinのメッセージが出ますが、DefaultのままでLinuxMint17.2のライブイメージを起動します。

    4.インストーラの起動

    ライブ環境起動後にターゲットのSanDisk Cruzer Fit 16GBを接続して、インストーラをダブルクリックして起動。

    5.パーティションの設定とOSインストール

    パーティションの設定はカスタムにしました。メモリ4GBあるのでSWAPパーティションがなくても問題ありません。なので、パーティションテーブルを初期化して、1パーティションをext4で作成、マウントポイントは / にします。インストールを継続しようとすると、「スワップパーティションがないよ」と警告されますが、そのまま継続。あとはインストーラの指示通りにインストール。ブートローダーは /dev/sdb (HDDが認識されていなければ、これがSanDisk Cruzer Fit 16GBのはず)に書き込みます。

    6.再起動とアップデート

    インストールが完了したら、インストーラの指示に沿って再起動する方を選択します。再起動したら、アップデートマネージャを起動して、ひたすらアップデートします。

    7.設定ファイル編集による追加設定

    1)内蔵HDDを見えなくする

    SATAドライバを禁止して内蔵HDDを見えないようにします。SATAで接続されているDVDROMドライブも見えなくなってしまいますが、代わりに内蔵HDDを誤って書き換えてしまったりする可能性が大幅に減少します。作業としては、 /etc/default/grub を開いて、 「GRUB_CMDLINE_LINUX_DEFAULT」の起動時オプションに「libata.force=disable」を追加します。
    修正後は、

    $ sudo grub-mkconfig -o /boot/grub/grub.cfg

    としてgrub.cfgファイルを自動生成させて反映させます。
    この後、BIOSのSATA禁止を解除して再起動して、PCの内蔵HDDが見えないことを確認します。

    2)USBメモリへのアクセス高速化

    HDDアクセス時のアクセス時刻の記録を停止してアクセスを減らすとともに、/tmpをtmpfsにより確保してHDDへのアクセスをなくします。/etc/fstab をのもとからある行にnoatimeオプションを追加し、さらにtmpfsで始まる行を追加します。

    # / was on /dev/sda1 during installation
    UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 noatime,errors=remount-ro 0 1
    # tmpfs
    tmpfs /tmp tmpfs defaults,noatime 0 0

    3)システム時計が狂うのを直す

    /etc/default/rcS の中の「UTC=yes」を「UTC=no」に修正します。

    ここで一旦再起動します。

    8.その他、追加設定

    1. 背景の変更
      明るい背景が苦手なので、適当な暗めの背景に変更しました。
    2. テーマの変更
      青系の色が好きなので、Mint-X-Tealにテーマを変更しました。
    3. FireFoxの設定変更
      ・起動時のホームページを自分の設定に修正
      ・履歴の記憶を「一切記憶させない」に変更
    4. Chromeブラウザのインストール・設定
      Chromeのダウンロードページへ行ってDebian32bit版をダウンロード、Package Installerでインストール。インストール後、「アプリケーション」⇒「インターネット」⇒「Google Chrome」で起動できますが、自分はまずは右クリックして「プロパティ」を表示し、コマンドの部分に「–incognito」のオプションを追加して、常にプライベートモードで起動するようにしています。
    5. 日本語設定
      日本語の設定を忘れていました。「設定」⇒「言語」でLanguage/RegionともにJapanese,Japan UTF-8になっていることを確認して、System localeのところで「システム全体に適用する」を押します。
      上のほうにある「Input Method」を押して、「Add support for IBus」を押してIBusをインストールします。インストール完了後、上の方にある「Input Method」をNoneからIBusに変更します。
      変更したら一旦ログアウトしてログインし直すと、右下にキーボードのアイコンが出てくるので、これを左クリックしてMozcを選択します。テキストエディタなどを開いてみると日本語入力できるはずです。

    こんなところでしょうか。

    あとは、好きなアプリをインストールするなり、何なりすればと思います。


  • ESP-8266用ArduinoIDEでサンプルを動かす

    投稿日 2015年 7月 11日 1つのコメント

    環境構築とサンプルを動かす話を一つの記事にしたら長くて読みにくくなってしまったので、2つに分割します。この記事は環境構築の続きです。

    ESP8266自身で動かすWebサーバーサンプルのテストと、ESP8266をNTPクライアントにするサンプルのテストです。

    サンプルのコンパイルと書き込み

    以下の手順でサンプルの動作を確認しました。

    1. 「ファイル」⇒「スケッチの例」⇒「ESP8266mDNS」⇒「mDNS_Web_Server」を選択してみます。
    2. 23行目にSSIDを、24行目にパスワードを設定する箇所がありますので、そこにそれぞれの環境に応じた設定をします。
    3. 「ファイル」⇒「名前をつけて保存」で適当なディレクトリを作って保存します。
      (あたり前といえばあたり前ですが、保存しないとうまく動作しません)
    4. ESP8266ボード側はブートローダの起動状態にしておきます。(GPIO0をGNDに落とした状態でリセットをかけて、リセット解除しておきます。リセット解除後はGPIO0はGNDに落ちていても落ちていなくても構いません。なお、ESP8266のファームウェアバージョンはv0.9.5のものを使用しています。)
    5. 「ツール」⇒「シリアルモニタ」でシリアルモニタを起動しておきます。速度は115200bpsです。
    6. 「スケッチ」⇒「マイコンボードに書き込む」でコンパイルと書き込みを行います。
    7. 書き込みが終わると自動的に実行されます。
      screen8
    8. シリアルモニタ側にIPアドレスなどの情報が表示されます。
    9. ブラウザからそのIPアドレスにアクセスすると、ESP8266上で動作するWebサーバからのメッセージ(「Hello from ESP8266 at 192.168.xxx.xxx」)が取得できます。
      下記はAndroid上のブラウザからIPアドレス指定でアクセスした後のシリアルコンソールの表示内容です。
      screen9

    同様にNTPClientなども動作しました。

    Windowsだけではなく、Linuxでもこれだけお手軽に動かせるようになってきています。かなりお手軽にESP8266を動かす環境が整ってきていることを感じますね。

    ※上記の動作確認は接続先のアクセスポイントを含め、シールドルーム内で実施しています。早く技適対応済みのモジュールが入手できるようになって欲しいものです。


  • Linux版ESP-8266用ArduinoIDEのインストール

    投稿日 2015年 7月 10日 1つのコメント

    Linux版のESP8266対応のArduinoIDEのインストールが簡単になっていましたので、その方法でLinux32bit環境(LinuxMint17環境)にインストールしてみました。
    ArduinoIDEの1.6.4からボードマネージャ(Boards Manager)を使ってサードパーティのプラットフォームパッケージのインストールができるようになったようです。そこで、ESP8266用のプラットフォームパッケージが準備された、ということみたいです。
    このプラットフォームパッケージを使うと、超簡単にArduinoIDEからESP8266を使うことができます。現時点ではWindows,MacOS、Linux(32bit/64bit)のパッケージが準備されているようです。

    (7/15に64bit版Linuxでもサンプルのコンパイルまで確認してみました。手順は概ね同じですが、若干の記載漏れを加筆しました。また、64bit版ではファイル名などで32になっているところが64になったりします。)

    このプラットフォームパッケージの特筆すべき点は「AVRマイコンなど他のマイコンを必要とせず、ESP8266モジュール単体でArduinoとして動作しつつ無線LANでの通信ができる」ということです。

    大事なこと(すごいこと)なのでもう一度書きます。Arduinoとして動作させるのに、(書き込み時は別として)ESP8266モジュールと電源以外の部品は必要ありません

    たぶん、ArduinoIDE自体で依存するモジュールがあると思います。build-essentialやdefault-jdkなどは事前にインストールしておくほうが良いかと思います。

    ArduinoIDEのインストール

    arduino.ccからLinux32bit版のArudino IDEをダウンロードしてきます。ダウンロードが完了したら、アーカイブを展開します。

    端末(コンソール)を開いて、ホームディレクトリから

    $ xzcat ダウンロード/arduino-1.6.5-linux32.tar.xz | tar -xv
    $ ./arduino-1.6.5/arduino

    として、開発環境を起動します。
    (ダウンロード場所はディストリビューションなどに応じた場所を指定してください。上記ではホームディレクトリ直下にarduino-1.6.5というディレクトリができて、そこに展開します。)

    screen1

    「ファイル」⇒「環境設定」にて、環境設定の画面を開きます。開いたら、「Additional Boards Managers URLs:」に「http://arduino.esp8266.com/package_esp8266com_index.json」と入力し、OKを押します。

    ※追伸:安定版と開発版のバージョンができているようです。
    安定版は「http://arduino.esp8266.com/stable/package_esp8266com_index.json」、開発版は「http://arduino.esp8266.com/staging/package_esp8266com_index.json」を入力してください。
    どちらを選べばいいかわからない場合は当然安定版の方を選びましょう。

    「ツール」⇒「ボード」⇒「Board Manager …」を選択します。

    screen3

    一番下に、「esp8266 by ESP8266 Community」というのがありますので、ここをクリック(選択)すると、右下に「Install」ボタンが現れますので、「Install」ボタンを押します。

    screen4

    すると、40MBくらいダウンロードした後、Installedになります。

    screen6

    確認したら、「閉じる」でインストールは完了です。
    ESP-8266が使えるかどうかを「ツール」⇒「ボード」で確認します。

    screen7

    メニューに「Generic ESP8266 Module」「Olimex MOD-WIFI-ESP8266(-DEV)」「NodeMCU(ESP8266 ESP-12 Module)」が増えているのが確認できました。

    今回は「Generic ESP8266 Module」で動作させてみます。
    選択すると、「ツール」の下に「CPU Frequency」「Flash Size」「Upload Speed」「ポート」などの設定ができるようになっていました。今回はそれぞれ「80MHz」「512K(64K SPIFFS)」「115200」「/dev/ttyUSB0」としています。

    サンプルの動作確認は次の記事です。