2015年12月31日木曜日

ESP-WROOM-02のRTOSをMacOS X El Capitaionで動かす


■大まかな手順■


  • esp-open-sdkをビルド
  • esp-open-rtosをダウンロード

…これだけのことなんですが、MacOS X El Capitain固有の問題やら私の環境固有の問題で大ハマリしました。また、最初ESP8266-RTOS-SDKを試してみたのですが、サンプルのビルドすら通らずに挫折してesp-open-rtosに逃げたら、あっという間にマルチスレッドなLチカまで通って拍子抜け、という経緯がありました。

ということで、ハマりどころも含めてご紹介します。

なお、esp-open-sdkは、大文字小文字を区別するファイル・システムでないと動作しません。なので、Volumeを作ってその中で作業をします。そしてesp-open-rtosはesp-open-sdkがないとダメです。なので、再起動などでunmoutされた後に再度esp-open-rtosを使う場合には以下の手順で再度esp-open-rtosの入っているdmgファイルをマウントしなおす必要があります。

$ sudo hdiutil mount ~/Documents/case-sensitive.dmg
…「見つからない」というエラーが出ればすぐ気づくのですが、ビルドで別のエラーがでる、esptool.pyで書き込みしようとした時にうまくいかない…という直接関連なさそうなエラーが出るので、ちょっとハマりました。

あと、Homebrewが必要です。

■まずesp-open-sdkをビルド■


https://github.com/pfalcon/esp-open-sdk
このページの「Requirements and Dependencies / MacOS」を参考にesp-open-sdkが動く様にします。
$ brew tap homebrew/dupes
$ brew install binutils coreutils automake wget gawk libtool gperf gnu-sed --with-default-names grep
$ export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
$ sudo hdiutil create ~/Documents/case-sensitive.dmg -volname "case-sensitive" -size 10g -fs "Case-sensitive HFS+"
$ sudo hdiutil mount ~/Documents/case-sensitive.dmg
$ cd /Volumes/case-sensitive
$ git clone --recursive https://github.com/pfalcon/esp-open-sdk.git$ make STANDALONE=y

Buildingでのgit cloneは当然問題ないのですが、その次のmakeでビルドが通りませんでした。なお、私はmake STANDALONE=yを選択しました。esp-open-rtosにはSTANDALONE=nを選べと書いてあるのですが(後で気付いた)、とりあえず問題なく使うことができました。

□ハマり1:じゃまな古いsed□

ビルド途中でエラーが出ました。sed -rオプションが使えない云々。調べるとmac標準のsedではなくgnu-sedを使えば解消できるとあるのですが、「Requirements and Dependencies / MacOS」でbrewと使って導入済み。かなり右往左往しましたが、結果として消し忘れていたMacPortsのsedが悪さをしていました。以下の手順に従ってMacPortsをアンインストールして、sed -rオプション云々のエラーは消えました。


□ハマり2:Xcode command line tools□

makeしているとこんなエラーがズラーっと出てとまります。
[INFO ]  Installing pass-2 core C compiler[ERROR]    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstddef:46:9: error: no member named 'ptrdiff_t' in the global namespace
...
エラーメッセージの内容からXcodeのcommand line toolsが悪さをしているっぽい。対応策はここで見つけました。

私のところはXcode 6.3ではないですが、結果的には以下のスクリプトを実行することで解消できました。
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-blocking.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-clast-to-gimple.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-dependences.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-interchange.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-optimize-isl.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-poly.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-scop-detection.c
sed -i '1s/^/#include <stddef.h>\n/' crosstool-NG/.build/src/gcc-4.8.2/gcc/graphite-sese-to-poly.c
すぐに終わりますので、再度 make STANDALONE=y を実行します。私のところはこれで通りました。
Espressif ESP8266 SDK is installed, its libraries and headers are merged with the toolchain
このメッセージが出たら完了です。

なお、そのすぐ上にも書いてあるように、ツールを実行するためにパスを設定する必要があります。.bash_profileに追加しておきましょう。
export PATH=/Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin:$PATH



■esp-open-rtosの設定とサンプルの実行■

https://github.com/SuperHouse/esp-open-rtos

RTOS-SDKの大騒ぎと比べるとあっけないほど簡単です。まず、適当な作業用ディレクトリを作り、そこにesp-open-rtosをダウンロードします。
cd
mkdir esp
cd esp
git clone --recursive https://github.com/Superhouse/esp-open-rtos.git
cd esp-open-rtos

…はい、これだけです。

次に、自分のアプリをビルドする際のssidとpasswordを設定しておきます。1つのESP8266/ESP-WROOM-02だけで遊ぶには良いんですが、複数あるときはちょっと面倒ですが・・・include/ssid_config.hを開き、
#define WIFI_SSID "mywifissid"
#define WIFI_PASS "my secret password"
を自分のSSID/passwordに変更し、すぐ上にある#warningも消します。やらないとは思いますが、ここでcloneしたsdkに変更をしてpushする際に、自分のSSID/passwordを一緒にプッシュしないように気をつけなさいよ、というwarningです。

続いて、サンプルのビルドと実行ですが、そのまえにESP-WROOM-02をシリアルポートにつなぎ、PROGを押したままRESETを押し離し、PROGを離します。さらに2組のLEDと220-1kΩの抵抗を直列にして、GPIO 12とGPIO 13に接続します。次に、examples/blink_times/blink_timers.cを開き、
const int gpio_frc2 = 14;
const int gpio_frc2 = 13;
に変更します(他のGPIOを使う場合にはそれに合わせて変更してください)。

あとは、

make flash -j4 -C examples/blink_timers ESPPORT=/dev/<usbシリアルのポート>
を実行すれば、ビルドの後、自動的にESPに書き込まれ、二個のLEDが1/5秒周期と2秒周期で点滅します。ソースを見ればわかりますが、2個のLEDはそれぞれ別々のスレッドとして動作しています。

お疲れ様でした。ソースをXcodeなどのエディタで開いてしまえば、ビルド&ダウンロードはコマンド一発(ターミナルでは上向き↓を押してENTERを押すだけ)なので、Arduino IDEで使う場合とそう変わりはありません。これで本格的なマルチスレッドが手に入るのだから、苦労も報われるというものです。



■余談:ESP8266-RTOS-SDKをビルドする際のハマり■

ビルドはできたものの、サンプル中の「GPIO_OUTPUTが見つからない」というエラーを解消できずに挫折というか諦めました。ただ、そこまで行くのにかなり苦労したので、一応記録を残しておきます。

ESP8266_RTOS_SDK

まず、esp-open-sdkをセットアップするのはesp-open-rtosと同じです。

次に適当なディレクトリを作ってそのなかに移動してから
$git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
でSDKをダウンロードします。つぎに、gen_misc.shを開き、SDK_PATHは書いてあるとおりRTOSの場所、BIN_PATHはビルドしたバイナリを置く場所を指定します。

BIN_PATHに指定したディレクトリはビルド前に作っておかないとエラーになります。指定したディレクトリにバイナリが入るので、そこからesptool.pyなどを起動すると何かとラクですね。

さて、ビルドを始めると、
.out section `.irom0.text' will not fit in region `irom0_0_seg'
で止まってしまいます。

回避策はRTOS_SDK V1.3 do not fit my code any moreで見つけました。ESP8266_RTOS_SDK/ld/eagle.app.v6.ldってファイルを開き、MEMORYってブロックを記事の末尾にある
MEMORY
{
  dport0_0_seg :                        org = 0x3FF00000, len = 0x10
  dram0_0_seg :                         org = 0x3FFE8000, len = 0x14000
  iram1_0_seg :                         org = 0x40100000, len = 0x8000
  irom0_0_seg :                         org = 0x40210000, len = 0x7C000
}
で置き換えるとビルド通ります。お疲れ様でした。

2015年12月30日水曜日

ホームリフローはサンハヤトのハンダクリームに限るっ


いきなりアフィリでも狙ってんの?ってタイトルで恐縮ですが、ホームリフローを始めて18ヶ月にして初めて購入したサンハヤト「表面実装部品取付キット SMX-21」を使ってみました。

最短時間で不良ゼロ

でした。マチ針を使って「うまく塗れない」と言っていたあの日。マンガ「ハルロック」から得た知識でマイナスドライバーを使ってうまく塗れるようになって歩留まり向上したあの時。そして購入後18ヶ月を経過してさすがに品質低下してはんだボールだらけになり「ダメだこりゃ」と気付いた朝。ついにさようならです。

白い箱の中身


■注意事項■

