2020年2月16日日曜日

ESP-IDF v4をWindowsのVS Codeで使いやすくしてみる(PlatformIOなし)

https://blog.nyancotech.online/2020/02/windowsesp32esp-idf.html
の続きです。
WindowsでESP-IDF v4環境の構築は上記ページをご覧ください。

まずは普通にインストールされたESP-IDF Command Promptを開きます。



Using Python in C:\Users\admin\AppData\Local\Programs\Python\Python37\
Python 3.7.3
Using Git in C:\Program Files\Git\cmd\
git version 2.25.0.windows.1
Setting IDF_PATH: C:\Users\admin\esp\esp-idf

この部分をメモっておきます。


VS CodeでESP-IDFディレクトリを、「フォルダを開く」から開いたあと、
左下の歯車ボタンから設定を開きます。


Workspaceタブを選択し、Terminal欄をクリック、Edit in settings.jsonをクリック


 {
    "terminal.integrated.shellArgs.windows": [
        "cmd", 
        "/k", 
        "..\\.espressif\\idf_cmd_init.bat", 
        "C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python37\\", 
        "C:\\Program Files\\Git\\cmd\\"
      ]
}

ここに上のJSONを環境に合わせて変更して入力後保存します。
..\\.espressif\\idf_cmd_init.bat
の行には、インストールした.espressifディレクトリ内の
idf_cmd_init.batへのパスを入力してください。
自分は
esp- .espressif
     L esp-idf
というディレクトリ構成にしているので
カレントディレクトリのesp-idfディレクトリから見ると
..\.espressifが.espressifの場所になってます。
Python37というのが書いてある行は、
初めにESP-IDF Command Promptで表示されていた
「Using Python in...」の右に書いてあるディレクトリを入力します。
Git\\cmdというのが書いてある行は、同じく
「Using Git in...」に書かれている行を入力します。

それぞれパスの区切り文字はエスケープ文字として認識されてしまうので、
\\と2つ続けて入力してください。




settings.jsonを保存して、Terminal->New Terminalでターミナルを開くと、
VS CodeからESP-IDF Command Promptが使用できます!
idf.py flash -p COM10とかやればこの画面のまま書き込みまでできます!


2020年2月15日土曜日

【令和最新版】WindowsにESP32開発環境ESP-IDFをインストールする

これまでESP32の開発環境はUnixシェル用のものしか用意されておらず、 Windowsではmsysを使って実行する方法が公式で紹介されていました。 そんな中、最近になって、Espressif純正の一括インストーラが出ていたので試してみました。
https://docs.espressif.com/projects/esp-idf/en/latest/get-started/windows-setup.html

ダウンロードしたexeファイルを開き、インストールしていきます。


必要なパッケージをインストールしてくれますが、Pythonやgitなど、
すでに入っているものがあればそれを選択することで
新しくインストールすることなく進むことができます。
よくできてますね


ESP-IDFのレポジトリをすでにダウンロードしてあれば
そのディレクトリを使うことができます。



ESP-IDFをダウンロードする場合はバージョンを選択できます。
使用するコンポーネントの互換性の問題などがなければ、
4.0を選んだほうが後々アップデートする手間を減らせるかもしれません。


ツールチェーンやPythonの仮想環境を保存する先を選択します。


一発でESP-IDF用のターミナルを開くショートカットを
スタートメニューやデスクトップに登録できます。


各種設定が完了するといよいよインストールです。


ESP-IDFレポジトリはとても大きいのでダウンロードに時間がかかります。



しばらくして、インストールができ…


ませんでした。

表示されたログを見ると、Python virtualenvに
--no-site-packeagesなんてオプションないよと言われています。


はてさてexeファイルの中身に入ってるんだろうしどうしたものかと調べていると、
修正版が出ていました。
下のほうに直リン貼ってる人がいます。




気を取り直してやり直し。


インストールできました。


Pythonのパッケージは専用の環境としてインストールされ、
PATHもシステム標準のものではなく専用のPATHが設定されるようです。
ほかの開発環境と競合せずに動いてありがたいですね。
早速esp-idf\examples\get-started\hello-worldディレクトリで
make menuconfig相当の"idf.py menuconfig"をしてみると…
なんかUnicodeDecodeErrorとか言われています…。


