2018年4月29日日曜日

0603のMLCCを手ハンダ

56歳会社員です。秋月で0603(mm)のMLCCが発売されたので買ってみました。


いやー…ホコリですね。顆粒ダシより細かいっす。

普段MLCCを手ハンダ付けする時には逆作用ピンセットを使うのですが、先端太すぎてまったくつかめません。最初の1個はピンセットで掴みそこねて見事に飛ばしてしまいました。さすがのDUMONTでもダメ。安いHOZANの精密ピンセットをルーターで研磨してかみ合わせを調整してから使いました。いやー、ルーターはいい買い物でした。今まで研いだりするのは大の苦手だったんですが、持っているだけで水平垂直に研磨できるので、少し荒い道具を使いやすいように仕上げることもできます。


基板は手元にあったaitendoの0.6mmピッチSOIC用。例によってサンハヤトのクリームはんだを使います。0.6mm間隔で2つクリームを盛るなんてのは無理なので、設置場所の両端を覆うように1mmぐらいのハンダ山を作りました。しまった写真取り忘れた。

ルーペはヘッドルーペではなくアームルーペ(TERASAKI)を使いました。ハンダゴテはHAKKO FX-100です。

基板をマスキングテープ(3M)で固定してから、左手にピンセット、右手にハンダゴテ。ルーペでもほぼ見えませんw MLCCをクリーム山の中央付近で保持します。コテを基板に当て、少しずつクリームに近づけて行って、クリームが溶けたところでコテを離す。これを4方向から繰り返しました。

最後にUSB顕微鏡下ではみだしたところを修正したのですが…コテ太いw



洗浄したのがこちらです。容量を測定したら70nF程度(MLCCは直流では容量が減ります…秋月のWeb参照)で、損傷せずショートもせずに取り付けできました。


電子工作に復帰して初めて表面実装部品(2012)をいじった時は「わしら年寄りはどうすればええんじゃ…」と思ったもんですが、最近は「2012でけーw」とか言ってるんですから、人間は慣れるもんですね(しみじみ)。

2018年4月22日日曜日

セミナーの進行を止める老人、それが私

Fusion 360のセミナーに参加しました。良いセミナーでした(もう1日あるけど)。Fusion 360の操作感や3Dモデルを作っていく流れを習得できるのでみなさんもぜひ。操作も大事だけど流れはもっと大切です。

セミナーに参加するのは久しぶり。

こういう技術系ハンズオンセミナーでは、まず講師が操作をしながら説明をして、それから「では、一緒に操作してみましょう」という流れになる。

ただ、余裕をもって習いたいので、私は最初の説明を聞きながら操作をして「一緒に操作をしてみましょう」のところではメモなんかを書いていたもんでした。若い頃は。

ところが、今回、最初の操作で躓いた。自分が「ごく初歩的な操作で躓いて、セミナーの進行を止める年寄り」になってしまった。ショック。

何でだろうと思ったら、昔は操作しながらでも講師の説明が頭に入ってきたんですが、今は全然耳に入らない。「聞きながら操作」しているつもりがそうではなかった。

それに気づいてからは、ちゃんと講師の説明をガン見してから自分の操作をすることにして、なんとかついていけるようになったんですが(いや、3D CADのモード切り替えや選択方法の違いなどで戸惑うことはありましたが)…自分の老化にビックリです。

で、講師の説明を聞きながら周りを見ていると…毎回進行を止める人は、やっぱり講師の説明を見てないですね。たぶん御本人は、何で自分が操作をわからないのか、わかっていないんだと思います。

かつて自然にできたことができなくなっている、それは良くあることなんですが…できなくなっていることに気づかない、というのは怖いですね。

----

セミナー会場は南千住。遠いです。写真がないと寂しいので、ランチ写真貼っておきます。

ランチってか「やよい軒」ですけどね。かつてご飯を2杯3杯とおかわりしたもんですが、今は1杯でお腹いっぱい。


あと11:22に撮影した写真がこちらです。これで何度目だ。


2018年4月13日金曜日

ESP32+Mongoos OS、入れてみました。

まず、ESP-IDFが正しくインストールされている必要があります。

で、ホストMac/PCに環境を構築します。macの場合はターミナルに3行コピペするだけ。1分もかからず終了し、ブラウザにmongoose os環境が立ち上がります。

