ともの技術メモ

趣味の電子工作などの記録。時に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」を追加します。
    修正後は、

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

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

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

    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でライブラリを持ってきます。

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

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

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

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

    下の方に

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

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

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

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

    Screenshot0001

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

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

    そして、ブラウザ上で「Value」のところに1をセットして「Throw」を押すと、点灯していたLEDが消灯しました。0をセットして「Throw」を押すと、消灯していた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を点滅させてみます。

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

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

    同様に書き込んでやると、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サイトに上がっています。


  • ESP8266にWebSocketを喋らせてみる

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

    世の中、同じようなことを考える方はいるようで、すでにESP8266+ArduinoIDEでWebSocketライブラリが存在しています。WebSocketが扱えるようになれば、(プログラミングスキルがあれば)クラウド側から好きなタイミングでESP8266に指示をおくることができるようになるはずです。(が、世の中そんなに甘くないんですねぇ〜)

    で、今回見つけたWebSocketライブラリは ESP8266-Websocket です。

    今回の記事はこれのサンプルを動かしてみよう、と苦戦した記録です。作業PCのOSはUbuntu14.10 LTS 64bit、ArduinoIDEのバージョンは1.6.5です。なお、Ubuntuで動かすにあたっては、

    として、/dev/ttyUSB0のアクセス権をユーザーにつけた後、再ログインしないと/dev/ttyUSB0へアクセスできないとしてエラーになります。

    Arduinoのライブラリは ~/Arduino/librariesの下に置けばいいようですので、そこにgitでライブラリを引っ張ってきます。

    その後、ArduinoIDEで「スケッチ」→「Include Library」→「Manage Libraries」で右上の「Filter your search」で「ESP8266-Websocket」と入力して「INSTALLED」になっていることを確認します。

    scrn1

    次に、WebSocketClientのデモを動かしてみます。

    「ファイル」→「スケッチの例」→「ESP8266-Websocket」→「WebSocketClient_Demo」を選択します。

    scren2

    ソースの冒頭の

    の部分に自分の無線LANのESSIDとパスキーを入力してから、名前を付けて保存します。

    このライブラリはおそらくWindows環境で作成されたのでしょう。Linux環境でビルドしようとすると、ファイル名の大文字小文字で失敗します。そのため、ライブラリの中の以下の部分を修正します。

    WebSocketClient.h と WebSocketServer.h の

    に、

    WebSocketServer.cpp と WebSocketClient.cppの

    とします。

    これでビルドが通るようになりましたが、それでもコネクションに失敗します。禁断のgoto文で接続しに行く部分のみを繰り返すと、何回目か以降は通るようです。ライブラリのWebSocketClient.cppの冒頭にデバッグのための#define文があるので、ここをコメントを外すとデバッグメッセージが出るのですが、これでもハンドシェークの途中で止まっていることはわかるものの、それ以上はなんともわかりません。
    これ以上は間にLANアナライザを入れてみてパケット解析しつつ、RFCを読んで何かおかしいのか調べるしかなさそうです。

    以下は、現時点でのサンプルプログラムを改造したものです。

    WebSocketClient.cppをみると、サーバ側からのヘッダの解釈の実装がまだまだであることがわかります。ひとつの可能性として、どうやらここで止まっていそうです。もうひとつは、パケットの受信バッファの処理がどうも変な感じがします。

    いずれにせよ、このライブラリはまだそのままでは使えるものではなさそうな感じです。(ま、よくみると色々と制約があるよ、って書いてあるんですけどね)


  • WebSocketについてちょっと実験してみた

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

    たまたまWebをさまよっていたら、WebSocketの話が目についたので調べてみた。まあ、HTTPに比べると、一旦リンクを張ってしまえばサーバ側からも通信ができるってのが美味しいところ。

    で、ブラウザがWebSocketをサポートしているか確認することができるサイトが

    http://www.websocket.org/echo.html

    なのですが、ここには自分でHTMLを書いて確認したい場合のためのコードが置いてあったりします。で、これを試してみると・・・テキストエディタに貼り付けたら1行になってしまいました(T_T)

    整形しなおしたものをここに置いておきます。

    これをコピペしたら今度は1行になるようなことはなかったです。

    そして、これをローカルで表示させたらこうなりました。

    で、ごにょごにょっとしたことを考えているので、自分の理解の範囲で動作を解釈してみます。(間違ってたら指摘いただけると幸いです)

    1. 動作は8行目から始まって、testWebSocket()が呼ばれる。
    2. 13行目のnewでwebsocketのインスタンスを生成。ここでソケットをオープンする。
    3. 14〜17行目はイベントハンドラ。ソケットをオープンすると、この中の14行目のonopenに設定したハンドラが呼ばれる。(先の13行目から呼ばれるところが変な感じがしますが、Javascriptのスコープの特性から14行目で定義している内容を13行目で使用可能なのですね)
    4. 20行目がonopenのイベントハンドラ。この中で、doSend()を呼んでその先でwebsocket.send()でデータを送信している。
    5. websocket.send()の結果、サーバ側からエコーバックが帰ってくる。
    6. エコーバックを受信すると、16行目で定義しているonmessageのハンドラが呼ばれるので、29行目のonMessage()が実行される。この中で、websocket.close()を呼んでコネクションをクローズ。
    7. クローズすると、15行目で定義しているoncloseに対応したハンドラが呼ばれる。

    比較的簡単に使えそうですね。
    ちょっとだけソケットの使い回しができることを確認してみました。

    ソースコードをちょっとだけ弄ります。

    変数nに初期値10を設定して、受信時の動作をnの値によって切り替えています。nが0より大きい場合には次のメッセージを送ってnをカウントダウン、nがゼロならソケットをクローズします。
    結果は、

    Screenshot_soc

    となりました。同じソケットを開いたまま11回のメッセージやりとりができていることがわかります。

    参考にさせていただいた/参考になりそうなサイト


  • Covia F4sのその後(とグアムでのプリペイドSIM事情)

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

    Covia F4sを買った話は以前の記事に書きましたが、その後について気づいた点などを書いてみます。

    現在はCovia F4sの後継でフラッシュが4GBに、RAMが1MBに増量された(そして色も違う)F4s+が出ていて、実はこっちも持っています。黒が欲しかったのと、某アプリが512MBのRAMではバックグラウンド動作できないためです。
    バッテリ容量が小さいのが欠点ですが、手のひらに収まるサイズなのが非常によいところ。F4sの方はF4s+のバッテリ充電器兼いろいろ試してみる対象機になってます。で、お試し機に格下げ(格上げ?)なのでSMS無し版のヨドバシ480円SIMで動かしたりしています。

    で、今回、グアムに持っていった(モバイルルータを別途レンタルして使用)のですが、挙動が不審で、何をやってもすぐに再起動。バッテリ充電だけでも再起動。そしてそのうち、反応がなくなって、電池を外して入れなおさざるを得なくなる、という症状が出ました。(F4s+の方は問題なかったのですが・・)

    RAM周りのハードウェア異常かと思って、日本に帰国したら修理に出すしかないなぁ、と思っていたら、日本では全く異常がありません。F4sを所有されているかたは要注意かもしれません。

    現地SIMがあれば、SIMを入れ替えてどうなるか、とか、SIMを外したらどうなるか、というのも試してみればよかったのかもしれないのですが、日程の関係から今回は現地プリペイドSIMは購入せず。

    グアムでのプリペイドSIM事情

    ちなみに、グアムではマイクロネシアモール日本語のフロアガイドの2階の真ん中の吹き抜け左側のところ)と、グアムプレミアアウトレットに(店舗一覧。お店はこの地図のMの場所)ドコモパシフィックの店舗があります(今回=2015年7月確認)。どちらも有名なショッピングスポットなので簡単に行けるでしょう。ここでドコモパシフィック(NTTドコモとは別会社です)のSIMを買うことができると思います。(以前、一度アウトレットの方で買ったことがあります)

    ドコモパシフィックのプリペイドプランのページはここにあります。ここの記載をみると、プリペイド回線の残高チェック、プリペイド回線間の残高移動、クレジットカードでの残高チャージなどができるようです。また、プリペイドの料金プランはここにあります。SMS、ローカル通話、パケット使い放題3日間で8ドルのようです(が、SIMの価格は入ってないです)。で、10ドル分のプリペイドチャージ付きのSIMが19.95ドルのようです。(追加チャージ用のプリペイドカードは$20、$10、$5の3種類があるようです)

    なので、10ドルのチャージ付きのSIMカードを買って、『3日間ローカル通話・ローカルSMS・データ使い放題8ドルコース』か『5日間データ使い放題9ドルだけど、通話とSMSは有料』で使うかのどちらかでしょうね。設定はお店の人にやってもらうのがいいでしょう。


  • ESP8266からherokuにデータを送ってみる

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

    これまでに node.js + herokuでHTTP GETコマンドを使って最低限のデータの出し入れができることを確認しました。つまりherokuで実用性はないとはいえ、サーバ側の構築ができるようになりました。ただ、セキュリティとか実用性とかそういうのは考えてないので、とにかく最低限ですし、そもそもデータベースを使っていないのでプログラムを再起動されると消えてしまいます。そしてそれは頻繁に起こります。なので、あくまで「ちゃんと作ればできることがわかる」というレベルです。

    次は、ESP8266からherokuにデータを送って、PCからそのデータを読み取れるか試してみます。簡単に済ますためにESP8266側は先に確認したようにArduino IDEで構築します。heroku側は先の「hello-heroku2」のままにします。

    Arduino側のスケッチはサンプルの「ESP8266WiFi」の下の「WiFiClient」を元にしています。一旦、WiFiClientを開いて、名前(今回は「HerokuClient」にしました)をつけて保存します。
    その後、ESSIDとWiFiのパスワードの設定、先の「hello-heroku2」に合わせたGETメソッドに合わせたURLの生成の部分を修正します。今回は、起動すると1から順にデータをheroku側にセットするだけとしました。

    修正後のソースは以下のようになりました。元のソースはdata.sparkfun.comのサービスにデータを送るようになっていたようですが、今回はそれを変更しています。(コメントは修正していませんので、そのままになっています。また、WiFiの設定関連は当然伏せてありますので、環境に合わせて修正が必要です。)

    これで、ESP8266モジュール側をGPIO0をGNDに落とした状態でリセット解除することでブートローダ状態で待機させてから、ArduinoIDEで「マイコンボードに書き込む」とするとコンパイルと書き込みが行われてプログラムが走り出します。
    事前にシリアルモニタを起動しておくと、

    Screenshot--dev-ttyUSB0

    という感じでWiFiのアクセスポイントに接続し、その後herokuへDATAを1から順にセットしている様子が確認できます。(日本語が文字化けしてますが、まあいいでしょう)
    PC側からherokuにアクセスすると、

    Screenshot-Mozilla Firefox-13

    という感じで、ESP8266からセットしたデータを確認することができました。

    これでESP8266からherokuへのデータのアップロードと、ブラウザによるherokuにアップロードされたデータの確認ができたことになります。実用にするにはheroku側はデータベース使わないとね、とか、複数のESP8266に対応しないとね、とか、セキュリティ全く無いじゃん、とか、山ほど考慮するべきことがありますが、最低限遊べるレベルには到達したのではないでしょうか。

    heroku + node.js + ESP8266 + ArduinoIDEの組み合わせでIoT環境を試すレベルであれば簡単に構築できることがわかりました。もちろん、リソースをかければ本格的な環境にアップグレードすることもできると思います。あとはこの環境をどう使うか、ということですね〜。