MPU9250の使い方&測定レンジ設定こんにちは!今回は加速度+ジャイロ+方位が取れる高精度センサであるMPU-9250の使い方をご紹介します。データ取得や測定レンジ変更など基本的な使い方と使用レビューをしようと思います。センサの詳しい仕様はこちらのデータシートを参照すれば分かります。この記事はデータシートを見るのが面倒な時のための備忘録的記事です。この記事は自分で色々試行錯誤した結果でもあるので、間違っている箇所があればぜひご指摘ください。Unoやラズパイなど、I2CまたはSPI通信が使えるなら何でもOKだと思います。今回はArduino系でI2Cを使う想定でサンプルコードをご紹介します。配線はデータシートの通りですが、必要最小限でこれだけになります。ポイントは左下と右下のピンで、左下はアドレス選択ピンで3.3VかGNDどちらに接続してもいいですが通信する時のアドレスが異なります。0x69右下はI2Cの場合3.3Vに接続します。最小構成での配線データの取得I2C通信するライブラリはArduinoならばWire.hが使えます。MPU-9250のデータ読み込みはデバイスアドレスを指定して、メモリアドレスを書き込んだあと、メモリを読み出すことで取得します。加速度、ジャイロの値を取得するサンプルコードをご紹介します。データは16ビットで、上位8ビットと下位8ビットに分かれているので、データの読み込みを2回行い結合する関数i2c_read2を用意しています。この関数に読みたいメモリアドレスを入力するだけで、データを取得することが出来ます。250//[deg/s]//メモリアドレスから2バイト読み込んで整数に直します。データはビッグエンディアンです。//先頭アドレスの読み込み。16bitのshort型に格納。//次のアドレスの読み込み。16bitのshort型に格納。//一つ目のデータを8ビットシフト。//2つのデータを結合して返す。delay(10);}測定レンジと内部LPFの設定このセンサは測定レンジが加速度は±2G~±16G、ジャイロは±250deg/s~±2000deg/sまで設定可能です。設定は特定のメモリアドレスにデータを書き込むことで行います。メモリアドレスに値を書き込む関数i2c_writeを用意しました。Wire.endTransmission(true);}これを使って、次のような感じに設定を行います。メモリアドレス26~29が設定値を書き込むアドレスです。Delay:66.96ms)結果を見てみるX軸とY軸の加速度をプロットしてみました。縦軸が加速度[G]で横軸が時刻です。いい感じに取れてると思います!加速度をプロットしたグラフ。縦軸が加速度[G]、横軸が時間。この例ではLPF設定をカットオフ周波数5Hzに設定したので、かなり強いフィルターがかかっています。それでも手で振ったくらいの加速度は問題なく表示されます。電動歯ブラシを当ててみたところ、殆ど値が変化しませんでした。ここまで強いフィルターが必要な状況はそう無いと思いますが、必要に応じて調整するのがいいと思います。MPU9250の使い方&測定レンジ設定にコメントESP8266で指パッチン検出器を作る1最近私生活がバタバタしていたので久しぶりの投稿です。前から考えていた指パッチンで何かアクションを起こすデバイスが試行錯誤を重ねようやく完成したので、作り方をご紹介しようと思います。今回の目標は「指パッチンしたら何か起こる」デバイスを作ることです。指パッチン「だけ」を検出して何かアクションを起こす。手を叩いたり何かがぶつかる音では反応しない。できるだけ誤作動(指パッチンしていないのにアクション)しない。コストと消費電力を抑えるため、ラズパイではなくESP8266を使う。そのため、C++でプログラムを書き、しかもコード量を減らす必要がある。家に帰ってきたら指を鳴らしてカッコよく電気をつけたい。そんな要望に当システムがお応えします。指パッチンの音を解析する指パッチンの音の特徴は?指パッチンだけを検出するためには、指パッチンの音の特徴を捉える必要があります。マイクで取った音の信号だけでは、データがバラバラすぎて判定できません。フーリエ変換してみる指パッチンの音と手を叩く音は、同じ単発音ですが、人間の耳には音色の違いがはっきり分かります。その理由は音に含まれる周波数の配合が異なるためです。そこでフーリエ変換を使って周波数分析を行います。周波数分析とは一定時間の音の時系列データの中に、各周波数成分がどのくらい入っているかを調べる手法です(ざっくり)。フーリエ変換を行うと、時系列データ(横軸が時間、縦軸が振幅)が周波数成分に変換されて、横軸が周波数、縦軸がパワースペクトルになります。周波数分析を使えば指パッチンと手を叩く音で異なる結果が得られるはずです。指パッチン、手を叩く、金属をぶつけるの3種類の音を周波数分析した結果がこちらです。3種類の音をフーリエ変換した結果。指パッチン同士はなんとなく似てそう。なんとなく指パッチンは似ている波形が出ています。逆にそれ以外は全く違う周波数的特徴を持っていることがわかります。次はこの指パッチンとそれ以外のデータを分類する判定アルゴリズムを作っていきます。周波数分析が出来たとして、どういう波形なら指パッチンと判断するかを決める必要があります。そのためには指パッチンに近いかどうかを定量的に評価する指標が必要です。評価の方法としては色々ありますが、相関係数を使う方法とサポートベクターマシンを使う方法を思いついたのでやってみました。得られたデータがどれくらい指パッチンに似ているか定量的にわかればいいので、まず相関係数を使う方法を思いつきました。相関係数は2つのデータ(ベクトル)が似ているかどうかを数値で表すことが出来ます。指パッチンを何回か録音して、指パッチンの平均的なデータを求めておきます。実際に判定するときは、この平均データと新たに得られたデータを比較することによって、得られたデータがどのくらい指パッチンに似ているか判定します。指パッチンを20回録音して得られた平均データがこちらです。指パッチン20回の平均データ。これを基準に相関係数を求める。これと新たに得られたデータを比較して、相関係数が高ければ指パッチンと判定します。以下は指パッチンの平均データをx軸、新たに得られたデータをy軸にとった散布図です。教科書で見たことあるようなきれいなグラフになりました笑。平均をデータに近い=相関が強い相関係数はデータが似ているほど1に近くなります。逆に全く相関がなければ0になります。指パッチンと指パッチン以外の約100回のデータで実際に判定を行ってみたところ、次のようになりました。約100回のデータに対して相関係数を計算。指パッチンはちゃんと相関係数が大きくなっている。これを見ると、指パッチンのときはだいたい0.4以上の相関係数が出ていることがわかります。これをトリガーにすれば実用的な判定システムが作れそうです。長くなってきたので今回はここまでにします。電子工作ESP8266で指パッチン検出器を作る1にコメント帰宅したら自動で解錠するスマートロックを自作する4~指紋認証編~前回、タクトスイッチを使って外から解錠するやつを作りました。今回はいよいよスマートロックっぽいことをしていきます。なんと指紋認証に挑戦です。意外と簡単に、かつ安くできましたのでご紹介します。ICカードで解錠はいったん置いておきます。(作ったけど、記事にするのが面倒くさい。)今回の目標は、指でセンサにふれると解錠してくれるスマートロックを作ることです。1200円くらいAmazonで最安だった指紋認識モジュールです。高いやつだと4000円くらいするのにこちらは1200円なのでちょっと不安ですが、きちんと認識してくれます。若干認識までにかかる時間が長いかも?。指を置いてから0.5~1秒くらいかかります。導線にピンヘッダをはんだ付けする指紋モジュールから出ている線はVCC、GND、TX、RXの四本です。これをArduinoで接続するためにピンをはんだ付けします。(以下、作業途中の写真を撮るのを忘れたのでイメージ画像です。)モジュール付属のコネクタ・ケーブルを半分に切断して、ジャンパワイヤとピンをはんだ付けしていきます。付属のケーブルを半分に切断ケーブル+ジャンパワイヤ+ピンをはんだ付け。ちなみに、モジュールの線の配置はこのようになっています。ESP8266に接続UART接続でESP8266と通信しますので、以下のように接続します。マイコンとの通信はソフトウェアシリアルを使うので、TXとRXをESPのD2とD3につなぎます。(追記:僕が使っているESP8266ではソフトウェアシリアルが使えませんでした!後述します。GND指紋認識テストモジュールが接続できたら指紋認証がうまくいくかテストしてみます。ArduinoIDEのライブラリ管理から検索するか、adafruitのgitからモジュール用のドライバとサンプルプログラムをダウンロードします。ArduinoIDEからサンプルプログラムを開いてenrollを書き込んでみます。これだけで指紋の登録ができる...と色々なサイトに書いてありますが、僕の場合は上手くいきませんでした...。found.」と表示され、そもそも何も通信できていないようです。調べた結果、原因はESP8266モジュールのソフトウェアシリアルが怪しいと結論づけました。ESP8266はデフォルトの通信レートが119200bpsであるのに対し、このモジュールは9600bpsで通信するので上手くいっていないのだと思います。ネットの記事を調べてESP8266の通信レートを9600に落とす方法を試しましたが、僕の持っているモジュールでは変更しても電源を入れ直すと通信レートが戻ってしまい上手く行きませんでした。するかESP8266でソフトウェアシリアルが使えないならどうするか、これに結構悩みました。UnoとかNanoとか他のモジュールを使う。WiFiから解錠したり他の機器との連携は無理。NanoとESPを両方使えばできるがなんか無駄な気がする。ESP8266のハードウェアシリアルを使う。シリアルモニタが使えなくなるためデバッグができなくなる。ログをWiFi経由で確認できるようにすれば一応デバッグできる。3日くらい悩んでましたが、今後WiFiはやっぱり使いたいのと、これまで作ってた基盤がESP用になっているのでまた1から基盤にはんだ付けし直すのが面倒という理由で案2を採用することにしました。この方法だとシリアルモニタからモジュールに数値を送信することができないんですよね...。指紋の登録時には番号を送信する必要があるので、指紋登録時は1、運用時は2という面倒くさいことになっております。Nanoを使って行います。adafruitのサンプルプログラムからenrollを書き込んで、指紋モジュールのTXとRXをArduinoのD2とD3につなぎます。シリアルモニタを開いて、メッセージ通りに番号を入力して指を2回置けば登録完了です。登録した指紋は電源を切っても保持されているので、よく使う指を全部登録したら次はESPにつないで認証できるかやってみます。指紋を認識できるかテストしてみるここからはモジュールをESP8266につないで作業していきます。ソフトウェアシリアルではなくハードウェアシリアルを使うので接続はモジュールのTX、RXとESPのRX、TXです。プログラムの書き込みを行う際はモジュールを外さないと書き込めません。それとシリアルモニタは使えません。書き込むプログラムはサンプルプログラムfingerprintをちょっと変えるだけでOKです。Serial.printlnは全部コメントアウトしています。}変更点としてはmySerialの部分をSerialに変えて、Serial.printlnをすべてコメントアウトするだけです。シリアルモニタが使えないので、確認用のLEDをD0とGNDにつけます。認証が成功するとLEDを1秒間光らせます。プログラムの解錠条件に、今回の指紋認証の結果を加えるだけです。最終的なプログラムを載せておきます。delay(10);}シリアルモニタが使えないのでWiFiからログを確認できる機能を追加しています。何かメッセージを出したいときはaction_logに保存しておき、http://192.168.xxx.xxx/logで表示します。action_logのクラスはMyFunction.hに別ファイルとして書いてます。電子工作帰宅したら自動で解錠するスマートロックを自作する4~指紋認証編~にコメント帰宅したら自動で解錠するスマートロックを自作する2~ボタンで解錠編~前回はドアが閉まったら自動で鍵をかけるシステムを作りましたが、それだと開けることができないので結局鍵を出さないといけなくて面倒です。そこで今回は鍵の代わりにタクトスイッチを使った暗証番号的な方法で解錠する方法をご紹介します。作りたいもの前回のつづきです。前回から追加で必要なものタクトスイッチ押すと導通するふつうのタクトスイッチドアの外側にスイッチをつける外から押せる位置にスイッチをつけます。うちのドアの横のすき間から線を通せたので普通の導線を使っています。ドアのすき間が狭い場合はフラットケーブル等を使うと良いと思います。ESP8266側はGNDとデジタル入出力に繋ぎます。方法を決めるボタンを準備したら次はどんなパターンでボタンを押したら解錠するか決めます。やり方はみなさんのオリジナリティを出せるところだと思います。ボタンを押す順番や、押す時間の長短などを組み合わせて秘密の暗号にします。ここでは長短の組み合わせをパスワードにしてみます。長短の組み合わせ(モールス符号)をパスワードにしてみる皆さんご存じモールス符号をパスワードにしてみます。―・」と押した時に解錠するようにしてみます。新しく追加したのは関数secret_command()の部分です。ボタンを押したり離したりしたときに、digitalReadの値の立ち下がり・立ち上がりを検出して、ボタンを押していた時間で「・」か「―」を判定します。3秒以上入力がなかったら終了して、入力された符号とパスワードが一致していたら解錠します。}完成!簡単ではありますがこれだけでパスワード解錠的な機能をつけることができました。他にもテンキーなどのデバイスを付けてパスワードと一致したら解錠とかもできると思います。いいやり方があるよ!という方はコメントで教えてください。セキュリティを考えるなら、10回入力に失敗したら一定時間操作を受け付けなくなるとかも考えたほうが良いかもしれません。今回の例ならパスワードが10ケタなので、2の10乗=1024回試されたら破られます。パスワードは長いほうが良いかも。電子工作帰宅したら自動で解錠するスマートロックを自作する2~ボタンで解錠編~にコメントArduinoでFFTを使うマイクから拾った音の音階を調べるプログラムのテストです。Arduinoだけを使ってFFTする方法を調べてみたのですが、情報が古く、日本語では欲しい情報になかなかたどり着けなかったので上手く行ったやり方を紹介します。FFTとは一定期間の音信号を解析して、どの周波数成分がどの程度含まれているか求める手法です。信号の数を2のべき乗にすることによって高速に計算することが出来ます。上手く説明できません。鳴っている音の周波数が何なのかわかる手法です。nanoでもやってみましたが、メモリが足りずスケッチが書き込めませんでした。他のArduinoは要検証です。以下の2個セットのやつが値段的にも最安でWiFiも使えてメモリも多いのでよく買ってます。マイクモジュールやり方ここのやり方に沿って進めていくだけですが、かいつまんで解説していきます。IDEを開き、スケッチ→ライブラリをインクルード→ライブラリを管理...の順にクリックします。順にクリック検索バーに「fft」を入力し、「arduinoFFT」をインストールします。arduinoFFTをインストールこれだけで完了です。プログラム書き込み下にサンプルプログラムを置いておきます。上記サイトに掲載されているプログラムほぼそのままです。一部ESP8266向けに変更しています。オリジナルよりもサンプル数とサンプリング周期を上げています。FFTの特徴として、サンプリング周波数の半分の周波数までしか解析することが出来ません。サンプリング周波数が8000Hzなら、4000Hz以上の音は検出できません。サンプル数を多くすると、結果の分解能が上がる代わりに測定にかかる時間が増えます。サンプル数は2のn乗にしなければならないと決まっていますので、欲しい分解能に応じて決める必要があります。分解能はサンプリング周波数[Hz]÷サンプル数になります。下のサンプルプログラムでは8000÷256=32[Hz]刻みの結果しか得られないことになります。判別する周波数の精度を上げたい場合にはサンプル数(=サンプリング時間)をあげる必要があります。下記のプログラムでは最も成分の多い周波数(ピーク周波数)を出力するようにしています。//ESP8266の場合は「A0」。普通のArduinoは「0」。}Arduinoとマイクを接続わざわざ書くまでもありませんが、Arduinoとマイクを接続します。3.3VとGNDとA0をマイクモジュールにつなぐだけです。マイクモジュールを使えば簡単!テストプログラムを書き込んだらシリアルプロッタを開いて口笛を吹いてみます。口笛の音階があっているかはさておき、音の高さを判別することができました!追記:電源を安定化すれば精度が上がる上記の方法で問題なくFFTはできるのですが、たまに誤差が多い結果が出ることもありました。安いマイクなのでしょうがないのかな?と思っていましたが、ふと思いついて電源を見直したところ精度がめっちゃ向上したので報告します。Arduinoの3.3Vピンから電源を取るとノイズが多いようで、マイクの出力がノイズを含んでいました。マイクの電源を別に用意したところ、ノイズがなくなりFFTの出力もキレイになりました。電池を別に用意するのが面倒な場合は、電源安定回路やレギュレータを使うのもありです。esp8266のVinピンから取っても大丈夫でした。(VinはUSBの5Vと繋がっている)今回は以上です。「この置物を動かすと~置物(ヤッベー)「クーラーがつきます♪」あぎりさんの部屋にあった置物のイメージ何この装置...欲しい...ということで今回はこれを作っていこうと思います。基本構想エアコンは赤外線を使ってつける赤外線送信機と置物は分けて作る赤外線送信機と置物はWiFi通信でつなぐ置物を動かしたらWiFiで送信機に指令を送る→送信機がエアコンをつける赤外線送信機と置物は一体で作ることもできますが(そっちのほうが安いし簡単)、どうしても赤外線がエアコンに届くように配置を工夫する必要がありますし、置物の正面に立つと使えなかったりするのでここはWiFiを使っています。回転センサ(10kΩ可変抵抗器、10kでなくても可)10kΩ抵抗器(アナログ入力が最大1Vの場合のみ必要。Board)×2赤外線LEDトランジスタ(2CS1815)200Ω抵抗器(あったほうがいいけどなくても可)まず置物側ですが、置物本体に回転によって抵抗値が変わる可変抵抗器を使いたいと思います。可変抵抗器は別名ボリュームともいい、昔のテレビやラジオのダイヤルやアンプの音量調節など、ダイヤル状のものにはまず使われているであろう基本的な部品です。これを使って置物が一定以上回ったらWiFi信号を送るデバイスを作ろうと思います。可変抵抗と普通の抵抗は10kΩと書きましたが別に1kΩでもいいです。次に送信機側ですが、赤外線LEDの他に抵抗とトランジスタを使って赤外線が最大限届くようにします。必要なものリスト(AMAZON)使う部品リストを載せておきます。抵抗やトランジスタはAmazonだとバラ売りされていないので、お近くの電子部品の販売店に行かれる方が絶対良いです。東急ハンズとかでも売ってます。逆にESP8266モジュールはネットで買った方が安くておすすめです。置物を回転させたらWiFiを通じてリクエストを送信する装置を作ります。必要なものは、ESP8266と回転によって抵抗が変化する可変抵抗、確認用のLEDです。可変抵抗の仕組みは簡単です。両端に電圧をかけると、(抵抗が一様ならば)その間で電圧は一様に降下します。可変抵抗を回転させるとこの抵抗のどこを触るかが変えられるので、電圧をESP8266で読み取るだけで回転量が分かります。僕のESP8266モジュールはアナログ入力に0~3.3Vが使えるのですが、アナログ入力が0~1VのESP8266もあります。いう場合は次のように20kΩの抵抗を入れることによって出力の範囲を変えることが出来ます。GETリクエストを送信します。WiFi接続が確認できるまで待つ。これがないとGETが失敗することがある。delay(10);}赤外線LED側の設計WiFiリクエストを受け取って、エアコン用の赤外線を出す装置を作ります。必要なものはESP8266と、赤外線LED、電流増幅用のトランジスタと抵抗です。ソースコード(赤外線LED側)WiFiリクエストを受け取って何かをするのはWebServer.hを使います。→ライブラリ管理→でESP8266WebServerと検索してライブラリをダウンロードします。赤外線の送信は「」というライブラリを使いました。こちらはTOSHIBA製や日立製など主要なエアコン製品の赤外線信号を提供してくれているので、好きなコマンドを簡単に送ることが出来ます。自分が持っているリモコンの信号を覚えさせてそれを再生する方法もありますが、全部のボタンを覚えさせるのが手間なのと、たまに送信ミスすることがあったのでこちらを使うことにしました。"デフォルトのパラメータを設定します。"デフォルトのパラメータを表示します。"エアコンONを送信します。クエリをつけるとそれをデフォルトのパラメータに設定して起動します。"クエリをつけないと以前に設定したパラメータを使います。"エアコンOFFを送信します。MDNS.update();}回路図よくあるLEDを光らせる回路と同じです。僕が買った赤外線LEDは3.3Vでは光が弱すぎてエアコンまで届かなかったので、5VをトランジスタでON/OFFするようにしています。赤外線LEDをトランジスタでON/OFFするだけ基盤もなしでそのまま配線しちゃいますまた、このままだと5VがLEDに直接かかっているので、電流が流れすぎてLEDを壊す可能性がありますが、たくさん電流を流したほうが赤外線がよく届くのであえて抵抗を入れていません。今のところ問題なく動いていますし、LEDが光るのは一瞬なので大丈夫だとは思いますが、最初は抵抗をはさみつつテストする方が良いでしょう。適当な箱に入れて目立たなくする置物側を作るときに使った箱のもう半分を利用して適当に作ってみました。木の箱に入れるだけでちゃんとしてる感が出ますね!LEDやトランジスタにジャンパワイヤを切ってハンダ付け。テープで巻いときゃなんとかなる。木箱からのぞくLED...完成!置物を目立つところに、LEDの箱を目立たないところに置いておきましょう。1件のコメント吹き消しキャンドルを作るはじめに前回部屋の明かりをIoT化してWiFiから消したり点けたりできるようになりました。消そうと思うたびにスマホを取り出してブラウザで操作しないといけないので、ちょっとスマートじゃないなということで息を吹きかけると消える装置を作ってみました。手元にあったLEDキャンドルをリメイクしてみたかったっていうのもある。つくりたいもの息を検出する検出したらWiFiを介してHTTPのGETリクエストを送る(またはLEDを消す)必要なものESP8266モジュールまたは適当なArduino(LEDを消すだけ)コンデンサマイク(※アンプなしのもの。↓いつもの安くておすすめなやつですブレッドボードを組み立てる必要なものを揃えたらブレッドボードにさしていきましょう。回路図はこんな感じです。吹き消しキャンドル回路図ブレッドボード配置図。できるだけ回路図と同じになるように表示しています。最低限の部品しか使っていませんがこれで動きます。詳しい方からすればミスが多いと思いますので、ご遠慮無くご指摘ください。簡単にポイントを説明します。マイク部分この部分はコンデンサマイクの基本的な回路です。データシートにも書いてあります。抵抗R3とコンデンサC1の値はデータシートとかなり違いますが、これしか手元になかったので使っています。一応問題なく動いているのでOKとします。コンデンサマイクは極性があるのでプラスとマイナスを間違えると動きません。逆に、コンデンサC1は極性があるとだめなのでセラミックコンデンサを使います。バイアス回路この部分はバイアス回路です。コンデンサマイクからの信号に一定電圧をプラスして信号を見やすくします。僕が使っているESP8266モジュールはアナログ入力が0~3.3Vなので、その半分くらいの1.65Vが足されるようにしました。ある(むしろこっちが一般的?)ので、その場合はバイアスが0.5VくらいになるようにR1とR2の値を決めてください。LED動作確認用にLEDを付けています。普通はLEDに電流が流れすぎないように数百Ωの抵抗を入れたほうが絶対いいですが、これでも動くのでテストだけなら抵抗無しでやってます。長時間使うとあんま良くないと思います。【注意!】esp8266に電源を差し込む前に、回路が間違っていないか確認しましょう。esp8266の3.3VとGNDがショートしてるとヤバイです。過大な電流が流れてesp8266を壊します。僕はこれで2つ壊しました。テスター等で必ず確認してください。IDEを使ってesp8266にプログラムを書き込みます。コードの全体像はこちらです。息はコンデンサマイクで検知。定常値を求めるLPFの係数。長期的なセンサ値の平均を求める。検出判定のパラメータ。TIME_DURATION[s]間にCOUNT_MAX回しきい値を超えたら反応する。最初のanalogReadは値が信用できないので、何回か読む。センサ値にローパスフィルタをかけたもの。delay(10);}息の検出アルゴリズムloop()関数内で息の検出をしています。コンデンサマイクはかなり小さい信号しか出すことが出来ないので、通常はアンプ回路で信号を増幅しますが、息くらいの大きい振動ではアンプ無しでも検出できるくらいに信号が変化します。今回のプログラムではこの信号の変化をトリガーにしてアクションを起こします。息以外の音でも反応してしまいそうですが、意外とそんなことはありませんでした。書き込み僕と同じモジュールを使っている方は以下の設定で大丈夫です。完成!コンデンサマイクに直接息を吹きかけてみましょう。写真では分かりづらいですが、LEDが消えました!もし消えなかった方はプログラム中の閾値やMAX_COUNTを減らすなどして調整してみてください。電子工作吹き消しキャンドルを作るにコメントESP32のタッチセンサの使い方と外れ値処理はじめにArduinoの無線版であるESP32(正式名称はESP-WROOM-32)モジュールにはデフォルトでタッチセンサが10個もついています。ライブラリもあって使うのは非常に簡単です。今回はタッチセンサの使い方と、実際に自作デバイスを作るときのノウハウについて書きます。無線チップが乗っていてArduinoとしてプログラミングもできるモジュールESP32を使用します。Bluetoothデュアルモードちなみに20円安くwavesという所からも出てますが、ピンヘッダの半田付けが悪くブレッドボードに刺さりにくいというレビューがあったので、こちらのHiletgoの方をおすすめします。ピンヘッダも問題ありませんでした。ArduinoIDEにライブラリをインストールするのはこちらを参考にしました。ESP32-DevKitCを使ってみた〜環境構築からタッチセンサによるLチカまで〜タッチセンサを使うプログラムはめちゃくちゃ簡単で、次のコードだけです。delay(1000);}何も宣言しなくても、「touchRead(T0)」を書くだけで値の取得ができます。T0ピンに触れていないときは40~70の値、触れてるときは10~30の値になります。タッチ判定このタッチセンサを使うシチュエーションとしては、センサに触ったら何かの動作をさせることが多いと思います。タッチの判定条件として一番簡単でよく使われているのは、「センサ値がt以下になった時、処理を実行する」です。delay(10);}しかし、これだとセンサに触れている間はずっとt0<40になってしまい、処理が連続で実行されてしまいます。そこで、一度タッチしたらセンサから指を離すまで待つことが必要です。delay(10);}たまに外れ値が出る。はじめは上のプログラムで動かしていたのですが、このタッチセンサはたまに触れていないのに0を出すことがあります。センサ値をプロットしたところ、触れていないのに変な値が出ることがあるこの外れ値は連続で出るわけではなく、一瞬出てすぐに普通の値に戻ります。そのような外れ値に対応するための処理として急激な変化の影響を少なくする、ローパスフィルタというものがあります。ローパスフィルタのプログラムは簡単で、前の値を覚えておいて今回の値の方にちょっとずらすことを繰り返します。サンプルコードはこんな感じです。delay(10);}このときのセンサ値をプロットしたものがこちらです。ローパスフィルタによって外れ値が除去できました!ローパスフィルタによって外れ値が除去できました。これでタッチ判定が誤作動することも無くなります。電子工作ESP32のタッチセンサの使い方と外れ値処理にコメント帰宅したら自動で解錠するスマートロックを自作する1~オートロック編~はじめにホテルとかオフィスのドアみたいに閉まると自動で施錠してくれるやつ、あれすごく便利ですよね。家を出るときにわざわざポケットから鍵を出して鍵穴に指して回す動作をしなくていいと思ったよりだいぶ楽です。今回はオートロックを自作して自宅の玄関に取り付けた話です。作りたいものまず、作りたいオートロックに必要な機能を決めます。暗証番号で解錠ICカードで解錠スマホを持って近づくだけで解錠1→4になるほど難易度が高いと思います。この記事では最初の「ドアが閉まったら自動で施錠」をご紹介します。作ってる途中ですので、随時更新していきます。108円ArduinoまたはESP8266Arduinoの種類は何でも大丈夫ですが、後々解錠にFelica(ICカード)を使う予定ならシリアル通信で152000bpsが使えるボードが必要です。良く使われているArduinoUnoは対応していません。下記の安いArduinoNano互換品とかでいいと思います。今後スマホを使って解錠するなど、WiFiを使って何かすることを考えるならESP8266をおすすめします。ちなみに僕はESP8266で作ってます。サーボモータサーボモータとは、指定した角度まで回転してくれるモーターです。室内側のサムターンを回すので、それなりにパワーのあるものが必要です。僕の家のサムターンはちょっと固めだったのか、持っていたSG90では回せませんでした。不安な方はよりトルクの大きいSG92Rをおすすめします。こちらはSG90よりも動きが遅いらしいですが、楽々回してくれてかっこ良いです。100均の開閉センサ付きライト100均の下駄箱ライトは写真を撮るの忘れましたが、扉に磁石とセンサーを取り付けて双方が離れるとスイッチON、近づくとスイッチOFFするライトです。今回はこれの磁石とセンサー部分を切り取って使っています。100円で開閉センサが手に入るので便利です。(ここで紹介されているようなやつです。)サムターン回し装置まずモーターでサムターンを回す装置を作っていきます。3Dプリンターで部品を作っている人も見かけますが、CAD書いて出力するのも面倒なので割り箸とかで作っていきます。どんな機構にするかまずサムターンを回すための機構ですが、こんな感じになるように作ります。木のブロックがついた部分を左右に90度回すことによって鍵が開く。木のブロックは余ってる木材の端材とかで全然OKです。それをサーボモーターに付属しているプラスチックのパーツに取り付けます。木の端材をサーボモータについてるパーツにネジ止めしたところこうすることによって、ニュートラルにしておけば鍵を使って開けたり手で開けたりできます。モータで開閉するときは左右に90度回転させて、またニュートラルに戻すことで、手動とモータの動作を両立させることができます。ドアノブに取り付け割り箸とマスキングテープを使ってモータをドアノブに固定します。ここはドアノブの形状によって色々やり方があると思うので、ご自宅のドアにあったやり方で固定してください。割り箸でモータを固定ドアノブにつける。ここのやり方はお好みで。開閉センサドアが開いているか閉まっているかを検知するセンサを作ります。100均の下駄箱ライトを使えば簡単に作れます。100均のライトは片方が磁石、もう片方が金属板になっていて、磁石が近づくことで金属板が接触して電気が流れる仕組みになっています。今回はこの部分だけを切ってセンサ代わりに使います。導線を切ってコネクタをはんだ付けする2つの箱が近づくと導通、離れると絶縁です。配線サーボモータと開閉センサが用意できたら配線してみます。サーボモータは接続を間違えないようにESP8266のGND、Vin、D4(PWMピン)につなぎます。サーボモータから出ている線は茶色がGND、赤が5V、オレンジがPWM信号です。開閉センサはGND、D0につなぎます。2本ありますがどちらの線をどちらにつないでもOKです。配線イメージプログラムESP8266にこちらのプログラムを書き込みます。動作としてはすごく簡単で、開閉センサが「開」から「閉」になったタイミングでサムターンを回すだけです。}ルータ設定やWiFiパスワードの部分はご自身の環境に合わせて変えてください。Arduinoを使う人はヘッダーファイルとか適宜変更して、それ以外はほとんどそのままで行けると思います。完成!プログラムができたら開閉センサを近づけたり離したりしてみてください。近づけたときにサーボモータが回るはずです。ESP8266を使っている人はスマホやパソコンのURLのところに192.168.xxx.xxx/closeと入力しても動きます。確認ができたらドアに取り付けてみます。オートロックなので閉め出されないように鍵を持っておくこと!動作テスト中に閉め出されたら恥ずかしいです。ドアに取り付けてマスキングテープでいい感じにしました最大の問題はUSBケーブルが玄関まで届くかですね。僕は延長コードを3個経由しています。あと家から出るときに室内側からサムターンを回すのが少し大変です。慣れれば簡単に開けられますがちょっとモータが邪魔なので、今度は家の中からスイッチとかで開けられるようにしておきます。次回は帰ってきたときに暗証番号的なもので解錠する方法をご紹介します。6件のコメント温度・湿度・気圧が全部測れるセンサーGAOHOU製GY-BME280の使い方はじめに温湿度計を作ろうと思って調べていたら、こちらのセンサーにたどり着きました。1.8-5V4ピン温湿度+気圧測定モジュール2週間かかりましたが無事到着。使い方を調べようと思ったのですが、他の似たようなモジュールの方が有名みたいでこの製品について説明しているページが皆無...そんなもん先に調べとけということで実際に使ってみてわかったことを紹介します。このページでは4ピンのモジュール「GY-BMEP」について説明します。6ピンのBME280モジュールでは無いので注意して下さい!何ができる温度・湿度・気圧がわりと良い精度で測定できるI2C接続アドレスは0x76または0x77が選べる読み出しは早いセンサーの精度はわりといい感じです。この辺はずっと使ってみないとわかりませんが。Vin、GND、SCL、SDAの4つのピンがあるので、I2Cで接続します。Nanoを使う場合はSCL→A5ピンSDA→A4ピンに接続します。電源は6ピンのモジュールと違って3.3Vでも5Vでも使えるみたいです。I2C通信を行うスケッチはこちらのページを丸パクリ参考にさせて頂きました!※説明欄ではSPIでも通信できると謳っていますが出来ませんでした。チップ自体は対応していますが、接続するピンがありません真ん中の3つ端子はなに?日本語で探しても答えにたどり着けず、モジュール名で検索して英語のQ&Aを見てみたら回答がありました。I2C通信のデバイスアドレスを選択するためのものだそうです。1つしか使っていないときは問題になりませんが、2つ以上同じ機器を使う時は、同じアドレスが2つ存在しないようにアドレスを変更します。このデバイスは通常時は0x76ですが、次のようにすると0x77に変更できる、とあります。金の端子の真ん中と左の間を鋭利なナイフ等で傷つけて断線し、右と真ん中をハンダ付けして導通させます。ライセンスで提供されています。当サイトはクリエイティブ・コモンズを利用しています。以下のルールを守って下さい。BY(表示)作品を創作した人(著作者)の氏名や作品のタイトルなど、作品に関する情報を表示しなくてはならないことを表します。