2026年5月6日水曜日

OpenPnP:Bottom Vision Pipelineがうまく行かない時

いろいろいじっているうちに不調になってしまいまして。

リカバーで苦労するんだったら、その経緯と結果をここに「こういうpipelineを設定すればバッチリ!」って書こうと思ったのですが……

  1. パーツのbottom vision pipelineをリセットする
  2. 調整したい部品をノズルに吸い付ける
  3. カメラのブライトネスを調整する
    1. Machine SetupのCameraのDevice Settingタブで、全部の数値をデフォルトに戻してAutoを外す
    2. Brightnessを±2ぐらいの範囲で調整する
    3. Partタブで調整したい部品をクリックし、Bottom Vision Settingタブを選び、Test Alignmentボタンをクリックし、ノズルの先の部品が正しく赤枠で囲まれているかを確認する
    4. 囲まれていなかったら2に戻る

これだけでした……要するに、パイプラインはいじらずにカメラをいじれってことです(ヤサグレ

といいますか、pipelineの各項目やその関連についての情報がないんですよね……どなたか見つけたら教えてください。

どっとはらい。

Tips

Machine Setup->Cameras->OpenPnp Capture Camera Bottom VisionのDevice Settingタブで、Brightnessなどの数値を変更してもApplyが有効になりません。

バグじゃん?と思ったけど、これは「数値が即座に反映されているからrevertできないよ」という意図なのかなぁと思ってます。つまりApplyしなくても数値は設定に反映されています。

この辺、Autoのチェックボックスがそれぞれあるんですが、遅くてpipelineには間に合いません。地道に設定しましょう。

Bug?

まだ調査中ですが、Reference Auto Feederで、左下のパネルのActuatorタブから"Set feeder address"でIDをセットして、"Feeder Forward"ボタンからIDを指定するとちゃんとフィードするんですが、メイン画面のFeedersタブからfeedしても動いてくれません。泣いてます。

メイン画面でパーツをピックアップしてノズルに吸着した状態だと真空ポンプがうるさいです。用が終わったらさっさと左下パネルのSpecialタブからDiscard / Recycleしていたのですが、その状態はすぐ上のnozzle表示には反映されるのですが、メインパネルの状態には正しく反映されないようで、アプリを再起動しないと正常になりません。

どうも左下のパネルとメインパネルとの間の連携うまく行ってない感じですね。昔Java屋だった時代もあるので、いろいろと昔の日々を思い出しております。

なお、その状態でも実装するときにはちゃんとフィードされます。どうなってんだ。使い方の問題?ごめんなさい←先に謝っておくという生き方

2026年5月2日土曜日

OpenPnP:Bliend Feederのレンダリング修正

OpenPnPはオープンソースなので、部品を供給するフィーダーが何種類も3Dプリントで作れるように公開されています。ヘッドで自動的に送るもの、電動、テープを貼り付けて静置するものなどいろいろです。

その一つのBlinds Feederは、3Dプリントした土台にテープをセットしてカバーの透明シールを剥がし、同じく3Dプリントしたフタを被せるようになっています。フタをスライドすると中身が飛び出さないようになり、実装のときにはフタをスライドして中身が見えるようにしてから稼働します。

どういう部品(カットテープ)を使うかをスクリプト?でセットすると、OpenSCADというやはりオープンソースのツールが3Dでレンダリングしてくれます。そのSTLを3Dプリンタに持っていけば、部品名のばっちり入った専用フィーダーが手に入るという素晴らしさ。

なのですが……試すとラベルが出力できません。

Claude Opusさんに相談したら3回ぐらいのやりとりで問題が修正されました。

いやー……大したもんだ。

ちなみに、冒頭の画像は、以下のスクリプトで生成されたものです。

    arrayed_tape_lanes=      [
        LaneDefinition(1, tape0402,   ["R0402-316K"]), 
        LaneDefinition(1, tape12mm,   ["LTC4011CFE"]), 
        LaneDefinition(1, tape12mm,   ["TPS630701"]), 
        LaneDefinition(1, tape0402,   ["C0402-100nF"]), 
        LaneDefinition(1, tape0402,   ["R0402-100K"]), 
        ],    

いやー……大したもんだ。

なお、光学認識の精度を高めるために、緑色のフィラメントを使うとクロマキーあれこれで認識精度がよくなるらしいです。

修正したスクリプト?はgithubに上げておきます。オープンソースほんと何もわからんのですが、とりあえず元がGPL 3.0なので公開しておかないといけないよね、ということで。

2026年5月1日金曜日

OpenPnP:Tips:ズレた!?

OpenPnPの実装機PSE-3000を順調にテスト中です。

が。模様替えしていて掃除機で強打してしまいました。

ヘッド(ピックアップを上下させるところ)が曲がってしまったようで、0.05mmほど部品がズレて置かれるようになってしまいました。

光学的な処理は問題ないので、たぶんカメラ位置とピックアップ軸とがずれたのではないか?という推測のもと、関係しそうなところを片っ端からいじっていたら(原始人)、見つかりました。Machine Setup→Heads→ReferenceHead H1→Nozzlesの下に2つノズルがあって、私の場合、両方ともズレますので個々に


Configuration→Coordinate Systemを直します。今回、上に0.05mmほどズレるので、Yの値を0.05mm変えたところ、無事真ん中に置かれるようになりました。

焦りました……自分のミスなのでメーカー製品だったら、サービスマンに来てもらって10万円ぐらい請求されかねない事態でしたが、オープンソース製品こういうところ助かります。

ソフトの改良などでオープンソースに貢献する日が来るかどうかわかりませんが(バグはいくつか見つけましたが)、とりあえずTIPSを公開しつつ恥を晒して生きていこうと思います。

2026年4月30日木曜日

誤家庭リフロー再び:今度はオーブン改造

いい感じのグラフ

弊社のリフロー歴は以下の通りです。

  • 山善のホットプレート+放射温度計による手動制御
  • 中華リフロー炉LY962と日本製アップトランス導入
  • PCBA外注へ
  • 自宅リフロー回帰 ←今ここ

中華リフロー炉LY962は赤外線+温風式で、赤外線式のT962よりも少しマシでステージの中央付近だけを使う分にはムラ無く動いてくれました。冷却ファンが回らないなどの些細(?)な問題はありましたが。

ただ、その後JLCPCBのPCBAがとてもリーズナブルになり、「LCSCに在庫のある部品で設計する」という方針だと自分で作業する気になれないほど安く早く基板が届くようになりました。それで中華リフロー炉を手放しました。

ということで数年間はPCBAでいい感じに試作・少量量産をしていたのですが、トランプ関税とイラン事変が始まりまして……JLCPCBのPCBAは部品のコストが急上昇し納期も伸びがちです。コストはまだしも納期が延びたのは痛いです。

また、国内のPCBセンターも品質が低下してしまい価格に見合わないものになってしまいました。

というわけで、また自宅でリフロー環境を整えることになりました。外注PCBAに頼っているうちに設計は0402やBGAが多くなり、ピンセットで乗せるのもしんどいので、OpenPnPの実装機も導入しました。

で、リフロー炉。中華リフロー炉はでかいし臭いし温度も誤差が大きく改造が必要……ということで選択肢から外しました。改造にも結構な手がかかり、それならコンベクションオーブン改造する方が早いな、と。

その他、30x30mmの主にリワーク用のMHP30と部品取り用Mechanicの60x80mm、100x100mm中華ホットプレートが転がってます。

余談ですが、昔はスイッチサイエンスさんがオーブン用の制御基板を出してたんですよね。またネット検索してもいろいろ「作った」っていう記事はみかけるんですが、売ってない……。

はっ、もしかしてビジネスチャンス!?

構成

GPIO足りないからPi Picoに移行するか……などと右往左往したのですが、液晶付きmicroSD付きという安楽さには勝てずにM5Stack Basicにしました。

構成は以下の通りです。


コンベクションオーブン

シロカの安いコンベクションオーブンST-4N231は余計な電子制御がないので(温度はバイメタル制御、あとは機械スイッチ、タイマーはゼンマイ式)内部を改造しなくても外部で電源供給をON/OFFすれば使えます……ただ在庫少なくなってきました。

ゼンマイで自動的に電源切れるのは安全側としてはありがたいのですが、毎回リフロー開始前に60分にセットしてリフロー途中で電源OFFという惨事を予防する必要があります。

M5Stack BASICの改造

将来の拡張も考えるとGPIO足りないのでスピーカーを殺します。具体的にはこの記事を参考にAFMジャンパーを短絡してアンプが働かないようにしました。

これで浮いたGPIO25はSSRの制御に使います。

熱電対+MAX31855

ブレイクアウト基板を使います。Adafruit製品とそのパチ、Strawberry Linux製がありますが、Adafruitのは熱電対別売りなのでちょっと面倒です。

・1番楽:Strawberry LinuxのMAX31855セット秋月のコネクタ付き熱電対

・少し面倒:Strawberry LinuxのMAX31855セットで自分でコネクタ配線する

という感じです。秋月の熱電対は250℃までと書いてありますが200℃ぐらいで被覆溶けます(笑)。Strawberry Linux付属の熱電対はガラス被覆で400℃まで使えます。後者はガラス繊維の被覆を剥く必要があります。手袋をしてもガラス繊維で指がチクチクになりますし、カプトンテープでペローっと剥けたりしますので、扱いは慎重に。

Adafruit製はターミナルブロックに直接接続する方法です。がっつり固定しないとすぐに断線しそうです。私は自分で基板とネジ止めできる台を3Dプリントで作り被覆ごとしっかりくわえ込むようにしました。

左:ストリナ、右:Adafruit製

まぁStrawberry Linuxさんのもネジ位置がコネクタから離れているので、ちゃんとサポート作る方が安全かな?とは思います。

M5Stackの配線

左右サイドの端子だけ使います。

MAX31855はMOSIを使いません。計測データー送りっぱなしです。GPIO5 = SCK, GPIO16 = MISO(MAX31855モジュール上ではDOと表記されることも)のピンは並列、CSを1台ずつ(GPIO17, GPIO26)につなぎます。あとはGNDとVccです。

上記の通りGPIO25はSSRを制御するためのフォトカプラーにつなぎます。GPIO25から電流制限の470Ωを経由してフォトカプラー(どこの誤家庭にもあるTLP624)のアノードにつなぎます。カソードはGNDへ。

フォトカプラーの二次側は5V→フォトカプラーのコレクタ→SSRの制御入力側+→SSRの制御入力側ー(マイナス)→GNDという配線です。

SSR

今回使うのは秋月で売っているこれ↓ですが、最大12mAとは書いてあるものの最低動作電流が書いてないんですよね。

SSRの入力特性を確認するため、制御入力側に直流電源を接続して動作確認を行いました。

その結果、約4mA〜12mAの入力電流でAC100V側がONとなり、今回使用した個体では3.7V・約3.6mAから動作を開始しました。

本来、SSR入力(内部はLED)は電流制御が望ましいのですが、本構成ではCRDは電圧差不足により使用できず、抵抗による制限では動作マージンを十分に確保できない状態でした。

そのため本記事の構成では、SSR内蔵の電流制限抵抗に依存し、外部電流制限なしで使用しています。

ただし、入力電流の仕様が明確でないため、個体差やロット差による動作ばらつきが想定されます。

同様の構成を採用する場合は、必ず入力電流を実測し、十分なマージンを確認してください。

また、SSRはオフ時でも微小な漏れ電流が流れます。このためヒーターが完全に遮断されない可能性があります。改造・配線作業時や未使用時は、必ずコンセントを抜いてください。

仕様書には5A以上で使うときには放熱器が必要と書いてあるのですが、秋月にもありませんし、Mouser, Digikey, AliExpressでも手に入りません。型番で検索したらAmazonに在庫があって購入できたのですが、さっき見たら無くなっていました。

なお結果として1200Wのコンベクションオーブン全力で使ってもほぼ温度上昇しませんでした。これなら放熱器なしでも?と思うのですが、まぁ半導体は意外と特性変化するので、そのまま付けておきます。みなさまも何か適当なアルミ板で放熱してください。

コンベクションオーブンの改造

※ここから先はAC100Vを扱います。感電・発火の危険があります。
 圧着・絶縁処理に不安がある場合は、この部分だけでも経験者に依頼してください。

ACのコードはゴム引きの2本平行になっているやつです。これを真ん中で2つに分けます。左右の被覆に傷を付けないよう慎重に!まぁ傷ついた側を加工用に使えばいいですけども。

左右に分かれた片方を真ん中で切断し、切断した両端の被覆を剥いて、絶縁付き圧着端子を圧着してしっかりネジで締め込みます。

これでAC電源をSSRでカットできるようになりました。

なお圧着工具がない場合には、この機会にご購入ください。決して!銅線を巻き付けてネジで止める!なんてやってはいけません。

私が使っている圧着工具
マーベル(MARVEL) 圧着工具 ハンドプレス 絶縁被覆付圧着端子・スリーブ用 MH-032

今回必要な圧着端子

制御入力側:TRUSCO 絶縁被覆付圧着端子先開形φ4.3長さ21.9 (25個入) TTMEX1.25Y4N

AC100V側:TRUSCO 絶縁被覆付圧着端子先開形φ4.3長さ21.5 (20個入) TTMEX2Y4S

圧着工具はもっと安い中国製もありますが、必ず「絶縁被覆付き圧着端子用」を購入してください。絶縁被覆なしの「裸圧着端子用」というのもあって、そっちだと正しく圧着できません。また、絶縁被覆付U字圧着端子は被覆の色で電線の太さが決まり、圧着工具に装着する場合も工具の同じ色のところに差し込みます。電線の太さと端子のサイズ(ねじ径)が別々に指定されているので、間違えないように気をつけてください。

配線と基本テスト

まず、M5StackとMAX31855 x 2とフォトカプラーをつなぎます。MAX31855には熱電対を接続します。

MAX31855 x 2個との通信をします。Adafruitさんのライブラリでピン接続だけ変更して1台ずつ動作を確認すると良いでしょう。熱電対を指でつまんで、温度が室温付近から30℃ちょいまで上がることを確認してください。指でつまんで温度がさがる場合には、たぶん熱電対の配線が逆極性になっています。室温が高すぎる可能性もありますが。

次はフォトカプラーですが、フォトカプラーの二次側に電流制限抵抗入りLEDなどをつないでLチカするのが一番わかりやすいと思います。

一度電源を全部切ってから熱電対をコンベクションオーブン内に取り付けます。私はこのリフローオーブンは試作用とわりきっているので、緑色専用にするつもりです(レジストの色に寄って赤外線吸収率が違うので測定用基板と実施用基板が同じ色でないと誤差が大きくなる)。余っている緑色両面基板に熱電対を貼って、オーブンのトレイ左右に配置しました。「大きな基板が使えるように!」と左右いっぱいに離すと真ん中に置く基板との温度差が大きくなってしまうと思いますので、実際に使う基板の最大サイズから少し離れる、程度の位置に設置するのが良いかと思いますが……この辺は実験して決めるしかありません。

あと、オーブンのドアから熱電対につながる線を引き込む必要がありますが、このオーブンはドアをあけるとトレイを引き出すようなフックがついてます。そのせいで「トレイを容易に引き出せる」かつ「開閉してもじゃまにならない」ような配線を決めるのに苦労しました。

現状では以下のように配線しています。

上左右の隅から入り、白いフロントカバーと銀灰色のカバーの間にある縦溝を通してトレイの下の方まで。


下の方には「ドアをあけてトレイを引っ張り出せるけど、たるみすぎてヒーターに接触しない」程度のたるみをもたせます。


そしてトレイの左右端にある針金に固定するのですが、開閉時にフックが当たらない位置から手前に向かって伸ばし、一番手前のところで断線しない程度にUターンして、奥の方へ折り返し、奥行き半分ぐらいのところで中央方向に向かって曲がり、基板と熱電対を固定する。


という形になりました。トレイの下には「ぱんくず受け」のアルミ皿がありますので、この上に配線を少し長めに残しておけば、熱電対の位置を変える時に困らない。はず。です。

ちなみにT962のような赤外線式オーブンの場合には熱電対は基板の上空にぶら下がっています。いいのかそれで。

結合テスト

M5Stackに結合テスト用プログラムをアップロードしておきます。単純に

  1. 各GPIOやMAX31855を初期化
  2. Aボタンが押されるのを待つ
  3. 押された後は、温度を表示する→両方が30℃以下ならSSRをオンにする、そうでなければSSRをオフにする→繰り返し

程度で良いと思います。

電源コンセントから全部ぬけていて、M5StackもUSB給電されておらず、バッテリーでも動いていない状態から始めます。コンベクションオーブンのタイマーが切、モードが上下ヒーター、温度100℃になっていることを確認します。

M5StackとMAX31855x2とフォトカプラーを接続します(確認します)。

フォトカプラーとSSRの制御入力側を接続します(確認します)。

SSRの二次側は配線済と思いますが、未接続なら接続します。

コンベクションオーブンのタイマーが切になっていることを再度確認します。

M5StackとパソコンをUSBで接続します。SSRのインジケーターが点灯していないことを確認してください。

まだここではコンベクションオーブンのプラグはささっていませんからね!

M5のスタートボタンを押します。SSRのインジケータが点灯するはずです。点灯したら、熱電対を指でつまみます。温度が30℃を超えるとSSRインジケーターが消えるはずです。

基本的な動作は大丈夫みたいです。

M5のプログラムを書き換えて、両方60℃以下ならSSRオン、にします。

コンベクションオーブン+SSRのプラグをコンセントに差し込みます。

コンベクションオーブンのモードを上ヒーター、タイマーを10分ぐらいにセットします。

M5StackのAボタン(上記テストプログラムの場合)を押します。SSRのインジケーターが点灯して上ヒーターが赤くなってきます。温度が上がってくるとSSRのインジケーターが消えて、ヒーターも白くなっていきます。切れたあともしばらくはオーバーシュートで温度が上昇していくと思います。早く冷やすためにドアをあけて空気を入れて温度を下げます。温度が60℃を切ると再びインジケーターが点灯し、ヒーターが赤くなります。

電気製品全般として「異常な臭いや煙があがったら電源を切る」のですが、新品のオーブンはものすごく臭いんですよね……なので、正常に動作しているか、特にACのコードが加熱したりしていないか、十分確認してください。

一度完全に冷ましてから、コンベクションオーブンのモードを上下ヒーターにして、再度テストします。SSRやACコードなどが異常に発熱している様子がなければ、大丈夫かと思います。

が、自作機器、くれぐれも最後は自己責任!ということで一つずつ確認しながら進めてください。

お疲れ様でした(まだ終わってない)。

制御について

PIDでもできるかもしれませんが、熱慣性が大きすぎてしんどいです。

なので、私は計測のプログラムを書いて(Claudeさんに書いてもらって)、150℃、200℃、250℃……など要点でのオーバーシュート量と時間、PWM20〜30%で平衡になる温度を計測、そのパラメーターをもとにして差分制御を行う形にしました。

まぁプリヒートのところを除くと出力全開なんすよね。

ゼロクロスSSRを使っていますし熱慣性も大きいので1HzのPWMにしています。

ということで、Claudeさんにテストデーター取得用のプログラムを書いてもらってSDカードに入ったログを得ました。それ踏まえて

  1. プリヒート温度まで
    起動ボタンが押されたら100%で加熱する。150℃でのオーバーシュートが6.5℃だったので145℃で100%加熱を止める。
  2. プリヒート区間
    オーバーシュートが収束する160℃から勾配制御を始める。PWM 22%だと180℃まで上昇するので、150-180℃までの30℃を90秒→0.33℃/秒の温度勾配に近づくようPWMを10秒ごとに1%ずつ変化させる。
    150℃を超えた時点から計時して、180℃を超えるか90秒を経過した時点でプリヒート終わり。
  3. リフローへ
    100%出力で250℃まで加熱。250℃ではオーバーシュートがほとんどないので、数秒後にオーブンのドアを開けて空冷(人力)

という制御にしています。結果が冒頭のグラフです。まだ細かいチューニングをしていませんが、バタバタ暴れないいい制御になっているんじゃないかと思います。


少し宣伝

自分も作ってみたいけど、苦手な分野は手伝って欲しい!という方は、私のココナラサービスをご検討いただければ幸いです。

  • 基板を作る
  • ソフトウェアのみの開発
  • 各種サポート

など、どの段階・要素でも対応可能です ^ ^

2026年2月16日月曜日

ATTINY1616への書き込み

自分へのメモ。

Arduino NANO経由での書き込みには失敗。jtag2updi自身がもうやーめた、みたいな感じですし。

続いてシリアルでの書き込み。

先人曰くCH340が良いらしいけども、手元に皆無だったので、昔ハミックベア用に作ったCP2102の基板を使います。懐かしい型番ですわね。

接続方法としては、

  1. USBシリアルのTXとRXの間にショットキーバリヤーダイオードを入れる。TXがカソード / RXがアノード
  2. RXから470Ω(4.7KΩという記述もある)でATTINY1616のUPDIピンにつなぐ。
  3. ATTINYのGNDとUSBシリアルのGNDを接続
  4. ATTINYのVCCとUSBシリアルのVUSBを接続

Arduino IDEにATTINY1616などのビルド&書き込みツール「megaTinyCore」を入れます。入れ方はここを参考にしました。

Arduinoで動く20PinのAVRマイコンATtiny1616を試してみた

で、ツールメニューはこんな感じ。


PortはUSBシリアルのポート、BoardはMegaTinyCoreの下にATTiny1616が2つでてくるのですが、w/Optibootのない方を選びます(何が違うのか不明)。

Chip:で接続したATtinyを選びます。

あとはProgrammerのところがミソで、USBシリアルをつなぐ場合にはUPDI Serialを選ぶのですが速度などいろいろあります。私は「SerialUPDI 230400 .... Mac / Linux」というのが目に留まったので、それで試しました。

Toolメニューから「Burn Bootloader」を選びます。これで、USBシリアル経由でATTiny1616に対してArduinoブートローダーが書き込まれます。

で、おなじみのBlinkの書き込みですが、ここはもうcmd+Uでイケます。さてピン番号の指定はどうすれば?と思ってLED_BUILTINにマウスオーバーしたら「PIN_PA7」と表示されました。で、PA7に抵抗入りLEDをつないでみたら無事点滅しました。


jtag2updiで半日ぐらいツブしたあとなので、あっけなく動いたなぁという感じです(枯木

その後、SerialのスピードをTurbo 921600にしても書き込みできましたが、Blinkぐらいのサイズ(744 bytes)だと違いがわかりませんw

あと、Serial.printはPB2に信号が出てました。ピンアサイン通りですね(RXはPB3)。公式サイトにピンアサインをソフトで切り換える方法が出てました。が……

Hardware Serial reference (AKA UART or USART)

Serial.pinsで送受信ピンのアサインを変更したり、Serial.beginで各種モードを指定できるようなのですが、うまく行ってません。pinsで他のピンを指定してもPB2から出てきてしまうので、まだ何か他にあるんでしょうか……まぁ全部読めって話なんすけどw

とりあえず最低限の動作確認できたので、今日はこの辺で。

その後、M5StackのCH9102F搭載タイプのESP32-DOWNLOADERを試してみましたがうまくいきませんでした。手元には同製品のCP2104タイプがないので試せていません。CH340で書けた、FT232を使った、という記事は見かけるのですが……。うちは前記の通りCP2102です。

ご参考まで。