箱を開けると「表面実装部品取り付けキット 特殊クリームハンダをお使いになるまえに」という注意書きが入ってます(フラック成分が固まってピストンが動きにくくなっていることがある云々)。私のはそれほどではないものの少し固くなっていたので、記載通りの処置をして問題なく使えました。とはいえ、最初使う時にはどのぐらいの力で押したら出てくるのかわからないので、ティッシュなどを用意するか比較的面積の広いパッドを標的にするのが良いかと思います。

クリームハンダは冷蔵庫で保存する必要があります。作業の1-2時間前に冷蔵庫から出しておきましょう。ただ、室温に戻ったとはいえ手の温度よりは冷えてます。冷えたものを暖めると当然熱膨張します。そのため、ふと気が付くと5mmぐらいハンダが出ていることがあるので、作業は手早く行い中断する場合にはティッシュなどの上に置きましょう。ただ瓶に入っているものと違い、瓶からスプーンですくい取るという作業がないので、中断せずにずっと拡大鏡の視野の中で作業し続けることができると思います。

あと念のためですが、キットには接着剤が付属しています。これでチップを固定するとハンダ付け作業が楽になるのですが・・・この接着剤はリフローには対応していません。あくまで手ハンダ用の接着剤なのでお間違えなく。

■塗布■

