ラベル ESP-WROOM-02 の投稿を表示しています。 すべての投稿を表示
ラベル ESP-WROOM-02 の投稿を表示しています。 すべての投稿を表示

2017年12月31日日曜日

クラウドファウンディングのハードウェア担当でした


股間のパッドを叩くと「チーン!」と音がするというシンプルな楽器Banggosのハードウェアを担当しました。

■発端■

発案者のFさんからWantedly経由でハードウェアを製作して欲しいと連絡がありました。SwitchScienceで発売しているハードウェアをご覧になったとのこと。面白そうなので担当させていただくことになりました。Chatのやりとりでこんなことが決まりました。
  • 担当するのはハードウェアのみ
  • ESP-WROOM-02を使う
  • WiFiで飛ばしてスマフォから音を出す
  • 衝撃スイッチを用いるバージョン
  • 導電布タッチセンサーを使うバージョン
  • 電源は単三電池3本(外国では単四を入手しにくいため)
    ※その後、海外対応が不要になったため単4電池2本に変更

※現在倉橋浩一はWantedlyは使用していません。
 ご連絡くださる場合には、facebook, LinkedInなどでお願いいたします。

■検討:衝撃スイッチ■

衝撃スイッチを搭載した基板を設計して、Elecrowに発注、自分で実装して試してみました。音楽センス皆無の私からすると叩いてすぐに反応しているように見えたのですが、発案者で音楽家のFさんには「遅延が大きすぎる」との評価。

スイッチを交換したバージョンを何種類か作ってみたものの、状況は変わりませんでした。

■検討:導電布■

ご存じのように多くのマイコンのGPIOは静電容量を用いてタッチセンサーとして用いることができます。まず、支給された高価な導電布を用いてESPに実装してみましたが、感度の調整が難しく、感度を上げると手を近づけただけで反応するなど思わしくありません。導電布ではなく導線・銅板などを使うと意図した通りに反応するので、導電布の導電性が思ったより低いのが原因のようでした。

また、動作が不安定なので、AT42QTシリーズなどの専用チップを用いてみました。これは電源投入時・リセット時に自動的にチューニングをしてくれるというものです。これも銅線ではうまくいきますが、導電布では難しい状態です。

導電布に変わるものを探したところ、Switch Scienceから「EaoTex感圧導電布」が発売され、試してみました。圧力で抵抗値が変わるモノなので、当初は抵抗値で作動させようと思って入手したのですが、これをAT42QTを組み合わせたところ、ほぼ理想的な特性が得られました。価格も前記導電布の1/10程度で非常に安く、耐久性もありそうです。

ただ、着衣状態でのタッチセンサー動作はやはり不安定で、安定させると反応が遅くなってしまう傾向があり、ドラムという打楽器には難しいのではないかと判断しました。

■検討:加速度■

加速度センサーについては当初も案があったのですが、踊りながら叩くというような状況で叩く衝撃と踊る衝撃を区別するには演算が必要で、そうすると遅れが出る……ということで没にしていました。

が、改めて使ってみたところ、叩く衝撃と踊る衝撃は方向が異なるので、ごく単純な演算処理だけで検出できるということがわかりました。Fさんの評価でも遅延はなく、加速度センサー使用によるコストアップは導電布を使わないことで吸収できるとわかり、最終的に決定しました。

また、音の出しやすさなどからCPUについてはESP-WROOM-32とし、内蔵DACからヘッドフォン端子に音を出しつつWiFiで飛ばす。電源については昇降圧DC/DCコンバータを用いて電池2本で駆動する、ということになりました。これならエネループでも新品のアルカリ乾電池でも安定して動作させられます。

■試作:失敗!■

設計した基板をpcbgogoに発注して自分で実装したところ、1発で動作しました。ステンシル無し+ホットプレートリフローでQFNを搭載したボードが一発で動くなんて奇跡です(笑)。ということで、いつものElecrowに5枚の試作を依頼しました。

が、これは動作しませんでした。それは、今回使用した加速度センサのパッケージはQFN16(0.5mmピッチ)はElecrowのデザインルールを下回っていて、ピン間にレジストが回っておらず豪快にブリッジしていました。Eagle CADにElecrowの支給するデザインルールを用いてチェックし問題はなかったのですが、それとは別にWebに最低0.25mmと記載されていました。こちらで設計したQFNのレジスト太さは最低0.1mmでした。

さて、困りました。数個の試作、あるいは数十個単位の製作をElecrowほどの低価格で引き受けてくれるところはそう多くありません。

国内の業者のWebで自動見積をしたところ5個7万円弱、50個9万円弱と出ました。量産はまだしも、失敗する可能性のある試作が7万円というのは非常に痛いです。

探した結果、Seeed StudioのFusion PCBならば0.1mm精度のマスクにも対応可能とのこと。ただ、当然ながら単価は大幅に上がってしまいます。20個で約4万円。当初予定の約10倍です。部品代もESP-WROOM-02のタッチセンス版と比べると約2倍になってしまいました。プロダクトオーナーのFさんの了解を得て進めました。

■量産試作■

回路に問題ないことは確認できていたのでFusion PCB Aに発注。すべての部品は日本から送り、部品到着後2週間。設計意図通りに動作しました。
 
ESP32のI2SライブラリはデータをまとめてセットするAPIと1語ずつセットするAPIが用意されています。前者だと音データが終わるまで他の処理ができないので、今回は後者を使いました。音をだすためのスレッドを作り、その中でシグナルが来たら音を出し、もし途中で別のシグナルが来たらそっちに切り替える、という単純な方法です。

加速度センサーの処理は直近のデータの三軸合成値の移動平均を求め(重力加速度)、その値から大きく変化したら「叩かれた」と判断して音出しシグナルを出します。こうすることで、踊って姿勢が変わっても無駄に音が出ず、叩いた時だけ的確に判定できるようになりました。

■量産■

内部抵抗の大きくなった電池でも安定して動作するようにDC/DCの入力側のパスコンを大きくするなど細かい変更を行って、量産発注しました。発注から約3週間、先方に部品到着から約10日で受け取ることができました。



12月30日の夕方到着。12月31日に動作確認を行った後、基板に電池ボックスをハンダ付けし、プロダクトオーナーの元に送りました。

基板試作は何だかんだで7種類、PCB Aでも3種類作りました。工数は軽く100時間を越え、失敗作分などの持ち出し経費もだいぶ多かったのですが、得るものの多いプロジェクトでした。

冒頭にも記載しましたが、倉橋浩一個人としてこのような基板の設計・製作をお請けすることは可能です。Facebook, LinkedInなどからご連絡いただければ幸いです。

また、KickstarterおよびCampfireでの募集はすでに終了しておりますが、発案者のFさんに直接コンタクトとっていただければ対応可能とのことです。

■IGNICTION■

プロジェクトが進んでいる間に、iFaceなどを作っているHamee株式会社に転職することができました。勤務先のHamee株式会社ではプロダクト・インキュベーション・プロジェクト「IGNICTION(イグニクション)」を開始いたしました。ハードウェア設計・製作支援もご相談可能ですので、ご興味のある方のコンタクトお待ち申し上げております。