ちょっとぐぐったらこんなすばらしいコピペで動きそうな記事を発見

最近のUnicodeDecodeError

.espressif\python_env\idf4.0_py3.7_env\Lib\site-packages\sitecustomize.py
に上記記事のように
import builtins

__original = open
def __open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):
    if 'b' not in mode and not encoding:
        encoding = 'utf-8'
    return __original(file, mode, buffering, encoding, errors, newline, closefd, opener)
builtins.open = __open

と記述したファイルを置き、標準のopen関数を上書きしてあげます。


すると…

うーんなんか周り文字化けてるけどとりあえず動いた!



このように、Espressif Systems様が提供してくださっている
Windows版インストーラにより、

簡単にWindowsでの開発環境が作れました!

(正直これでも今までよりは楽だと思います)

あとはメモですが
idf.py menuconfig
でmenuconfig
Serial flusher configでフラッシュの設定ができたりします。
idf.py makeでビルド
idf.py flash -p COMxxでCOMxxポートに接続されたESP32へ書き込み
idf.py monitor -p COMxxでシリアルモニタ(トレースバック付き)
monitor中に
Ctrl+T -> Ctrl+Shift+Fで再書き込み

2019年11月16日土曜日

ROHM BP35A1 ローム製Wi-SUN通信モジュールを使ってスマートメーターにBルート接続する

TwitterでM5StickC用にRohmのBP35A1を取り付けるアダプターを
作っておられる方がいて、BOOTHで購入できたので買ってみました。


サンプルコードも配布されていますが、開いてみるとMicroPythonだったので、Arduinoのスケッチを書いてArduinoで使ってみました


そもそもBルートとはなにか?
電力会社の設置している、各家庭にある電力量計は、アラゴの円板を使っていたアナログのものからデジタル化されています。
デジタル化されたメーターは、サブギガ(920MHzあたり)を使う無線で通信ができるようになっています。

なんのために無線通信できるのか?
毎月の検針を、検針員がメーターを直接読み取らなくても手元のプリンターで積算電力量を受信して印刷できます。
植栽や建物の密集度の関係上検針しにくい住宅や、集合住宅などでは集合ポスト前で一括受信・印刷することができるのだと思います。検針員はとても省力化できると思います。実際のところ、電波の到達距離も大したことがないため、どのような運用をしているのかはわかりません。
また、遠隔で電力供給の休止を行えるとされています。

これらはすべて電力会社が電力の使用を監視・制御するための通信で、Aルートと呼ばれています。
今回の話題であるBルートは、需要家(ユーザー)ごとにスマートハウスのようなHEMS機器とスマートメーターを直接無線接続して、使用電力のマネジメントなどを行うための仕組みです。

現在の使用電力量や各電力機器の動作状況をHEMS機器同士で共有することで、効率的に電力の使用ができるとされています。

今回使ったモジュールはこのようなHEMS対応機器を開発するための通信モジュールです。

スマートメーターと通信モジュールをBルート接続して使うためには電力会社にBルート接続用ID、パスワードを発行してもらう必要があります。
東京電力の場合、スマートメーター化されていない電力量計であっても、ID発行の申請を行うことでスマートメーターへの切り替えも行えるようです。(要工事)

BP35A1はUARTでシリアル通信コマンドを使って制御します。
公式のコマンドリファレンスは日本語ですが、この手のモジュールを使ったことがないと、読んでも心が折れそうだと思います。

ざっくりとした流れとしては

Bルート接続用ID/パスワードを設定
スマートメーターの電波をスキャン
スキャン結果からスマートメーターの接続情報を調べる
スキャン結果の接続情報を接続先として設定
接続開始・完了
電力取得コマンド送信
結果受信

と、初期化シーケンスがいろいろあってめんどくさいです。
とりあえずシリアルターミナルで手打ちして接続までいけるようにこれら一連の流れをメモしておきます。
上記のWi-SUN HATの場合、ピンを下にして裏面を向けて、
左側のピンから
GND/NC/NC/TX/RX/NC/3.3V/NC
というピン配置になっているため、電源とUARTを接続すればUSBシリアル変換などを使って使うこともできます。
115200bps 3.3VのUART 改行コード\r\nです。

以下コマンドでスマートメーターの接続までを行います。

Bルートのパスワードを設定
SKSETPWD C passwordhere