もう簡単です。拡大鏡をみながら注射器でプチプチと粘り気のある灰色のクリームを置いていくだけです。クリームはかなり粘り気が強くパッドに触れるだけで付着してくれるのでサクサク進みます。ESP-WROOM-02は底面に接点があるのでブリッジしないか心配になったのですが、パッドを無視して一列にブチューっと流し込んだだけです。ただ、チップを押し付けると表面張力が悪い方に作用してしまうと思い、そっと乗せるだけにしました。溶けた時にレジストがハンダをはじいてくれるはず。いずれにせよブリッジのリスクは高くなるので、積極的にはオススメはしません。「一列なおもて動作す。いわんや1パッドごとに置いておや」って感じ(違

チップ部品に関しては、2012なら楽勝でハンダを置きにいけます。

というわけで塗り終わったのがこちらです。


率直に言って汚い。慣れてないからしょうがないねっ

ご覧のように、ちょっと多すぎですね・・・チップ抵抗などはたぶんこの半分ぐらいでいいかと思います。拡大鏡で見ながら作業していると立体感がなくてどのぐらい盛っているのかわからないのと、ハンダのノリがいいのでついつい多めに出してしまいました・・・。なお、写真のタイムスタンプによれば、開封写真の最後〜塗布完了写真の最初まで約15分でした。前回マイナスドライバーで同じ基板に塗った時には30分程度かかっていたと思うので、大幅な時間短縮です。

さて、部品を置いていきます。アル中気味の私ですが、チップ部品を置くときでも手が震えないのでまだ大丈夫かなと安心する一時です。


もうはみ出しまくりだし、ESPの下など本当に不安になってしまう状態ですが、ともかくやってみます。

リフロー工程は

  1. ホットプレートにフタをして150度ぐらいに温めておく
  2. 基板をそっと乗せて、1-2分ほど余熱する。この時、温度を確認するために蓋を開けなければいけないですが、温度はそれほどシビアに考えなくても良いと思います。1-2分と幅がありますが、余熱することが目的なので基板表面が140-150度ぐらいになったらOKではないかと。
  3. 加熱開始、ホットプレートの表面が250度を越えないように注意しつつ、じっと見ていると基板表面が180度を超えたぐらいのところでハンダがキラッと溶けます。そのままホットプレートの温度を保ち、基板表面が210-220度ぐらいになったところで加熱をやめます。
  4. あとは全力でうちわ等で扇いで冷まします。基板表面が150度ぐらいまで冷えればもう触れたり落としても部品が動いたりすることはないので、ピンセットでステンレス流し台などに置いて冷まします。


…あ、リフロー完了直後の写真がない。



というわけで、スイッチやピンソケットなどてハンダ部品取り付け後の写真しかありませんが、こんな感じに仕上がりました。R10のあたりはクリームハンダが盛大にはみ出していたのですが、大きなはんだボールが2個あっただけで、フラックスクリーナーで簡単に除去できました。抵抗などかなりの大盛りですね。ESPについては「ここは少し多いな」というところ(下の写真左下端)は大盛りになっていますが、それ以外のところはきれいに溶け込んでいます。

さて、あとはチップの下でショートしていないかを通電前にテスターで確認をします。
  • VinとGnd、3v3とGnd、Vinと3v3間がショートしていないか
  • ESPの全ピンの接続とブリッジ確認
    • テスターでパッドとその端子が導通しているかを確認
    • 隣のピンとショートしていないかを確認
  • 抵抗、コンデンサ、LEDなどが正しい値を示しているか確認
    • 回路によっては必ずしも表示値と同じにならないので、他の部品との並直列などに考慮する必要はあります。

なお、電源の入力側と出力側の抵抗値を測って記録しておくと、次に同じものを作るときの参考になります。

冒頭書いた通り、ハンダ不良ゼロで一発で動きました。いえー。

■ハンダをしまうときのtips■

シリンジを少し引いてからジップ袋にしまいましょう。発生するガスや熱膨張に起因するキャップの内側にハンダクリームが漏れて固まる現象を軽減できます(と経験者は語るorz)。でもシリンジ引くと空気を吸って酸化が早まるような気もしますし…どっちが優先するかは今後の課題とさせていただきます。

追記(2016-01-31):注射針(ニードル)は、使った後1-2週間で詰まりますね。試しに交換しないで置いたら、2週間後は固いけど少し水っぽい、4週間たつと渾身の力を込めるとごく少量出てくるレベルで、まったく使えません。2週間後に水っぽくなったのは、固まりかけたものがフィルタみたいな状態になり、フラックスだけがにじみ出てきてしまったせいだと思います。

注射針はキットには5本しか入っていないし少し太いかなと思うので、ebay.comなどで安い工作用の注射針をまとめて買っておくと便利です(送料無料で500円ぐらい)。
SMT SMD PCB Solder Paste Adhesive Glue Liquid Dispenser+Dispensing Needle(50pcs)

5本ずつ10種類も入っているので、細すぎるのと太すぎるのが余ってしまうのが悩みです。国内だとインクジェットプリンタのインク入れ替え用に売られているものが入手しやすいようです。

いずれにしても、使い終わったら注射針をつけたままにしておいて、その次に使用するときにはまず針を変えてから作業するのが良いです。ご参考まで。

2015年12月29日火曜日

ESPにつないだRGB LEDをブラウザから制御する


■WiFi制御Lチカ■

ESPからサーバへデータを送信するのは何度かやったのですが、そういえばブラウザなどからESPを制御する、というのはやっていなかったので試してみました。

上の動画では、

  1. http://server/?w=4
  2. http://server/?r=1023&g=1023&b=1023
  3. http://server/?r=1023&g=0&b=0
  4. http://server/?r=0&g=1023
  5. http://server/?w
  6. http://server/?r=0&g=0&b=1023

の順番で操作しています。1.明滅指定、2.全色全点灯、3.青のみ明滅、4.緑のみ明滅、5. 明滅をストップ、6.青のみ点灯、という制御です。

こういうのをゼロから作るのはシンドいので、まず土台になりそうなプログラムをESP8266サンプルの中から探すと「HelloServer」というのが見つかりました。

これは、ブラウザから「/」または「/inline」でアクセスするとそれぞれ異なるメッセージが返ってきて、それ以外だとnot foundとともにargが表示される、というものです。必要なのはパスとargなので、これを使います。

■仕様と解説■

単にLEDを点滅させるだけじゃつまらないので、

  • RGB LEDを接続する
  • 各色ごとに明るさを変える r=100&g=200&b=300 って感じで
  • w=<n>と指定するとn mSec×256周期で滑らかに明滅する。ただしその時に設定されている各色の値がピークの明るさになる。

って仕様にしてみました。明るさを調節するにはanalogWriteでPWMを使い、それを滑らかに変化させるためにTickerを使います。

analogWriteは指定したGPIOに対して約500hzのPWM出力をします。値として0-1023を指定することができますが、値/1023の比率でonになっている時間が長くなります。0を指定すればずっとoff、512なら約50%、1023ならonのまま、ってことです。

Tickerは指定した秒数ごとに指定した関数を呼び出してくれます。attachで有効になり、detachで無効になります。今回のプログラムではsetupであらかじめサインカーブを描くテーブルisinを作っておき、設定したミリ秒数毎にテーブルの値を出力することで滑らかに明るさを変化しています。実際にその処理をおこなっているのはwaveHandlerです。waveHandlerではwaveCountで示されるisinの値を各色ごとの直近の明るさ比率(gRGB)に補正して、RGBごとに位相を120度ずつずらして(i*MaxSinTable/3)出力しています。一個出力したらwaveCountに1を足して次の値を準備します。

ブラウザからのコマンドを受け付けるのはhandleRootです。最初の例で示したように引数は同時に複数指定することができます。何個引数があるかはserver.args()で知ることができるので、これでforループを回します。そして、「引数名=値」の形式の引数名に相当するargName(i)の最初の1文字だけを取り出し、値をarg(i)から取り出します。そして引数名として指定されたのがr, g, bならばそれぞれの明るさをセットし、wならば値をミリ秒単位の割り込み周期としてattachかdetachを実行します。wはトグル動作つまり呼ばれるごとにon/offを切り替えるので、tickerAttachedというフラグを用意して切り替えます。

サーバのルートが呼ばれたらhandleRootを呼び出すということは、setup()の中で
server.on("/", handleRoot);
と指定しています。

…楽だわー。Play! Framework並にラクだわー(すいません、仕事でstruts2などという化石の干物を腐らせたようなライブラリを相手にしているので、つい愚痴が)

なお、handleNotFoundはサンプルのままです。ブラウザから例えば
http:<server>/foo?tare=panda
と呼び出すと、画面上には
File Not Found

URI: /foo
Method: GET
Arguments: 1
 tare: panda

という表示が返ってきてソースと見比べながら引数などをどういう具合いに扱われるかがよくわかります。

また、setup()では
  server.on("/inline", [](){
    server.send(200, "text/plain", "this works as well");
  });
という記述もあります。この [ ]( ) { } は無名の関数で、別のところにhandler関数を書くかわりにここで簡単な処理をチャッチャと記述してしまうことができます。サンプルのように単純なテキストメッセージを返すならこれで十分ですね。

■ハードウェア■

素のESP-WROOM-02は配線が面倒くさいので、今回は自家製のESP基板を使いました。FTDIとRGB LEDを接続するだけなので素晴らしく簡単です。電源にも良い部品を使っているので動作も安定しています(だれも褒めてくれないので自分だけは自分に優しくしよう)。



ESPでのお約束なプルダウン / プルアップ抵抗などの他には、RGB LEDを接続するだけです。

RGB LEDは秋月の「RGBフルカラーLED 5mm4本足 OSTA5131」です。BlueとGreenのLEDは3.6v以上の電圧かけないと光らないのが建前なんですが、実際には3.3vでも結構明るく点灯しちゃうんですよね。なお、GPIOと直結するのはまずいので、220オームの抵抗を直列に入れてます。また、このRGB LEDはカソードコモンといってマイナスにつなぐ側が共通になっています。GNDと接続してください。その辺、ブレッドボードでつくると妙にでかくなってしまうので、aitendoのユニバーサル基板で作りました。
ああハンダ付けは楽しいw


■はまりどころ■

今回はなかった、と言いたかったんですが、実は解決できていない問題が1つ。このプログラムを起動して r=200&g=200&b=200&w=8 と暗め and ゆっくり目で動かしていると時々「パッ」と明るくなります。WiFiに関する機能を取り除いても起こりますが、明滅させないでいると起こりません。

明滅時にはanalogWrite命令で頻繁にPWMの出力幅を変えているのですが、実行のタイミングが悪いとHIGHがしばらく続いてしまうのではないかと思います。同じような現象はmbed / LPC1114FN28でも経験していて、この時はPWMの周波数を高くすることで回避できたのですが、Arduino IDE環境ではPWMの周波数を簡単には変更できないのでさてどーしたもんかしら。

■ソース■

というわけで、ソースです。

2015年12月27日日曜日

クリームハンダの寿命

リフロー用のハンダ、クリームハンダには寿命があります。微細なハンダ粒とフラックスからできているので、フラックスの影響でハンダが酸化したりフラックス自体の活性が低下するのが原因だそうで、物によりますが大体数ヶ月の消費期限が設定されています。

さて、我が家のクリームハンダ、買ってから18か月が経過しました。

さすがにダメな仕上がりです。



何かよくない微生物でも増殖しちゃったんじゃないか?というレベルでタチの悪そうなハンダボールが多発していて、買ってきた頃と比較すると明らかに状態が悪化しています。何より、今回の基板はリフローしただけでは動かず、溶剤で基板を洗ってハンダボールを除去した後ハンダゴテで補修してようやく動きました。リフローした意味がないw

徐々に悪化したのであまり気にしていなかったのですが、振り返ってみると健全に使えたのは購入後半年ぐらいだったかなと思います。

安いものならebayで送料無料の数百円(ビンに入ったペースト)から、高品質だけど高いサンハヤト製品でも1300円(注射針なしのシリンジ入りハンダのみ)〜3000円(ハンダ入りシリンジ、注射針、吸取り網、固定用接着剤などのセット)で買えるものなので、今後は3-6か月ぐらいで新しいのに交換していこうと思います。

なお、サンハヤトの「表面実装部品取り付けキット SMX-21(共晶ハンダ) / SMX-51(鉛フリー)」「特殊クリームハンダ SMX-H05(共晶ハンダ) / SMX-B05(鉛フリー)」は、門田無線さんで買うと便利です。通販ならクール宅急便で届きますし、あらかじめ連絡して代金を振り込めば取り寄せして店頭で入手することもできます(消費期限のある商品なので、お店にご迷惑をおかけしないようにしましょう)。

廃棄方法はお住いの自治体の指定に従ってください。

2015年12月26日土曜日

ElecrowにPCB Assemblyを頼んでみた


基板だけなら今までにも何度かElecrowに発注したことあるのですが、今度は部品実装まで頼んでみました。

大まかな手順は以下の通り。
  1. 何はともあれ回路・基板を設計する
  2. PCB Assembly注文ページのリンクから、まず先方に連絡を入れる。
  3. 担当者がアサインされてメールが届くので、その指示に従い、ガーバー、部品リストなどを送って見積もりを出してもらう。部品リスト(BOM)は、以下のように分けて記載します。記入例はElecrowパーツリストライブラリのExcelファイルに同梱(別シート)されています。
    • Elecrowの部品リストに掲載されているもの
    • Digi-key / Mouserなどから入手可能なもの
    • 日本から送るもの
  4. 先方から見積もりが届く。今回、10個,50個,100個で見積もってもらいました。
  5. OKなら、PCB Assemblyのページから支払いをする。PCB Assemblyは単価$1なので、金額分の数量($100なら100個、分かりやすい)を注文する。
  6. 日本から送る部品があるならば、とっとと送る。
  7. 到着を待つ
こんな感じです。最初に連絡を入れてから1日かかりませんでした。注文には最低数量の制限はありません。また、パーツを基板の上に乗せるためのparts mappingを用意する方法がわからなかったので質問してみたのですが、特に何も言われませんでした。

今回お願いしたのは5x5cmほどの両面基板10枚、主要なパーツは日本から送り、RCとLEDを先方のパーツリストから選んで全部ひっくるめて$80でした。とても安いです。

さて、秋月で部品を買ってこなくちゃ。届いたら、また報告します。

■追記(12/30)■

中国への部品発送にはEMSを使いました。通常の発送伝票の他にInvoiceの記入が必要です。なおシンセンへの送料は秋月箱300g以下で900円でした。ご参考まで。

■追記(2016年)■

10日ほどで届きました! 仕上がりは大変キレイです。プリントの掠れもズレもなく、ハンダは輝き1つずつ静電気防止袋に収まって届きました。

で、その後何回か注文しましたが、シルク印刷については当たり外れがあるようです。

グリーンのレジスト+1.6mm厚については、今まで外れたことがありません。しかし、それ以外の色については、ズレたり掠れたりすることがあります。Elecrowは緑以外を指定しても追加料金を取られないのですが、やはり緑1.6mmが一番安定しているかもしれません。

赤や1.6mm以外の基板を指定する場合には、少し割高になりますがpremier PCBを指定することができます。割高といっても100枚作って20% upって感じです。premierだと24milの文字でも潰れずにプリントされます。

あと、ガーバーとBOM(パーツリスト)はくれぐれも正確に。間違えていた場合でも先方から「これはどうなってんの?」と問い合わせが来ることはなく、そのまま生産されてしまいます。

なので、初めての場合はまず最初に少量生産してもらって様子を見る方が安全です。例えば基板を100枚注文して部品を100個発送しておき、「最初に10個だけ作って日本に送ってくれ。よければ残りの90個も生産」というオーダーも可能です(最初に基板100枚分と製造費10セット分を支払う。OKなら90セット分の製造費を支払う)。もちろん、その場合の製造手数料($10)と送料($15〜)は2回分になりますが、そこは部品をパーにするリスクと天秤にかけてご検討ください。

そんなこんなで、premier PCB + PCB Assemblyで注文したモジュール、スイッチサイエンス様から絶賛発売中です :-)


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年11月15日日曜日