念のためですが、このブログ記載内容の一切の責任は倉橋浩一個人にあり、Hamee株式会社とは関係ありません。またBanggosもHamee株式会社とは無関係です。IGNICTIONについてもここでは制度の存在を告知するのみであり、その以上のものではありません。

2017年4月22日土曜日

Board1用拡張基板


■ESP-WROOM-02 Board1用基板■

先日pcbgogoに発注した基板です。
  • ESP-WROOM-02 Board1専用
  • DS1307+(RTC)装着可能(xtalパスコンは表面実装)
  • DCジャックまたは2ピンの端子から給電
  • 秋月の超小型USBシリアル変換モジュール用ソケット
    デバッグ中にUSBシリアルからの給電をカットできるジャンパー付き
  • ストロベリーリナックスの電流電圧電力モジュールを2個搭載可能
  • 電流・電圧測定切り替え用ソルダージャンパー付きコネクタ
  • 電流・電圧出力型センサ接続コネクタ2個
  • I2Cコネクタ2個
  • GPIOコネクタ2個
  • 8 x 9のスルーホールユニバーサル領域

という「何に使うのコレw」な仕様の基板です。電流出力形のセンサーを2個接続する必要があり、ユニバーサル基板を作るのが面倒なので基板を起こしてはんだ付けしました。

どうせ基板起こすなら直接INA226載せた方がいいんじゃない?とも思ったのですが、INA226のEagleライブラリが見つからなかったのでこういう形にしました。手間を省くために基板を起こしたのに基板設計で手間取っては本末転倒なので。

部品の取り付けはリフローの時間を含めて40分ぐらい。たくさんのピンヘッダをカットするだけで15分ぐらいかかったような気がする。まぁ基板設計と発注のやりとりで2時間かかっていますけども。

なお、組み上げた当初、I2Cが動かなくて焦りましたが、原因はプルアップ抵抗。今回使ったどのモジュールにもI2Cプルアップ抵抗がついていなかったのです。「どうせ外付けのI2Cモジュールでプルアップしてるから要らないよな」って付けていなかったんですが、Board1にはプルアップ用ソルダージャンパーがあるのでセーフです。

INA226 x 2個搭載というのはさすがにマニアックな仕様だと思いますが、拡張ボードって需要ありますかね? もしあれば、コメントいただければ幸いです。

【CM】
こういう基板なら 'ポケットマネーの費用感' で作ります。

倉橋屋 info@kurahashi-ya.com までご連絡ください。

ソフト開発もやってます(いかん、こっちが本業だった)。

2017年3月31日金曜日

ESP8266のanalogWrite、使用上の注意


ESP8266 / ESP-WROOM-02のanalogWriteでおかしな現象に遭遇しました。回避策も合わせてご紹介します。

■複数analogWrite同時出力でちらつく■

Power LEDをドライバに接続して「じわーっと明るくする」制御をしていたところ、「じわー」のところでちらつく現象が発生しました。調べてみると
  • analogWriteの値を1ch変えただけではちらつかない
  • 2ch以上同時に変えるとちらつく

ことがわかりました。ここにたどり着くまで大変でした……。OTA処理で時間を取られているんじゃないか、温度センサーの読み込みでひっかかるんじゃないか、もしかしてPower LEDドライバに問題があるんじゃないか……。「じわー」のプログラムに問題があるんじゃないか……。など。

以下切り分けのためのコードです。ご覧の通り、単純に値を整数で加算していくので、ちらつくはずないですが、激しくチラつきます。


ここで「もしかして、analogWriteをほぼ同時に複数書き換えると問題が生じるのではないか?」と思い至りました。以前、analogWriteのソースを調べたことがあったのですが、通常のカウンターとコンパレータではなく結構めんどうくさい割り込み処理を使って全部ソフトで処理されていましたので。書き換えの時に処理が追いつかない等でパルス幅が乱れるのだと思います。

で、書き換えたのがこちらです。


問題なく動作します。ESP8288 / ESP-WROOM-02のanalogWriteを複数同時に書き換えるときにはご注意ください。

■CM■

ここで使用しているPower LEDドライバ基板、スイッチサイエンスのESPrや弊社Board1をそのまま挿して、300mA x 3chのLEDを制御できます。オンボードの温度センサーを使って、基板の温度上昇を検知して出力を下げる、なんてこともできます。

どぞよろしく▶Cap1 - LED Drivers for ESP

2017年3月17日金曜日

ESPr / Board1用 Power LED Driver発売です


またヘンな基板を発売してしまいましたw

スイッチサイエンス社ESPr / 弊社Board1と重ねて使えるLEDドライバ基板です。LEDを300mAで定電流駆動します。スイッチング動作なので効率良いです。24VのACアダプタを使用する場合、Vf合計で19vまでのLEDを直列に接続できます。

3chあるのでパワーRGB LEDを接続してWiFi対応無段階照明コントローラとしてお使いください。

基板上のコネクタ穴はESPr / Board1に合わせてありますが、直接配線すればArduinoでも使えます。

ボード上には温度センサーSTTS751も載せてありますので、温度監視もできます。Vf合計値と電源電圧の差が大きいと発熱も大きくなるので気をつけてください。発熱といえば、省エネルギーというイメージとは裏腹にパワーLEDの発熱も凄いです。必ずしっかりした放熱器に取り付けて使用しましょう。300mA x RGBだと数十秒で燃えます(経験者語)。

なお、商品にはブロックターミナル、ESPr、Board1、ピンソケット、LED、ACアダプタ、ジャンパワイヤなどは附属しておりません。別途お買い求めください。

商品サポートページはこちらです。

2016年10月25日火曜日

ESP+Tilt & Panステージ+放射温度計


新しいESP基板が出来たので、以前作ったものを作り直してみました。上の写真は新しいモジュール、下が旧バージョンです。

旧バージョン
旧バージョンはTilt & Panステージの上にセンサーだけ載せていたのでESPとの間に配線が10本走っていたのですが、今度はESP基板もステージ上に置けるので外部からの配線は電池ボックスからの電源2本だけです。

なお、このPan&TiltはElecrowで$12で売ってます。同じお店の$11のものとどこが違うのかわかりません(笑)。

サーボの線をもっと短くすればよかった…

ステージとESP+センサーの固定、前作ではテグスでグラグラと縛っていただけでしたが、今度は3Mの「ツマミを引っ張ると簡単に剥がれる両面テープ」を使いました。コンクリートの壁などにも貼れる強力なテープですが、基板の下からハミ出ている白いベロを引っ張ると簡単に剥がれます。

iOSアプリは前回と同じ。iOSテザリングでESPと接続しています。データ転送はUDPです。


センサーはMXL90614、赤外線放射温度センサーです。今回使った基板はVin, Gnd, SCL, SDAの順で並んでいてESP基板の並びと合わないので、隣接するIO12とIO13から digitalWrite(12, Low); digitalWrite(13, HIGH); で電源供給しています。サーボはIO15, IO16です。



■CM■

ここで使用した新ESP-WROOM-02基板Board4、スイッチサイエンス社から発売中です。