BルートのIDを設定
SKSETBID idhere

アクティブスキャンを実行
SKSCAN 2 FFFFFFFF 6

結果が返ってくる
EVENT 20 FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx
EPANDESC
   Channel:31
   Channel Page:09
   Pan ID:ABCD
   Addr:xxxxxxxxxxxxxx
   LQI:93
   PairID:00E79995
 EVENT 22 FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx


取得したスマートメーターのアドレスをIPv6アドレスに変換
 SKLL64 xxxxxxxxxxxxxx  //Addrの値
 FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx

チャンネルを設定
SKSREG S2 31  //Channelの値

Pan IDを設定
SKSREG S3 ABCD  //Pan IDの値

接続開始
SKJOIN FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx  //IPv6アドレスに変換後の値

EVENT 25が来ると接続成功です。
私は当初、EVENT 24で接続失敗しかしなかったのですが、
東電のフォームでパスワードを変更依頼したところ、以降つながるようになりました。
以前のパスワードではスマートメーターの設定がうまくできていなかったのかもしれません。

接続完了後、電力取得のコマンドを送信します。

SKSENDTO 1  FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx 0E1A 1 000E
000Eのあとに半角スペースを入れて、続いてバイナリで
{0x10, 0x81, 0x00, 0x01, 0x05, 0xFF, 0x01, 0x02, 0x88, 0x01, 0x62, 0x01, 0xE7, 0x00} + \r\n
を送信すると瞬時電力が取得できます。

成功すると
ERXUDP FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx
FE80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx 0E1A 0E1A xxxxxxxxxxxxxxx 1 0012 xxxxxxxxxxxxxxxxxxxxxxxxxxxx000000BA
のようなレスポンスが返ってきます。
ここで見るのは最後の8桁、000000BAです。
これをそのまま10進に変換して、0xBA=瞬時電力186W
というような感じで読むようです。
上記サンプルコードでは、M5StickCで本体の液晶画面にこの数字を取得表示するようにしています。
Arduinoのスケッチなので、これを改良して、Wi-Fi経由でデータ送信して、
遠隔地から電力量を確認するような使い方も可能です。

それほど死ぬほど難しいわけではないですが、まだまだ情報量が少なく、
活用例も乏しいためもっと使う人が増えると楽しいのかなと思います。


2019年5月1日水曜日

大学生の思い出(長文でうつなので読まなくてもよい)

すきあらば自分語りです。すみません。

1年少し前まで大学生だったんですよ。
はじめての一人暮らしとか、いろいろとはじめての体験ができたと思います。
そんな中で大学生活で一番つらかった時期について書きます。
今つらいなーという学生に読んでもらえばいいんじゃないのと思いますが、
つらさは十人十色なので参考とかじゃなくどこかで共感してもらえばと思います。

某工学部の学生だった2年生になる春休み、学生のうちに自動車免許は取っておきなさい
と大学で言われて、まあ地元に戻ったら確実に必要だしなと思って自動車学校に通い始めました。
はじめは運転の姿勢の感覚を掴むだけの模型みたいなやつに座らされてハンドルの回し方なんかをやりましたね。その後学科の授業や、構内での運転練習と
春休み中アルバイトと自動車学校で、だらだら過ごさずちょうどいいくらいのスケジュールで過ごしていました。

その時期やっていたアルバイト先では、バイトリーダーみたいな立場だったフリーターの厳しい先輩がいて、
自分ができることをなんでできないのかわからないみたいな感じで、本当に意味がわからない。作業を覚える気があるのか?真剣にやっていないのではないか?というような内容で、
同じようなミスを何度もしている僕をとても厳しくご指導いただいていました。

自分は要領が悪く、口で言われたことを体の動きに変換できないので(それで体育の授業で先生にもイライラされていました)
自動車学校も順調にいくはずもなく、マニュアル免許コースだったのでエンストはしはまくり、狭い構内のコースではなかなかギアも上げられない。
仮免で路上に出るまでにとても時間を費やしていたと思います。
何度もオートマにせんか?と教官に言われていました。
今思うとそこで別にオートマにしておけばよかったような気もしますが。。
授業は半年とか1年?っていう期間内だったら無限にやり直せるため、
サクサク進むよりもとを取ったとも言えますが、
周りは高校を卒業したばかりの年下の子がサクサクとこなしているのを見て
あーやっぱり自分はなんにもできないんだなぁみたいなふうに考えて帰り道いつも落ち込んでいました。

