趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • 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を選択します。テキストエディタなどを開いてみると日本語入力できるはずです。

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

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


  • ESP8266をUARTアダプタ(?)として使う

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

    海外でのESP8266の使われ方の一つとしてWiFi-UART変換を結構みかけます。これはWiFi側からの入出力をESP8266のUARTの入出力に接続するもので、UARTで制御できる機器をネットワーク越しにtelnetでコントロールできるようにする例が多いようです。もっと簡単に言うと『Teratermなどを使ってWiFi越しにUARTポートを実現する』とでも言えばいいでしょうか。そのうちやってみたいと思うのですが、今回はちょっと調べた例だけ記載したいと思います。

    UART変換に関する情報は「ESP8266 WiFi bridge」あたりで検索すると結構引っかかってきます。

    検索結果を見てみると、GitHubの「ESP8266-transparent-bridge」というエントリーではWiFi越しにArduinoのプログラミングができた、という記載があります。また、こちらの「MULTIWII (CLEANFLIGHT) WIFI TO EZ-GUI “HOW-TO” – ESP8266」という記事ではMultiWiiというマルチコプター(クアッドコプターはその一種)のコントローラに無線接続するまでが事細かに記載されています。記事の中では、Androidから接続する手順やWindowsから仮想COMポートとして接続する手順まで記載されていますので、参考になるかと思います。


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

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

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

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

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

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

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


  • ESP8266でjumpwire.ioを試してみた

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

    ESP8266についてググっていたら、広告欄に何やら「jumpwire.io」なるものが出てました。確か、ESP8266を使ったクラウドサーバーなんちゃらとか(細かい内容は忘れました)。

    とりあえずクリックしてみたら「MakerのためのIoTプラットフォーム」「Arduinoを5分でクラウドにつないで、あなたのIoTプロジェクトを成功に導きます。」だそうです。なんでも無料でお試しができるようなので、試してみることにしました。環境はUbuntu14.10LTS 64bit版 + ArduinoIDE1.6.5 + esp8266 version 1.6.5-947-g39819f0(ボードパッケージ)です。ボードパッケージのインストールまでの方法はこちらの記事を参照。

    無料サインアップ・・・から先は英語ですが、めげずに登録してみます。よくある「ユーザーIDはメールアドレス」ってやつです。ユーザーIDと設定するパスワードを打ち込むと、メールアドレス宛にアクティベート用のメールが届くので、そこにあるリンクをクリックするとサインアップ完了です。
    で、改めてログインし直します。(これもよくあるパターン)

    ログインすると、いきなり秘密のトークン(Secret token)が表示されます。この画面をコンソールと呼ぶようです。プロジェクトは無料で5つ作れて、A〜Eというアルファベットになるようです。で、プロジェクトごとにKEYが26個(A〜Z)セットできるようです。

    ここで一旦中断し、ローカル側(クライアント側)のプログラミングに戻ります。今回はgithubにライブラリとサンプルがあるようなので、これを動かしてみます。

    まず、gitでライブラリを持ってきます。

    ~$ cd Arduino/libraries/
    ~/Arduino/libraries$ git clone https://github.com/jumpwire-io/JWIO_ESP8266_ArduinoIDE
    Cloning into 'JWIO_ESP8266_ArduinoIDE'...
    remote: Counting objects: 35, done.
    remote: Total 35 (delta 0), reused 0 (delta 0), pack-reused 35
    Unpacking objects: 100% (35/35), done.
    Checking connectivity... done.
    ~/Arduino/libraries$ 
    

    これで~/Arduino/libraries/JWIO_ESP8266_ArduinoIDEの下にサンプルスケッチ(Sample_Sketch.ino)までコピーされますので、これをスケッチが保存されるべき場所にコピーします。

    ~/Arduino$ mkdir JWIO_ESP8266_ArduinoIDE
    ~/Arduino$ cd JWIO_ESP8266_ArduinoIDE/
    ~/Arduino/JWIO_ESP8266_ArduinoIDE$ mkdir Sample_Sketch
    ~/Arduino/JWIO_ESP8266_ArduinoIDE$ cd Sample_Sketch/
    ~/Arduino/JWIO_ESP8266_ArduinoIDE/Sample_Sketch$ cp ../../libraries/JWIO_ESP8266_ArduinoIDE/Sample_Sketch.ino .
    ~/Arduino/JWIO_ESP8266_ArduinoIDE/Sample_Sketch$

    これで「スケッチを開く」で、~/Arduino/JWIO_ESP8266_ArduinoIDE/ の下のSample_Sketch.inoを開きます。

    サンプルスケッチの冒頭に、

    jumpwireIo jwio("your_wifi_ssid","your_wifi_password",
      "your_jwio_secret_token","A");

    という箇所がありますので、ここにWiFiの設定と、さっき出たSecret tokenをセットします。4つ目のAは多分プロジェクト名でしょうか、そのままにしておきます。

    下の方に

      pinMode(5, OUTPUT);// initialize digital pin 13.

    という箇所があります。自分はGPIO2を使うので、ここを5から2に変更しておきます。後の方のdigitalWrite()のところも同様に修正しました。
    修正後のソースはこんな感じです。(開示できない箇所はxxxxxxxxxxxxxになってます)

    //definitions for jumpwire.io
    #include <ESP8266WiFi.h>
    #include <JWIO_ESP8266_ArduinoIDE.h>
    jumpwireIo jwio("xxxxxxxxxxxxx","xxxxxxxxxxxxx",
      "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","A");
    
    
    //put your definitions here
    
    //put your global variables here
    unsigned long timer;
    
    void setup() {
      jwio.setup(); //always put this code in setup()
      //put your code here
      pinMode(2, OUTPUT);// initialize digital pin 13.
      timer = millis(); // reset timer
    }
    
    void loop() {
      jwio.loop(); //always put this code in loop()
      //put your code here
      if (millis() - timer > 5000){
          jwio.Throw('B',millis()/1000.0);
          timer = millis(); // reset timer
        }
    }
    
    void Catch(char key, float value){
      //this function is called when byte values on jumpwire.io server are changed
      //put your code here
      if (key == 'A') {
        if(value == 0){          //if value of key A is 0
          digitalWrite(2, LOW);  //turn OFF LED
        }
        else if(value == 1){     //if value of key A is 1
          digitalWrite(2, HIGH); //turn ON LED
        }
      }
    }

    さて、ここで「マイコンに書き込み」とすると、コンパイルエラーが発生しました。

    Sample_Sketch.ino:4:37: fatal error: JWIO_ESP8266_ArduinoIDE.h: No such file or directory

    だそうです。そこでサンプルソースの冒頭の

    #include <JWIO_ESP8266_ArduinoIDE.h>

    #include "JWIO_ESP8266_ArduinoIDE.h"

    とすることで、ビルド&書き込み、実行ができました。
    ログを見ていると、ところどころでなにやらWebSocket関連でエラーが発生しているっぽい感じもしますが、先に開いたjumpwire.ioのログインコンソール上にKey BとしてESP8266側から経過時間が設定されているのがわかります。(下記画面だと418秒経過後)

    Screenshot0001

    さらに、Webコンソールの下の方にはData logとしてログが表示されています。

    ArduinoIDEのシリアルコンソールにはラウンドトリップタイムも表示されていますが、自分の環境からだと150msくらいかかっているようです。

    そして、ブラウザ上で「Value」のところに1をセットして「Throw」を押すと、点灯していたLEDが消灯しました。0をセットして「Throw」を押すと、消灯していたLEDが点灯しました。ソースのコメントとは逆の動作ですが、これは回路の差によるものでしょう。

    サンプルソースを修正して以下のようにしてみました。

    //definitions for jumpwire.io
    #include <ESP8266WiFi.h>
    #include "JWIO_ESP8266_ArduinoIDE.h"
    jumpwireIo jwio("xxxxxxxxxxxxxxx","xxxxxxxxxxxxxxxxxx",
      "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","A");
    
    
    //put your definitions here
    
    //put your global variables here
    unsigned long timer;
    bool sw=1,osw=1;
    
    void setup() {
      jwio.setup(); //always put this code in setup()
      //put your code here
      pinMode(2, OUTPUT);// initialize digital pin 13.
      timer = millis(); // reset timer
    }
    
    void loop() {
      jwio.loop(); //always put this code in loop()
      //put your code here
      if (millis() - timer > 5000){
          jwio.Throw('B',millis()/1000.0);
          timer = millis(); // reset timer
        }
      sw = digitalRead(0);
      if (sw != osw) {
        osw = sw;
        jwio.Throw('C',sw);
      }
    }
    
    void Catch(char key, float value){
      //this function is called when byte values on jumpwire.io server are changed
      //put your code here
      if (key == 'A') {
        if(value == 0){          //if value of key A is 0
          digitalWrite(2, LOW);  //turn ON LED
        }
        else if(value == 1){     //if value of key A is 1
          digitalWrite(2, HIGH); //turn OFF LED
        }
      }
    }

    GPIO0についているスイッチの状態が変化した場合にKey-Cの値をスイッチの状態に応じて0/1に変化させるように修正してみました。(無事動きました)

    公式サイトに日本語版の説明もない状態で動かしているため?)ログを見ていると途中でWebsocketが切れるみたいで、安定性に若干不安を感じないでもないですが、jumpwire.ioはシンプルに動くので、確かに手早くクライアント(ESP8266)の状態をブラウザで確認できるようにしておきたい、とにかく短期間でクラウドでデータ収集できるようにしたい、という場合には簡単でいいと思います。

    ちなみに、サインアップしてからこの記事を書きつつサンプルを改造したもの(ボタンの状態がアップロードされるように修正したもの)を動かすまでに要した時間は約1.5時間です。5分はちょっと眉唾ものとしても、ArduinoIDEでESP8266が動く状態からなら動かすだけなら30分もあれば十分動かせるでしょう。確かに非常にお手軽ですので、知っておいて損はないと思います。


  • ESP8266のGPIOをArduinoIDEで扱う

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

    ArduinoIDE上でESP8266モジュールを扱うことができることはわかりました。もちろん、WiFiを使ってクラウド上のサーバーとも通信ができました。

    ・・・が、ESP8266モジュールの端子をどうやって扱うのか、まだ調べてませんでした。

    で、GPIO2に接続したLEDを点滅させてみます。

    void setup() {
      pinMode(2, OUTPUT);
    }
    
    void loop() {
      digitalWrite(2, LOW);
      delay(1000);
      digitalWrite(2, HIGH);
      delay(2000);
    }

    これを名前を付けて保存して、GPIO0に付けたスイッチを押したままリセットを解除してブートローダを起動した後、「マイコンボードに書き込む」とするとGPIO2に接続したLEDが点滅しました。

    次に、GPIO0の状態を読み取って、GPIO2に出力してみます。

    void setup() {
      pinMode(2, OUTPUT);
      pinMode(0, INPUT);
    }
    
    void loop() {
      bool v = digitalRead(0);
      digitalWrite(2, v);
      delay(10);
    }

    同様に書き込んでやると、GPIO0に接続したスイッチのON/OFF状態に応じてLEDが点滅しました。

    ・・・単純にGPIOの番号を数値で指定してやれば良さそうな感じもしますが、どうなのでしょう。本当はソースまで追って確認したかったのですが、ちょっと短時間では確認しきれませんでした。とりあえず使いたいボタンとLEDだけ確認できたので、残りはボチボチと・・・。


  • 秋月にESP-WROOM-02が登場

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

    ふと、秋月電子のWebサイトをチェックしていたら・・・新製品のところにESP-WROOM-02が載ってました。もちろん技適マーク入り。お値段は1個550円、10個以上だと1個450円。直接買いに行ける(≒送料を考えない)なら、AliExpressで買うよりも早くて安くて安心です。これで、わざわざAliExpressで買う意味がなくなりましたね。

    ESP-WROOM-02のデータシート、ESP-8266EXチップセットのデータシートとハードウェアユーザーガイド、技適の証明書(のコピー)も秋月のWebサイトに上がっています。