なお、Board2とBoard3はお星様になりました(違

2016年10月6日木曜日

ESP-WROOM-02でI2S DACを動か…せない

I2S WebStreamingのために買ったES9023ボードですが、今のところまだ成功しておりません。

せっかく(というほどの値段ではなかったですが)ES9023のDACを買ったのに使わないのはもったいないなぁと思いつつオクラにしてました。

が、こんなのを見つけました。ヒャッハー!

ともかく、esp-open-rtosごと落とします。なお、open-rtosのビルドについてはこの手順でどぞ。macの場合、case sensitive volumeなどが必要なのでちょっと一手間必要です。

ESPのFlashに入るような手頃なサイズの音源がなかったので、GarageBandとiTunesを使ってWAV作りました。もしかしてできるかな?と思ってググったら出てくるからインターネッツはすばらしい。ありがとうございます。

なお、iTunesの仕様が変わってしまって、記事の通り「曲」を右クリックをしてもWAVファイル作成のメニューは出てきません。ファイルメニューから、変換>WAVバージョンを作成 で作れます。

かくして、ピアノの鍵盤を3回押しただけのsample.wavが出来上がりましたw examples/i2s-audio/の下に files ディレクトリを作り、その中に入れます。

で、ビルド…しようと思ったら、久しぶりすぎてrtos sdkの想定しているesptool.pyとパラメータが異なりエラー。

ということでesptoolをアップデート
$pip install -I esptool
で、今度こそビルド&インストール!
make flash -j4 -C examples/i2s_audio ESPPORT=/dev/tty.usbserial-DN01J0KN 
通った! で、ES9023をつなぐまえにwktkしながらオシロをつないでみました。出力はGPIO2 = LRCK, GPIO03 = DATA, GPIO15 = BCLKとのこと。

結果。

GPIO2にクロックみたいなものは出ているのですが、不規則。DATAとBCLKは出てませんでした。

…はい、また失敗です。うーん。

2016年9月22日木曜日

今更ですがESP-WROOM-02で赤外線リモコン(174円也)

先日、会社でIoT勉強会を実施しました。

勤務先はガチのソフト開発なのですが、やっぱりIoTへの関心は高く、あっという間に定員に達しました。内容的にはESP-WROOM-02+BME280(気温湿度気圧センサー)+PIRセンサー(人感センサー)+空気質センサー+OLEDという有りがちな組み合わせですが、幸いにも好評のうちに勉強会を終えることができました。


勉強会を開催したい!!という方はLinkedIn経由でくらはしまでご連絡ください。材料費は1人前5000円ぐらいです。団地の集会場やコミュニティセンターでやってみたいです。

で、ここからが本題。勉強会参加者の方から、アフターフォローSNSで「エアコンを制御したい」というお題をいただきましたので、さくっと作ってみました。

■部品■

品名Name秋月PN価格購入数量参考バラ単価使用数
赤外線リモコン受信モジュールOSRB38C9AA(2個入)IR_RECEIVERI-046591001501
5mm赤外線LED OSI5FU5111C−40 (5個入)D1, D2I-032611001202
トランジスタ2SC1815GR 60V150mA (20個入)T1I-008812001101
カーボン抵抗(炭素皮膜抵抗) 1/6W 47Ω (100本入)R3, R4R-16470100112
カーボン抵抗(炭素皮膜抵抗) 1/6W 2.2kΩ (100本入)R1, R2R-16222100112
積層セラミックコンデンサ 47μF16V ±10% 5mmピッチ (10個入)C1P-049177001701

秋月で買うと大量に余りますが、特に抵抗とトランジスタは必ず使うので買ってしまってもいいと思います。コンデンサがわりと高いですが、これは無くてもあんまり変わりませんし、同容量の電解コンデンサなら1本10円ぐらいだと思います。

このうち、抵抗とセラミックコンデンサは極性がありません。つまり、どのピンをどっち側につないでもOKです。が、赤外線受信モジュール、LED、トランジスタ、電解コンデンサには極性があります。電解コンデンサは表面に書いてありますし、LEDは長い方の足がプラス電源側になります。トランジスタは仕様書にECBと書いてありますが、それぞれ、エミッター、コレクタ、ベースの略です。2SC1815の場合は、足を下に向け、平らな面(部品番号などが印字されている面)をこちらに向けて、左からECBの順番です。回路図ではトランジスタの左側がB(ベース)、上(矢印のついてないヤツ)はC(コレクタ)、下(矢印)はE(エミッタ)です。

赤外線受信モジュールIR RECEIVERはモノによって違いますが、今回使ったものは足を下に向け、受光窓をこちらに向けた左から1 OUT、2 GND、3 VCCです。違うモジュールを使った場合には仕様書で確認してみてください。

抵抗値は、2.2kΩ(回路図では2k2と表記)は赤赤赤金、47Ωは黄紫黒金です。最後の金は精度を表すもので金は±5%、銀は±10%です。今回のような用途では5%でも10%でも問題ありません。カラーコードについては、ここのページが見やすいかと思います(特に一番下の表)。

■回路■


会社のブログでは私のホワイトボードへろへろ回路図が晒されてしまったので、汚名返上を願ってEagleで書いてみた。

…ツール使ってもヘロヘロだったorz

あ、4u7じゃなくて47uだった。受信プログラムを走らせていると、リモコン操作していなくてもインバータやLEDランプのノイズを出鱈目な信号として誤認識してしまうので、ノイズ対策としてつけてみたんですが、あんまり違いありませんでした。誤読の場合はメーカー識別コードなどが出鱈目になるので対象となる製品のコードでフィルタリングすれば実用上は問題ないかと思います。

47μFの積層セラミックコンデンサは結構高いので、なしでもええんやで、H田さん。

受信機はIO15、LEDはIO16につないでいますが、これは空いていればどこでもOKですが、ソースのIOポート番号をそれに合わせて変更する必要があります。

同じ回路をArduinoで使う場合には、3v3ではなく5vにつなぎ、R3とR4を75Ωに取り替えてください。

■ライブラリ■

Arduinoの定番IRRemoteをESPで使うとAVR.hでひっかかってしまうので、IRRemoteESP8266を使います。原作者の方、ESP8266へポートしてくださった方に感謝致します。

githubからzip落としてArduino IDEに読み込ませます。

IRRemote/IRRemoteESP8266とも、そのままではバッファが小さくてエアコンのデータを扱うことができません。適当なエディタでIRRemoteESP8266.hを開き、RAWBUFの値を100から400に変更255に変更して保存します。

追記(2017年2月6日):400では動かない、ここは8bitなので255が最大値とのご指摘をいただきました。大変申し訳ありません。ご教示いただきありがとうございました。

…ところで何故私のところでは動いていたのでしょう・・・。

■受信プログラム■

コードを解析してバイナリコードで送るのがスマートなんですけど、面倒くさいのでrawコード(信号のon/off時間をそのままベタに記録したフォーマット。とても長い)を受信します。

なお、エアコンの場合、テレビと違ってリモコン信号が正常に送られているかどうか判断するのが難しいです。設定温度を本体に表示してくれるエアコンは別ですが。なので、私はタイマーのon / offで確認しました。タイマーをセットするとエアコン本体の予約ランプが点灯するので、セット / 解除の信号を送って、ランプの点滅で動作確認しようという寸法です。

何その巨大Lチカ。

他にはフィンの向きを使う(左右に切り替える)のも良いかと思います。なおエアコンの頻繁なon/offは電力消費にもエアコン本体の寿命にも悪影響を与えるので、ご注意を。

仕事部屋は古いFujitsuエアコン、IRRemoteのサンプルを改造して、以下のような出力を得ました。Panasonicとか48bitsとか出てますが気にしないように。

26度、風量自動、1時間タイマーON:
8083F
Decoded PANASONIC - Address: 28C6 Value: 8083F (48 bits)

Raw (244): 0xCE4,0x672,0x1C2,0x190,0x1C2,0x190,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1F4,0x190,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x190,0x1F4,0x190,0x190,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x190,0x1F4,0x190,0x1C2,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x1C2,0x1C2,0x190,0x190,0x190,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x190,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x190,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x190,0x4E2,0x1C2,0x4E2,0x190,

26度、風量自動、タイマー解除:
8083F
Decoded PANASONIC - Address: 28C6 Value: 8083F (48 bits)
Raw (244): 0xCE4,0x672,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x4E2,0x1C2,0x1C2,0x1C2,0x4E2,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x4E2,0x1C2,0x1C2,0x190,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x4B0,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4B0,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x4E2,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x4E2,0x1C2,0x190,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x190,0x190,0x190,0x1C2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x190,0x1C2,0x1C2,0x190,0x1C2,0x190,0x1C2,0x1C2,0x1C2,0x190,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x4E2,0x1C2,0x190,0x190,0x4E2,0x1C2,0x190,0x1C2,0x1C2,0x190,

長いっすねー。ソースは短いっす。


■送信プログラム■

受信プログラムからシリアルに吐き出されたraw列をコピペして、5秒ごとに送信受信を繰り返すプログラムです。これも元は附属のサンプルを書き換えました。

動きます。動きますが、赤外線LEDの指向性がかなり強いので、向きをちゃんと合わせないと反応してくれません。気をつけてください。

こっちもソース短いです。

2016年9月5日月曜日

ブラウザからDCモータを制御

というわけで、せっかくのESP-WROOM-02なので、ブラウザから(というかhttpで)モータを制御するようにプログラム書き換えました。

配線は前回のままです。起動するとIPアドレスが表示されますので、そのIPアドレスにパラメータをつけると制御できます。

http://<ip-address>?brake=0 : ブレーキがかかります
http://<ip-address>?r=40:速度指令40でモータを正転させます
http://<ip-address>?r=-40:速度指令40でモータを逆転させます。

ま、rじゃなくてもbrake以外なら何でも良いんですが。

ソース乗っけておきます。


2016年9月4日日曜日

170円でDCモータを制御(DRV8830):ESP-WROOM-02



Elecrowの4WD模型を買ったのは良いのですが、例によって買っただけで満足してしまってぜんぜん手をつけてません。

これではいけないわ、ということで、とりあえずDCモータを制御するコントローラを試してみました。秋月だけ見ても色々なコントローラが揃っているのですが、ESP-WROOM-02で4つのモータを制御するとなると単純なHブリッジをPWMで制御するのは無理(ピンが足りない)なので、I2Cに9個までぶら下げることのできるDRV8830を使います。

レジスタに値を書けばその通りの電圧で回してくれて、過電流や温度などのステータスも見られるのでラクです。

■必要なもの■


あとはブレッドボードなどの配線資材などが必要です。

■配線■

簡単すぎて表にする意味がなかったですね…。

ESP-WROOM-02DRV8830
GPIO4SDA
GPIO5SCL
VINVcc
GNDGnd

その他に

  • モータの+とOUT1、モータの-とOUT2
  • モータの+と-の間に1nFのセラミックコンデンサ
  • DRV8830のISENSEとGNDの間に0.2Ωの抵抗
  • DRV8830のVCCとGNDの間に0.1μFのセラミックコンデンサ
  • SDAと3.3vの間に10kΩの抵抗
  • SCLと3.3vの間に10kΩの抵抗
  • USBシリアルなどの5v出力とESP-WROOM-02ボードのVIN
  • USBシリアルなどのGNDとESP-WROOM-02ボードのGND
を接続します。

DRV8830の説明には「マイコンの電源とモータの電源は共通に」って書いてあるのですが、ここではDRV8830には5Vをかけてます。オープンドレインなのでI2Cにはプルアップ電圧以上は出てきませんが、FAULTなどには5Vが出てきてしまうのでESP-WROOM-02に接続すると壊れます(ESPが)。マイコンと接続するのは3.3vでプルアップしたI2Cだけにしてください。

■プログラム■

探すとSparkfunさんがサンプルを公開してくれているのですが、AVR用でESPではビルド通りません。なおも探してみると、Arduino版のサンプルが公開されていたので、参考にさせていただきました。ありがとうございます。

モーターが正弦波に乗ってゆっくり加速>減速>反転してゆっくり加速>ゆっくり減速…を繰り返すだけですが、とりあえずソフトで意図した通りの動作ができました。

さて、これでElecrow 4WDを制御しなきゃいけないんですが…普通モーターはトルク≒電流を制御します。DRV8830は出力電圧をPWMで制御するので、実際どのぐらいトルクが出ているのかはわかりません。それに、モータにはロータリーエンコーダなどもついてないので、「モーターがどんな具合いで回っているのかを知る手段がない」という恐ろしい状態でモータを制御しなきゃいけませんw

…どうすんだ、これ…(笑)



2016年8月17日水曜日

ESP+400円あれば10分で作れる睡眠計

ただし送料は別ですw

秋月電子通商のサイトから

これは毎度おなじみのPIRセンサー、赤外線を発する物体が動いたことを検出してくれるセンサーです。主に防犯用途で使われるものですが、安い割には高感度なので鳩の検出や来客の検出など便利に使えます。なお、このHC-SR501は安いんですが、動きを検出したあと信号を数秒〜数分間引き伸ばして出力する仕様です。侵入者を検知してランプを点灯するためのものなので。そういう意味ではSE-10というセンサーの方が正確に把握できるんですが、高いのと5V電源では正常に動作しないので、今回は見送ります。

今回はこの400円のセンサーと無料のThingSpeak.comを使って10分で睡眠記録デバイスを作ってみます。

当然ESP-WROOM-02のモジュールも必要です。それにはぜひ倉橋屋Board1をご検討ください:-)