mongoose osは、ESP上で動くOS(FreeRTOSベース?)、JavaScriptランタイム、フラームワーク、それらと連携するMac/PC上で動くホストツールなどで構成されています。フレームワークはAWS, Google IoTなど各社クラウドサービスに対応していて、お手軽に使えます。

サーバとなっているツール部分がESPと通信しながら動いているので、ブラウザIDEなのにスタンドアローンアプリ形式のIDEと同様に使えます。例えば、こんなダイアログが出てくるので、ESP32 Dev-CモジュールをUSBに接続するとシリアルポートが選べます。選んだらSelectボタン。


次にプラットフォームと書き込むアプリを選んでFlash。書き込みが自動で始まります。書き込みが終わるとデモアプリ「demo-js」が起動して、じわじわとメッセージを流してきます。


このあとSet WiFiで使用場所でのSSIDとPasswordを設定してSetボタンを押せば接続完了。

楽だなー。ESP32用の開発ツールとして一番よく出来ているかも。

JavaScriptとC/C++も簡単に連携できるし、しばらく遊んでみます。ずっと保留したままになっているニキシー管時計、これで作ってみようかしらw

ESP32 + VisualStudio Code + PlatformIO

マカーだけどいろいろあってVisualStudio Codeを入れてESP-IDFを動かすことに。参考にしたのはこの辺。ありがとうございます。
Install the IDE PlatformIO extension for Visual Studio Code

Windows版VSCだとArudino IDEプラグインが使えるんですが、このプラグインはMacには出ていないようなので、PlatformIOを使います。AtomやSublimeでもPlatformIOは使えるんですが、どうもしっくりこない。

まずVisualStudio Code、Mac版のインストール。ダウンロードして解凍すると.appができるので /Application へコピーし、ダブルクリック。

PlatformIOのインストールは、表示>拡張機能メニューから platformio を探して選びます。


試しにプロジェクトを作ってみます。PlatformIOのHome(画面下コマンド行の家アイコン)をクリックし、New Projectをクリックします。

プロジェクト名を入力し、BoardのところでESP32と入力すると候補が出てきますので、無難にEspressif ESP32 Dev Moduleを選びます。FrameworkはESP-IDFを選び、Finishをクリックすると空のプロジェクトができます。


すると勝手に依存関係が解消されていきセットアップが完了します。PlatformIO偉い。

srcを右クリックして「新しいファイル」を選び、main.cを作ります。適当なコードを入力します。とりあえずesp-idfのexamplesにあるhello_world/main/hello_world_main.cの内容をコピーしました。

シリアルモニタのポートとボーレート設定は、platformio.iniに
monitor_port = /dev/cu.SLAB_USBtoUART
monitor_baud = 115200
を追加。ポートは設定しなくても聞いてきてくれるけど、まぁこっちの方が楽かと。

では、ESP32をUSBに接続し、ウィンドウ最下行の「→」ボタンでbuild&uploadします。最初のコンパイルが長い遅いのはお約束。なお、VSCを再起動する度に再コンパイルする仕様ですが、修正してコンパイルした時は対象ファイルだけコンパイルされます。

コンパイルが終わり、ESP32へのアップロードが始まります。

終わったらウィンドウ最下行の「Monitorアイコン(横向きのACプラグ)」をクリックするとmake monitorが起動します。

なお、シリアルポートを専有するので再度uploadするときにはmonitorを止めなければいけませんが、uploadボタンをクリックすると「monitorタスク止めますか?」と聞いてくれるので安心です。

Windowsは大嫌いですが、MSの開発ツールは嫌いではありません。VSCも良く出来ています。少なくともEclipseよりもサクサク動いてくれる、ような気がしますw 

少なくともArduino IDEよりもかなりマシに使えます(※個人の感想です)。

ただ、ESP-IDFとビルド方法が異なるので、ESP-IDFで作った既存プロジェクトを開くことはできません。開こうとするとplatformio.iniが無いって言われるので適当にコピーして入れて開いても、VSCからはビルドできません。

PlatformIOで作ったらプロジェクトならビルドできますが、標準ツールと違うビルドシステムにするのは少し抵抗があります。

とりあえず、VSC上でターミナルを開き、そこで make flash を実行すれば、ビルドしてくれるんですけども…違う…そこじゃない感が凄いです。

まぁサクサクで落ちないIDEってだけでも十分っす。あとArduinoプロジェクトに関しては、Arduino IDEよりぜんぜん良いですし。