Solidarite


人は愚かだ。

しかし、英知は何物も乗り越えることができる。


mbed, LPC1114FN28使用。ライブラリはJacob Bramley氏のPixelArrayを使用しました。

Thanks, Jacob!

このライブラリはBurstSPIを利用しています。SPI/MOSI端子を出力ピンとして使用し、WS2811/2812のDin端子と接続してください。Din信号は周波数特性に敏感なので、なるべく配線を短くしてつなぎます。誤動作するとLED全点灯側に振れますので、電源がヤバいです。配線を長くしなくてはいけない場合は両端にSN751768などを入れてRS485信号に変換し、ツイステッドペアのシールド線で配線すれば少し安心だと思います。

今日の秋月:NchMOSFET 2SK4033 (60V5A) (5個入)

(秋月のサイトから)

Nch MOSFET 2SK4033、本当に今のMOSFETはVth低くてもRds小さくてスゴいですね(データシートから転記)

  • Vdss 60V
  • Vgss ±20V
  • Rds 0.07Ω
  • Id 5A
  • Pd 20W
  • Ciss 730pF
  • Coss 95pF
  • Crss 60pF

Arduinoはもちろん、mbedからでも十分スイッチできます。電子工作の定番MOSFETの2N7000とは桁が違う(秋月のサイトから引用)

  • VDSS 60V
  • VGSS ±20V
  • RDS(ON) 標準1.8Ω 最大5.1Ω(@VGS=4。5V)
  • ID 200mA
  • PD 400mW
  • Ciss 標準20pF 最大50pF
  • Coss 標準11pF 最大25pF
  • Crss 標準4pF 最大5pF


値段もあまり変わらないし、もう2SC1815や2N7000は買わなくて良いんじゃね?と思うくらいなのですが…2SK4033の方が入力容量がデカいので、マイコン直結だと高速でスイッチングするのは厳しいですね。

ところで、表面実装部品を直接ピンヘッダにハンダ付けして使うのがマイブーム(笑)なのですが、2SK4033は表面実装だけど端子間隔が2.54mmなのでピンヘッダに直接ハンダ付けするのが楽だし、そうすれば普通に使える。

よし何個か買って置こうか…と思ったのですが。

電気的特性の同じ2SK4017↓を買えばいいんだよな、と直前に気づきましたw

NchパワーMOSFET 2SK4017(Q) (60V5A)

2015年11月14日土曜日

今日の秋月:DS1307 I2Cリアルタイムクロックモジュール(RTC)

(秋月のサイトより)

サインスマートのI2C接続RTCモジュール、750円。

RTCのDS1307と32kbitシリアルEEPROM 24C32と電池ホルダーを一つにまとめたモジュール。5V版。

自分でデジタル時計を作る時にはDIP版のDS1307+をよく使います。外付けなしで動いて値段が手頃でI2Cの扱いも簡単、何よりバックアップ電源端子が別になっているのでリチウム一次電池を直結するだけでバックアップできて便利なんですよね。このモジュールには充電回路もついているのでどっちにしろ気にしなくて良いですが。

1307に限らないですが、RTCは通電当初はあんまり精度が良くなくて「まぁ…値段相応かな」と思うんですが、数日経つと普通のクォーツ程度の精度に落ち着いてきます。

あ、今気づいたけど、このモジュールって温度センサーDS18B20用のパターンもついてるんですね。ただ、DS18B20は別売り。I2Cとは別に1 wireで接続する必要があるので、温度計が必要なら少し高いけど湿度も測れるHDC1000を使った方が良いんじゃないかなー。熱慣性小さくて好き。

今日の秋月:液晶表示ミニ周波数カウンター(1MHz~500MHz)

(秋月のサイトより)

サインスマート製で006P電池と同じようなサイズの周波数カウンター、2750円。

私が電子工作に興味をもった小学生の頃(うわ40年前だ)、テスターは持っていましたが、周波数カウンターは超憧れの計測器でした。当時いくらぐらいだったっけなぁ。10万とか30万とか、とにかく小学生には雲の上というか銀河系の外レベルの話でした。それも一番安いやつは30Mhzが上限。

