2019年3月26日火曜日

Eagle、NC強制配線の現象がわかった(っぽい)

回路図を見ても配線されていないNCの端子が、基板上では勝手に他の配線とつなげられてしまう現象の原因がわかりました。

回路図に部品をおいて、ローテートや移動したときに間違って他の端子とつながってしまうことがあります。そういう場合に配線を削除しても、その時のRoute名が端子に残っているようです。それで、その後配線作業をした時に、残っているRoute名と新たに生成されるRoute名が一致して結線されてしまいます。

直すには、NCのピンからどこにもつながらない配線を伸ばして、それからそこと勝手につながっている配線のRoute名を変えます。変更すると「このセグメントだけか?それとも関連する番号全部か?」と確認が出てきますが、「このセグメントだけ」を選びます。

これで消えるはずです。

DRCやERCにも出てこなくて、一本ずつ配線を確認しないと気づかない現象なので大変怖いです。今回NCと大きく書いてあるところにつながっていたので気づいたのですが…前回はVCCとGNDがショートしていてまったく起動せず頭を抱える状態でした。

ローテートや「接続しますか?」は慎重に扱いましょう。

超簡単!componentsearchengineでPCB CADの部品作り

Mouserさんの部品詳細ページを見ると、ECAD Modelという項目があります。ここに「PCB Symbol, Footprint云々」とあれば作成済のフットプリントとシンボルを各ツール別にダウンロードできるのですが、未登録の場合には「Build or Request PCB Footprint or Symbol」になっていて、自分で作るか作成をリクエストすることになります。


以下いずれの場合もcomponent search engineでの作業になります。さあWebを開きましょう! アカウントを登録しましょう!!

■ダウンロードできる場合

部品名を検索すると一覧が出てきます。そこに「部品あるで」と表示されている場合は、当該アイコンをクリックし、詳細ページでFREE DOWNLOADを選べばzipが落ちるので、回答して自分の使っているライブラリのファイルを抜き出すだけです。簡単すぎ。

■Build or Requestの場合

数分の作業なのでダマされたと思ってやって見よう!

作りたい部品の正しいパッケージのBuild or Requestをクリック


赤い矢印のところで大雑把どんなパッケージかを選びます。


仕様書には「44-Lead PQFP Package Outline (PG)」となっているので、一番近い?QFP-PLCC / Quad Flat Packagesを選びます。

一つ上に戻って、BUILD/LAUNCH WIZARDをクリック。SamacSys PCB LIbrary Wizardが開きます。



で、後は上から必要事項を入力していきますが、業界あるいはメーカーの標準的なパッケージであれば、だいたいパッケージをいじる必要はないと思います。いじる必要がある場合は…仕様書とにらめっこしながら各部の寸法をミリまたはインチ単位で入力してきます。仕様書の表記と画面の表記は違うので、間違えないように気をつけてください。私は一回パッケージの幅と広がったピンの幅を間違えて、ハンダが届かないFootPrintを作ってしまったことがあります(試作だったしハンダブリッジで届く範囲でしたけど…辛かった)。

次はElectrical Pin Informationの入力ですが、Typeがundefined / Power / Ground / InOut / Input / Outputしかないので楽といえば楽なんですがNCを明示できないのがちょっと危ないです。間違えないようにEagle上で直すことをおすすめします(間違えてNCに出力をつないでしまい、基板半分の配線をやりなおした経験者・談)。あと反転は!ではなく*です(横に注記が出てますがEagleが!なので間違えた)。CVSでのアップロードなどもできるようなので、仕様書でスプレッドシートにコピペしてアップロードすると楽になるかもしれません。私は地味に44ピン入力しましたが。

あとは「FinalCheck」ボタンを押して確認してもらい(何をどの程度確認しているのかは不明なのでそこは自己責任で)、以下の「Final Checks Pass.」が出たら、Complete Partをクリックします。

そうすると右上に、「Download Model」アイコンが出ます。クリックしてunzipすれば部品のライブラリが手に入ります! 素晴らしい。しかもここでMouserのカートに入りますから、「ライブラリのある部品を探す」ってのがものすごく簡単になります。
所要時間は9分でした。以前は「30分探してなかったら作る」だったんですが、今は「eagle library '部品名'」で最初のページで出てこなかったら作る、ってことにしています。見つけた部品もどっちみち検証しないと使えないので、その方が早いとです。