2018年4月6日金曜日

動物の活動状態を記録する@ココナラ

動いた痕跡

うわわわわ

農業試験場の研究員の方からCoconalaにて「条件を変えたときに害虫の行動にどのような影響があるかを記録したい」というご相談をいただきました。

当初のご相談は「(フォトインタラプタを使用して)通路を遮る動きをカウントしたい」ということでしたが、ラズパイを用いた画像による動体検知を提案しました。

赤外線LED、IR Picamera、Raspberry Piだけという大変シンプルな構成です。起動すると指定秒数ごとに差分を求め、全画素のうち何%が変化したかを標準出力に書き出します。オプションとしてウィンドウに画像を表示するか画像ファイルを出力するか、を指定できるようにしました。

プログラムはPython + OpenCVで書きました。当初、よくある動体検知としてBackgroundSubtractorMOGとapplyを使うタイプで試していただいたのですが、結果は少し意図と違っていました。
虫ではなく坊主頭中年体型のわたくし
ということで「背景からどのぐらい変化したか」ではなく単純に前フレームと差分を求めるプログラムに変更しました。とはいえPython不慣れ+OpenCV初心者なので、こちらのコードを参考にさせていただきました。ありがとうございます。

冒頭の画像が演算結果です。害虫がケースの中で動いているところを捉えた画像と飼育環境の写真です。

依頼者の方からは、新しい知見も含めて期待以上の結果が得られたとのご報告をいただきました。日本の農業のために微力ながらお手伝いができて何よりです。

今回のように「こういう観察がしたい」というテーマがあればご相談ください。相談だけなら500円、実装についても公的な研究機関からの公益性のあるテーマであればできるだけお力になりたいと思っています。お気軽にどうぞ。

一応ソースです…間隔指定ではなくwait指定だ、とか、いろいろ突っ込みどころはあると思いますがpython初心者ということでご寛恕いただきたく存じますm(_ _)m

【追記4月11日】
公開当初のソースは背景との差分検知をするものでした。
フレーム間差分に書き換えました。

2018年4月2日月曜日

M5Stack、ちゃんとPDM音が出ますね

命令を見るとtone系なので「あれ、せっかくのスピーカーなのにビープだけ?」って思ったんですが、回路図を見るとGPIO25がアンプ入力につながってます。

ってことで、下記の通り初期化して

void set_16k_16() {
  i2s_set_pin(I2S_NUM, NULL);
  i2s_config_t i2s_config;
  i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_PDM);       // Only TX
  i2s_config.sample_rate = 16000;
  i2s_config.bits_per_sample = BITS_PER_SAMPLE;
  i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT;                //right channels
  //  i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;                //right left
  i2s_config.communication_format = I2S_COMM_FORMAT_PCM;
  i2s_config.dma_buf_count = 4;
  i2s_config.dma_buf_len =  1024;
  i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;                    //Interrupt level 1
  i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
}

これつかって PCMデータ(符号なし16ビット)を渡すと音声出ますね。

  i2s_write_bytes(I2S_NUM, (const char *)ching, sizeof(ching),   portMAX_DELAY);
  i2s_zero_dma_buffer(I2S_NUM);

2018年3月30日金曜日

ダンボールでないAIYケース


私は不器用なので、ダンボール製のAIYは見事に基板が斜めになってあちこちスキマがorz

これではちょっと家に置いておきにくい、ということで、またCAD頼みで工作しました。


makercase.comで設計してAdobe Illustratorで穴あけ指示を行い、Elecrowでカットしてもらいました。接着剤なしでぴったりと組み上がり、基板ももちろん水平です(笑)。

難点は分解がちょっと大変w

音出してみたらダンボールと違って結構良い音がでます。

【追記】取説

わりと好評だったのでスイッチサイエンスさんから売ってもらおうかと思っていたのですが、MakerCase作者の方とコンタクトが取れません。権利関係がわからないものを売るわけにはいかないので、販売予定はありません。ご了承ください。

以下は商品化のために書いていたマニュアルです。せっかく書いたので貼っておきます。

レーザーカットしたときのアクリルの匂いが凄いので荷物が届いたらまず窓を開けます。

中にはプチプチにくるまったアクリル板と2つのビニール袋とゴム足シートと品質管理/組立ライン用手袋が入ってます。