これは2750円で500Mhzまで計れちゃうんですね(遠い目

// 「今日の」には多少の誤差を含みますw

2015年11月13日金曜日

自作補聴器への樹状迷路orz

(秋月電子通商のWebより)

おお、こんなのがあるんですね(上写真および下記仕様は秋月電子通商のWebから)。

オーディオコーデックIC VS1063A
  • 対応方式:MP3/AAC/WMA/FLAC/Ogg/G.711/G.722等
  • 低消費電力DSPコア(VS_DSP4プロセッサ)搭載
  • マイコン制御またはスタンドアローン動作でMP3録音/再生をワンチップで簡単に実現できます
  • ストリーミング対応
  • ライン入力(2ch)/マイクアンプ(1ch)/ヘッドフォンアンプ(ステレオ)内蔵
  • LQFP48(48ピンフラットパッケージ)
  • DAC分解能:18bit(2ch)
  • ダイナミックレンジ:100dB ・SN比:94dB
  • エンコード:MP3、Ogg Vorbis、RIFF WAV
  • デコード:MP3、MP2、Ogg Vorbis、AAC、WMA、FLAC、RIFF WAV
  • GPIO×12、UART、SPI Bus、I2C ・トーンコントロール(低音/高音)、イコライザ(5バンド)

オーディオ機器、例えばMP3プレイヤーなんかをワンチップで作れちゃうチップ。

デジタル信号処理音痴でアナログ音痴の私が補聴器を作ろうと思って今ひとつすっきりいかないのが多チャンネルのイコライザとアンプ系なのですが、「マイクアンプ」「イコライザ(5バンド)」「ヘッドフォンアンプ」などが揃っているので、あとはFFTで帯域ごとのパワーを求めてイコライザを制御すれば、補聴器の基本機能である帯域ごとの圧縮・増幅、なんてのがサクっと出来てしまいます。

しかも600円で低消費電力。うは。

…なんてことばかり考えていると、ぜんぜん進まないし中途半端に試作をしたチップやモジュールやボードの山ができるだけです。

まずSTM32 F7を何とかして、次にMSP432R401をどうにかした後で、VS1063Aで何かプログラムをビルドできてから買おう。

2015年11月11日水曜日

「机ドン!」検出デバイス改良@Arduino


■暫定仕様でした■

前バージョンは「とりあえず動けばいいや」で、各軸どれかがボリュームでセットした値を超えたら2段階の明るさでランプを明滅させる、という安易な仕様でした。

これだと一度、例えば閾値ギリギリの信号で点滅が始まるとその後に強い衝撃が来ても無視されてしまいます。幸い、滅多にそういうケースはないのですが、可能性としては排除できません。

■改良版■

まず、加速度を各軸ごとの値ではなくスカラー値として処理します。各軸値自乗の総和の平方根ですね(sqrt(x*x + y*y + z*z))。スカラー値はセンサーの向きが変わっても一定のはずなので、起動時に値を保持しておけば、あとは初期スカラー値と瞬間のスカラー値の差をとれば、どの方向であれ掛かった加速度の大きさがわかります。なお、255を超える値を自乗した時に整数だとオーバーフローしてしまうので、floatに直しています。

それと、少し簡略版ですが、加速度の最大値でランプのピークの明るさを決めるようにしました。ピークかどうかを検出するのは、一定の時間ごとにサンプルした今回の値が前回の値よりも下がったら前回がピークだった、ということになります。本当ならそのピーク値が前回のピーク値より上かどうかを調べれば、大きな山から下っていくところに出来た小さなピークを誤認することがなくなるのですが、今回は「ドン!」という比較的単純な衝撃の検出なのでそこまで凝ったことはしませんでしたm(_ _)m 

この辺は本当にこり始めるとキリがないですし、味付けというか装置の賢さを感じる要素だったりするんですが…とりあえず週末までに何か考えます。

なお、ハードウェアには一切手を加えていません。

■結果■

以下2点の問題が解決しました。

  • 水平に置いて起動した後、傾けて置いても点滅しっぱなしにならない。
  • 大きな衝撃を与えた場合にきっちり強くランプが点灯する。

■ソース■


2015年11月10日火曜日

mbed最強:STM32 F7 Discovery



Cortex-M7@216Mhz、64Mbit SDRAM、という基本スペックもスゴいけど、個人的には液晶がタッチパネル付き、それもコストの高い静電式ってところに萌えます。

シリコンマイクも2個搭載しているので、そのままレコーディング可能。ライン入出力あり、コーデックはハイレゾにも対応。



ないのはWiFiとBluetoothぐらいだけど、EtherついてるしUSBも3ポートあるからどうにでもなっちゃう(はず

とりあえず、各種搭載モジュールについてはmbed用ライブラリが提供されたみたいだし、…これで補聴器作れなかったら、技術屋の看板下ろすわw

MSP432R401も忘れてませんよw
#でもマイクやアンプ壊したりでなかなか進まないのよ@アナログ音痴

2015年11月8日日曜日

「机ドン!」検出デバイス@ESP-WROOM版



■ESP版■

というわけで前回のArduino版をESP-WROOM-02でも動かしてみました。

AdafruitによるWS2811最新版ライブラリはESP8266にも対応しています。

ただ、うちのWS2811がNeoPixelではなく安物なのがいけないのか、指示した通りに光ってくれません。Greenだけは良い感じなんですが、Red/Blueについては意図した信号になっていません。トランジスタで3.3->5vへのレベルコンバータをはさんでみたのですが変わりませんでした。うーん。

400khzに切り替えても同じ。うーん。

光り方をみていると最上位ビットがズレているような感じ。

ということでLEDの点滅が意図したパターンとは違いますが、ESPでも動作させることができました。加速度センサーの値に応じてLEDを点滅させるところまではArduino版と同じですが、1分ごとにThingSpeak.comあてに各軸ごとの最大加速度を送信するようにしました。

■配線など■

相変わらずプルアップ/プルダウン/GND接続が多くて面倒くさい。

ESP-WROOM-02接続先
3V33V3
GND(すべて)GND
EN10kΩ経由で3V3
IO14ADXL345のSCL
IO12WS2811のDin
IO13N.C.
IO1510kΩ経由でGND
IO210kΩ経由で3V3
IO010kΩ経由で3V3 およびISPスイッチ※
IO16N.C.
TOUTN.C.
RST10kΩ経由で3V3 およびRSTスイッチ※
IO5N.C.
TxdFTDIのRxへ
RxdFTDIのTxへ
IO4ADXL345のSDAへ

※ISPスイッチ/RSTスイッチはノーマリーオープンのタクトスイッチで、他方をGNDにつないでください。これによりRSTとISPは常時Highレベルでスイッチを押した時にLowレベルになります。

レベル変換回路はこちらのページ(3.3V 5V レベル変換)に記載されていた「3.FETによる3.3V 5Vレベル変換」と「4.トランジスタによる3.3V 5Vレベル変換」回路を試しました。このページ上の写真にうつっているのはトランジスタによる回路です。なお、WS2811の場合は流れ込む電流が多いのか5V側のプルアップ抵抗は10kΩでは電圧が上がらなかったので1kΩを使いました。出力側の回路に応じて使い分ける必要があります。

それとFTDIを接続する際には、GND同士の接続をお忘れなく。

ADXL345接続先
SCLESPのIO14
SDAESPのIO4
SDOGND
CS3.3v
Vs3.3v
GNDGND
Vdd3.3v

WS2811接続先
DinESPのIO12
Vcc5V
GNDGND
DoutN.C.

M78AR033-0.5接続先
Vin5V
GNDGND
Vout3V3ライン

この他、ESPの3V3近くとADXL345のVccに0.1μFのパスコン、WS2811のVccとGNDの間に470uFのアルミ電解コンデンサを入れてます。

■ADXL345ライブラリの修正■

Android Citiさんのライブラリは Wire.begin(); でI2Cを初期化しているので、これを接続したピンに合わせて Wire.begin(4, 14); に変えます。ただそのままだと後日このライブラリをArduinoで使った時に動かなくて苦しみそうなので、
#ifdef ESP8266
  Wire.begin(4,15);
#else
  Wire.begin();
#endif
と書いておきます。

■ソース■

Arduino版との違いはボリューム読み込みをしていないのとThingSpeak.comへの送信処理を行っている点です。ThingSpeakへは1分ごとにその間の最高値を送るようにしています。

ESPからThingSpeak.comへの送出には鳩退治デバイスに使ったsendなどの処理をほぼそのまま使ってます。楽だわー。


2015年11月7日土曜日

「机ドン!」検出デバイスw


■追記■

ESP-WROOM-02にも対応しました(リンク)。

■原因はWindows/Excel■

どっちも嫌い。Excelは使い慣れているGoogle SpreadsheetやNumbersと比べてUI特にモード遷移が不自然で違和感の塊だし、ASCIIキーボード愛用マカーなので日本語切り替えキーが変なところにあるのもイヤ。

そんなこんなで職場でのイライラは募るばかり。

そのせいか、ついついキーボードを「バン!」と叩いていたようで、同僚氏からクレームが来ましたです。辛く当たってごめんよ、Apple Wireless keyboard(自腹購入)。

しかし、気をつけていても直らず。

ということで、振動を検出・通知するデバイスを作りました。

■仕様■

手っ取り早くArduino nanoと加速度センサーADXL345マイコン内蔵LEDを使う。

一定以上の衝撃を検出したら、各軸に対応した色のLEDをペカペカ点滅させる。「一定以上」の値についてはボリュームで設定する。

手持ちで単純なRGB入りLEDもあるのでシリアルRGBを使う必要はないんだけど、当初ピンの少ないESP8266上で動かそうとしていたのです。しかしArduino用ライブラリでは動いてくれないので挫折、nanoにしました。

初めての秋月版、きれいにまとまったのに
なお、上の写真でADXL345(赤い基板)のハンダがすごく汚いですが、これは電子工作を再開した直後に作ったもの。隣の秋月ESPに免じて許してやってください。少しはきれいになったのは昔の勘を取り戻したというのもあるけど、大きなものでもルーペ使ってハンダ付けするようになったのが大きな要因だと思います。

■接続など■

Nano接続先
3.3v出力ブレッドボードの+ライン
GNDブレッドボードの-ライン
5v出力マイコン内蔵LEDのVdd
D2マイコン内蔵LEDのDin
A4ADXL345のSCL
A5ADXL345のSDA
A610KΩ半固定抵抗の真ん中

ADXL345接続先
SCLArduino A4
SDAArduino A5
SDOGND
CS3.3v
Vs3.3v
GNDGND
Vdd3.3v

その他、半固定抵抗の一端をGND, 他端を3.3v、マイコン内蔵LEDのGNDをGNDに接続します。あ、またパスコン入れ忘れた。

標準のArduinoだとA6って使えないんでしたっけ。その場合はA0-A3どれでも結構です。そしてソース上のanalogReadで指定しているピン番号をそれに合わせて変えてください…A0の場合は14です。

nanoではなくnanoパチ

■ソフトについて■

ADXL345のライブラリはAndroid Citiさんのライブラリ、マイコン内蔵LEDについてはAdafruitさんのライブラリを使用させていただきました。ありがとうございます。

あ、そろそろ年末だからAdafruitさんに何か注文しなきゃ(注:いつも同社が提供しているライブラリを他社製品でばかり使っているので、年に一度お礼代わりに何か買うことにしています)。

コードはsetupで各デバイスを初期化、点滅に必要なサインカーブ用テーブルを用意、装置の傾きなどを補正するために各軸からの値の平均値を取ってます。loopはぐるぐる回りながら加速度を読み込んで初期値との差分が一定値を超えていたら点滅用のカウンタをセットし、あとはカウンタをインクリメントしながら各軸の値をテーブルに従って変えています。無駄な演算多いけど許してください。

うーん、本当は「ドン!」のピーク値を算出し、それを元にして最大照度などを決定すべきなんですが・・・面倒くさいからやってません。また、現在は加速度で検出していますけど、重力加速度の影響で傾けたりしても誤動作してしまいます。それこそ毎度お馴染みFFTを実行して数Hz以上の加速度成分が一定値を超えたら作動する…って処理にすれば完璧だと思いますが・・・・面倒すぎるのでやってません。


2015年11月5日木曜日

表面実装立体化シリーズ:MOSFET

老眼鏡でも見えない件

最新のMOSFETはすっごいですよね。毎度お馴染みの2N7000あたりと比べるとオン抵抗、スイッチング速度、ドレイン電流、どの特性も一桁違う感じです。

しかし、残念ながら新しいのはみんな表面実装か大型パッケージ。

というわけで、またピンヘッダに直付けしてみましたw

以前のチップ抵抗/コンデンサは大変うまくいったのですが、今回は2個つくるのに30分もかかりました。最初はピンヘッダを内側にまげて、GDS配列のまま取り付けようとしたのですが、どーにも細かすぎて私のスキルでは無理。

なので、1と2を隣接するヘッダにハンダ付けし、3はジャンパで飛ばしました。試してみたらちゃんとスイッチングしているので、一応生きてはいるようです。

ちょっとゴツいけど、初期の点接触トランジスタみたいでちょっと萌えるw

ブレイクアウト基板ならもう少し簡単だけど、ディスクリート部品にはちょっと大げさになってしまうので、こういう作業を簡単にできるブレイクアウト・ピンヘッダみたいなのがあれば、それなりに売れるんじゃないかな。

おお起業ロマン!…と一瞬思ったのですが、こういうプラスチック型が必要で初期投資大きく、単価が安いものはリスクが大きいよね。

夢は見ないで大人しく寝ます。みなさんも良い夢を。

2015年10月28日水曜日

電子工作でのモバイルバッテリ利用について

今はなきエネループのモバイルバッテリKBC-L3、電子工作で手軽に使えて便利です。わりと安定した5vが出てくるしコンパクトだし。

電子工作の電源としてもっと普及しそうなのに、あんまりネタを聞かないなぁと思っていたのですが…新しくもっと大容量のモバイルバッテリを買ってその理由がわかりました。

エネループのモバイルバッテリは最低5mA流せばパワーオフしないのですが、新しく買った方は100mA流しても切れてしまいます。間欠利用でも500mA以上の電流を2秒流して8秒止める、ぐらいのパターンでないと切れます。

うーん、「大容量だから長時間もってくれるよね」って期待したのですが、甘かった。

このモバイルバッテリどうしよう。最近のスマフォ(iPhone6s plusに変えました)は電池切れないので、外付けなんて使わないし。

…と言っていたら、先日使う機会がありました。iPhoneを充電し忘れていて残量30%で家を出なければならなかったのですが、職場ではMacにデバイスをつなげられないので会社でモバイルバッテリから無事充電できました。

ちっともモバイルじゃないな…。

2015年10月25日日曜日

iPhoneアプリを考えてみた。

Beaconなどを使ってお互いの信号強度だけから相手の位置を求められないかと思って考えてみました。

アルゴリズムとしては相互の距離だけがわかっているn個の点について、二次元座標上のそれぞれの位置を求めなさい…っていう問題ですよね。

そんなに精度は期待できないしn=10ぐらいまでなら総当たりで一番確率高いのを正解とする、のも不可能ではないかと思って計算してみました。

えーとメッシュの交点が1000箇所あるとして、それぞれに10個を置く(重なる場合もあり)わけだから…1000x999x998....990=およそ10^30でえーと1回の演算が0.1μ秒として10^23秒。宇宙の年齢の10^6倍。

ちょっと遅いですね。もう計算が1-2桁違ってても気にならないレベルw

メッシュを減らしてから絞り込まないとどうにもならない。とはいえメッシュ100個でも約10^20秒なのでiPhoneが電池切れするどころかリチウムが半減期を迎えるレベルじゃないかな(リチウムの半減期がどのぐらいだか知らないけどさ)。

うん。無理。

計算の途中で「あ、この組み合わせはないわ」というのは比較的早くわかりそうなので、ここまでスゴいことにはならないかもしれないけど。

なお、以上は電卓でざっと叩いて検算もしていませんが、多少桁が違っていても宇宙的尺度からすれば大したことではなので、お気になさらないでください。

なお「あれ、順列と組み合わせのどっちだっけ?」とさっきから考えているのですが、間違っていても10!=6桁違うだけでたいしたことではありませんw

2015年10月24日土曜日

鳩対策2号機(動きモノ


学習能力のあるカラスは電撃一回で来なくなったようですが、鳩は電撃で対策した柵には寄りつかなくなったものの今度は室外機の上に来るようになりました。

ということで、今度は、光り物と動き物で脅かす作戦にしました。やつら「実害」がないとダメなので、当初は電極を振り回そうかと思ったのですが、製作中に私が「実害」を受ける未来しか浮かばないので保留。

■仕様■

まず使用機材:
  • 動作状況をモニタできるようにESP8266を使用
  • 動きモノはサーボモータSG90
  • 光りモノは赤色LEDを直接接続
  • 鳩検出はPIR
  • 動作状況の記録にはThingSpeakを使用
動作仕様:
  • PIRで何かを検出したら時計をセット
  • 時計がセットされていたらサーボ腕を振り回しつつLEDを点滅させる。5秒経ってもどかなければ、LEDの点滅を激しくする
  • 何かがいなくなったら、サーボとLEDを止めてから何秒とどまっていたかをThingSpeakに送信
  • それとは別に1分ごとに気温と湿度をThingSpeakに送信する

■ハードウェア制作■

ESP8266/ESP-WROOM-02の電源を甘く見てはいけません。最終的に毎度お馴染みの「超高効率DC-DCコンバーター(3.3V0.5A) M78AR033-0.5」を使い、アルミ電解コンデンサ470uF + タンタル4.7uF + 積層セラミック1uをブレッドボードの3.3v電源ラインに並べ、ESPモジュールの上、Vcc - GND間に直接積層セラミック0.1uをハンダ付けして、安定動作させることができました。VccとGNDが離れているのでパスコン付けにくいんですよね…。ロットでの差異や個体差もあると思いますが、ここまでやれば起動直後にドーンと電流食われてもだいたい安定します。

サーボモータはIOピン直結、LEDはVfの実測値1.8vだったのでESPのIO定格値12mAを超えないよう150Ωの抵抗を入れて制限します。

HDC1000は秋月のプルアップ抵抗内蔵モジュールを使いますので、電源とI2Cを接続するだけでOKです。

PIRはHC-SR501を使いました。アマゾンでも秋月でも入手できます。このPIRは4.5vから使うことができます。秋月では5-12vと書いてありますが、他サイトでは4.5-12vになっていて、実際に試しても5vで問題ないようです。SE-10のように5vって書いてあるけど5vで使うとしばらくして不安定になる、ということはありません。以下配線表です。


ESP-WROOM-02モジュール接続先
1Vcc3.3vライン
2EN10kΩを通して3.3vラインへ(プルアップ)
3IO14HDC1000のSCLへ
4IO12150Ωを介してLED1へ
5IO13150Ωを介してLED2へ
6IO15N.C.(無接続)
7IO2プルアップ
8IO0プルアップ
スイッチを通してGNDへ
9GNDGNDへ
10IO4HDC1000のSDAへ
11RxDFTDIのTxへ
12TxDFTDIのRxへ
13GNDGNDへ
14IO5N.C.
15RSTプルアップ
スイッチを通してGNDへ
16TOUTN.C.
17IO16SG90の信号線(オレンジ色)
18GNDGNDへ


この他、各モジュールには電源を接続します。HDC1000はモジュールに書いてある通り、PIRはここがわかりやすいです。サーボはこちらを参考にしました。

PIRは感度と出力秒数をボリュームで、ジャンパで出力モードを指定できます。感度ボリュームは検知範囲の指定ですが、人間よりも小さい鳩が対象なので最大(7m程度)にします。出力秒数は動きが検知されなくなった後何秒ぐらい出力HIGHをキープするかを設定します。よくある侵入警告灯などで使う機能ですね。これは居なくなったらできるだけ早く消えて欲しいので最小にします。ジャンパは信号出力中に動きを検知した場合に点灯時間を延長するか最初の検知から指定時間を経過したらその間動きがあってもOFFにするかを切り替えます。内側は動いている間はずっと出力、外側は指定時間でOFF。今回は鳩の滞在時間を調べたいので、内側にします。上記の通り出力が延長されてしまうので正確な記録にはならないのですが…まぁ傾向はわかるかなと。

■ThingSpeakすげえ■

今回、ThingSpeak初めて使ったのですが、こういうWebサービスの中では今までで一番簡単でした。開発中、「そろそろThingSpeakへの書き込みコードを用意しておこう」と思ってコピペしてAPI KEYや変数などを書き換えてそのまま放置していたんですが、画面の隅で何か動いているものがあるなと思ったらThingSpeakのグラフでした。これだけでグラフになっちゃったのは初めてです。いやー、恐ろしい。

なお、ThingSpeakへの書き込みコードはここからコピーしました。ありがとうございます。Particleも良いんだけどね…I2Cが動かないのと何よりも技適がないのでどうにもなりまへん。

■ESPをArduino IDEで使う場合のピン番号■

動かしたヒトならみんなご存じだと思うのですが、探しても明記しているページが出てこなかったので書いておきます。

Arduino IDEでpinmode, digitalOutなどを使い場合に指定するピン番号は、ESPのIO4, IO5などと書いてある数字を使います。物理的なピン番号ではありませんのでお間違いのないように。

■ハマり所■

  • 上にも書きましたが、ESP8266の電源はちゃんとインピーダンスを下げないと暴走します。それもArduino IDEが書き込み終わった直後に暴走(電解コンデンサ追加で改善)、動作するけど数分で止まる(タンタル4.7uF追加)、数十分で止まる(パスコンを基板上に直接ハンダ付けで改善)…と対策をすれば良くなりますので、安定して動作しないとお悩みの方はお試しあれ。
  • Arduino HDC1000ライブラリはそのままでは動きません。Wire.beginでSDL, SCLのピン番号を指定する必要があります。HDC1000.cppのコンストラクタでWire.begin(); を Wire.begin(4,14); にします。
  • 存在しないIO番号、例えば6を指定すると、Arduino IDEではエラーになりませんがpinmodeなどを実行した際にExceptionが出ます(シリアルコンソールにメッセージが出ます)。
  • サーボモータを使うのはこれが初めてです。サーボモータは0-180度で動作するとのことなんですが、激安サーボとして有名なSG90は45-135度ぐらいしか動作しませんでした。その範囲外を指定すると唸り始めます。5個買ったうちの2個が同じ状態だったのですが、そういうもの?
  • サーボモータをつないだままにしておくと信号が一定でもピクピクもぞもぞ動いていますが、これを止めるにはdetachします。使う時にまたatachします。消費電力の節減にもなります。

■ソース■

より高い威嚇効果を求めて複雑な動きをさせたら腕の動きが激しくなったときにサーボがモゲそうになったので、単純な動きにしていますが…RTOSあたりをつかって、ちゃんと加速度制御を考えた上で複雑な動きをさせたいものです。


2015年10月18日日曜日

鳩撃退装置作動中


赤はパイロットランプ兼モバイルバッテリ起床用、青は高電圧発生中ランプ。コンビニ袋に入れて、PIRセンサーは左側を向いている。

赤LEDは昼間でも明るく見えます。そのせいか、これを置いてからまったく鳩が来なくなりました。喜ぶべきことなのですが、痛い警告を与えるための散々苦労して作った高電圧発生装置がまったく機能していないのは寂しいorz

2015年10月16日金曜日

ものすごく久しぶりにユニバーサルボード使った

ほこりが…。
PIRでMOSFETをスイッチして、別に作った高圧発生回路の電源をon / offしているだけですけどね。

裏面
なお、PIRだけだと消費電流が少なすぎてモバイルバッテリが勝手に切れてしまうので、赤LEDを付けました。モバイルバッテリを寝かさないためには5mA程度流さないといけないのですが、今時の赤色LEDは5mAも流すととても眩しい。

困ったことに、動作確認用のランプ(青)がまったく目立たなくなってしまいました…。


2015年10月9日金曜日

ESP-WROOM連続稼働実験

ESP-WROOMの電源についての続き(前回)。

サイズの割にスゴいピーク電流が要求されるESP8266/WROOM-02、我が家での実験では普通の三端子レギュレータだと最大でも10時間連続稼働が限界でしたが、三端子DC/DCコンバータだと余裕で100時間を超えました。

秋月のサイトから

電源として9V2AのACアダプタを使ってもシリーズレギュレータでは安定せず、USBの5Vからでも三端子DC/DCだと安定しています。

秋月にはこのDC/DCより30円安い「スーパー三端子レギュレータ」ってのもあるんですが、最高電圧が「スーパー三端子」は28vまでなのに対し「超高効率DC-DC」は32vまで使えるので、我が家ではこちらを常備しています。

一度「スーパー三端子レギュレータ」を24vACアダプタにつないでいたらサージで壊れたようで、それも短絡モードで破損したために私の部品在庫としては比較的高価な24Ghz帯レーダーなどつながっている回路数千円分を道連れにしてくださったという苦い経験もありまして…。

ESPの話に戻りますが、某林さんのところでは安定稼働させるべくAnalog Discoveryまで購入してキャパシタなどで低ESR化を図っておられるご様子…まぁ低ESRはオーディオ方面にも効きますよね。しかし、いいなぁ、Analog Discovery。

うちは未だにテクトロのSTamigoだ(って知っている人、いないだろうなぁw

2015年9月28日月曜日

32bit CPU搭載インバータ改良

iPhone6s plus、カメラの性能すげええ

前回はとりあえず20khzで発振して、ボリュームに応じてデューティー比を変えるだけで32bit CPU Cotrtex-M0をまったく活かしておりませんでした。

今回は、少し仕事をしてもらっています…とはいえ、8bitどころか4bitで十分なレベルなのですが。

■仕様■

出力電圧をボリュームで設定できるように。

■実装■

メインループでは設定電圧と現在の電圧を測定し、その差でパルス幅を設定します。設定電圧以上なら出力をオフにし、設定電圧より低ければその差に応じてパルス幅を決めます。差が大きければ大きいほどパルス幅を広くしてインダクタンスに貯める電力を増やします。

その他、100m秒ごとに電圧設定のためのボリュームを読みに行きます。

■ハード■

前回はMOSFETとSBDの耐圧が限界となって電圧を上げられませんでした。今回は、耐圧500vのMOSFETと1000vのダイオード、それに400vの電解コンデンサを使います。

ただ、一つ問題があって、高耐圧のMOSFETはゲートがオンになる電圧も高く、今回使った2SK3234の場合は約5v以上必要です。そのため3.3vのLPC1114では直接ドライブできないので、小さなMOSFETを一段追加しそれでゲートを駆動します。電源電圧も5v以上必要です。何かすごーい遠回りをしているような気もしますが、気にしないで作ります。

あとどのぐらいの出力かを示すLEDと、出力電圧を測定するための分圧抵抗などを追加しました。

なおMOSFETが1個余計に入ったので、出力の論理が反転しています。つまり、mbedから「1」を出力するとパワーMOSFETがoffになります。そのためにPWMへの出力では 1.0 - width としてデューティー比を反転させています。


■mbedのPWM■

当初はボリュームでPWM周波数を変更できるようにしていました。インダクタンスを使っているので、どのぐらいの周波数でパルスを出力するのが一番効率が良いのかをさぐるためです。

で、100m秒ごとにボリュームからanalog inで読み取った値をもとにpwm.periodの値をセットしたのですが…これを行うとPwmOutの値を0にしていても100mSごとに出力がon / offする、つまり約5hzの太いパルスが出てしまいます。

設定電圧を0にしていても約40vの電圧が出てMOSFETがヤケに熱いので、何だろうと思ったのですが…ともかく回路が壊れなくて何よりです。

もう一つ、LEDをPWMで駆動しているのですが、当初まったく点灯しませんでした。これは、PWMの周波数がデフォルトのまま(約20m秒=50hz)なのにそれよりも早い周期でPWMへの書き込みを実行していたためです。ledに書き込みをしているループは1m秒で1回回りますので、それより十分早い10khzを出力するよう変更したところ、無事点灯しました。

いやはや…。

■動かしてみて■

設定電圧を急速に上げるとLEDが明るく点灯し、電圧が上昇して設定電圧に近づくとすーっと暗くなっていきます。逆に急に下げてやるとLEDはしばらく消灯した後、設定電圧に近づくとすっと点灯します。だいたい狙い通りです。強烈なノイズ発生源の近くにあるのでanalog inの値はそうとうバラついているはずで、安定しなければ移動平均処理を加えようかと思っていたのですが、なしでも安定してます。

時間積分効果とでも言いましょうかw

なお、こういう制御(PD)の場合、設定電圧よりも少し低いところで安定します。今回はボリュームを使っているので気にならないですが、電圧を数値で設定する場合にはそのための補正が必要です。

昔、Skycamという製品のためにモーターぶんまわし系の制御をしていた時にはずいぶん苦労したものです…(遠い目

なお、現在、出力値と電圧差の関係は単純な比例ですが、より安定かつスムーズな制御を行うためには二次関数式で比例させることもできます。つまり電圧差が少ないときには少しだけパルスを出して、差が大きい時はドカッと出すわけです(何その小学生なみの表現)。その先にはPID制御などが…ってキリがないw

電源電圧5vと9vで試しましたが、どちらも200vまできっちり上がりました。一応設定限度を200vにしているんですが、波形を見る限りもうちょっと上げられそうです。消費電流は多いですねぇ…9v電源から100vまで上げた時で70mA前後です。冬の太陽だと手持ちの0.5w太陽電池では無理で、2-5wぐらいのセルでないと安定して動かすのは難しいでしょうねぇ。大きいと風の影響なども考えないといけないし…ああどんどん違う方向へ(笑)。

■ソース■

特に珍しいことはしていません。このソースはフリーで公開します。つまり、何にどう使ってもいいですが、責任は問いませんよライセンスです。


2015年9月26日土曜日

さっそく「スライドでアップグレード」がorz

まだ希望に満ちていたあのころ…
iPhone6s Plusが届いて小躍りしつつ5sから長い時間をかけてデータの移し替えが終わった喜びも束の間、噂の

「>スライドでアップグレード」

が出たきり何の操作もできなくなる状態がやってきましたorz

ここに対処方法がいろいろ書いてあるんですが、どれもiTunesがデバイスを認識してくれるのが前提。だいたい、パスワード忘れたわけじゃねぇよ、そこの画面までたどり着かないんだこの馬鹿野郎!と罵っていたら、終わりの方に「リカバリモードで復元する」って項目がありました。


「iTunes と同期したことがない場合や、iCloud で「iPhone を探す」を設定していない場合は、リカバリモードを使ってデバイスを復元する必要があります。この手順を実行すると、デバイスのデータとそのパスコードが消去されます。」とのことですが、明日まで待ってAppleStore行くよりマシ。

というわけで指示の通りに押しっぱなしにしていると「iTunesとつなげ画面」が出ました。何とかいけそうなので指示通り進めます。この画面になったまま戻らなくて不安ですが、とにかく待ちます。ピザなんか頼んでしまったので、食べながら待ちます。


上記リンクには「15分でタイムアウトするから、何回も2-3の手順を繰り返せって書いてあるのですが、むやみに繰り返しても無意味です。iTunesの右上にダウンロードアイコンが回っていますので、これをクリックしてみてください。2GB以上をダウンロードしているはずです。なので、これが終わってから(私の場合は4時間でした)もう一度、スリープボタンとホームボタンの両方をじーっと押してアップルマークが出て、そのあと消えて「iTunes→」の画面になるのを待ちます。そして、iTunesの画面で「復元」→「復元&アップデート」を選びます。「iPhoneソフトウェアの抽出中」などがiTunes上に表示され、数分後、空っぽで9.0.1になったiPhone6sがあなたの前に。

あとは、うんざりですけど、もう一度、同期したり設定したり、お好きなように。

帰宅してからここまで、えーと、6時間か…長かった。

2015年9月25日金曜日

ブレッドボードも消耗品、なの?

こんなにあるのに何故すぎ消えるのか…ルパン三世じゃあるまいし

ブレッドボードは実験が終わったら再利用できるので、そんなに買わなくても。

…はい、そう思っていた時期が私にもありました。もう何だかだで30枚ぐらいは買っていると思うんですが…足りないんです。でも、作りかけ収納箱を見ても、ブレッドボードはそんなに多くない。

まるで水が砂に吸い込まれるように消えて行く…。

種島先輩と休眠中のRPi2を従えるBBB


まぁよく見ると、普通に実運用しているブレッドボードが眼の隅に転がっていたりするんですけどね。そういうのはユニバーサルボードに移すかプリント基板発注しなきゃと思うんですが、なかなか…。

ただ、ブレッドボードがないと、あれを試したいこれを作りたい、と思った時に腰が重くなってしまうのは間違いありません。

というわけで、また5枚買いました。ジャンプワイヤも高いヤツを各色ごっそり買いました(でも青は買いません…老眼で黒と区別がつかねえんだよ)。

これでしばらくは大丈夫だろう…と思いたい。

関係ないけどiPhone6s Plus届きました。でかい…早くも後悔気味orz

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調べたりするのが唯々面倒。


2015年9月22日火曜日

スペクトルアナライザー by MSP432P401R+Energia MT

ピンぼけじゃないもん影だもん(趣味:写真)

■Energia MT=マルチタスク■

EnergiaはArduino互換の開発環境ですが、MSP432P401R版はマルチタスクに対応しています。

マルチタスクというにはあまりにも単純でセマフォとかメールとかまったくありません。でも、今までのArduinoと比べれば格段に作りやすくなりました。

使い方は単純で

  • Energia IDEでタブを開き適当な名前を付ける
  • メイン同様setupとloop関数を用意するが、setupDisplay(), loopDisplay()のようにタスク名が後に続くようにするとsetup+loopのペアを別タスクとして認識する
  • メインに置いたヘッダやメイン上のGlobal変数は別タスクでも認識される

排他などについては厳密な排他制御は無理、暫定的にGlobal上にフラグを置いて自分で制御するしかありません。また、プリエンプションやタスク優先度がどうなっているのかも不明。その辺まったく情報がありません。まぁそのうち何とかなるでしょう。

ということで、とりあえず毎度お馴染みのスペクトルアナライザーをマルチタスクで作ってみました。

■材料

MSP432P401R、アンプ付きマイクAE-MICAMP、超小型グラフィック液晶AQM1284A、ブレッドボード、ジャンパ線…すべて秋月で揃います。合計4000円ぐらい? USBシリアルなども不要なのでArduino uno正規品を買うより安いです。

マイクはアナログ出力なのでドライバ等不要です。液晶についてはAQM1284AのコントローラIC ST7565RのライブラリをAdafruitさんが公開しているので、それを少し改造して使います。

FFTは大浦先生のライブラリそのままですが、M4F対応としてdoubleをfloatに置換して使用します。

以上です。

■配線■

マイクはGND, Vcc(5vが推奨されていますが出力電圧が大きくなりすぎるので3.3vにします)を接続し、OUTをEnergiaのP5.0に接続します。

AQM1284Aは以下の通りです。


AQM1284AEnergia MSP432P401R
VDD3V3
CSP3.0 / 18
RESETP2.5 / 19
RSP5.7 / 17
SCLKP1.5 / 7
SDIP1.6 / 15
GNDGND

■使い方■

各ソースは末尾に掲載します。長くてすみません。

Energiaは最新の16を使用してください。起動する前に、ST7565という名前のフォルダを作り、その中にST7565.cppとST7565.hを入れ、Energiaのlibraryフォルダに入れます。

Enegiaを起動したら、新しいプロジェクトを作り、FFTGraph_MTをコピペします。次に、ウィンドウ右上にある下向き三角をクリックして「新規タブ」を選び、TaskLCDという名前を付けてTaskLCDをコピペします(名前は何でも良いです)。

配線の点検をすませたらMSP432をマイクロUSBで接続し、Energiaでcmd+M、ビルドとプログラムの転送が終わるとグラフィック液晶に表示が出る…はずです。

なお、この作り方は厳密にいえば正しいマルチタスクではありません。TaskLCDが表示している最中にメインスレッドが表示バッファを書き換えてしまうこともありえます。でも、表示中にスペクトルが変わったとしても人間の目で追える変化ではないので、大目に見てやってください。

■毎度お馴染みのハマり■

Adafruitのライブラリの移植は、コンパイルエラーが出る→つぶす→ビルド→エラー→潰す…を淡々と繰り返すだけですが、それで終わらないのがコントラスト設定とpagemapでした。

コントラスト設定は秋月版との液晶の違いかAdafruit版だと真っ黒になってしまうのですが、Voltage Resistor Setを指定して回避できました。

pagemapはコントローラ上のページと液晶の表示位置を対応させるための表ですが、配布されているものと秋月のでは仕様が異なるようで、こんなのが出ました。左上隅から右下隅への直線がちょっと下にずれてます。64ドットで8ページ、たぶん2ページずれているのでしょう。


何度かの途中試行錯誤を経て

逆だ

なんだこれ

最終的にちゃんと表示が出ました。ここまで約1時間。



その次はマイクからの入力が常にゼロという現象が。そんなお行儀のいいアナログ入力はありえないのでしばらく頭を抱えていたのですが、これはanalogRead対応のピンにつないだつもりがanalogWriteのピンだった、というオチ。そりゃ値ゼロだわorz

FFTライブラリはつい最近使ったものなので問題なし。マルチタスク対応に関しては、奇跡的にも一発で動きました。何も難しいことしていないので当たり前ですけども、簡単なところで引っかかるのがこの私orz

でも、「自作補聴器」に今までで一番近づいたなぁ。すごいぞM4F、偉いぞM4F。