「EagleにライブラリがないからこのICは使うのをやめよう」という発想がなくなったので、褒めてください(笑)。

…なお、この辺の作業ってWindowsでLibrary Loaderを動かさないと駄目だと思っていたんですが… Webで完結してしまいました。

ああ世界がますますWindowsから孤立していくw

2019年3月23日土曜日

EagleのFanout機能


小さいパッケージに太いGNDを接続する場合や込み入った配線があるとき、今までは手で細いRouteを引いてやる必要があったんですが、新機能(でもないか)のFanoutは、

  • チップ単位または配線単位
  • 全部外側、全部内側、中外交互などのオプション
を指定すると、例えばチップを選べば自動的に細い線を引っ張り出して適当なviaを近くに打ってくれます。基板設計ものすごく楽。特に自動配線と相性が良いようで、バスを引っ張り回すような回路だと自動で打たれるvia数が半減したりします。

基板設計もだいぶ省力化できるんですが……ピンごとに対応したviaがあるので、わざわざテストピンを設けなくても良い、ってことに最近気づきましたw テストピン立てようと思えば立てられますし…いや便利便利。

Elecrow Rush-48hサービス


ちょっと急ぎだったので、貧乏な私としては清水の舞台、ではないけど、階段3段飛びぐらいの覚悟で48時間サービスに頼んでみました。朝9時に注文して72時間経ってもいつもの「出荷しました」連絡が来ないしWebでもIn Productionのままなので「どないなっとるねん」と連絡したら「前日に発送した」とのこと。直後にメールとトラッキング番号が届く。蕎麦屋の出前かいw OCSの集荷が夕方18時になっているから48時間出荷かどうかは議論の余地があるけど、まぁ誤差の範囲。あと例によってOCS/ANAがさくっと配達してくれたので、3月19日 9時発注、3月23日 14時受領……都合101時間で到着しました。