ビニール袋は白い柱みたいなのがM2.6のラズパイ固定用で底面から順番にネジ|アクリル板|10mmスペーサー|ラズパイ基板|12mmスペーサー|ワッシャー|ナットの順。もう一つ白いのはスピーカー用で外からネジ|ワッシャー|アクリル板|スピーカーフレーム|ワッシャー|ナットの順。

アクリル板から保護シート剥がす前に、底面のどのへんにゴム足を付けるかポンチかキリで印つけておくとずれないです。ラズパイ固定ネジ穴と干渉しないように気をつけること。

あとアクリル板同士をがっちり噛ませてしまうとほぼ外すのは無理(特に6面のうちの最後の2面)になるので、まずどの組み合わせになるのかをざっと並べてみておくこと。ラズパイのコネクタ穴は似通っているので注意。側面パネルは4種類とも違うけど、手前にスピーカーが来た場合、右がSD、左がEther+USB、奥がHDMIその他になります。地板の向きを側板に合わせます。天板はスピーカーの反対側にマイク。いずれも対称軸に注意。

このへんで手袋します。保護シートを剥がすには強めの荷造りテープを貼って剥がすか、目立たない隅っこを尖ったピンセットなどで剥がします。

まず底面の片面の保護シート剥がします(内側)。外側になるシートは全部剥がさずにラズパイ部分だけはがしておいて、ラズパイ取り付けます。向きに注意。ホコリに注意。キムワイプなどで拭いても静電気が強くなるだけなので、エアーブロワーなどで吹き飛ばします。

スピーカー、これは両面剥がして取り付けるほうが良いっすね。スピーカーがずれないように注意。ネジは対角線の位置から締めること。くれぐれもホコリに注意。

スイッチとマイク基板取り付け。マイク基板は3MのW-18という透明両面テープで貼るのがおすすめです。この手袋だとテープの接着面に触っても糸くず等があまり残らないので、素手で扱うよりも楽です。素手だと確実に指紋が付きますからね。

残りのアクリル板、内側の保護シートを剥がしつつ組み立てて行きます。はめるときには水平垂直を維持しながらまっすぐ押し込む方が入りやすいです。というか板が傾いていると入らないです。組み立てながら内側のホコリを取る。

最後の一枚を入れる前にちゃんとブートすること機能することなどを確かめましょう。ピンセット使えば外からSDカード出し入れできますが、配線ミスなどを直そうとしても閉めちゃってからまた開けるのはかなり難しいので。

最後の一枚をはめたら残る保護シートをはがします。ゴム足を貼ります。ゴム足は一度貼ると簡単には剥がれないので一発で確実に貼ります。

完成です。手袋はずして鑑賞して下さい。

ホコリはとにかくものすごく目立つのでご注意を。

2018年3月23日金曜日

Pmod MTDSに一言

MTDS Library Programmers's Reference Manualさん。

word形式なのは許す。

でも目次がないってどゆこと?

もしかしてwordで開くと目次出てきたりするんだろうか。

いずれにしても、もう一生Pmodは買わない。

2018年3月19日月曜日

超低価格大容量SPI Flash(ただし遅い)

【写真】予備を作ると壊れもせず一発で動く…私はそういう星の下に生まれた男だ。

W25Q32FVSSIGっていうチップを入手しました。SPI接続のフラッシュメモリです。

結論として、消去がやたら遅い(6秒程度)ので別タスクで消す等の処理は必要ですが、4MBのストレージが約50円しかも1.27mmピッチのSOICパッケージというのは扱いやすくて良いんじゃないでしょうか。

digi-keyなどでは生産中止品扱いなのですが、中国でセカンドかサードソースかコピー品が生産されているのでしょう。

■準備■

とりあえず使ってみる場合、「Arduino チップ名」か「ESP32 チップ名」でググってみると何かライブラリが出てきます。安心して配線しましょう。

SOIC、手元に変換基板がなかったので秋月のSOP8用で代用します。パターンが足の下に隠れてしまうので手ハンダではなくリフローしました。最近0.2mm間隔のチップを相手にしていたので、1.27mmなんて鼻歌です(表面張力のおかげですが)。

何度でも書きますが、自宅リフローにつかうクリームハンダはサンハヤトに限ります(笑)。これはハンダの粒子もきめ細かいですしパターン乗りもよく本当に扱いやすいです。フラックス活性が高いのかなんだか知りませんがボールなどが発生しにくいです。価格はわりと高いんですが、どうせ有効期限内に使い切れないので丁度いいのです(笑)。