…他にオス - メスのジャンパワイヤとかブレッドボードが必要ですが、それはさておき。

まず、PIRとESP-WROOM-02を接続します。PIRの電極は、ドームを上、ピンを手前にした状態で左からGnd, Signal, Vccです。GndとESPのGnd、SignalとIO12、Vccと電源(5v以上…Board1をUSBにつないでいる場合はVin、ESPrなどではVOUT)を接続します。Signal出力は約3vなので、ESPと直結しても大丈夫です。なお、PIRによってはもっと電圧の高いものやオープンコレクタのものもあるので、その場合は仕様に従ってください(コメント欄に書いていただければ、わかる範囲でお答えします)。

接続はこれでおしまいです。HC-SR501はボリュームが2つ付いていて、それぞれ感度調整と持続時間調整です。感度はその通り感度で時計回りに回すほど敏感になります。持続時間は一度動きを検出した時にその後何秒出力HIGHを維持するかを設定できます。睡眠計として使うのであれば、感度は最低(時計回り目一杯)+持続時間最小(時計回り目一杯)で良いと思います。あとジャンパが一箇所ありますが、基板の端の方にするとHIGHになっているときに次の動きを検出してもLOWになるタイミングは延長されませんが、基板端から離れた方に挿すと動きを検出した時点でHIGHが延長されます。これ、どっちが良いでしょうね。

