名前を指定して接続する場合。アドレスを指定して接続する場合。コマンドを送ると、130バイトほどのバイナリデータを返してくるようになっています。コマンドを送り、受け取ったデータをシリアルでPCに返してみます。Serial.print(data);}これで、シリアルモニターにUSBセンサーの値がJSONっぽい形式で返ってきました。返ってきてしまいました。実行し直しても再接続がうまくいきません。ESP32全体を再起動するという処理を入れると、うまく再接続されています。Errorが発生していました。142083226確かに、このセクターをddで読み出してみると、延々カシャカシャ音を立てるばかり。Errorで失敗します。errorこういう時は、このセクターに書き込みを行うと、HDDのファームウェアが代替(だいたい)セクターに置き換えてくれるはず。このセクターはファイルデータの一部であることが分かっているので、とりあえず0で埋めます。(ファイルシステムのメタデータの一部だと厄介。Errorになってしまいます。したがって、以下のようにbs=4kを指定して、セクタ番号を8で除算した値を指定します。間違うと別のデータを破壊してしまうので注意。out書き込みに成功しました。out正常に読み出せるようになっていました(というか、そう見えるように代替セクターに置き換えられていると思われます)。前後のセクターを読んでみても正常そうなので、しばらくこれで様子を見てみます。Leonardo等は、USBキーボードやマウスとして振舞わせ、PC等を操作するのに使うことができます。IDEをプログラミング環境として使えるESP32ではUSBキーボード機能は付いていません。LEを利用してキーボードとして振舞わせることができるはず。いうことで、やってみました。セットアップ今回はM5StickCを使いましたが、ESP32ならどのボードでも同様です。IDEでESP32を使用するためのセットアップ手順は、下記サイトなどを参考にしてください。Device)のためのクラスはESP32のツールキットにすでに含まれていますが、キーボードやマウスとして振る舞うのに必要なセットアップをクラスにまとめたライブラリを作ってくれている方がいるので、これを利用すると簡単です。起動すれば利用できるようになります。以下のサンプルを見れば一目瞭然なほど簡単です。タイプし、エンターキーを押すものです。Keyboard」というデバイスが見えます。これに接続してテキストエディタ等に切り替えると、5秒ごとに入力されるのが確認できます。PCだけでなく、iPhoneでも動作を確認できました。Touchを有効にしてみたりしたのですが、ボタンもカーソル移動も反応せず...)。このままだと勝手に動くだけですが、せっかくM5StickCを使っているので、カウントダウンを表示したりボタン操作で一時停止などができるようにしてみました。下記サンプルではCtrlキーを5秒ごとに押しています。(これだけだとあまり意味はないですが、ゲーム等と組み合わせたり、使い方は工夫次第ということで。15:19ESP32をBluetoothキーボードやマウスにするTweet広告を非表示にするもっと読むコメントを書く2019-08-04太陽電池で動くワイヤレス環境センサーTweet前回の記事のドアセンサーで使ったTWELITEを使って、太陽電池で動くワイヤレス環境センサーを作りました。BME280で温度・湿度・気圧を計測し、定期的に無線で送信することができます。電気二重層コンデンサを搭載しており、夜間もデータ送信が可能です。エナジーハーベストの実験目的です。PiにUSB接続しています。SOLARに付属していますが、試しに室内用の別のパネルに変えてみました。日の入らない室内など、暗めの環境では有効ですが、屋外など十分昼に明るくなる環境であれば付属のものでも十分動作しそうです。BME280のブレークアウトボードは、商品名にSPIとか書いてありますがI2C接続です。SOLARの製品ページにあるPDFの通りです。https://mono-wireless.com/jp/products/TWE-EH-SOLAR/index.html裏面はこんな感じに。空間が空いていてスカスカ。ケースは手持ちの適当なやつですが、ちゃんと選べばもっと小さくもできそう。TWELITEには上記ページにある「無線タグアプリ」の子機用のファームウェアを書き込み、10分に一度,BME280の情報を送信するように設定します。注意書きにある通り、起動時のOTAは無効にするようオプションビットを設定しておきます。BLUE用)を書き込みます。すると、親機の方のシリアルにデータが流れてくるので、あとはこれを記録してあげればOKです。キャパシタ電圧の変化A1の値として、キャパシタ(電気二重層コンデンサ)に蓄電されている電圧値(の1/2の値)を取得することができます。これをプロットしてみると、夜間に暗くなった時にキャパシタの電力を使って動作している様子を見ることができます。以下は約4日分のデータ。夜間に電圧が落ちて,日が出てくると一気に充電されています。今回設置したのは屋外の直射日光の当たらない場所ですが、ちゃんと終夜で動いています。夜間も暗いながらも夜間灯の光が入っており、多少は消費を緩和している可能性はあります。11:30太陽電池で動くワイヤレス環境センサーTweet広告を非表示にするもっと読むコメントを書く2019-06-09ボタン電池で年単位で使えるワイヤレスドアセンサーを作ったTweetボタン電池で数年ほど動作し続ける、ワイヤレスなドアセンサーを作りました。あるIoTネタですが、オフィスのトイレ個室が混雑しがちなので、自席で空きがわかると良いなというやつです。外観と、ドアの上部に載せたところ。仕様センサーは、1分間ごとにドアの開閉状態を無線送信します。(リアルタイム送信もできるのですが、あえて1分間ごとのみにしています。用途的に、混雑しているかが荒く分かればよく、逆にあんまりリアルタイムに監視したくないからという理由です。)複数のセンサー情報を集約して混雑しているか空いているかをWebページで見ることができます。使用したもの無線送信にはTWE-LITEを使用しました。簡単に省電力な無線システムを作ることができます。いくつかタイプがありますが、ボタン電池ホルダーが付いているPALを使いました。いうのが販売されているので、これを使えばあとは磁石さえ用意すればOKです。値段もするので、今回はセンサーにはリードスイッチをつけて使います。ガラス管の金属リードがわずかに離れて2本入っており、両側のそれぞれに磁石のS極とN極を近づけると、磁力でくっついて導通するという仕組みです。SPSTコンタクトリードスイッチ子機のケースにはタカチのSW-90Bを使用。長さも高さも余ってしまいますが、幅の小さいケースがなく......。SW-90Bの通販ならマルツオンラインマグネットはこれ。小さいので対向位置にくっついていても邪魔になりません。位置は結構ぴったりと合わせる必要があります。20個セット親機としてはDIPタイプのTWE-LITEを使いました。親機からWi-Fi経由でデータを流すのにはM5Stick-Cを使いました。スイッチサイエンス配線こんな感じにリードスイッチをつけます。-+リードスイッチがONになると、A1がプルダウンされます。親機側は、M5Stick-Cにくっつけました。強引ファームウェアの書き込みと設定ファームウェアとして、以下のページからダウンロードできる「無線タグアプリ」を使用しました。MONO-WIRELESS.COM子機には子機用のバイナリ(現時点で最新のv2.1.5)を書き込みます。USBシリアルでGND/TXD<->RXD/3.3Vにつなぎ、PRGをLOWに落として電源を入れ、PRGをHIGHに戻すとプログラムモードに入ります。含まれるPythonのツールを使います。ファームウェアを指定して書き込みM2ピンをLOWにして起動すると設定画面に入り、以下のように表示されます。IDやチャンネルなどを適当に設定していきます。3などと違う番号をつけておきます。指定して、OTAは無効にしておきます。センサータイプは10(アナログセンサー)にしておきます。親機には親機用のバイナリを書き込みます。ID、チャンネルを指定します。無線受信したデータがシリアル出力されるので、これをESP32側のSerial1で受け取り、適当にパースしてWi-Fi経由でHTTP送信するようにしました。結果こんな感じで混雑状況がわかります。個別の開閉状態は表示しないようになっています。このページを定期取得して空きができたらポップアップ通知するスクリプトを書いた人などが現れていますwちなみに親機と子機は壁2枚隔てた距離にありますが、かなり感度は良好で滅多にデータ欠損などはないようです。04:24ボタン電池で年単位で使えるワイヤレスドアセンサーを作ったTweet広告を非表示にするもっと読むコメントを書く2019-05-11EXAPUNKSのソリティアを自動操作で解くTweet前回の記事でソリティアの解法を求めるコードを紹介しましたが、これに画像認識と自動マウス操作機能を加えて、全自動で解くようにしました。youtu.beコードはGitHubにあります。(Solitaire)画像認識は、screencaptureコマンドで撮ったスクリーンショットをOpenCVで画像認識しています。マッチングしているだけの簡単なものです。06:53EXAPUNKSのソリティアを自動操作で解くTweet広告を非表示にするもっと読むコメントを書く2019-05-09EXAPUNKSのソリティアをRubyで解くついでにJITを試してみるTweetプログラミングっぽい独特なパズルゲームを開発しているZachtronicsが出したEXAPUNKSというゲームで遊んでいます。簡単なアセンブリのような言語でEXAというウイルスのようなエージェントをプログラミングし、ストーリーを追いながらハッキングでデータを改ざんしたりハードウェアを操作したり、時には別のハッカー(プレイヤー)のプログラムと対戦したりするというパズルゲームです。store.steampowered.comwww.youtube.comさて、本編もなかなかやりごたえのある内容(かつ適度な楽しめる難易度)なのですが、少しストーリーを進めると、おまけで息抜きにミニゲーム「ПАСЬЯНС」(ソリティア)で遊べるようになります。いう降順のセット4つと各スートの絵文字4枚を重ねたセット、計8セットを作れば勝利、というルールです。途中で一枚だけ、右上の空きスペースに避けておくことが可能です。息抜き用とはいえ、適当にやっていると結構、途中で詰まってしまうくらいの難易度です(UNDOもできないし)。プログラミングゲームなので、このПАСЬЯНСをプログラムで解かせてみました。いえこのゲームのEXA用言語ではなく、普通のRubyです。いうファイルに、カードの並びを左上から右に記入したものを与えます。上記のスクリーンショットであれば、以下のようになります。走らせると、以下のように解法の手順が表示されます。右はカードの数字や絵カードのスートを示します。0(一番左)のスペードの絵カードを4(真ん中)のスペードに重ねる。次に、0(一番左)のクラブの絵カードを右上の空きスペースに退避する。...という感じです。このままでも、通常は一瞬で、遅くとも数秒で解けますが、稀に延々計算していて解が表示されないことがあります。このプログラムでは素朴に手順を深さ優先で探索しているために、解が見つからない場合には最後の方の似たような手順を何度も調べ続けてしまうためです。ランダムな配置でどれくらい解ける*1のか調べてみたところ、だいたい96%くらいは解けるようでした。素朴すぎるので、次のように適当に深読みしすぎるのを防止してやると、ほぼ確実に解けるようになります。end時間がかかる例として、以下の入力があります。Proでだいたい10秒くらいかかります。CPUインテンシブな負荷なので、たまたま手元にあるRubyのバージョンごとに速度を測ってみました。10.56sJITで多少ですが実時間が早くなっていますね。ruby-trunkではJITなしの時はv2.6.3よりも若干遅くなっていますが、JITありではさらに高速になっており、かつJIT時のCPU時間の上昇も抑えられているのが分かります。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。