WROOM-02で静電容量式水分計を作る (4)I2Cバッファなしで動作確認
◯やりたいこと
1. (3)で準備したシンプルサイズボード(WROOM-02)で(2)の実験回路を組み直してみる。
2. I2CバッファがなくてもADC(MCP3425)が 1m程度のケーブルをドライブできるか確認する。
◯やったこと
1. シンプルサイズボードへの乗換え
(2)で実験した回路をさっそくシンプルサイズボードで組み直してみます。
ESP-01程ではないのですが、電源回路まで含めてミニブレッドボード上に組み上げられるのはさすがシンプルサイズです。
プローブを接続してデータを集めてみると
前回の実験と同様キチンとデータを送信してきます。
乗換えは問題なく成功です。
2. I2Cバッファなしでデータ転送が可能かの確認
ADCのデータシートを見ていたところ「Current at Output and Supply Pins ±10 mA」という記述を見つけました。結構大きめなドライブ能力です。10mAもあればひょっとして 1m程度のケーブルだと I2Cバッファなしでデータを転送できるのでは?と思い始めました。そこでバッファなし回路での実験に挑戦です。
プローブとWROOM-02との接続は I2Cによる 4線通信。4線シールド線と言ったら身近にあるのはもちろんUSBケーブル。
端子端で断線しているUSBケーブルのケーブル部分を利用します。
端部を切断して
外被をはぎ4線を現します。
ブレッドボードに挿せるよう端部をはんだ処理しておきます。
もう一端側はシールド線もよっておきます。
このケーブルを先程動作実験に成功したブレッドボードへ接続。
プローブとWROOM-02は超近いのですが繋がる経路が1m〜という回路です。空中配線・不安定設置は実験回路という事でご勘弁。
つなぎ終わったらさっそく電源オン。
これも特に問題なく動作。いい感じです。
今回は I2Cのプルアップ抵抗を4.7KΩで動作させてみたのですがこの値でのデータ転送に問題はないようです。プルアップ抵抗の値は消費電力に直結しますので、電池動作を想定している今回は抵抗値をなるべく大きくしたいところ。I2Cの転送スピードを落としてでも大きめな抵抗値を探っていく予定です。
ちなみに現状でのI2Cラインの波形を簡易オシロで見てみたところ
結構なまっていますね。汗
やはり転送スピードを落として対応した方が正解な様です。
電源側から 1m経由したプローブ側の電源電圧を測ってみると
10mV単位での電圧降下はなし。こちらはいい感じです。プローブ側の消費電流はプルアップ抵抗が大口消費者ですのでせいぜい数mA。2Aで iPadへ充電できる USBケーブルにとってはフフン程度の消費電流なのでしょう。
◯やってみて
思いのほか順調に実験が進みました。プローブ側がADC単独で済むとなると小型化も比較的簡単にできそうです。ADCボードに直接ケーブルをはんだ付けしシリコンで固めて熱収縮チューブ、みたいな感じでワンタッチでできそうです。
当面測定実験を継続して
動作安定性の確認とプルアップ抵抗と転送スピードの調整で消費電力最小化を進めていく予定です。
WROOM-02で静電容量式水分計を作る (3)WROOOM-02のコンパクトサイズ、シンプルサイズを準備する
◯やりたいこと
WROOM-02を利用した水分計を作るにあたり、100ミル(2.54mm)x11幅のWROOMモジュールでは横幅が広く出来上がりがどうしても大きくなるため、アマゾンで売っていた900ミル幅のコンパクトサイズのピッチ変換ボードとスイッチサイエンスさんで売っている出力8ピンのシンプルサイズの変換ボードを利用した小型版のWROOM-02モジュールを作成してみて小型化の検討をする。
◯やったこと
・部品の準備
まずはアマゾンで900ミル幅のコンパクトサイズピッチ変換ボードを調達。
5枚1組1,000円で売っていた物です。
これに秋月電子で売っているWROOM-02モジュールを組み合わせて
900ミル幅のモジュールを作成します。
ピン配置が1100ミル幅のモジュールと一緒なのでスケッチの書込み機はちょっとした配線の配置替えで利用が可能なのが便利です。
幅の小型化が5mm程可能になります。
続いてスイッチサイエンスさんで売っていたシンプルサイズのピッチ変換ボードとWROOM-02モジュールの組み合わせ。
こちらは出力ピンがESP-01と同じ8ピンに集約されており、出力端子は4x2列ではなく8x1列でデザインされたもの。大きさ的にかなり小さくすることができます。GPIO0,2以外のプルアップ、プルダウンは基板上で実施できるため外付け部品点数が減るのも魅力的です。ESP-01で言えばSタイプと言ったところでしょうか。これらをはんだ付けしてモジュールを作成します。
・製作
製作と言っても基板にモジュールをはんだ付けするだけですので簡単です。
ピン数が多いので2ヶ所仮付けをして位置合わせをした後
ずらずらとはんだ付けしていきます。後からの修正はかなり困難になりますので最初の位置決め・浮き直しは結構慎重にやってます。
モジュール取付後はヘッダピンを取り付け。
シンプルサイズのモジュールも同様に作成すれば小型モジュール達が完成。WROOM-02シリーズ各サイズのそろい踏みです。
◯やってみて
900ミル幅のモジュールは5穴タイプのブレッドボードで外側に1穴確保できるのがいいですね。
ブレッドボード上の部品配置の自由度が俄然上がります。
シンプルサイズのモジュールはミニブレッドでも利用できそうなのがいい感じ。
ユニバーサルに組んでも随分と小型化できそうです。
◯さっそく
前回ESP-01で実験した回路をさっそくこのWROOOM-02モジュールを利用した回路に組み替え、シリアル通信出力していたデータをWiFi 出力にする実験を開始します。また前回はADC出力をバッファを通して接続していましたが、MC3425の出力ドライブ能力が10mAあるようでしたので直接ドライブ出来るかも実験してみます。
WROOM-02で静電容量式水分計を作る (2)動作確認編
◯やりたいこと
前回防水処理した静電容量式水分センサーを使い、土中水分量を定期的に測定する測定器を作る。
データはWiFi(WROOM-02)で送信し電池稼働とする。
◯やったこと
・回路設計
プローブ側の回路図は前回の記事に載せてあります。プローブの出力はダイオードで整流後、平滑コンデンサの端子電圧をそのまま出力しているアナログな値ですので不必要に引き回すと測定値が変わってしまいそう。そこでプローブのすぐ近くでAD(Analog-to-Digital)変換を行い、WROOM-02迄はI2Cでデータを送る回路を検討します。
当初はAD変換をATtiny85で検討したのですが、ICの大きさやスケッチ作成の手間を考えた結果 AD変換→I2C送信をワンチップで出来る MCP3425を使い、 PCA9306をI2Cバッファとして使う回路で落ちつきました。
どちらも秋月さんでDIP化キットとして売っているものです。これらをプローブの周りに組み上げ、電源とI2C線を4芯のシールドケーブルでWROOM-02まで引っ張る計画です。
以上の点を考慮して出来た回路図がこれ。
回路と言っても2つのICを繋いだだけの簡単な回路図ですけど…。
プローブ内の回路は3Vで動作しておりダイオードの電圧降下を考えると出力電圧は2V程度、MCP3425の基準電圧2.048Vとちょうどマッチングしそうでしたので分圧はせず直接ADCに入力しています。I2Cに変換後は4芯のケーブルで離れた場所にあるWROOM-02に接続します。
・製作
上記回路をさっそくブレッドボードに組んでみました。
2つのチップ接続は特に問題はありません。出力されたI2Cデータは最終的にWroom02でWiFi転送する事になりますので、実験中に作成したスケッチを変更しなくて済むようESP8266のソフトウエア I2Cで一旦受けます。受けた結果はハードウエアシリアルで後段に出力する形で実験を進めます。
・動作試験
まずは簡単なスケッチを作成して動作を確認してみます。測定結果は我が家のえだまめ(ラズパイネットワーク)群を利用して前回作ったWiFiマイクロターミナルに表示させます。ただ今回利用するスケッチは我が家のえだまめネットワーク専用のものになってしまうので、実験終了後一般化したものを後で掲載する事にします。
ADCをゲイン 1倍、ビットレート 16Bit、変化モード ワンショット測定でセットアップするスケッチを ESP8266に書込み、いまだケースに入れてもらっていない電流計付電源を接続した後
WiFiマイクロターミナルに表示されるのを待ちます。
ドキドキ。
しばらく待つと…
お〜、無事データが転送されてきました。5秒おきにデータを送ってくる設定です。測定端子は現状オープン、オープン時の電圧は 0Vの様です。試しにADC入力端子を手で触ってみると電圧が微妙に変化します。どうやらうまく動作している様です。
続いて実際にプローブを接続。
乾燥状態での出力電圧は
2V前後。設計通りな値が出ています。順調、順調。
続いてティッシュでくるんで湿潤状態を作りその際の電圧を計ってみると
半分ほどへ変化。どうやら無事動作しているようです。
ただ現状は空中配線の動作実験段階ですので測定出力もバリバリ不安定。シビアな電圧測定はケース化して部品をしっかり固定した後追い込んでいく予定です。
◯やってみて
基本的な動作確認が取れましたので次は
・ケース化
・Wroom02でWiFi化を行い定時データ送信用のスケッチを開発
を順次おこなっていく予定です。
プローブ部分を如何に小さくするか頭を悩ませてます。
静電容量式水分計プローブの防水化
アマゾンで5個1,000円で売ってる静電容量式の水分計プローブを買ってみました。
タイマー555で方形波を発信させたあと、プローブをキャパシタとしたローパスフィルタを通してDAC(D,R,C)で電圧変換するという超アナログ回路な製品です。プローブ部分の水分量による静電容量の変化でLPFの定数を変え変化を検出しています。
鉢植えの土などに挿して土中水分量を測る事などが目的なのですが、水の中に入れるのにいかんせん防水対策が取られていません。そこで即席で防水対策を取ることにしました。
まずは3PのXHコネクタを外し、
防水しやすい様フラットケーブルでの引き出しに変更します。
そして準備するのはこれ。
熱収縮チューブに電子部品固定用のシリコンゴム。
シリコンを部品面にたっぷり盛ったあと
熱収縮チューブを被せて
ドライヤーで熱を加えると完成。
フラットケーブルの取り出し口にもしっかりシリコンを詰めておきます。
あとはしばらく放置しとけば無事完成。
シリコンが固まったらWiFiでデータを送る水分計を作る予定です。
ESP8266(WROOM-02) で WiFiマイクロターミナルを作る その(4) 日本語フォント表示
◯やりたいこと
その(3)で準備した漢字フォントを実際に表示してみる
◯やったこと
漢字フォントのフラッシュメモリへのアップロードや表示ライブラリのインストールはその(3)で終了していますので、今回は実際にそのフォントをOLEDに表示してみます。
作ってみたスケッチは以下の通り。
// Standerd Library #include <Arduino.h> #include <Wire.h> // Include Library /* OLED (SSD1306) */ #include <Adafruit_SSD1306.h> #include <espfonts.h> // Global Value /* I2C */ #define I2C_SDA 2 // D2 #define I2C_SCK 0 // D0 #define I2C_CLK 50000 // fSCL=50KHz /* OLED */ #define OLED_ADR 0x3C // I2C ADDRESS #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height,in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); /* ESP FONT */ extern espfonts ESPfonts; ///// ハードウエア 初期設定 void setup() { // I2C 初期化 Wire.begin (I2C_SDA, I2C_SCK); Wire.setClock(I2C_CLK); // OLED(SSD1306) 初期化 display.begin(SSD1306_SWITCHCAPVCC, OLED_ADR); display.clearDisplay(); // ESP FONT 初期化 ESPfonts.init(); ESPfonts.open(); // 漢字描画 String msg; msg = "0Aa東京都"; // 8x8 ESP_print( 0, 0,0,"漢字ターミナル"); // 10x10 ESP_print(64, 0,1,msg); // 12x12 ESP_print( 0, 9,2,msg); // 14x14 ESP_print(64, 9,3,msg); msg = "0A東京"; // 16x16 ESP_print( 0,22,4,msg); // 20x20 ESP_print(64,22,5,msg); msg = "0Aa東京都"; // 24x24 ESP_print( 0,40,6,msg); display.display(); } void loop() { } // void ESP_print(uint8_t x, uint8_t y, uint8_t fnt, String str) { // 漢字フォント表示 if (fnt>=0 && fnt<=6) { // String->char変換 int str_len = str.length() + 1; char msg[str_len]; str.toCharArray(msg, str_len); // フォント指定 ESPfonts.setFontSizeAsIndex(fnt); uint8_t fontB[ESPfonts.getLength()]; // 文字列表示 char *ptr = msg; while(*ptr) { // フォントパターン取得 ptr = ESPfonts.getFontData(fontB, ptr); if (!ptr) break; // フォントサイズ取得 uint8_t fontW = ESPfonts.getWidth(); uint8_t fontH = ESPfonts.getHeight(); // 改行チェック(スクロールなし) if (x+fontW >= SCREEN_WIDTH) { x=0; y+=fontH; } // フォント描画 display.drawBitmap(x,y,fontB,fontW,fontH,WHITE); x+=fontW; } } }
ESP_print()と言う関数を作って7つの各フォントを半角文字と一緒に表示させてみました。
x座標(0-127)、y座標(0-63)、利用フォント(0-6)、文字列(string)を指定して呼び出すとドット座標(x、y)を左上角とした位置に指定されたフォントで文字列を表示します。
Tamakichiさんのライブラリはとてもよく出来ていて、びっくりするほど簡単に漢字フォントを表示することができました。半角全角もライブラリ側で判断してフォントを選んでくれますし、7種類のフォントを自由に選べる点もすごい。ホント感謝です。
◯やってみて
これでWiFiコンソールを漢字化するノウハウが手に入りましたのでさっそくその(1)、(2)で作成したコンソールの漢字化に着手していきます。
ESP8266(WROOM-02) で WiFiマイクロターミナルを作る その(3) 日本語フォント対応
◯やりたいこと
その(1)、(2)で作成したコンソールを漢字表示対応にしたい。
フォントデータはWROOM-02が持っている4MBのフラッシュメモリ(SPIFFS・FS)に格納し、極力ハードウエアの追加なしで進める。
◯やったこと
1.前例検索
初めてトライする項目も多数ありここはもう先輩諸氏のお力を拝借。検索したところ素晴らしいページを発見。
GitHub - Tamakichi/ESP8266-KanjiFont-Library-SPIFFS: ESP8266用漢字フォントライブラリ SPIFFS版
特徴として
・フォントデータを全て内蔵フラッシュメモリに格納
・7種類のフォントに対応
美咲フォント(8x8),ナガ10(10x10),東雲フォント(12x12,14x14,16x16),Kappa20(20x20),X11R6フォント(24x24)
・それぞれの半角フォントにも対応
すごい!やりたいことにピッタリな内容です。(Tamakichiさんに感謝)
さっそく参考にさせていただきノウハウ取得に挑戦です。
2.フラッシュメモリ(SPIFFS・FS)へのデータ転送手段の取得
ページの説明によるとファイル上のデータをESP8266へ転送するツールがあるとの事。
File System · ESP8266 Arduino Core
英語のページでしたのでGoogle翻訳とタッグを組みながら試行錯誤を開始。以下は私がやってみてうまくいった手順を書いておきます。
2-1.ツールのダウンロード
リンクが張ってあったページからツールをダウンロードし記載の通りにインストールを進めたのですがどうもうまくいきません。改めて気合を入れて翻訳を進めたところ、どうもIDEとアップロードツールのバージョンに関係があるらしいとの事。そこでアップロードツールの最新バージョンを検索して見つけたページ、
Releases · esp8266/arduino-esp8266fs-plugin · GitHub
ここの ESP8266FS-0.5.0.zip をダウンロードして使用しました。
解凍すると
ESP8266FS/tool/esp8266fs.jar
と言うフォルダ構成のファイルが一つゲットできます。
2-2.IDEへアップロードツールを登録する
次にIDEへダウンロードしたツールを登録します。方法は簡単で、IDEがスケッチを格納しているフォルダ内の tools フォルダに、解凍してできた ESP8266FS フォルダを丸ごとコピーするだけです。toolsフォルダがない場合はフォルダを作成してそこへコピーします。コピーすると一般的に
(home_dir)/Arduino/tools/ESP8266FS/tool/esp8266fs.jar
という形で実行ファイルが格納されることになります。
うまくいったかを確認するには、IDEを再起動して「ツール」を開いた時に ESP8266 Sktch Data Upload という項目が追加になっていれば成功です。
3.IDEへ漢字フォントライブラリをインストールする
Tamakichiさんのページ から一括ダウンロードして得られる ESP8266-KanjiFont-Library-SPIFFS-master.zip ファイルを解凍し、以下のファイル・フォルダを展開します。
この中の libraryフォルダ内にある espfontsフォルダを IDE の「librarys」フォルダにコピーすればライブラリのインストールは完了です。
(home_dir)/Arduino/librarys/espfonts/以下たくさん
4.日本語フォントデータをWROOM-02のフラッシュメモリに転送する
4-1.IDEで新規ファイルを起動する
アップロードツールは「現在開いているスケッチ」が保存されているフォルダ内の「data」フォルダにあるデータをアップロードします。そのため dataフォルダを新しく作ってそこへフォントデータを入れる事になるのですが、開いているスケッチに無関係なフォルダを作る事になりますので変更しても問題のないスケッチを利用した方が無難です。そこでIDEの「新規ファイル」でおニュースケッチを開きそれを利用します。おニュースケッチはセーブしない限り windowsのテンポラリーフォルダにありますので、利用後セーブせずに終了すればデータごと消えてくれるので後処理も簡単です。
4-2.フォントデータのコピー
IDEで「スケッチ」「スケッチのフォルダを開く」から今開いているスケッチが格納されているフォルダを開きます。そこに新しく「data」フォルダを作成し、3で解凍した「fontbin」内にある「FONT.BIN」をコピーします。
4-3.フォントデータのアップロード
ここまで準備できれば残りはワンクリックのみ。「ツール」「ESP8266 Sktch Data Upload」をクリックすればアップロードが始まります。
librarys
少々時間がかかりますが100%書込み終了になればフラッシュメモリへのフォントデータ転送が完了です。
長くなりましたので動作試験はその(4)で。
ESP8266(WROOM-02) で WiFiマイクロターミナルを作る その(2)
◯やったこと
・製作
製作に向けて部品を準備します。
WiFi運用を行うため、CPUモジュールは技適を取得しているWROOM-02を使います。
秋月電子からの購入品です。WROOMはI/O端子が多いのはいいのですがちょっとした小さな実験には大きすぎて少し不便な所があります。ましてWROOM32になるとさらに巨大化。技適を取ったESP-01サイズがあると超便利なのですが無い物ねだり。ESP-01を自由に使える海外のユーザーはいいなぁとよだれ垂らしてます。
組み上げるユニバーサルボードはこのケース用の秋月電子製タイプCボード。
その他の部品も準備して
フロント部品との取り合いをチェックしながら配置を決め
製作。
ちなみに裏面。
ディスクリートで組む部分は赤外線LEDのドライブ回路だけですので非常にすっきりした配線です。ちょっとした改造も考えているためまだランドの全てを半田付けしていません。
これをケースに入れ
フロントカバーとの取り合いをチェックしながら
組み上げます。
・動作チェック
組み上がったところで早速動作試験に入ります。
起動表示の後無操作時間10秒で時刻表示モードに入ります。
ここで我が家で走っているラズパイをメインとしたネットワークからコマンドを送信してみます。家のあちこちにあるラズパイ達はそれぞれに割り当てられた機能を実行するためコマンド待ちをしているのですが、今回のマイクロターミナルはこれらラズパイのネットワークに参加して情報を表示する担当を担ってもらいます。
1番目のRGB-LEDを緑に点灯させるコマンドを送ってみると
無事緑色が点灯します。
やり〜。
文字表示コマンドを送信すると
文字がきちんと表示されます。
順調、順調。
赤外線コマンドを送ってテレビや照明のオンオフも無事できましたし、SWに割り当てた赤外線コマンドでのオンオフも無事動作確認です。
◯やってみて
実験と称してハダカボードをテープで貼り付けて運用していた赤外線コマンドですが、
家族の中では格好悪いとえらい不評。今回のターミナルができたおかげでこの辺の苦情ほ多少減るかもしれません。またラズパイ達の状態表示機としても活躍してくれることも期待大。見やすいところに設置していろいろとやってみようと考えてます。
ESP8266(WROOM-02) で WiFiマイクロターミナルを作る その(1)
◯やりたいこと
WiFi接続のTCPサーバを立ち上げてコマンドを受付け、受付けたデータを表示する極小ターミナルを作成します。要はWiFi接続型の携帯コンソール作成です。出力としてOLED(SSD1306 21文字x8行)、RGB-LED(WS2812 8色)x3、赤外線LEDx1、入力としてSW(トグル)x3を持ち、電源入力はUSB microB、一時的に持ち歩きできるよう小容量のLiPo電池も持たせます。
またWiFiでの運用を行いますので、CPUモジュールは実験で使ってきたESP-01から技適を取得しているWROOM-02に切り替えます。
今回はその(1)として外観計画と回路設計、それに基づいてブレッドボードの実験機を作成し実際に動かすまでをやってみます。その(1)はハードウエアの紹介のみでスケッチの内容はその(3)くらいで紹介したいと思います。
・外観計画
全体的な完成イメージはこんな感じ。
秋月電子製プラスチックケースを利用します。
コンソール出力用のOLED、RGB-LED、赤外線LEDと入力用のタクトスイッチをフロントに配置。USB入力は下部に配置します。
OLEDが露出なのは仕様です。ケース加工簡略化のためピンソケットのみを外部に引き出した結果です。(=手抜き)
部品配置はこのケース用のユニバーサルボードにこんな感じで配置。
これはフロントバックの実際です。
・回路設計
OLEDやRGB-LEDのコントロールは今までの実験で得たノウハウを利用できます。赤外線に関してはミニブレッドボード上に実験回路を組み、SW入力によるミニリモコンを作って動作確認しながらノウハウを取得。
その結果出来上がった回路がこれ。
大まかに電源、ESP8266、外部入出力の3つがありますが、ESP8266の能力が高いため外付け回路は赤外線LEDのドライブMOSFETのみ。かなり簡単に作ることができます。
・実験機作成
回路図に基づいてスケッチ開発用に実験機をブレッドボード上に作成します。
配線状況は以下の通り。
・配線、単純部品配置
・UART、3端子レギュレータ配置
・OLED配置
・完成
実験機にはスケッチ開発時のデバッグ用にUARTを取り付けESP8266のハードウエアシリアルと接続してあります。5v電源もUARTから供給しています。
◯やってみて
実験機での動作試験は無事成功です。
WiFiで受付けたコマンドによるメッセージの表示、RGB-LED、赤外線LED(室内灯やテレビのON/OFF等)の制御や、SWによるミニリモコン機能、
無入力時の時刻表示等、
いろいろな機能の実験ができました。バッチリ成功です。
これをもとに次回はこの回路をユニバーサル基盤上に組み上げケースに収納していきます。
ESP8266 + NEO-6M でGPS受信器を作る
◯やりたいこと
GPSモジュールを使ってOLEDを表示器にしたGPS受信器を作ってみる。GPSモジュールとの通信はUART、OLEDとの通信はI2Cとなるので、2つの異なった通信の同時利用に関するノウハウを得たい。
◯やったこと
最初はATtinyで簡単にできないかなと考えたのですが、SoftwareSerial(UART)とWire(I2C)ライブラリの同時起動が可能かどうかの不安があったのと、そもそもGPSモジュールをいじった事がなかったのでデバック作業が複雑化してしまう事を懸念して、ハードウェアシリアルを持つESP8266(今回はESP01)を使って実験して見る事にしました。
・回路設計
回路自体は簡単です。ESPのUARTにGPSを、I2CにOLEDを接続するだけです。UARTはESP01の場合 TX - D1, RX - D3に指定されていますし、I2CはWireライブラリ指定時に任意のピンを割り当てれば大丈夫です。今回は配線の都合で SDA - D2, SCK - D0の組み合わせにしています。
またPCとの通信用と電源供給を兼ねてUSB-UART変換モジュールも組み込みます。秋月電子で購入した超小型のモジュールを使用しています。
・製作
さっそくミニブレッドボードに作ってみました。
はみ出し、アンバランスはご勘弁。あくまで動作ノウハウ取得用の実験機の製作です。
GPSモジュールはケース化した時の設置方法が決まっていないためスルーホール用のジャンパ線を利用して取り付けます。
ショート防止用のセロテープはご愛嬌。
それぞれ接続して受信器が完成です。
・スケッチ作成
すったもんだしながら自分なりにスケッチを作ってみました。
動作には Adafruit_SSD1306.h と TinyGPS++.h の2つのモジュールのインストールが必要です。
// Standerd Library #include <Arduino.h> #include <Wire.h> #include <time.h> // Installed library /* OLED (SSD1306) */ #include <Adafruit_SSD1306.h> /* GPS (NEO-6M) */ #include <TinyGPS++.h> // http://arduiniana.org/libraries/tinygpsplus/ // Unique Value /* UART */ #define TX 1 // D1 #define RX 3 // D3 HardwareSerial hs(0); // UART 0 /* I2C */ #define I2C_SDA 2 // D2 #define I2C_SCK 0 // D0 #define I2C_CLK 50000 // fSCL=100KHz /* OLED */ #define OLED_ADR 0x3C // I2C ADDRESS #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); /* GPS */ TinyGPSPlus gps; void setup() { // シリアル設定 hs.begin(9600); // I2C設定 Wire.begin (I2C_SDA, I2C_SCK); // set I2C pins, default clock is 100kHz Wire.setClock(I2C_CLK); // set I2C clock(fSCL) // OLED(SSD1306) 開始 display.begin(SSD1306_SWITCHCAPVCC, OLED_ADR); // OLED画面初期表示 display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor( 0, 0); display.println("SSD1306"); display.setTextSize(1); display.setCursor( 0, 19); display.println("OLED Start."); display.display(); } void loop() { // 初期設定 char t[17]; String s; // 受信データ表示 if(get_nmea()) { // 表示初期化 display.clearDisplay(); // 日付,時刻表示 display.setTextSize(1); display.setCursor( 0, 4); sprintf(t,"%04d/%02d/%02d %02d:%02d%:02d", gps.date.year(), gps.date.month(), gps.date.day(), (gps.time.hour()+9)%24,gps.time.minute(),gps.time.second()); display.println(t); // GPS詳細データ表示 display.setTextSize(1); display.setCursor( 0, 16); s = "Lat: "+String(gps.location.lat(),6); display.println(s); s = "Lng: "+String(gps.location.lng(),6); display.println(s); s = "Spd: "+String(gps.speed.kmph(),0)+" km/h"; display.println(s); s = "Alt: "+String(gps.altitude.meters(),0)+" m"; display.println(s); display.println(); s = "Satellite "+String(gps.satellites.value()); display.println(s); } // データ未受信 else { display.fillRect( 0, 0,128, 16,BLACK); display.setTextSize(2); display.setCursor( 0, 0); display.print("No DATA"); } display.display(); } // GPSデータ受信 boolean get_nmea() { boolean flg_nmea = false; for (unsigned long start = millis(); millis() - start < 1000;) { while (hs.available()) { if (gps.encode(hs.read())) flg_nmea = true;; } } return flg_nmea; }
当初GPSモジュールとESPのUART通信がうまくいかず結構はまりましたが、UARTをHardwareSerialの0番としてガッチリ指定して使用したところうまく通信してくれました。通常使いのSerial.read()ではうまくいかないようです。
その他の部分はそれ程問題なく動作してくれました。
・動作
出来上がったところでさっそく電源を入れてみます。
無事動作。写真はスタート時点でまだGPS情報が受信できていませんが時間情報は受信しているようです。しばらく置いておくと衛星情報を受信し始め、モジュールのLEDが点滅を始めると座標データが表示されます。
モジュールからの出力はPC用のUARTモジュールにも接続しているので、PCでも専用ソフトでの表示が可能です。
◯やってみて
とりあえず第一段階の目的、動作ノウハウ取得は完了です。ESP8266で動作確認が取れましたので、wroomを使ったSDカードへの座標ロギングやWiFiでのデータ交換等いろいろ拡張していきたいと思います。いたずらでATtiny85でもできないかやってみるつもりです。
ATTiny85とINA219モジュールで電流計を作ってみた
◯やりたいこと
ATtiny85を使ってロガー機能やWiFi機能のない単純なデジタル電流計を作る。
◯やったこと
・回路図
例によって先輩諸氏の事例を画像検索し、気になった画像をチョイス。ページが外国語だったらgoogle翻訳におんぶにだっこでガッチリお世話になりながら参考事例を探します。
今回たどり着いた記事はこれ。
その名も「ATtiny Power Meter」。
今回探していた内容そのものズバリです。(感謝)
・製作
記事を参考にしてさっそくブレッドボードに作ってみます。前回ESP8266で作ったものと配線はほとんど同じ。i2c信号線を少し変えるだけで製作が完了です。
・スケッチ
記事の内容にあるようにgithubに公開されているソースをダウンロードします。
GitHub - moononournation/ATtinyPowerMeter
zipファイルでダウンロードしたものを「ATtinyPowerMeter」というフォルダを作ってその中にファイル展開します。
「ATtinyPowerMeter.ino」をIDEで開きコンパイル。
OLEDやINA219のライブラリは同一フォルダ内に展開されており何の問題もなくコンパイルが終了しました。完成度が高いですね。
ちなみにコンパイルするにあたり「TinyWireM」というモジュールをインストールしておく必要があります。ATtiny用のワイヤライブラリ(I2Cマスター用)です。スレーブ用の「TinyWireS」というワイヤライブラリもありますので必要に応じてインストールしておくと便利です。
・動作試験
さっそく動作させてみます。前回同様まずはLED負荷から。
おー、一発動作、リアルタイムグラフもキチンと表示されます。
面積が積算電力ですね。
ミニゲームの使用電流も計測してみました。
キチンと動作しているようです。
自己消費電力測定モードでは4mA程度の消費でした。
意外と低消費です。
◯やってみて
今回はとても参考になる事例でした。INA219、OLED用のモジュールを読み込む事によりAT85での動作のさせ方の理解も進みます。次へのステップアップが進みそうです。公開してくださった方に改めて感謝です。
さっそくこれで携帯(Li電池)型の電流計付き電源を作ってみようと考えてました。
INA219とESP8266で電流計を作ってみた
◯やりたいこと
デジタルな電流計を作りたい。
◯やったこと
・設計
電流計付の電源という形で動作させます。測定データはI2C接続のOLEDに表示し、データロガーとしての機能はWiFiでのデータ転送を想定。そのためメインモジュールとしてWiFi付きESP8266を利用する事にしました。
・製作
手っ取り早く電流測定用のINA219というチップを利用したモジュールを購入。
シャント抵抗が組み込まれており、測定部分がワンタッチ。ピンヘッダも付いているので他に部品を準備する必要がありません。とても便利。
速攻でミニブレッド上に回路を組み立ててみます。
中華製モジュールのおかげで最近の電子工作はプラモデル感覚です。
・動作
電流計用のスケッチはIDEのスケッチ例そのままで問題なく動作しましたので、OLED回りのスケッチを追加してオリジナル電流計実験バージョンが完成。さっそくLEDをつないで動作させてみます。
おー、無事動作。
測定中に記録した電流値のmax,minも表示させてみました。
前に作成したATTiny85のミニゲーム機を測定してみたところ、
24.4mAをピークに20mA程度の電流が流れているのが分かります。
電子負荷でも動作を確認。
ブレッドボードなので大電流での電圧降下が大きいですが概ね電流値は一致しているようです。
◯やってみて
とりあえず第一段階終了。これで定常的な電流を監視するための手持ちグッズが一つ増えました。
今後は積算電力記録機能やデータをWiFiで転送する機能などを順次持たせたり、独立型電流計をATTinyで作れないか実験していこうと考えています。
◯その後
電源の接続を自己消費電力測定モードにして数時間走らせてみました。
max 216mA、min 70mA。
なるほどこういう情報も得られるんですね。
温湿度センサーを乾電池稼働から太陽電池+Li充電器(CN3065)稼働へ移行
◯やりたいこと
単三電池稼働させていた温湿度・照度センサーを太陽電池で充電するLiバッテリー稼働に切り替え、電池交換不用に必要なLi電池容量を求める。
◯やったこと
持ち運びしやすいように単三電池ボックスにBME280(温湿度・気圧)、BH1750(照度)を組込んで実験していたセンサー、
外気での稼働に向け、太陽電池+Li電池による給電方式で電池交換を不用にできるかどうかをあらたに実験して見る事にしました。乾電池でも2〜3ヶ月は普通に稼働してくれていたのですが、更なるメンテフリーに向けもうひと実験です。
やる事は簡単、アマゾンで売っていたPVチャージャーを買ってきて
aitendoで買ったLiPo電池を
つなげるだけです。
これをスマホスタンドにセットすれば即席メンテナンスフリー・電池交換不用センサーが完成。
今の世の中ってホント便利です。
◯やってみて
電池の持ちを測る実験のため結果が出るのは数ヶ月先になります。まずは稼働開始から。
今回利用したESP8266モジュールは小さくて端子数も少なく実験する上で何かと便利なのですが、使用するにあたりいろいろと制約がかかるため実験にはひと手間が必要です。実験がうまくいったら制約のないモジュールに乗り換えていく事になります。
・スタート後
測定機は10分おきにディープスリープから起動して測定データを送信してきます。送信データを見てみると測定は順調に開始されたようです。
(温湿度・気圧)
(照度)
・1日後
前日夕方の発電停止から今朝発電開始までの12時間は測定が継続されていました。晴天だった初日は110mAhのLiPo電池でも容量が足りたようです。
今回の組み合わせでは発電を開始する光量が200lux位にあるようで、今後発電能力に関しても順次実験してみる事にします。
(照度)
・3日後
左のグラフが日光下(ガラス2枚通過)のセンサーデータ、右が日陰でのセンサーデータ。
曇天や夜間で最大17時間未発電でもデータ欠落はありませんでした。電池容量は1日程度であればこの容量で大丈夫そうです。ただ晴天時は午前中の早いうちに満充電になってしまい2Wの太陽電池は電池容量に対し完全にオーバースペック。1.15Wでどうなるか交換して実験継続です。
・1週間後
データの欠落はありませんでした。110mAhの容量でも順調な様です。
1.15Wでも晴天時は午前中の早い段階で満充電になっているようですので、PVを更に小型化し300mWを接続してみます。
このPVは小型でも開放電圧が5Vあり、今回のモジュールにも使用できる便利なPVです。
I2Cの信号線のレベル変換をBSS138で組んでみる
◯やりたいこと
ESP8266から出力される3.3VのI2Cの信号線(SCL,SDA)を、MOSFET(BSS138)を使って5Vに変換してみる。
◯やったこと
・製作
秋月電子さんで販売しているロジックレベル変換モジュールを参考に、同じく秋月さんで売っているBSS138とDIP変換基板を使ってディスクリートで変換回路を組んでみました。
回路は変換モジュールの回路図を参考に以下のものを2回路作成します。
オリジナルとの違いはプルアップ抵抗を4.7KΩに変更している点です。
部品は秋月さんから調達。
これを前回作った電源基板にESP8266の回路と一緒に組んでみました。
変換基板にピンヘッダを取付け、8PのDIPソケットに差し込んで使用してます。
基板写真右下二つが3.3V系のI2Cgroveソケット、左側が5V系のGROVEソケットになります。GROVEソケットは2.54mmピッチ基板に脚を広げて無理くり取付してます。
・動作チェック
配線をチェックした後さっそくハンディオシロで動作を確認してみます。
3.3V(黄)がきちんと5V(青)に変換されてます。やりー。
拡大して遅延を見てみると
約30nS(プローブがワニグチなのでリンギングが大きいのはご勘弁)。思ったよりいいスピードです。これでしたら100KHzのI2Cは楽勝です。
◯やってみて
入出力実験用に使用しているRGB-LED,4-KEYブレッドボードですが、5V動作だとWS2811の規格内に入るためやはり動きが安定します。
まあ当然といえば当然なのですけど…。
アナログKEY入力もたまに隣のキーと間違って認識していたものが、電圧マージンが大きくなるせいかやはり安定動作してくれます。消費電力の点では不利なんでしょうが5VI2C、安心感という点ではいいかもしれません。
3.3Vの方はHUBを使って王道のBME280(温湿度、気圧)、LH1750(照度)、SSD1306(128x64lcd)のスケッチを開発。
こちらもしっかり安定動作中。
電源に加えてレベル変換もいい感じで動いています。
アマゾンで買った Li電池充電器 と DCDCコンバータ で5Vと3.3V電源を作る
◯やりたいこと
Li電池で組込用に5Vと3.3Vを作りたい。Li電池にはUSBから充電する。
◯やったこと
・回路図作成
オーソドックスに
USB→Li電池充電モジュール→Li 電池→5V昇圧モジュール→3.3Vレギュレータ
のパターンで組むことにしました。
・製作
アマゾンで10個まとめ売りしているTP4056を利用したリチウム電池充電モジュールと
0.9V-5V to 5V 600mAの昇圧コンバータモジュールから
USBコネクタを取り外して使います。
んでもって組んでみたのがこれ。
中華製モジュールの接続端子の配置はどうしてinchサイズになっていないのでしょう。中華製あるある、困ったもんです。どうしてもユニバーサル基板の穴に合わない部分は空中配線で逃げました。
配線を一通りチェックし終わったところで実際に電池とUSBをつないで動作試験。
充電モジュールLEDが青く点灯して放電中な事を示し、昇圧モジュールは動作中を示す赤のLEDが点灯しています。どうやらうまく動作しているようです。
電圧を計ってみると
きちんと出ています。一安心。
もちろん当初計画した電池単独での運用もできます。
◯出力試験
電源に電子負荷をつなげて出力試験をしてみます。
想定している使用電流は300mA。5V、3.3Vそれぞれで300mAの負荷をかけてみます。
ちょっと電圧降下が大きめでしょうか。GNDや+周りの配線をちょっとハンダ盛って太くしておきましょう。
◯やってみて
この電源を使いAT85とESP8266でi2c通信を利用したスケッチの開発を行う予定です。
アナログ入力を持つAT85を手足として5Vと3.3Vそれぞれで作ってみる予定です。