ThingSpeak.comのアカウントを登録します。ThingSpeak.comは「チャンネル」という単位で送信されてくるデータを管理します。一つのチャンネルは最大8個までのデータ列を記録することができます。New Channelで新しいチャンネルを登録し、Nameは適当に、Field1に「movement」というタイトルを付けチェックします。下の方の「Save Channel」をクリックすればOKです。次にAPI Keysというタブをクリックし、「Write API Key」の値をコピーしておきます。

あとは、以下のソースをArduino IDEで開き、お使いのWiFiのSSIDとパスワード、それからさっきコピーしたWrite API KeyをapiKeyにセットすればOKです。

一晩走らせてみた結果がこちら。

会社のIoT勉強会で使ったThinkSpeakを流用したのでArkの名前がw

そのままグラフにすると細かすぎてわからないので10分ごとの平均を480分表示させています。SE-10で取得したデータほどすっきり分離されないですが、xx時にベッドに入り、xx頃入眠、xxにトイレに起きてxx時起床というのが(言われれば)おわかりいただけるかと思います。

私は初老なので睡眠導入剤などを使っていますが、とりあえずこういうグラフがあれば「どの食事/運動/薬/サプリが有効なのか」を客観的に知ることができるかなー…と思っています。昼間部長とメールバトルした日などはドキドキして眠れないので、なかなか客観的な評価は難しいのですが(笑)。

小心者指数を計れるデバイスが出たら買います。買うべきです。ま、買っても役に立ちませんががが。

2016年6月21日火曜日

450円でESPでもArduinoでも使える高精度RTC

電子工作でRTCっていうとDS1307 / 1302あたりが定番だと思うんですが、秋月で売ってるRX-8025NBって、なかなか良いと思うんです。TXCO使ったものだともっと精度の高いものもあるんですが(NXPのPCF2129など)、450円で月差13秒程度ってのはなかなかのバランスだと思います。

秋月電子のサイトから

ずっと以前に買ってあったものの使う機会がなくて部品沼に沈んでましたが、在庫リストを見ていたら出てきたので使ってみました。

配線は、SDA - SDA, SCL - SCL, Vcc - Vcc, Gnd - Gndで何のひねりもありません。動作電圧範囲が広いのでmbedでもArduino / ESP8266/ ESP-WROOM-02どれでもそのまま使えます。

欠点としては、バッテリバックアップのラインが別になっていないので、電池やスーパーキャパシタをつなぐときにはSBRダイオードなどで一手間かかってしまいます。

この点、VddとVbatが分かれているDS1307+とかPCF2129は便利なんですよね。

余談ですが、こないだPCF2129で基板を作ったんですが動作しなくて泣いています。その辺の顛末はまたいつかブログに書きます。

■ソース■

こちらの記事を参考にさせていただきました。ありがとうございます。

RTCに多いんですが、年月日時分秒すべて60進数のBCDです。通常の10進をそのままセットするとまともな値が返ってこないので、セット前 / 読み出し後に変換してやる必要があります。fromClockFormatはBCD(60進)から10進、toClockFormatは10進からBCDへの変換を行ってます。

time_t(unix時間:1970年1月1日 00:00:00.000からの経過ミリ秒)とグレゴリアン歴との変換は標準関数で済ませてしまいました。テヘペロ。

起動するとWiFiに接続してsntpから時間を取得してRTCにセットし、あとはRTCから読み込んでは時間を表示しているだけです。

このRTCにはアラームをセットして割り込みを掛けたりする機能もあるのですが、使っていません。ESP-WROOM-02でRSTにつないでやると、deep sleepの後に指定した時刻に立ち上がる、なんてこともできると思います。



いい感じで動いているからあと何個か買っておこう。

…秋月にアフィリエイトがないのが残念です(笑)。

2016年6月19日日曜日

ESP-WROOM-02 : SNTPのAPIで大ハマリ


ESP8266 NON OS SDKには、sntp_get_current_timestamp() というapiが用意されています。その名の通り、ntpサーバにアクセスして時間をもらってくるものです。

ところが。

これが全然値を返してくれません。0ばっかりです。sntp_init()の順番が悪いのだろうか、time zoneを設定しなければいけないのか、upd local portが必要なのだろうか、DNSが動いていないのだろうか…など、2時間ほど試したのですが、ダメでした。

が。

ふと見ると、参考にしていたReferenceはver 1.1と書いてありまして。最新の1.5.4を見ると多少サンプルが違います。1.1と違って、waitが入ってます。