この時点でメンタルが崩壊するのは当たり前のことですね…。
どちらかというと完全に鬱とか適応障害みたいな感じだったのですが、
当時ネットで発達障害テストみたいなものをやっては90%当てはまりますみたいな結果で、
2chの未診断スレとかを毎日ROMってはとりあえず病院いけっていうレスばっかりでそうかぁ心療内科いくかぁと意を決して手を震わせながら電話予約しました。

よく覚えているのですが、桜が満開の晴れた日、自動車学校の帰りに駅前の心療内科へ行きました。
電話予約の段階ではどういう相談ですかとか何も聞かれなかったので、中に通されてはじめて相談が開始しました。

いきなり発達障害なんじゃとかADHDなのではとかいうとあーネットでそういうの流行ってるからねーwみたいなリアクションになりそうで嫌だなという謎のプライドから、
具体的な名称は言わずに、普通に相談として話し始めました。
バイト先でポンコツすぎてどうしたらいいかっていう話が主だったと思います。
大学で単位は取れているのかとか、
小学生のころとかどんな感じだった?っていうふうに聞かれて、
当時まだ単位落としまくるフェーズになる前だったので今の所は…と、
それっぽいエピソード、ランドセル忘れてそのまま学校行きそうになるとかそんな感じの話をしたら、
そういうパターンだとADD 注意欠陥障害の「傾向がある」感じ
それでも働けて単位も取れてるし、すごく軽度ですよ
薬で改善することもできるけど、僕さんくらい軽度な場合は薬とかよりも、行動療法で困らなくしていくほうが健全と言ってくれました。
自転車乗るのが趣味と言ったら、一定のペースで同じ動きをし続けるとドーパミンが出るからそれはいいよとか、ものをなくさないようにしたければ絶対必要なものだけでも置く場所を決めるとかまあなんかそんな感じで。

なるほど、とその瞬間は、ネットで書き込んでる人ほど大変ではないんだなーと、
相談前の緊張からの離脱とかも含めて、開放感を感じながらありがとうございましたと帰りました。
何も解決はしてないんですがw

余談ながら、心療内科に電話予約ってかなりハードルが高いような感じがするのですが、
この経験からつらいタイミングでこれができたことから病院に一人で行くこと全般が得意になりました。w

それから、新学期がはじまり、当然自動車学校を卒業しているはずもなく、授業がない曜日に自動車学校へ行って、夜はアルバイトへ行ってなど忙しく過ごしていました。
相変わらずアルバイト先ではポンコツで怒られているし、
自動車学校でもなんで言われたことができないの?もう大人でしょ?とか言われたりしながら過ごしました。

このとき、これが何にも守られていない状態の本来の僕のフルスペックで、
自分は本当に何もできないんだ。この先どうすることもできないのかもしれないと思っていました。

学校では持ち物や宿題を持ってくるのを忘れたり、教室を間違えて遅刻したり、
重要な授業回を寝過ごして行かなかったり、そんな日々でした。
大学生活で一番単位を落としたのがこの時期だったと思います。

そんな中でも、メンタルが弱いのか強いのかわからない僕は自動車学校の卒検までこぎつけ、一発で合格し、学校は夏休みを迎えました。何ヶ月自動車学校に通ったんでしょうね。
まあ2ヶ月学校の宿題なんかが忙しくて放置していたみたいな期間もあったので、実際は毎日通って2ヶ月くらいの回数だったのではないかなとは思います。

夏休みに入り、免許センターへ行って自動車免許を無事取得しました。
学科の試験は模試でも落ちたことが一度もないくらい得意だったのでなんともありませんでした。

夏休み、厳しい先輩にスケジュール表を見て悪態をつかれながら3週間くらいアルバイトを休み、実家まで自転車で帰る旅をやりました。
深夜に出発して、240kmくらい走り、夕方になってあと60kmくらいのところで自転車が壊れて、結局親に迎えに来てもらいました。

あとの期間は実家でだらだらしていました。このタイミングで精神的健康を取り戻そうと思っていました。