はやい(小並感

人民テープはもはや芸術の域
OCSで基板だけだと外装ビニールバッグなので人民テープと戦わなくて済むのも地味なメリットなんですが、今回はガチ人民テープで、どこから開けて良いのかわからない。剥がすと臭いのであんまり剥がしたくないのですが、ともかく全部剥がしてみると、横(短辺)に開け口がありました。例によって前後にMDF板が当てられていて、破損防止は万全。


ステンシルはばっちりです。

強いテープで剥がす時にステンシル痛みそうで怖い

基板、実は「48時間仕上げだと機械で作る要素も多くなって品質も良いのではないか?」とちょっと期待したのですが、シルクもレジストも、いつものElecrowより心持ちキレイな気がします。Elecrowは緑1.6mmだと比較的キレイなのですが、少なくともシルクは均一で潰れたり掠れていることがなく、これそのまま製品に使っても良いんじゃないか?というレベル。拡大写真はこちらです。ピンはSSOP 0.65mmピッチなので、レジストのズレは0.09mmぐらいでしょうか。via穴もずれてますけど許容範囲。



それにしても、0.65mmを普通にはんだ付けできるようになった自分をホメてやりたい…約5年前に電子工作を再開した時にはDIPが無くなったら死ぬ…って思っていたのにね(遠い目)。今はDIPだとはんだ付けしているというより溶接しているような気持ちで立ち向かっています。

今回フレーム付きステンシルと一緒の少し大きめの基板だったので7400円でしたが、注文から100時間ぐらいで届いて特に問題ありませんでした。私みたいな週末メイカーだと週末に設計して翌週に実装というサイクルをほぼ確実に回すことができるので、ありがたいです。

ピッチがもうちょっと細かいとJLCPCBかFusionの0.1mmピッチ指定じゃないと使えないんですが、JLCもFusionも緊急メニューがありません(Fusionは出来上がってから出荷されるまでが遅いし)。急ぎで0.5mmピッチ以下ならこれで十分かな、と思います。

2019年3月22日金曜日

SwiftからMetalへFloatの値を渡す(仮)

縦横比は無視(こういう演出なので)

(仮)がついているのは、「とりあえず動いたけど正しいかわからない」というツッコミ待ちフラグを示します。堤修一さんの「Metal入門」を読んでいることが前提です。

最初に結果を書きます。そのあとはほぼ雑談です。

まず、swift側のコード。drawの中です。valueが渡したい値で最初にバッファを定義して
        // バッファを作成
        var valueBuffer: MTLBuffer!
        let value:[Float] = [0.5]
        let size = MemoryLayout.size
        valueBuffer = device.makeBuffer(bytes: value, length: size)
次に生成したエンコーダーにセットします。
        renderEncoder.setFragmentBuffer(valueBuffer, offset: 0, index: 0)
.metal側
fragment float4 fragmentShader(ColorInOut       in       [[ stage_in ]],
                               texture2d texture  [[ texture(0) ]],
                               device float     *fBuffer [[ buffer(0) ]])
{
    float f = fBuffer[0];

fに値が入ります。めでたしめでたし。

[[ ]] の中の修飾子がどういう働きをしているのか理解できていなかったんですが…これ、GPUとCPUの共有メモリにtexure[0], [1], [2]....、vertex_id、buffer[0], buffer[1], buffer[2]....のような領域があって、
device float     *fBuffer [[ buffer(0) ]]
って書いた場合、「0番目のbuffer領域のアドレスをfloatのポインタfBufferにセットする」って意味なんですね。で、Swift側ではサイズとx番目かを示してデータをセットすれば、metal側ではそれをポインタ渡しみたいな形で受け取れる。

わかってしまえば簡単なんですが…いやー、苦労したたたた。

■背景■

「Metal入門」という本を読みつつ、Metalのお勉強をしています。お勉強中ですが、同僚のM氏から「作って」と言われている課題をこなさなければいけないので必死です。

その課題は撮影した画像をRGBとグレイに分割して、それらを重ねつつ動かすというやつです。CIFilterなどを探してみたのですが、どうにも上手く行かず、Metal様におすがりしました。

で、「Metal入門」を拾い読みして(それがいかんのだ)、fragment shaderを使えば画像の任意の点の色情報を取得し、それを最終的な描画位置の色として加工して返す、という処理が記述できることがわかった…のは良いですが、アニメーションとして処理したいのでCPUからパラメータを渡す必要があり、その方法を探していた次第です。

この記事が誰かの役に立ちますよーに。

■余談■

MSLでもif文書けるんですね。やってみたらエラーでないで意図した通りに動いたので思わずユーレカーと叫びながら表を走ってしまうところでした。ベクトルプロセッサだから無理だろと思って無駄な苦労してました。もちろん、GPUを使う上ではもっと効率のいい方法なんかもあるんでしょうけども、不勉強な凡夫として助かっております。

とりあえずfragmentShaderの実装については「今度、ここの座標の色を教えろや」って上位からドットの数だけ呼ばれるので、textureとして受け取った画像からsamplerを使って元画像の色の値を取り出し、そのカラー値(r, g, b, a)を返せば元画像がそのまま描画されるし、color = float4(red, 0, 0, 1)を返せば赤プレーンだけの値が返される…ということがわかって、そこから何とか書けるようになった感じです。

いやー…奥が深い。私基本的に業務系アプリ屋なんで、Metalのお勉強してもあんまり役に立たないんですけどねw でも、何かあったらお仕事いただければ幸いですm(_ _)m

2019年3月9日土曜日

受託開発もやってます

宣伝です。ココナラハンドメイドなどでハードウェアの受託開発をやっています。下記はいずれもブログ公開を許可していただいたもの。TwitterやFacebookでご依頼いただいてAmazonギフトやPayPalで決済することが多かったのですが、今年は少しココナラハンドメイドの実績を増やしていこうという魂胆でございます。

以下2018年の主な実績です。公開の許可をいただいた関係で何故かArduino nanoが多くなりましたが、ESP32、LPC1114やRaspberry pi用拡張ボードも同数あります。

これはATMega328とSakuraのIoTモジュールを搭載した基板です。0.4mmピッチのSIMモジュールコネクタが難物でしたが、ステンシルプリンターとリフロー炉を導入したことで歩留まりが一気に上る契機になりました(導入後リフローおよび手ハンダによる不良はQFNやVSONパッケージも含めてゼロです)。現在、ESP32-WROVER-IとSakura IoTモジュールを簡単に使える基板を製作中です。

これは、スイッチ2個の状態に応じてランプを表示させる装置のメイン部分。ご覧の通り、Arduino nanoの互換機で作っています。

またUnoです。マイクからの入力をFFT処理してノイズ部分をカットした後、エネルギーレベルが一定以上を越えたらリレーをONにして電力機器を動かすデバイスです。インジケーターは赤緑LEDで3色表示、音量の閾値とON継続時間はロータリーDIP SWでデジタル指定する方式です。

ラズパイを使った、工場ライン用ファームウェア書き込みの試作機です。ESP32の基板を接続してから緑ボタンを押すと自動的にpythonスクリプトで書き込みが始まり、終わると簡単な検査を行って正常だとグリーンランプが点灯します。ラズパイはSD Card保護のためRead Only + RAM DISK化してあります。これを原型としたコピー機が中国・深圳にて実際の生産ライン(1万台規模)で使用されました。なお、マステで説明書いてますけど…超特急のご依頼だったので(遠い目

DFPlayer + Arduino unoを使った音源デバイスです。センサーで一定の条件になると録音した音声が流れます。DFPlayer、間違えて100個注文してしまったので、大量に余ってます。お仕事ください(必死)。ちなみに余ったやつを使ってカラスが猛禽類に襲われている音声を録音してときどき流すようにしたらカラスがまったく来なくなりました。カラスを撃退するためにはタイマーで同じ音声を適当に流すのではなく、複数仕込んでおきセンサーに反応させて流すと効果が高いようです。

最後に、サラリーマン業で作ったものです。Hamicベアって商品名です。私はプロトタイプ〜製品版ファームウェア担当者の一人で、ハードウェアについてもちょこっと口出ししました。

単価は1万円〜10万円です。以下ページからダイレクトメッセージをお送り下さい。相談は無料ですので、どぞお気軽に。

RX8900、時計メーカーのICすげえ

紅い基板がRX8900

RX8900は、DXCXO内蔵高精度リアルタイムクロックです。温度補正され、出荷時に周波数調整されているのでトリムなしに高精度(公称月差9秒)で働くRTC ICです。

バッテリバックアップ性能を試してみました。

RX8900は、Vbat端子が独立していて電気二重層キャパシタの場合抵抗を1本つけるだけで充電・バックアップが可能になります。リチウム一次電池などの場合には充電阻止のダイオードが必要です。

買い置きの1Fの電気二重層と抵抗を直列にして、Vbatに接続し、時刻をセットしたあとVccを切ってそのまま放置します。キャパシタの電圧を見てると直後に2.4Vまで下がってバックアップモードに入り、その後はごくゆっくり電圧が下がっていきます。

72時間後の電圧は1.656Vでした。最低電圧1.6Vとのことなので、まだ余裕です。

マイコンを接続して時刻を読み出したところ…見事に経時されていました。いやー…すごいですね。いま、製品としてデジタル時計を作っているところなので、しっかり働いてもらおうと思います。

追記:96時間での計測を忘れて104時間後に計測したところ1.44Vでした。もうダメかと思ったのですが、ちゃんと正確にときを刻んでいました。さすが、墜落した飛行機が海底から引き上げられた際にも動いていたというSEIKOの子孫ですね!



2019年3月1日金曜日

IO12に気をつけて!(ESP32への書き込みが出来ない件)

おまえーがー 生まれたーときー …きれいな基板だったんだぜ

初期の通信はネゴシエーションはできるのですが、その後以下のエラーがでます。

esptool.py v2.6-beta1
Serial port /dev/cu.usbserial-DN0483G4
Connecting.....
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: 30:ae:a4:c6:88:50
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Warning: Could not auto-detect Flash size (FlashID=0xffffff, SizeID=0xff), defaulting to 4MB
Compressed 8192 bytes to 47...
A fatal error occurred: Timed out waiting for packet content

結果を先に書くと、IO12をプルアップしていたのが原因でした。プルアップしているとSPI Flashが1.8Vモードになってしまうので、書き込みできなくなります。
Cannot Download to ESP-WROVER-KIT

てことで、配線をカットしたら無事動きました…。

ほぼ同じ設計の基板が問題なく動いているので、リフローの不良を疑ってコテを全ピンに当ててみたり、果てはESP32-WROVERを交換してみたりしたのですが…そりゃー動きませんよね。

あとで思い返してみると、上の赤字の行の2つ上にwarningが出ていますが、これはFlashへの書き込みができないからサイズ検出が働いていなかったのでしょう。

いやー…アホでした…いつもは気をつけて使わないようにしているピンですが、GPIOを使い切ってしまって、その後、布線の都合で大スワップ大会になってしまい、いつの間にか使っていました…。

ESP32チップの交換

ソフト屋なのかハード屋なのかはっきりしろ!な机
カプトンテープで軽く周囲をカバーしてからリワークステーションで加熱。プリヒートで150度ぐらいに温めてから280度の温風で溶かします。ESP32-WROVERは私が外した部品のうちで最大級なのですが、風量とか温度にノウハウないと難しいですね…今回は外した部品を再利用しないので壊れても良いんですが…。


外した後は、吸い取り線とハンダゴテでお掃除。この写真でいえば吸い取り線を縦に置いて、一番上のピンの上側にハンダゴテを当てます。溶けるとコテが下に動かせるようになるので次のピンへと順次吸い取っていきます。なお写真でみてGNDが残っていることに気づいてもうちょっと掃除しました。ハンダを吸い取った後はフラックスクリーナーで清掃します。

右上1箇所にだけハンダを盛り、手で左手でチップを抑えながら右手ではんだ付けします。ズレていないことを確認しながら、右下にもはんだ付けします。動かなくなったら、シリンジではんだペーストを塗っていきます。細い針が見つからなかったので、どうも汚いな。


あとは、一番上から下へ、ハンダゴテで1ピン2-4秒ぐらいずつ、溶かし込ませながらゆっくりコテを移動していきます。ちょっとハンダが少なかったので、その時は糸ハンダで補充します。だいたい均等になったら、最後にまた上から下にゆっくりハンダゴテをあてて均一にならします。



均一にといいつつ、GNDはムラが出てしまいますね…。


余談ですが最近ハンドラップ使ってます。フラックスクリーナーを入れてキムワイプで使っているんですが、便利っす。

昭和の補修テクニック

チップ→LED→GNDという流れで設計したのですが、点灯せず。確認したらチップの出力端子がオープンドレインでした。チップ←LED←Vccに変更しないとダメです。



ということでスズメッキ線と抵抗で補修しました。

なお、余っているスズメッキ線は、オシロなどを接続するための延長です(TPつけるのを忘れてた。テヘ)。

最初の試作ということであまり詰め込まないで設計しといてよかった…。

昔はこうやってスズメッキ線で回路作ったなぁ…としみじみする朝でございました。

そうそう、電動式のハンダ吸い取り器を導入して、その圧倒的な威力に震えているところなのですが…LED、抵抗など2端子のチップ抵抗を外すのであれば、吸い取るよりも左にハンダゴテ右手にハンダ吸い取り器を持って、単に両方から加熱して取る方が簡単である…というごく当たり前のことに最近になって気づきました。

なお、この基板、ESP32-WROVERに書き込みが出来ないという問題が生じていて、それで定数変えたりもしたんですが、USBシリアルと通信はできるけどFlashサイズを検出できない等のエラーを出す、という状態です。ESP32-WROVERが不良なのだと思うのですが、リワークで交換するのが面倒なので他に理由がないか、回避する言い訳ができないか考えているところでございます。esptool.py、一応betaは取れたみたいだけど…。

esptool.py v2.6-beta1
Serial port /dev/cu.usbserial-DN0483G4
Connecting.....
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: 30:ae:a4:c6:88:50
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Warning: Could not auto-detect Flash size (FlashID=0xffffff, SizeID=0xff), defaulting to 4MB
Compressed 8192 bytes to 47...

A fatal error occurred: Timed out waiting for packet content