WiFi+BT付きのRaspberry Pi Zeroが登場

すでに日本語の記事も出回っていますが Raspberry Pi 5周年にあたって、Raspberry Pi Zero の新モデルが登場しました。

名称はRaspberry Pi Zero W。仕様としてはRaspberry Pi Zeroに802.11nとBluetooth 4.0が追加になっています。価格はRaspberry Pi Zeroが$5だったのに対して、Raspberry Pi Zero Wは$10。設計としては Raspberry Pi Zero に Raspberry Pi 3 model B の無線部分を移植(ただしアンテナはチップアンテナから基板パターンによるアンテナに変更)した感じのようです。

Raspberry Pi Zeroはようやく日本でも入手可能になりそうな感じですが、Raspberry Pi Zero Wは早くもSwitch Scienceさんが「3月下旬に1,296円で発売」としています。(まだ技適の問題がクリアになっていないようですが)

Raspberry Pi Zeroは激安でしたので(原価率に無理があったんじゃないかと思うのですが)入手難に悩むことになりました。しかしながら、今回のRaspberry Pi Zero Wは追加部品がそれほど多くない割に$5アップということで原価率的にはおそらく改善しているのではないかと思います。入手しやすくなることを期待したいものです。

加えて、Raspberry Pi Zero W用の公式ケースも登場するようです。Raspberry Piのロゴ入りのトップカバーは40ピンGPIOが引き出せるようになっているものと、カメラモジュールが取り付けられるようになっているもの、何も穴が開いていないものの3種類が付属するようです。

現物の画像などは Hack a Day の記事の写真がわかりやすいと思います。

WordPressでログインできなくなった!

WordPressでログイン認証のセキュリティ強化にCAPTCHAを入れようと、プラグインから「SI CAPTCHA Anti-Spam」をインストールしてみました。

設定でログイン画面にキャプチャを入れて、ログアウトしてログインしなおしたらCAPTCHAが表示されていません(!)。

しかも、ログインできない!!

で、調べてみると、「SI CAPTCHA Anti-Spam」には、GDというライブラリが必要なので、

$ sudo yum -y install gd php-gd

としてインストールを試みるも、さくらのVPSにインストールしたPHPのバージョンが合わずphp-gdがインストールができません。

で、四苦八苦した挙句の解決方法は、「プラグインディレクトリの名前を一時的に変更する」という方法でした。

/home/(ユーザー名)/public_html/wordpress/wp-contents/plugins にカレントディレクトリを変更して、プラグインの名前の付いたディレクトリの名前を一時的に変更してやると、無事にログインできました。

ログインしたら、ディレクトリの名前を元に戻して、プラグインを停止・削除しました。

