ラベル I2c の投稿を表示しています。 すべての投稿を表示
ラベル I2c の投稿を表示しています。 すべての投稿を表示

2016年2月8日月曜日

ESP-WROOM-02カスタム基板:ダストカウンター&OLED

出荷前連続稼働テスト(DSM501版)

■発端■

facebook友達のO先生が「PM2.5センサー欲しいけど高い」と書き込んでいて、私が「ポケットマネーで作れますぜ、しかもWiFi対応」とコメントしたところ、受注が決まりました。

話が早いw

■仕様確認■

当初は、倉橋屋謹製Board1をベースにしてユニバーサルボードかブレッドボードで、と考えていましたが、「持ち運ぶので丈夫かつコンパクトに」とのことで基板を起こすことになりました。
  • MCU:ESP-WROOM-02
  • 表示器:電子工作のお友達「0.96インチ OLED」
  • ダストセンサー:神栄テクノロジー製のPPD 42NJ
  • 電源:5vをモバイルバッテリなどから。USBコネクタは使わず変換ケーブル使用
  • 3ミリのネジ穴を4つ
  • センサー / OLEDはボードに乗せない。
  • センサー / OLEDとの接続は逆差し防止の爪付きコネクタ

コネクタの名前がわからなくて、某電子工作コミュニティに質問したら、みなさん教えてくださって、なかには「近くにいるから寄った」と写真まで取ってきてくださった方も。ありがとうございました。いつかコミュニティにお返しができれば良いのですが。

■設計■

Board1 Ver 0.3をベースにがっつりコネクタなどを配置。PPD 42NJについては5v電源・5v出力なので、抵抗で分圧してからESPに入力。

ほとんどauto route



はい、絵画的センス皆無ですorz

■検証■

Board1 Ver.0.0を使い、ブレッドボードでセンサーとディスプレイの動作を確認しました。ここまでだいたい48時間ほど。ホント、話が早いのは良いことです。


■基板発注〜納品■

例によって、最初の設計が出来てから2-3日寝かせます。今回ちょうど週末にかかっているのと他に3種類の基板が同時に設計出来上がったので、いいタイミングでした。

1/18....発注
1/26....深センから発送(EMS)
1/28....到着

DHLよりEMSの方が安くて早い。DHLは日本に着いてからが遅いんですよね。



で、週末の1/30、早朝からリフローです。2枚並行して作ろうと思ったのですが、もし設計にミスがあったら2枚分の部品がパーなので、1枚だけ作りました。なお、自分用にリフローする時は、ESPの端子には横一列にまとめてハンダペーストを置いてしまうのですが、今回は受託品なので丁寧に一個一個ランドに置いていきました。そしてホットプレートでリフローし、スルーホール部品をハンダ付けして完成。

とりあえずLチカを…と思ったのですが、LEDを取り付けたIO13にはダストセンサーをつなぐことになっているので、その替わりにTxラインに Serial.write("tarepanda");と送って、ランプが点灯することを確認しました。以前間違えてLEDと直列に10kΩの抵抗を入れたらホタルイカのようにササヤカな光が点ってそれはそれで味わいがありました。

今回は元の設計通り1kΩにしたのですが、明るいわぁ(笑)。あまりにも明るすぎるので納品版は2.2kΩにしました。それでも明るい。

■サンプルソース■

例によって難しいことはしていません。センサーからP1/P2の2本の信号線からパルスが出ていては、埃を検出した時間が長いほどP1/P2のLow時間が長くなるとのことです。P1は1.0μm、P2は2.5μmの埃を検出します。

よくあるサンプルだとArduinoのplusIn関数を使ってどちらかのパルスがLowな時間を計測し、それを30秒間合算しているという例が多いのですが、それだとP1/P2の両方を図ることができなくなってしまいます(どちらか一方のパルスに専有されてしまうので)。

なので、このサンプルでは、100μ秒ごとにポートを見に行き、LowかHighを判断し、Lowならカウンタを加算する、という単純な方法をとっています。60個の配列を用意し、各秒ごとに各配列の値を加算すれば、過去60秒間の各秒毎のLow時間を集計できますので、あとは全体を集計すれば過去60秒間の合計Lowを求めることができ、過去60秒間の移動平均も出すことができます。

追記(02/009):ソフトウェアについてもう少し詳しく書きました

あと、ESP-WROOM-02の作例では、set upで接続されるまで待って、それから処理を継続することが多いのですが、それだとWiFiとの接続ができない場所だとデモもできません。なので、とりあえずbeginで接続を試みたあとは、通常のloopの中で接続成功したか否かを見に行き、結果をOLEDに表示するようにしました。つながらなくてもとりあえず計測および表示を続けていて、つながったら1分ごとにThingSpeak.comへ送っています。



■公開情報■

githubにてeagleデータを公開準備中です。ソースとEagleのデータをひとまとめにして公開しようとしているのですが、ついでに自分の作業用ディレクトリも大整理しているところなので時間がかかってます。

■ビルド方法など■