Arduino IDEでESP32を選び、Library Managerで「SPIFlash」と入力するといくつかヒットしますが、とりあえずPrajwal Bhattaram氏作のSPIFlashを選びます。接続する前にESP32にFlashDiagnosticsを書き込んで起きましょう。ESP32への電源を切ってから以下の配線をします。

接続はESP32としては標準的なSPIの接続です。SOとSIはプルアップしていません。

ESP32W25Q32
IO051 CS
IO192 SO
3V33 WP
GND4 GND
IO235 SI
IO186 SCK
3V37 HLD
3V38 Vdd

■動かしてみて■

消去がものすごく遅いです。4MB消すのに6秒かかります。
Erase Chip: Data I/O test PASS Time: 5.967 s
Erase 64KB Block: Data I/O test PASS Time: 158.449 ms
Erase 32KB Block: Data I/O test PASS Time: 120.735 ms
Erase 4KB Sector: Data I/O test PASS Time: 91.357 ms

このチップ、こんなに安いんですが、100,000サイクルの消去が可能って書いてありますので、Wear Levelingは行われているみたいですね。小さい廉価品なのに大したもんだ。

【追記2018年9月5日】セクター(256bytes)で同一アドレスにひたすら消去・書き込み・読み出し…を繰り返す実験をしたら100万回越えてもエラー出ませんでした。約150万回で初めてエラーが出ました。テスト前にも相当使っていましたのでもうちょっと長いかもしれません。個体差もあるのでこの結果が保証されるというわけではありませんが、少なくとも仕様の10万回は問題ないと言えるでしょう【追記終わり】

読み書きはuSの単位なので普通に使えそうですが…Flashは消去してからでないと書き込みができない宿命なので、別タスクでメモリ消すとかリングバッファ的に管理して使う必要があります。あと、64KBずつ消すと10秒近くかかってしまいますが、一括消去だと6秒で終わるのも注目点ですね。まぁ「たかが二倍」とも言えますが。

アルゴリズムとしては1ブロック64KBとして状態を示すフラグを64個の配列にしておき、それぞれが使用中か消去済か消去要求か消去中か…を示すようにして、消去用タスクの中でループで状態を監視し、消去要求のブロックがあれば消去中に変更して消去を実行し、完了後消去済みに書き換えてから次のループ…という形でうまく動きました。タスクを使う場合は競合などに配慮する必要がありますが、この場合はタスクごとに変更可能な状態を制限しておくことで回避することができます。

使用したいブロックが消去済より少ない場合にはランダムにスキップしてやればある程度消耗度を分散させることもできます。使用中フラグは正の整数ということにして次のブロック番号を指すようにすれば簡単なシーケンシャルファイルを実装できます。

なお、Prajwal Bhattaram氏のライブラリはGNUなので、実際の装置に組み込む場合には注意が必要です。

私は例によって書き終わってからこれに気づいたので、自分で書き直しました。SPI Flashを扱うことのできるライブラリはいくつかあるんですが、みんなGNUなんですよね。幸い処理は比較的簡単です。

私が書いたやつは、そのうちお掃除したらApacheかなにかで公開します。

ESP32でI2Sから音を出す・その2

その1の方法だと再生が終わるまで帰ってきてくれないので、音が出ている最中に止めたり他の音に変更することができません。そのヘン改良したのがこちらです。

なおこちらはKickstarter製品で使ったコードの一部です。

setupではI2S関連の初期化と音を出力するためのタスクsound_loopを準備しています。

loopでは割り込み要素として加速度計を使っていて、3軸合成加速度が平均値(ほぼ重力)を一定以上越えたら音を出力するフラグsoundOnを立てます。

sound_loopではループをぐるぐる回って、大きな加速度を検知してsoundOnがonになったら音源番号iSoundを変更して再生位置iを初期化し、内側のループでi2s_push_sampleを使って1音ずつバッファにプッシュし、音を出力します。再生が終わるか、音源番号が変わったらループを抜けます。

内側のループにはウエイトを入れていないですが、DMAバッファがいっぱいになるとi2s_push_sampleで止まるので、大丈夫っぽいです(ポイかよ)。

まぁこんな感じで…。