大学がある街へ帰ると状況は同じで、相変わらずポンコツで怒られては凹んでいました。
そのままのメンタルで2年生が終わります。
学期末に単位の取得状況の件で呼び出されました。知ってる人とはべらべらと喋る人なので、来年度がんばります!はははと軽く答えたような気がします。

そして3年生を迎えます。単位足りずに進級できなかったらどうしようと思ったら結構ギリギリながら進級できていてほっとしましたが、たくさん授業があって忙しいです。
近所に高待遇のアルバイトを募集している外資系大型店舗ができて、しかも前年度卒業の学生が数人卒業して退職してしまったため、全然店員が集まっていませんでしたが、シフトの回数をなんとか減らしてもらいやりくりしました。
(今思うとそんなの関係ねえ!ってブッチしとけよくらいの話ですよね。ただ気が小さいので。辞めたいという相談は何度かしていましたが、なかなか食い下がられると。。)
この頃が一番真剣に勉強した期間で、授業の専門性も上がったため、今も役に立てている知識がたくさん頭に入った時期でした。

この年、アルバイト先の店員がかなり流動的で、入ってきては怖い先輩に厳しいことを言われてすぐに辞めてしまう人や、すごい年上のおじさんが入ってきて僕が先輩になってきたりしていました。
そんな中、怖い先輩が別のアルバイトをはじめていて、だんだんとそちらがメインになり、アルバイト先に顔を見せなくなりました。
気がつくと先輩の学生アルバイターは卒業していなくなっていて、僕が一番長くやっている人に…。
店長に、人に教える立場になるからちゃんとできるようにならないとななんて無責任なことを言われたりしながらも、ある意味羽根を伸ばして自分のペースで働けるようになりました。
チェーン店なのでマニュアル厳守が必須ですが、融通がきく部分や、やり直しがきくところで鬼の首を取ったかのように指摘されることがなく、快適に仕事ができるようになりました。

一方、学校の授業はほぼフルに授業が入っていて、とても忙しく、自分の低い能力ではレポートや試験の勉強が追いつかず今度はこちらでつらい思いをしていました。
みんなはこなしているのに、やっぱり自分は能力が足りないんだと別のところで落ち込みはじめました。
土日に宿題をやるためにアルバイトをなくしてもらっていても、寝て、Twitterやニコニコ動画を見ていたら終わってしまい、月曜日に入ってすぐの深夜に月曜日分の宿題をやるというクソみたいな日々。

そんな日々を過ごしながら、もうすぐ学期末、夏休み前の試験…というタイミングで事件がおきました。
これから手書きでA4レポート用紙20枚以上を書かなくてはいけないという徹夜覚悟のアルバイト開け。
大好きな松屋でバイト先のおじさんとご飯を食べて帰る途中、歩道に歩いている女性がいたので、自転車で歩道を下りて車道に移りました。
ハンドルに手のひらをのせただけの状態で、車道上の段差にさしかかりました。
段差にハンドルを取られて、手はするっとグリップから離れ、左足だけで地面に着地。

ズキッという強烈な痛みを感じながら、道路の真ん中なので急いで閉店後のドラッグストアの駐車場に移動。10分くらいうずくまっていました。
そのうち痛みがひいて、レポートを書かないと!と思って腫れてとても重くなった左足も使いながら自転車を漕いで帰宅しました。
まともな歩き方ができなくなっていますが、無事レポートを書き終え、提出。
明らかにヤバいので昼休みに整形外科へ。
レントゲンを撮ると、骨折していると言われます。

まずしたのがバイト先に電話。今日はいけそうもないと。律儀ですね。
それから実家に電話。手術になりそうだと。

週末だったので、休日を挟んで翌週入院生活がスタートしました。
一泊して、翌日から手術だといいます。
手術が終わったあとは安静とリハビリのための入院。
この入院に救われました。

入院前は期末試験のことしか頭になくて、一刻も早く退院しなければ!と思って、術後何日で退院できますか?というのが主治医に聞いた最初の質問でした。