いや、焦りました・・(^^;

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と

$ 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でNTP Clientを動かしてみた

一昨日のESP-WROOM-32(ESP32)をArduino IDEで動かしてみた続きです。

Arduino IDEにはWiFi関連のサンプルプログラムがあるので、動かしてみました。

「ファイル」⇒「スケッチ例」⇒「あらゆるボードのスケッチ例」⇒「WiFi」の下にいくつかサンプルが有りますが、こちらはESP32環境ではビルドできませんでした。Espressif社提供のライブラリとArduino IDEに初めから付いているWiFiライブラリでは完全に互換ではないようです。(確か、バージョン情報を取得するようなライブラリでコケてたような気がします)

「ファイル」⇒「スケッチ例」⇒「ESP32 Dev Module用のスケッチ例」⇒「WiFi」の下の「WiFiIPv6」というのを開いてみると、NTPクライアントプログラムのように見えますので、これを動かしてみることにします。
スケッチ例を開いて、冒頭にある

#define STA_SSID "xxxxxxxxxxxxxxxxx"
#define STA_PASS "xxxxxxxxx"

の部分にSSIDとパスワードをセットして名前を付けて保存、シリアルポートを /dev/ttyUSB* に設定した後、シリアルモニタを起動して、次に基板上のタクトスイッチを押しながら、「マイコンボードに書き込む」としてやると、ビルドと書き込みが行われます。タクトスイッチは「Writing at 0x00010000… (5 %) 」という表示が出たところで離してもOK。

書き込みが終わると、ESP-WROOM-32モジュールは勝手にリブートして起動します。

 

シリアルモニタ側には IPv6 でのステーションとしての動作、アクセスポイントとしての動作状況の表示、IPv4のステーションとしての動作状況が表示され、IPv4のIPアドレス取得ができると、その後NTPクライアントが動作している状況が表示されました。

また、同時にアクセスポイントとしても動作しているので、スマートフォンのWiFiアナライザなどのツールでみると「esp32-v6」というSSIDでのアクセスポイント動作が確認できました。

ESP32を動かしてみた

ふと秋月の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のリストが表示されれば成功です。

安価なVPSを調査してみました

最近、激安VPSがまた増えている気がします。概ね、月額500円あたりが最下限で、1日使うだけでも500円を切ることができなかったのですが、日割り、時間課金のタイプもでてきているので、改めて調べてみます。あ、企業で契約するようなVPSはそもそも調べてませんw。ローエンドのVPSだけです。あしからず。

  • さくらのVPS
    ローエンドのVPSの代表といえばさくらのVPSでしょう。いまご覧頂いているページもさくらのVPSの1Gプラン(ただしHDD100GB)で動いてます。そんなにトラフィックないので、512プランでも十分だと思いますが。
    ちなみに、1Gプランが『CPU仮想2Core/SSD30GB/メモリ1GB』で月額972円/年額10,692円/初期費用1,620円(税込み)、512プランが『CPU仮想1Core/SSD20GB/メモリ512MB』で月額685円/年額7,543円/初期費用1,620円(税込み)です。
  • カゴヤ・クラウド
    ここは早くから日額課金があったところになります。SSDタイプAが『CPU仮想3Core/SSD80GB/メモリ保証1GB最大2GB』で日額31円/月額864円/初期費用無料(税込み)です。日額課金は実験や短期間のサーバ設置に便利だったので使ったことがあるのですが、去年の11月にクレジットカード番号を含めて漏洩する事件を起こしたので信用できません。支払いシステムを変更したので大丈夫とか言ってるのですが、生理的に受け付けられません。もしも、バーチャルカードで払えるならもう一度登録してもいいかとは思いますが。
  • ConoHa
    時間課金をやり始めたところです。512MBプランが『CPU仮想1Core/SSD20GB/メモリ512MB』で1時間1円/月額630円/初期費用無料、最低利用期間なし、といったところ。OSはいろいろ選べる。
  • WebARENA
    ポイント制というちょっと変わった課金体型。一番安い条件だと512M-SSDタイプで『CPU仮想1Core/SSD20GB/メモリ512MB』で10ポイントで、その10ポイントの月額基本料金が360円(税別、税込みだと388円)。課金はスタート時は日割り+月末締め。ちょっと変わっているのが、支払いは翌月分を先払い、というところ。OSはCentOS6のみ。
    NTT系なので、クレジットカードのセキュリティとかはまともにやってくれると期待できる・・・と思うので、試してみても良いかもしれない。
  • ServerMan@VPS
    メモリ1GB/HDD50GBで月額467円(税別)、ただしコンテナ型なのでカーネルを共有する形になるらしい。
  • ABLENET
    V0プランで『CPU仮想1Core/SSD30GB/メモリ512MB』で月額648円/年払い5,486円(税別)/初期費用934円だそうです。
  • FC2 VPS
    バリュープランで『CPU1Core✕13%/HDD80GB/メモリ1GB』で月額780円/初期費用なし。OSはCentOS6.3。
  • お名前.com VPS
    メモリ1GBプランで『CPU仮想2Core/HDD100GB/メモリ1GB』で月額896円/初期費用無し(税別)。

着目すべきは、WebARENAの月額360円+消費税と、ConoHaの1時間1円でしょうか。

シングルボードコンピュータ5点

またまたYouTube動画からです。

たまたま見かけた「Top 5 Single-Board Computers」というビデオから。

紹介されているのは順に、

  1. C.H.I.P
  2. PINE64
  3. UDOO
  4. LATTEPANDA
  5. Black Swift

ですね。PINE64Black Swiftは初めて聞く名前です。

PINE64は64bitのCortex-A53(Quadコア)とRAM512MB/1GB/2GBを載せた安価なボードです。WiFiはオプションボードで搭載。

Black SwiftはAthros(現在はQualcomm)のAR9331をベースにしたROM16MB、RAM64MBの小さなボードです。しかし、入手方法がわからない(笑)。

インテルベースのシングルボードコンピュータ

たまたま見かけたのですが、「Raspberry Pi 3に対抗する(?)」インテルベースのシングルボードコンピュータがいくつか出てきているようです。

最初にみかけたのが LattePanda です。最初にみつけたYouTubeの動画などによると、

  • IntelのQuad CoreのCPU(Cherry Trail 1.8GHz)
  • ストレージは32GBのeMMC
  • RAMは2GBと4GBの2種類
  • RAMが2GBのモデルにはWindows10付きのものもある
  • USB3.0×1、USB2.0×2、WiFi + Bluetooth4.0、HDMI、100Mbps Ethernet、MicroSDスロット
  • Arduino対応のGPIO、Cheery TrailのGPIO
  • 電源は5V 2A

と仕様のようです。で、メモリ2GBのOSなしが$79、メモリ2GBのWindows10モデルが$109、メモリ4GBのOSなし?が$139のようです。ディストリビュータはDFRobotのようなのですが、LattePandaのWebサイトからAmazon Japanのページに飛んでくると、4GB版が19,999円になっています。で、この4GB版の商品説明が微妙で、

2016-11-24

で、なんのこっちゃ?なのですが、要はWindows10はインストールされているのだけど、ライセンスキーは付属しない、ということのようです。騙されて(?)買っちゃった人のレビューが載ってます。$109でOS有りだと、まあ面白いかも、なのですが、いくら4GBといえども、2万円でOS無しだとあまり買う意味無いですね・・・。また、Raspberry Pi 3との比較ビデオもあって、これを見ると、Intelプロセッサだけどあまり速くない。というか、Raspberry Pi 3が思ったよりも速いというか、やっぱWindows10重いというか、そんな感じでしょうか。

次に見かけたのがUDOO X86です。こちらはKICK STARTERでキャンペーンやってた(?)みたいです(やってるけど日本からは注文不可?)。公式Webの内容とKICK STARTERの内容で差があるのですが、公式Webの記載によると、

  • Intel の Quad Core CPU(Braswell で最大2.56GHzまでのモデルがある?)
  • メモリはDDR3L で 2GB/4GB/8GB
  • HDMIとDP×2(4K画像が3画面出せるような記述あり)
  • eMMC最大32GB(Webサイトでは安価なモデルはeMMCなし、KICKSTARTERでは8GB)
  • SATAコネクタ、M.2 SSDスロット、MicroSDスロット(KICKSTARTERではMicroSDからブートできるような記載もあります)
  • USB3.0×3ポート
  • Gigabit Ether
  • ArduinoコンパチのI/Oポート
  • その他

ということみたいです。KICKSTARTERでは

  • 2GHzのCPU、RAM2GB、eMMC8GBのものが$89(売り切れ)
  • 2.24GHzのCPU、RAM4GB、eMMC8GBのものが$109
  • その他

のようで、Webサイトで受け付けているPREORDERでは、

  • Atom X5-E8000 2GHz、RAM2GB、eMMCなし、ACアダプタ付きで$125
  • Celeron N3160 2.24GHz、RAM4GB Dual Channel、eMMCなし、ACアダプタ付きで$149
  • Celeron N3160 2.24GHz、RAM4GB Dual Channel、eMMC 32GB、ACアダプタ付きで$165
  • Pentium N3710 2.56GHz、RAM8GB Dual Channel、eMMC 32GB、ACアダプタ付きで$259

となっています。まあ、小さいPCとしてみると魅力的に見えないこともないのですが、送料とか関税(かかるのかな?)とか考えるとイマイチ感もありますね。

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

#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機を認識させる

通常の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

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