長いことArduino / ESPを使っていると、いつの間にかいろいろなライブラリが充実しているのですが、「これが最初!」ということになると素直に走ってくれません。というわけで、ビルドに必要な方法を挙げて行きます。
  • USBシリアルのドライバをインストール
    • Windowsの場合は、お使いのUSBシリアルのドライバをインストールするだけ
    • MacOS Xの場合、10.8以降、ドライバに認証が必要になったため、ややこしくなってしまいました。
      • 大まかな手順としては、Appleの認証のないkextの使用を許可する、という設定をして、それからライブラリをインストールします。
      • 使用許可はセーフティモードで再起動した後、ターミナルから以下のコマンドを実行し、また再起動し、それからライブラリをインストールします。
      • 使用しているUSBシリアルがFTDIの場合はここからダウンロードします。
      • 最近多くなってきたCH340についてはここの一番下(らしいのですが読めないのでわかりません…)。
      • うまくいかない場合には、ご遠慮なくお問い合わせください。
  • Arduino IDE 1.6.5
    • とりあえず動作確認した環境は1.6.5です。
    • 公式ページからダウンロードしてインストールしてください。
  • OLEDライブラリ
    • 以下のgithubからzipをダウンロードします。
    • Arduino IDEを起動し、スケッチ>Include Library...>Add .ZIP Libraryで先ほどダウンロードしたOLEDライブラリを指定して読み込んでください。
  • Time.h
    • 時間を扱うためのライブラリに含まれます。
    • このページの「Download ZIP」をクリックしてダウンロードしたファイルを上記と同じ手順で読み込みます(スケッチ>Include Libraryうんぬん


■謝辞■

各ライブラリの作者の皆様、

そして、この基板の発注主であり記事として公開することを快く許してくださったO先生、

ありがとうございました。

■お問い合わせ■

ご購入や製品開発についてのご相談はこちらまでお気軽に。

ご参考までに今回のオーダーメイド完成品で1セット2万円以下です(完成品1個+未使用基板8枚、デモ用ソフトと送料)。

また、5台からElecrowにて量産可能です。その場合、今回のものなら外付け部品も全部そろえて10台5万円程度です。

オーダの流れ:
  • メールで「こんな機能が欲しい」とご相談ください。
  • 何度かのやりとりの後、構成案と費用をお知らせします。
  • PayPalにてお支払いください。
    • PayPalはショッピングプロテクションがあり、もし納品されない場合には返金されるので安心です。私もebayで何度かお世話になりました。
  • 試作、基板設計、基板発注、基板完成、実装…など各段階で進捗をお知らせします。
  • 宅配便にて完成品をお送りします。
  • Google+にてユーザサポートを承ります。
    • グループでのサポートは無償です
    • privateサポートについてはご相談ください。

□追記(2018年12月14日)□

経験値上昇の伴い、値上げしました。最低4万円からですm(_ _)m。

あと、お取引にはココナラハンドメイドを使いますので、契約時にクレジットカード等でココナラに対して支払っていただき、納品後に私に対して決済される形になります。

ご相談はこちらまで。お気軽にどぞ。

2015年12月23日水曜日

Energia最新版でI2Cが動かない



Energiaの最新版Energia 0101E0017(と一つ前のEnergia 0101E0016)では、MSP430G2553にてI2Cがうまく動いてくれません。

厳密に信号レベルで見たわけではないのですが、他のデバイスあるいはEnergia 0101E0015で動いていたライブラリ等が動作しません。

回避方法は、とりあえずEnergia 0101E0015に戻せば動きます。はい。

・・・これで休日の貴重な2時間を潰してしまったじゃないかorz

I2C of MSP430G2553 is not working on Energia 0101E0016 and 0101E0017. if you got same problem, please install Energia 0101E0015.

2015年9月23日水曜日

まさにボトルネック

ADCとD級アンプの間の分圧抵抗をどこに入れよう…w

信号処理もどきを作ったのに、ADCがないので音を出して結果を確かめることができません。部品ぐらい買いに行けばいいんですが、膝を壊していて連休中はあまりでかけないで休むというコンセプトを忠実に守っているため、秋月にいや秋葉原にいけません。

せっかくMSP432P401Rで補聴器の着手できるめどが立ったのに…と思いつつ部品沼を整理していたら、一個だけMCP4725/DCコンバータが出てきました! 在庫リストにも記載されていないので、思いつきで買ってそのまま忘れていたのでしょうw

ということで、出力側の部品が揃いました。

秋月秋月秋月

ということで、まず今まで使ったことのないMCP4725を使ってみます。癖のないI2C仕様で割とすんなりつながった…のですが、何だか動作が不安定です。I2CのSDA線にオシロをつなぐとフリーズしてしまいます。基板裏のプルアップ用ジャンパは問題ないですし、オシロの入力インピーダンスはかなり高いので何か影響を及ぼすとは考えにくいのですが…ともかく、フリーズしていないことをLチカで確認することにして、だましだまし動かしてみます。

そして次に素の状態でMCP4725にどのぐらいの速度でデータを流してみようとして問題発覚。Energia/MSP432はI2Cの速度を切り替えられない。Arduinoだとライブラリのヘッダをちょっと書き換えれば400Khzまでは動くんですが、同じような箇所がMSP432版のドライバライブラリなどには見つかりません。i2c.cなんてソースに

    ASSERT(
            (EUSCI_B_I2C_SET_DATA_RATE_400KBPS == config->dataRate)
            || (EUSCI_B_I2C_SET_DATA_RATE_100KBPS == config->dataRate));

という記述はあるのですが、これを呼び出している側が見つからず、configもdefineも見つからず…。

しかたがないので、100khzで動かしてみましたが、1ワードの送信に3バイト必要+様々なオーバーヘッドで、毎秒約4000回≒2khzがやっと、という有様です。電話を遙かに下回り糸電話レベルの帯域orz

うーん、せめてI2cが400kで動けば16khzで出力できるので帯域は十分なのですが。

Energiaなんかで楽していないで、CMSIS使えってことですかね…ああ面倒くさい…。まぁ電子工作再開したばかりこのにLPC810にI2Cで液晶つないだりしてたので、できないわけじゃないんですけども…API調べたりするのが唯々面倒。