しかし、入院してみると、看護師さんが天使のよう。
怪我人なのでやたらに優しくしてくれます。
アルバイト先の同僚や学校の先生とは大違い。
痛みはどうですか?困ったことはありませんか?と気遣ってくれるし(当たり前かもだけど)
試験のために参考書を読んでいると、難しい本読んでてすごいですねー
とか褒めてくれる。大学に行ったらみんなやってる当たり前のことなのに!褒めてくれる!
結局2週間くらい入院しましたが、その中で本当に救われました。
人にやさしくしてもらうことでメンタルがとても回復しました。
そのまま2ヶ月程度は杖を欠かせない生活で、アルバイトに戻ることはできないと告げてそのまま退職。
期末試験にも間に合い、松葉杖をつきながら大学に行って、なんとか単位も取りました。

この1,2年間は、感情の起伏が大変でしたが自分と向き合うことができた期間でした。
教訓としては、
友達がいなくても心療内科ならお金払えば相談できる(解決するとは言ってない)
否定され続けるとメンタルを病む
メンタルを病むと何をやってもうまくいかない
荒療治的に不向きなことをやり続けるのは危険
つらいときは全部ブッチして優しい世界へ逃げるのが最強

みたいなところだと思います。
たしかに僕はADDなんじゃないかと思いますが、どちらかというとそれよりも、
あの頃はうつとか適応障害みたいな感じだったと思っています。

僕は実はポンコツじゃなかった!という話ではなく、実際ポンコツです
不向きなことをやればよりポンコツになりますし、怒られると本当に萎縮してポンコツになります。
人間程度の差はあれど少しはそういうものだと思います。
なので人に対してはなるべく優しく接したいと思いますし、自分もそうされたいです。

2019年4月28日日曜日

ESP32をWi-Fi AP/イーサネットコンバーターにする(LAN8720使用)

最近になって、昨年公式githubに”eth2wifi”というサンプルが上がっているのに気づきました。
どうやらこれを使うと、有線LANをつないでWi-Fiアクセスポイントを立ち上げる
あるいはESP32がWi-Fiアクセスポイントに接続して、ESP32を介して有線LANの機器をLANに接続する
ということができるようです。1000円そこらでAPが作れるのは画期的です。

ESP32は、Wi-Fiの他に、物理層の部分以外Ethernetにも対応しています。
実際にEthernetを使うためにはEthernet PHY(フィジカル=物理層)
の回路が必要です。
よく知りませんが、通信用のクロックを作ったり、
信号レベルなどを有線LANの規格にあわせたりしてくれる回路なのだと思います。
これらの回路をESP32内部に入れるのはあまり使う人いないのに不毛ということで
物理層がはじめからは載っていないのだと思います。僕もそれでいいと思います。

調べるとEthernet PHYのICというものがいろいろ出ていて、簡単にブレークアウトボードに乗っているものが手に入るICとして、LAN8720がESP32ではよく使われているようです。

というわけで、LAN8720の載った基板をAliexpressで注文しました。
200円くらいで売っています。
https://www.aliexpress.com/item/1pcs-Smart-Electronics-LAN8720-module-network-module-Ethernet-transceiver-RMII-interface-development-board-for-arduino/32947407343.html?spm=2114.search0204.3.41.18a547acrOaaW9&ws_ab_test=searchweb0_0,searchweb201602_4_10065_10068_319_10059_10884_317_10887_10696_321_322_10084_453_10083_454_10103_10618_10307_537_536,searchweb201603_16,ppcSwitch_0&algo_expid=a53a62b5-87f4-46c8-8fea-e77569fc6b6b-6&algo_pvid=a53a62b5-87f4-46c8-8fea-e77569fc6b6b&transAbTest=ae803_5

届いたので、
冒頭のリンクのURLに書いてあるとおり配線しました。


 まあたくさん配線しないといけなくて、めんどくさいですがジャンパ線で直接接続のバラックです。
リンク先に注意書きが書いてあるのですが、
LAN8720ボードからのクロック出力をGPIO0に入力していますが、
ESP32の起動時にGPIO0がローに落ちていると、ファーム書き込みモードに入ってしまいます。
そこで、調べたら出てきた対策をします。
発振子の足をNCのピンに引き出して、GPIO17につなぎます。
GPIO17はコードの中でクロック出力の有効化・無効化をしてくれています。
こんなやり方でいいのか?という感じがしますがこれでうまくいきました。
基板を立ち上げるなら、トランジスタで電源ごと切ったりするほうが健全な気もします。



eth2wifiサンプルのディレクトリで、make menuconfigで動作の設定ができます。