… sntp_get_current_timestampでは、パケット待ってくれないんですね…。referenceにそんなこた何にも書いてねーぞー(血の叫び

以下のコードで普通に動きました。はい、お疲れ様。

uint32_t getTimestamp() {
  configTime(9 * 3600, 0, "ntp.nict.jp", NULL, NULL);

  uint32_t result = 0;
  int cnt = 0;
  while (result == 0) {
    result = sntp_get_current_timestamp();
    delay(100);
    if (++cnt > 10) {
      break;
    }
  }
  return result;
}
ESP8266のサンプルとしてESP8266WiFi/NTPClientなんてのがあるせいか、スクラッチでUDPのntpパケットを扱っている作例が多いのですが、これ使うと簡単です(ハマらなければね)

ご活用くださいませ。

2016年6月14日火曜日

風呂水温計 ver 3.1

前回バージョンを少し改良。電池をもたせるために30度以下なら10分ごと、超えたら5分ごとに測定するようにしました。

…こんなグラフになりました。


沸くの早いな、ほんとに。

改良箇所は、void setup()の直前に次の行を追加し
int waitSec;
deepSleepの行を以下に入れ替えました。
waitSec = temperature > 30.0 ? 300 : 600;
ESP.deepSleep((waitSec - second()) * 1000 * 1000, WAKE_RF_DEFAULT);
さて、風呂に入ろうっと。

■追記 6/15■


前記のように「30度を下回ったら」って仕様に変更したんだけど、お湯に入れたままだと30度以下にならない件。これから暑くなるしなぁ。

2016年6月13日月曜日

100円温度センサー+ESP-WROOM-02でWiFi風呂水温計



ってことで、昨日試した100円温度センサーSTTS751をESP-WROOM-02と電池に接続し、100均のジャム瓶?に入れました。フタの発泡ウレタンを少し切り取ってアルミ地金をむき出し、そこに放熱グリースを塗ってセンサーを貼り付けました。

風呂の中でフタを下にして浮かんで欲しいので、重い電池がフタ側に来るようにするのがコツ?です。ただ、フタが下だとどうしても浸水してしまいます。内部の温度が下がるときに熱膨張(の逆)によって水を吸い込みますので、風呂が湧いたらお湯から出すようにするのが一番効果がありました(経験者は語る)。

対策としては膨張した空気の容積差を吸収すればいいので、もっと柔らかいボトルを使うか、ボトル側に穴をあけてビニールシートで空気室を作ってやるのが一番簡単かなと思います。

また、風呂のフタをしめていれば、それほど大きく温度がズレることもないので、電池をボトル側の底に入れても問題ないかと思います。その辺は使い方に応じて選択してください。


ESP-WROOM-02がdeep sleepから立ち上がった時にWiFi経由でThingSpeak.comへデータを送信します。風呂の温度はそれほど急激に変化するものでもありませんから、送信頻度は5分に1回にしました。以前1分間隔で動かした時には単4白エネループ3本で110時間動きました。今回黒エネループで何とか一ヶ月=720時間程度動いてくれると便利なのですが。

なおSTTS751とのやりとりは、こちらを参考にさせていただきました。ありがとうございます。

以下ソースです。初期化処理にbegin transmissionを追加して、データ受信のところを多少書き換えました。上記のサンプルコードには問題があるので後日修正します(6/24)。ThingSpeak.comへの送信は以前と同じというかほぼコピペです。


■追記■

電池のさらなる長持ちを目指してプログラムを改良しました(風呂水温計 ver 3.1)。

2016年6月10日金曜日

デジタルマイクSPM0405HD4Hがデジタルで動いた!

このまま「またデジタルマイクが動かない」「やっぱりデジタルマイクが動かない」「まだまだデジタルマイクが動かない」と長編化するかと思われたデジタルシリコンマイク、ついに動きました!


■考察■

今までも動いていたけどノイズに埋もれてわからなかった、というのが真相だと思います。

動かなかったバージョンでは100-10000回のカウントを終えるとLoopを抜けていました。これはESP-WROOM-02にはWDTがついていて、約1秒間loop()から抜けないとリセットがかかるのです。

何となくloop()抜けてもすぐに帰ってくるんだろ、ぐらいに考えていたんですが、これが想定以上に大きくて、抜けるたびに処理が止まってノイズとなっていました。loopから抜けるのをやめてESP.wtdFeed()にしたところ、かすかなノイズは入りますがマイクの前の音声がちゃんとADCから出力されるようになりました。

■ソース■

loopの値は100(サンプリング周波数10khz)ぐらいが良いようで、10(100khz)だとDACに出力するためのブランクの比率が著しいノイズとなり1000(1khz)にすると割れて何が何だか、という感じでした。また、countとして++だけでなく--も入れてみたところ、音量がかなり大きくなりました。100の場合で値は-100〜+100まで振れるので、精度は8bit、速度は10khzということになります。





お騒がせしました&ありがとうございました>電子工作部各位殿

もうちょっと高速のCPUが使えれば、DAC出力その他のための中断を回避できるので、もっといい音になると思います。現状で160Mhzクロックの32bit CPUなので、これより上のCPUを用意するよりはFPGAで作るべきものだと思います。約400円で専用チップ売ってるんですけどねw

ちなみにマイクの性能には「14bit相当・10khz」とのこと。うーん、どういう演算処理をすればそういう信号が得られるのでしょう。思いついたらまた試してみます。

■使用部品紹介という名のCM■

今回の実験では、
同社サイトより


同社サイトより

同社サイトより

を使用しました。

マイクモジュールとアンプへの3v3はBoard1搭載の安定化電源から供給しています。何かと電源にシビアなESPですが、(プログラムのバグ以外では)安定して動作しています。

タフな電源にしといてよかった…と設計者は胸をなでおろすのであった(完)。

2016年6月9日木曜日

デジタルマイクが動かない(SPI DAC出力編

Board1 - Mic - ADC+D級AMP

■ノイズしか出ねえ■

前回のあらすじ。秋月で300円のデジタルマイクモジュールを試してみたものの、マイコンからパルスを入れてもそれっぽい信号が取れている気がしない。でも、出力をLPF通してアンプにつないだら音が出ていた。

ということはPDMとしての動作はOKであとはデジタルとしてどうやったら信号を取り込めるか、ということになります。

ESP-WROOM-02を160Mhzで動かし、約1mhzでデューティー比50%近いパルスを入れてダウンエッジから約60nSecぐらいのところで取り込んだデータを集計してDACから出力してみたのですが…雑音しか出て来ませんでしたorz

ということで、以下失敗の記録です。なお、失敗記録を読んでもしょうがない、という方は先にこちら(デジタルマイクSPM0405HD4Hがデジタルで動いた!)をどうぞ。

■SPIと競合しちゃう■

最初GPIO12から信号を読み込んで居たのですが、ずっとゼロでした。SPIライブラリの内部で何かに使っているようです。GPIO5からクロック出力、GPIO4からデータ入力…という形にしたところ、読み込みできました。

なお、DACはMCP4922を使い、配線は以下の通りです。正しく動作しているかどうかは例によってノコギリ波で確認しました。

ESP8266SPM0405HD4HMCP4922
GPIO4DAT
GPIO5CLK
3v3Vcc1, 1, 11, 13
GndGnd, L/R12 GND
GPIO135 SDI
GPIO144 SCK
GPIO153 !CS
GPIO168 !LDAC


■最適化されちゃう■

タイミングやデューティー比を調整するために意味のないインクリメントを入れてみたのですが、localで宣言した意味のない演算は最適化で消されちゃうみたいですね。
for (int i = 0; i < n; i++) {
  int a = 0;
  a++;
  a++;
}
a++を増やしても結果変わりません。

void loop()の外で
int a = 0;
を宣言すると1つあたり25nSec程度の遅延が得られます。

digitalWrite(x, HIGH)で225nSec、digitalWrite(x, LOW)で212.5nSec程度の処理時間がかかります。

■試行錯誤しちゃう■

  • 現在のソースではダウンエッジだがアップエッジでも試す。ダウンエッジとアップエッジをLRライン=LOW/HIGH両方で試す。
  • ループ前にcountを0にして入力HIGHなら加算。あるいはLOWなら加算
    ▶ノイズだけ
  • ループ前にcountを毎回初期化せず、HIGHなら加算, LOWなら減算。あるいは逆
    ▶発散しました
  • ループ回数を減らしたり増やしたり
    ▶ノイズの音質が変わりますw
  • パルス出力からサンプリングまでのタイミングを増やしたり減らしたり
    ▶ノイズの音質が変わりますw
浩一はもう疲れました…。


■ソース■

loop内でforループから抜けた後のSerialは、タイミングなどを確認した後にコメントアウトしてます。処理時間がものすごく長いので。それとArduino IDEではツールメニュー>CPU Frequencyで160Mhzを選んでください。80Mhzだとクロック500khzしか出ませんので。


■そして…■

2016年6月5日日曜日

デジタルマイクが動かない(ESPとFPGAでクロック生成 )◀アナログ出てました

秋月のディジタルシリコンマイクモジュール(細ピンヘッダ版)を試してみました。

秋月のサイトより

このモジュールは1-3.25MHzのクロックを入れればPDMフォーマットでデジタルデータが取り出せます。PDMなのでローパスフィルタを通せばそのままアナログ信号として使えます。しかも300円。素晴らしい。

…しかし使えなければ意味がありません。結果として動作させることができませんでした。

今週は何をやっても動かないなorz

■追記6/6■

電子工作部の方から「LPFの出力をアンプに繋いでみたら何か信号出てるんじゃない?」というアドバイスをいただき、FPGAで作った1.25Mhzのクロックを入れて、LPF出力をカップリングコンデンサ経由で27dBのアンプにつないでみました。

そしたら!

小さいですが確かに音が出ています!! いえええええ!!! アドバイスありがとうございました。うれしー。小さすぎてオシロでは見えなかったけど、信号出てたのね。

というわけで、今週末はデジタルでの処理に再挑戦します。

それまでは以下のマイコンでの試行錯誤からFPGAでのクロック発生回路でアナログとしての取得に成功、最終的にデジタル信号として取り込みDACから音が出るまでのドタバタ劇をお楽しみいただければ幸いですw

■SPIでデジタル入力(失敗)■

今度はSPIです。SPIのクロックを1Mhzに設定し、SPI modeをいろいろ変えたりしてみたのですが、結果は似たようなもので値が123-127の間をパラパラ上下するだけでした。

#include <SPI.h>
const uint8_t BITS_COUNT_TABLE[256] = {
    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
};
int numofbits2(uint16_t bits)
{
    return BITS_COUNT_TABLE[((unsigned char*)&bits)[0]]
         + BITS_COUNT_TABLE[((unsigned char*)&bits)[1]];
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  SPI.begin();
  SPI.setFrequency(1000000);
  SPI.setDataMode(SPI_MODE0);
  noInterrupts();
}
static int mabiki = 0;
void loop() {
  // put your main code here, to run repeatedly:
  int num = 0;
  for (int i = 0; i < 16; i++) {
    num += numofbits2(SPI.transfer16(0xffff));
  }
  char buf[6];
  sprintf(buf, "%4d", num);
  if (mabiki == 20) {
    Serial.println(buf);
    mabiki = 0;
  } else {
    Serial.print(buf);  
  }
  mabiki++;
}
なお、ビットカウントはこちらの記事から使わせていただきました。

テーブルを使う方法は思いついたのですが、そのあとに記載されているアルゴリズムは本当にびっくりです。1960年代のコンピュータサイエンスは凄まじいですね。

■GPIOでデジタル入力(失敗)■

GPIOでクロックを生成し、ポートを読み込んで積算する方法を試してみました。帰ってきた値は見事にデタラメでグラフ化しても波形になりませんでした。
#include <Arduino.h>
void setup() {
  // put your setup code here, to run once:
  Serial.begin(230400);

  pinMode(14, OUTPUT);
  pinMode(12, INPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  int count = 0;
  for (long l = 0; l < 1000; l++) {
    digitalWrite(14, HIGH);
    if (digitalRead(12) == HIGH) {
      count ++;
    }
//    else {
//      count --;
//    }
    digitalWrite(14, LOW);
  }
  Serial.println(count);
}

なお、コメントアウトの部分はLOWならデクリメント、というサンプルを見たので試してみたのですが…結果がマイナスに振れただけで同じでしたたたたた。

■マイコン発振 / アナログ出力(失敗)■

1MHz強のクロックを入れ、出力に約20khzのローパスフィルタ(R=1kΩ,1=10nF)を通してマイク前から信号を入れてみました。ローパスフィルタは出力端子>抵抗>コンデンサ>Gndとつないで、抵抗とコンデンサがつながっているところから出力取ります。1MHz強のクロックはESPを160MHzクロックで動かして、以下のプログラムで生成します。デューティー比50%にならないけど、気にしない。デューティー比を考えれば少しでも演算の早いshortの方が良いのですが、shortだと約32mSecごとにシステム?に戻ってしまうのでオシロで波形見るときに邪魔かなと。
#include <Arduino.h>
void setup() {
  // put your setup code here, to run once:
  pinMode(14, OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  int count = 0;
  for (long l = 0; l < 1000000; l++) {
    digitalWrite(14, HIGH);
    digitalWrite(14, LOW);
  }
}

さて出力は…見事に直流です。本当にありがとうございましたorz

■FPGA発振 + アナログ出力■

最後にFPGAでちゃんとした1.25 / 2.5MHzのクロックを作って試してみます。でもまだちゃんと作る自信がないので、「FPGA電子工作スーパーキット」のp112ページからの手順やソースをまず動かして見て、そこにクロック生成を追加します(弱気

なお、同誌附属の基板はまだ組み立てていないので、BeMicro MAX10を使います。
  1. Quartus起動
  2. New Project Wizardでディレクトリ,プロジェクト名ClockGenを入力し、BeMicro搭載デバイスの10M08DAF484C8GESを選び、Finish。
  3. Fileメニュー>New...からVerilog HDL Fileを選びOK
  4. Velilogソースを打ち込む
  5. TasksのAnalysis & Synthesisを右クリックしてStartを選ぶ。エラーが出たら直してもう一度
  6. Assignmentsメニュー>Pin Plannerを選び、ピンを割り当てる(下図1)
  7. TasksのCompile Designを右クリックしてStartを選び、コンパイルし、「…Quartus Prime Full Compilation was successful」が出たらOK
  8. Toolsメニュー>Programmerで、Programmerを起動
  9. USB-Blasterが選択されていることを確認(表示されていなかったらHardware Setup...ボタンから選択ダイアログへ)
  10. Add Fileボタンをクリックし、output_filesの中のClockGen.sofを選ぶ。デバイスと書き込みファイルが表示される(下図2)
  11. Startボタンをクリック、瞬時に書き込みが終わり、LEDがチカチカ。


図1

図2
基本動作が確認できたので、2.5Mhzとその1/2, 1/4, 1/8のクロックをPMOD端子から出力するように書きなおします。
  1. QuartusのEntity欄でClockGenをダブルクリックしてVerilogソースを開きます。
  2. ソースを修正して保存します。
  3. 青の「▶」をクリックすると「変更するか?」と聞いてきますのでYES
  4. Full Compilation was successfulが出たらToolsメニューからProgrammer
  5. Startボタンをクリックしてコンフィグ(書き込み)
と、いうわけで、(少し)きれいな1.25Mhzと2.5Mhzが出ました。で、本題のデジタルマイクですが。同じです。ローパスフィルタを通しても何も出ません。

はい終了。

■FPGAのソース■



■最後に■

デジタルマイクは製品として販売されているからには、動くはず。でも何が悪いのかわかりません。もう涙も枯れ果てました…でもFPGAでクロック出すのはうまく行ったから良しとしよう(問題をすり替えてはいけません)。

続きはこちらをどうぞ。

2016年6月4日土曜日

ESP8266:I2S MP3 webradio streaming example(give up)


ESP-WROOM-02でI2Sを動かせないかと思ってググっていたら、上記記事がヒットしました。
Web StreamingがESP8266で出来る!

そりゃあやるしかありませんよね。残念ながら「現在は16bitのモノラル」だけど「サンプル・レートは96-320KBit MP3でテストしてうまくいってるっぽい」そうです。スゴいのか凄くないのかよくわかりませんw

なお、記事をよくみるとSPI RAMはSD_D0など見慣れないピンにつながっています。これ32pinのESPじゃないとダメですね。幸いなことにDACもSPI RAMもなしで動く、と書いてありますので、SPI RAMなしで行きます。ES9023も微妙に高かったので、同じように動作するはずのPCM5102ってのを買いました。ebayで1000円ぐらいでした。

上記リンクの通り配線しますが、ES9023ボードはライン出力なので別にアンプを用意する必要があります。
  • PCM5102(ES9023)ボード用電源(とりあえずUSBから取ります)
  • ブレッド‐ボードなど配線材料

数日間チャレンジしたのですが、動かすことができませんでした。最終的な原因はシリアルのコンフリクトだと思います。私は一旦ギブアップしますが、引き継いでくださる方のために記録を残しておきます。

■ダウンロード&ビルド■

このサンプルはfree-rtosで書かれています。ので、まだfree-rtosの環境がなければ、こちらをご参考にどぞ。

各種設定は mp3/user/playconfig.h で行うことができます。上から順番に見ていきます。

接続先のWIFI SSIDとパスワードをAP_NAMEとAP_PASSに設定します。

MP3_DECODERをダウンロードしたままの状態だとローカルのサーバからMP3をダウンロードする設定になっていますが、面倒なのでやめます。リストされているうちでは icecast.omroep.nl ってところだといい感じに接続できました。そのすぐ上の #if 0 を #if 1 に書き換えます。そして #if 1になっている 192.168.33.128 のところを #if 0 に書き換えます。ご自宅にラズパイなどでストリーミングサーバを立てている場合には、それを活かしてみましょう(動作を確認した後で)。

I2Sをつないでいるので DELTA_SIGMA_HACK をコメントアウトします。 PWM_HACK はそのままコメントアウトですね。

上記の通りSPI RAMは使わないのでFAKE_SPI_BUFFの行のコメントを外します。

ビルドはgithubに書いてあるとおり、コマンドラインで当該ディレクトリに移動してからmakeです。たぶん問題ないと思います。ツールが見つからない旨のエラーが出る場合にはパスを設定していあるか確認してください。make対象がないというエラーはディレクトリが違います。
 make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=80 SPI_MODE=QIO SPI_SIZE=1024
エラーがでなければ、ESP-WROOM-02にダウンロードします。なお、元記事にも書いてありますが、コンパイル後に出る eagle.irom0text.bin---->0x40000 は間違っています。下記のように0XA0000から書き込みをしてください。USBシリアルとESP-WROOM-02をつないでPROGとRESETを一緒にGNDに落とし、RESETを先に離してからPROGを離し、ダウンロードモードにしておきます。Board1の場合には白ボタンと赤ボタンを一緒に押して先に赤ボタンを離してから白ボタンを離します。コマンドラインで
cd mp3
esptool.py --port /dev/tty.usbserial-AH016T8K --baud 115200 \
write_flash 0x00000 ../bin/eagle.flash.bin 0xA0000 ../bin/eagle.irom0text.bin

これでConnecting...以下の表示が出ればOKです。
Connecting...
Erasing flash...
Writing at 0x00009c00... (100 %)
Erasing flash...
Writing at 0x000df800... (100 %)
Leaving...
動作はあまり安定しておらず、起動してすぐにexception、数秒走ってはexceptionが出る…を繰り返して、Rxのランプが点灯しっぱなしになったらGPIO15とRxをオシロで見てみます。数MHzのパルスが出ていればひとまず動いてます。

…ここまでplayconfig.hを試行錯誤して数時間かかりました。

ただ、LR切り替え信号が出てません。この信号がDATAのスタート信号になっているので、これがでないとDAC動いてくれません。

ソースを見ると、Tx / RxをI2Sの信号に使っているのにSerialにprintfでメッセージを出しているのですが…これ問題ないのでしょうか? UART_SetBaudrateをコメントアウトして動作に影響しないようにprintfをコメントアウトしてみましたが、ダメでした。

うーん、あと一歩だと思うのですが…ここまで動かしてギブアップするのは残念です。ただ、I2Sの使い方についてはいい勉強になりました。Tx/RxはDMAでバッファを使えるんですね。当面使う見込みないけどもw

以上お目汚し、失礼しました。

2016年5月18日水曜日

作った基板が動作しない:切り分け編



トラブルには切り分けが大事です。

ESP-WROOM-02が起動しない原因は大きく分けて以下の3つに分類できます。
  • 部品の初期不良または製作時の破損
  • 基板設計がダメ
  • 製作上の問題

前回はESPを交換してみましたが、やっぱりダメでした。

とりあえずESP部分とは別にアナログの動作を確認するためパターンをカットし、別のESPからの信号を直結してみたところ、問題なく動作しました。アナログ回路については特に新しい要素を入れてないので、当たり前といえば当たり前ですが。

また、アナログ部分を切り離した状態でESPを起動してみましたが、やはりboot mode (5, 7)として認識されています。あきまへん。

そして、恐ろしいことに、同様にboot mode (5, 7)を返してきて、ヒーティングガンによって吹き飛ばされた最初のESPを別の基板にリフローしてみたところ、なんの問題もなく動いてしまいました。

部品に起因する問題ではない、ということはほぼ確定しました。

■今回の検証■

ESP部分の基板設計がダメなのかを検証します。ESPとその周辺のプルアップ抵抗やパスコンだけをリフローして起動するかどうか確認します。

…装置の検証としてはあんまり意味ないんですけどね。でも、とりあえず、「ESP部分は動く」ってのを確認しておきたかったもんで。

結果として、動作しました。

…もう何が何だか…orz

真っ先に思い当たるのは前回はESPのIO15あたりのハンダ付けがダメだったってことなのですが、これは端子での電圧を確認してますので、問題ないはずです。

わかってしまえばきっと物凄くくだらない原因なんだろうなーと思うんですが…今のところは no idea です。とほほ。

2016年5月8日日曜日

作った基板が動作しない:修復編

作った基板が動作しない:調査編」の続きです。

前回、吸取り網ではどうにもならず、「もう一度ホットプレートで温めるか」というところで終わったのですが、「電子工作部」にて「カプトンテープで覆ってからヒーティングガンで仕留めろ」と教えていただきました。

で、こちらが結果です。わはははははははは。



本当はカプトンテープ貼った「処理前」「処理後」を写真に撮りたかったのですが、あっという間に吹き飛んでしまったので結果のみの写真となりました。あはははははは。

様子を見るために熱風を5秒あててから温度を図ってみたら100度程度でした。もう少し長目にあててもう一度温度を見てみよう、と思って9秒までカウントしたら吹っ飛んでいました。本当にもう見事な吹っ飛び具合いです。うはははははははははは。

本当にいつもお世話になっています。ありがとうございました>電子工作部

ヒーティングガンは以前、リフロー用に買ったのですが、部品が吹き飛んでしまってダメでした。なので「今後は熱収縮チューブ収縮専用機として働いてもらおう」と言ってたのですが、「ICの交換」という用途でも働いてもらえることとなりました。よかったよかった。

なお、使用したのは「白光 ハッコーヒーティングガン 883B 100V-1KW平型プラグ 883-13 」と「白光(HAKKO) ハッコーヒーティングガン オプションノズル A1108 」です。アマゾンのヒーティングガンのページにはお勧めとしてA1111が出ているのですが、ヒーティングガン883-13用のノズルはA1108です。お間違えなく。

で、ふっとんだESP-WROOM-02を供養してから、吸取り網で残ったハンダをきれいに掃除した後、遅硬化性接着剤で新しいESPを固定します。

固まったところでハンダペーストを塗り、ハンダゴテでひと撫で。いわゆる引きハンダというやつを実行。交換が完了しました。

■残念なお知らせ■

交換しても症状変わりませんでした。