僕が買ったボードのPHY Addressは1でした。
USE PHY Power pinにチェックが入っていると、PHY Power GPIOで制御ができます。
WiFi station modeにチェックが入っていると、イーサネットコンバーター
チェックを外すとAPになります。

実際通信してみましたが、CATV12Mではほぼ上限の値が出ていたので、実際にはもっと早いスピードで通信できると思います。
ツイッターを見ながらプライムビデオを流すくらいの使い方は余裕でできました。
本当に1000円そこらでAPを自作できるのはすごいですね。
2つ数珠つなぎにしてAP-イーサネットコンバーターとやれば中継機とかも組めそうです。
(それはもっとうまいやり方がありそうですが)

どうやってこれを実現しているのか?コードを見るととてもシンプルで驚きます。

static esp_err_t tcpip_adapter_sta_input_eth_output(void* buffer, uint16_t len, void* eb)
{
    if (ethernet_is_connected) {
        esp_eth_tx(buffer, len);
    }

    esp_wifi_internal_free_rx_buffer(eb);
    return ESP_OK;
}

Wi-Fiに受信バッファがあったらEthernetに送る
Ethernetに受信バッファがあったらWi-Fiに送るというような関数があります
シリアル通信のようなノリでこんなことができているのですね。
パケットをそのまま処理しているので、ESP32自身に宛てられたパケットを判別して処理するようなコードを書かないとESP32自身は通信ができないような気がします。
市販のAPのようにWebUIを実装したりするのは結構たいへんそうです。
ボタンを押しながら起動で別モードとして設定モードが立ち上がるような実装だと特に問題なく作れそうです。

2019年2月24日日曜日

M5CameraでGoogle Driveにアップロードする

結論というか、基本的にはこちらのブログがとてもためになるので読んでください

ESP32にWROVERというSPI RAM付きモデルが出て、大容量のRAMを使えるようになりました。
そこで、200万画素のCMOSセンサーが作る画像をバッファすることも容易になり、M5Stackシリーズを作っているメーカーから出ているM5Cameraをはじめとして、Omnivision OV2640が載ったESP32ボードが続々登場しています。

購入してすぐ、本体がSoftAPモードで立ち上がり、本体のWebサーバーにブラウザでつなぐとカメラの映像がストリーミングできるなどアツい展開になっています。
ただまあ、映像オタク的にはそれをやるなら別にネットワークカメラやWi-Fi付きデジカメのほうが画質もいいしいいじゃんということで、
マイコンにやらせるなら、実際にはなにかのトリガーで写真を撮ってどこかにアップロードさせたいみたいな用途のほうが強みが発揮できそうです。

そこで、M5CameraでGoogle Driveに写真をアップロードしてみました。

Google Driveは、Drive APIというものが用意されており、これを使うとRESTでファイル操作が可能になります。が、
一番冒頭にリンクさせていただいた、cURLでGoogle Driveにアップロードする方法をご覧いただくとわかるように、認証がやや面倒です。

簡単にまとめると
・APIを登録
・クライアントIDとシークレットキーを取得
・ブラウザでクライアントID付きの登録URLを開いて認証コードを取得(OAuth認証)
・認証コードとクライアントIDとシークレットキーをPOSTしてリフレッシュトークンを取得※
ここまでが初期設定です。

次からがファイルをPOSTするたびに行う操作です。
・リフレッシュトークンとクライアントIDとシークレットキーをPOSTしてアクセストークンを取得
・アクセストークンとファイル、ファイル情報をPOSTしてファイルをアップロード

※アクセストークンには有効期限があり、アクセストークンを取得するためのトークンがリフレッシュトークンです。
そのため、毎回リフレッシュトークンから有効なアクセストークンを取得する必要があります。

これらの操作をすべて行い、実際にM5Cameraで画像をアップロードするサンプルをArduinoで作ってみました。この例をちょっといじれば、カメラ画像以外にも、
ローカルのSPIフラッシュやSDカードに貯めたセンサーデータをまとめてCSVでアップロードするなど、ArduinoでGoogle Driveにファイルをアップロードできます。


さて、このサンプルを使う前にはGoogle DriveのAPIキーを取得する必要があります。
この操作がしょっちゅう画面構成が変わって、探してもやり方が見つからない場合があるので自分用にもメモしておきます。

Google Developers Consoleを開く


プロジェクトの選択をクリック


新しいプロジェクトを適当に作成


認証情報→OAuthクライアントID



同意画面を設定


名前を適当につけて保存


アプリケーションの種類:その他
名前適当で作成



クライアントIDとクライアントシークレットが取得できた。

あとはファームを入れ替えたM5Cameraを起動し、シリアルモニターを開くと、これらを聞いてきて、OAuth認証用コード取得URLが表示されるので、
要求されるコードを入力していくと、SPIフラッシュにそれらが保存されて次からは電源を入れるだけでGoogle Driveに写真を撮ってアップロードしてくれます。

2019年1月5日土曜日

久しぶりに将棋をやったら勝負ごとに向いてないことがわかった

チラ裏: 電子ピアノを買ったらなんでピアノが身につかなかったのかわかった
http://blog.nyancotech.online/2018/11/blog-post.html
の続きのような記事です。
結局、集中力がなすぎて楽器もロクに身につかなかったという内容の記事です。
恥の上塗りなので別に見なくてもいいです。この記事も読まなくていいです(え

小学生で早々に運動神経のなさはわかっていたので、中学校はなるべくゆるい
インドア派な部活をやりたいなと思って、将棋クラブに入りました。
部室はぞんざいなもので、半分以上倉庫のような部屋に押し込まれていました。
先輩はPSPでモンハンやったりしてましたね。
自分も特にまじめにやろうと思っていなかったので、将棋ソフトが入った
誰かが置いていったパソコンで遊んだりしていました。

まあさすがにたまには将棋を指すこともありました。
何度やっても毎回負けていました。囲いとかそんなのを覚えるのが煩わしくて
適当に指しているから負けているのだとその頃は思っていました。
はや10年近く経った大学生のころ、インドア派な同級生が
みんなでスマートフォン用の将棋アプリで遊んでいるのを見ました。
タッチパネルだしたしかにやりやすそうだなぁ。
最近はメディアにもよく将棋が取り上げられるしやっぱ流行ってるんだなぁ
と思いつつ自分も入れてみました。

将棋ウォーズってやつなのですが、Android/iOSアプリとどちらもあるようです。
https://play.google.com/store/apps/details?id=jp.heroz.android.shogiwars&hl=ja
https://itunes.apple.com/jp/app/%E5%B0%86%E6%A3%8B%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BA/id496801169?mt=8

まあ相変わらず負けっぱなしで、対人戦では相手が切断で投了して
勝つくらいしか勝つことがないという状態でした。
さすがに昔わずかながらやっていたのだから囲いくらいは覚えないとダメかと思い、穴熊や美濃囲いをググってコンピューター戦でやってみると、
囲っている間に駒がとられていってどんどん不利な局面に…

そこで当然のことに気が付きました。
対戦は相手がいるのだから、相手も自分を陥れようと駒を指してくるのですね。
超性善説の頭お花畑ハッピーさんなので、そんなこと微塵も思っていませんでした。(嘘

自分の進めたい局面だけではなく、相手がどう動いてくるのかまで見て、
それにどう反応していきながら攻めていくかまで考えなければならない。
そんなことが人間にできるはずがないと思いましたね。

考えてみると多くのゲームやスポーツってそうなっているんですよね。
体育の授業でやった野球やサッカー、バスケットボールやドッヂボール
球技なんて怖くてできないわと遺伝子レベルでトラウマを刻み込まれましたが、
運動神経だけではなく、相手が自分を攻撃してくるのだという背景もその一因だったのです。
余談ですが、卓球はまずボールが見えなくて、やっている人たちはどうやって球を打ち返しているのかいまだ不明です。

別に運動が嫌いなわけではなく、長距離走や水泳なんかは昔から好きでした。
球を使わないからではなく、誰からも攻撃されないからなのですね。
陸上競技も、並走している同士でペースの駆け引きがあるといいますが…
そんな世界は知らないので…。

それを考えると、たとえルールの中でも明らかな悪意をもって相手を陥れるようなことをしている球技をはじめとしたスポーツはやっぱり嫌いですし、将棋のようなゲームも結局はそんなことをしているんだと思って失意しました。やっぱり勝負事は嫌いです。