2026年9月26日土曜日

Blinds Feederの改善(むしろ3Dプリントねた)

上から0402, 0603, 0805, 1206, SOT2-3, MSMF Style2, 4x4.2mmインダクタ

本体+サポートをPLA、インタフェースをPETGという基本プレイ

前回PLAである程度はできていたのですが、動きの悪いレールや出力に失敗するケースも多いため、P1SをAMS 2 Proバージョンに買い替えたのを契機に、「絶対成功する出力ルール」を確立する方向でがんばりました。経過を省略すると

結論:本体とサポートはPLA、インタフェースだけPETG

というごく当たり前の結論に至りました。

最初これを試したのですがボロボロで……Blinds Feeder提唱者の方もPETGを推奨しておられるのでPETG単体で試行錯誤を重ねたのですが、どうしても100%の成功には至らず。

ただ、パラメータを追い込んだことで出力もだいぶきれいになり「ノズルに溜まったダマが壁を壊す」現象も解消できました。

PLAについては、フィラメントのデフォルト流量を2-3%減らす。Bambu PLAの標準は0.98になっていましたが、これを0.95まで落としたらダマがほとんど出なくなりました。

PETGはPolylite PETGですが、流量0.95→0.92で安定しています。また、ノズル温度は初期値255度、それ以外250度、フローを8㎜^3にしてきれいにでるようになりました。

マシンの設定は、糸引き対策としてZ-hopをAutoからSpiralに変更しました。

プリントの設定としてはQuality→Advanced→Avoid crossing wallをチェックしました。移動時に壁をまたぐケースが減るので、ダマが壁を壊すリスクが減るそうです。

本体+インタフェース+サポート(健気)

Blinds Feederの設定について

なるべく楽をして生きていきたい私がこんなに試行錯誤したのは、OpenPnPで「透明なカットテープを楽に認識して使いたい」からです。カットテープを扱う上で最良のフィーダーはReference Stripe Feederです。光学認識でスプロケット穴を認識し、穴と部品の相対位置を設定すればあとは光学認識とあとは単純な座標計算で部品を着々と拾ってくれます。ただ、透明カットテープは背景との差が出にくいために光学認識が失敗します。環境光の影響も受けるのでカーテンを閉めた部屋でも昼と夜とで動作が違ったりもします。Blinds Feederは、指定の色(前回に書いた通り、部品とHSVが大きく異なる背景であれば認識しやすいです。背景のHSVはスクショをClaudeさんに「この画像の主たる部分のHSVを調べて。値域は255でmin/max」などとプロンプトつけて投げればいい感じの値を算出してもらえます。もうテープの色が何色だろうが関係ないのです。とても嬉しいことです。

残る問題として、テープ上での部品の幅(テープの長さ方向)がピッチの半分を越えると、フタがブラインドとして機能しなくなります。開いている窓が部品より狭くなってしまうからです。私がBlinds Feederを使いたいと思う動機は2つ、

  1. フタと閉めて保管したい。カバーテープ剥がして保管するとちょっとした振動で部品が飛び出します。Blinds Feederは蓋付きなので安心!!
  2. Stripe Feederで認識するのが難しい透明なカットテープを何とかしたい

です。

BSS138は黒い静電防止テープなのでStripe Feederでもきちんと認識されるのですが、SOT23はちょっとした振動でもトレイの中でひっくり返ってしまいます。そのため、できるだけフタで守りたい。インダクタなど大きめの部品は透明テープでピッチも小さいことが多いので、困ります。

なお、このあとにOpenSCADの設定を書いていきますが、パラメーターのWidthは私の写真の上下方向=テープの幅方向です。部品の幅は写真だとテープでは長さ方向になるので、ややこしいです。どうぞお気をつけて。

SOT23-3(BSS138)

ということで、4mmピッチのBSS138はポケットの長さ方向の幅3mmの2倍としてpocket_pitch=6を指定してみています。

tapeBSS138_1 = TapeDefinition(
    tape_width=8,
    tape_thickness=0.6,
    pocket_portrusion=1.4,
    pocket_pitch=6,
    pocket_width=4,
    tape_play=0.05,
    cover_play=0.05);

こうするとテープ上のピッチは4mmなので12mmごとに窓が正しく開きます。とりあえず出力はうまく行きました。OpenPnPに設定する時にピッチを12mmにすれば認識してくれるんじゃないかなぁ……と思うのですがまだ試していません。追試を待て!

SOT23に限らないですが、樹脂のテープ、特に静電防止加工のテープは、ちょっとピンセットが触っただけでカットテープがバネ状に振動して部品が跳ねたりひっくり返ったりしがちです。これを避けるにテープの裏側にニチバンの幅5mmの両面テープを貼ってます。ポケットの幅(上下方向)は3mmぐらいなので上下にハミ出すのですが、それを押し込むようにするとテープの糊がいい感じに振動をダンピングして部品のジャンプを大幅に減らしてくれます。

SRP4020FA-1R5M

インダクタのSRP4020も同様です。みっちりつまっていますが、

tape12mm_SRP4020 = TapeDefinition(
    tape_width=12,
    tape_thickness=0.6,
    pocket_portrusion=2.8,
    pocket_pitch=12,
    pocket_width=5.4,
    tape_play=0.1,
    cover_play=0.05,
    blinds=true);

以上のように実際のピッチは8mmですが、pocket_pitchは12mmにして窓を大きくし、一つおきに拾ったあとはまた窓をずらして残りを拾う……という作戦です。これもBSS同様まだOpenPnPで試していませんが……追試をお待ちください。


0402 / 0603
tape0402_08 = TapeDefinition(
    tape_width=8,
    tape_thickness=0.8,
    pocket_pitch=2,
    pocket_width=2.25,
    tape_play=-0.03,
    cover_play=0.08);

tapeC0603 = TapeDefinition(
    tape_width=8,
    tape_thickness=1.2,
    pocket_pitch=4,
    pocket_width=2.5,
    tape_play=-0.0,
    cover_play=0.05);


0805 / 1206

tapePocketC0805 = TapeDefinition(
    tape_width=8,
    tape_thickness=0.6,
    pocket_portrusion=1.6,
    pocket_pitch=4,
    pocket_width=4,
    tape_play=0.05,
    cover_play=0.05);

tapePocketC1206 = TapeDefinition(
    tape_width=8,
    tape_thickness=0.6,
    pocket_portrusion=1.8,
    pocket_pitch=4,
    pocket_width=4,
    tape_play=0.05,
    cover_play=0.05);

MF-MSMF030-2

tape12mm_MSMF = TapeDefinition(
    tape_width=12,
    tape_thickness=0.4,
    pocket_portrusion=1.2,
    pocket_pitch=8,
    pocket_width=5.0,
    tape_play=0.1,
    cover_play=0.05);

なお、OpenSCADへのパラメータについて……tape_thicknessは計測した厚さを0.2mm単位で切り上げる感じですが、フタの動きが渋いときにはさらに0.2mm増やしてみるといいかもしれません。

tepa_playとcover_playはオリジナルのwikiに掲載されている図や説明にある通り、水平方向の「遊び」です。これが原因で動きが渋くなったりテープが装着できないというのはまだ経験していません。

赤い印がついてますが、ちょっとしたTIPSです。フタの部分は1レーンずつバラバラに出力されるので、どのフタがどのレーンのものかわからなくなってしまいます。なので、出力が終わったら赤いマジックで上から順番に1, 2, 3と印を付けています。「おなじ幅だとおなじフタ」になっていると思うのですが、出力のばらつきと区別がつかないケースも多いので、今のところ確実に再現できるように印をつけております。

3Dプリントの試行錯誤について

  • まずPETGフィラメントを乾燥して乾燥して乾燥
  • PETG標準のパラメータで出力→盛大に失敗
  • タイムラプスでは原因がわからなかったので実機で見ているとノズルのダマが次第の大きくなっていき、壁をひっかけて崩れるケースがあった
  • ダマ対策で流量、温度、ホップなどを調整調整調整
  • 細くオーバーハングも大きいので強い付着が必要。そのために先達からアドバイスをいただいてYOOPEIプレートを導入するも破綻、純正液体接着剤も購入するがそれも駄目
  • 純正のSmooth PEIが自宅にあったので公式の指示通り液体接着剤を4回塗っては乾かして、8レーンのうち7レーンの出力に成功
  • しかし手間が大変(塗って70度5分乾燥、これを4回)。
  • 一度PLAで試すが100%成功とはいかず、フタの動きもよくない
  • 塗布→出力→失敗して洗浄を10回以上繰り返してイヤになる
  • ヘアスプレーケープが良いと教えていただいて買ってみる。マスキング用のカバーを製造したこともあって均一に塗布できるようになるが、純正液体接着剤と比べると定着度はやや劣る
  • PLAをサポート+インタフェースとしてPETGを本体とする→まったく付着せず。パラメータを変更するが駄目
  • 基本に返って、ダマのでない条件の下で、インタフェースをPETGとしてPLAで出力したところ、ばっちりできた。
  • 本記事に至る

2026年9月8日火曜日

OpenPnP:Blinds Feederの設定について

調整途中なのでバリや糸引きが残ってますが……

Reference Stripe Feederは光学処理でカットテープを認識してくれますが、フィーダーそのものについてはユーザーが用意しなくてはいけません。いろいろ試して代替の部品はうまく認識できるようになりました。ただ、0603以下、特に0402以下はちょっとした振動で飛んだりひっくり返ったり無くなったりします。

もうつかれました。

ということで、再度Blinds Feederに戻ってまいりました。

Blinds Feederの特徴

  • テープ幅などを数値設定するとOpenSCADがSTL/PDFを吐いてくれる
  • 土台とフタが出力される
  • 土台にはスプロケットがぴったりハマる突起が出ているのでテープずれない
  • 土台には4つのFiducialsがあり座標を自動光学認識してくれる。一つの土台をグループとして登録しておけば、個々のテープの位置を登録しなくてもあとは四隅との相対座標で自動的に補正される!
  • フタには穴が空いていて、部品をその穴からピックアップする
  • フタを半ピッチずらすと部品が見えなくなり紛失の恐れも減る!
  • SOT23など部品が密集している場合はただのフタだけど保管中に部品が消えることがなくなる!
  • フタはノズルの動きで自動開閉可能!(ノズル変形が怖いので私は手動一択)
  • PDF/DXFでラベルを吐いてくれる。ラベルはOCRまたはQRコード、3Dプリントとは別に出力して貼り付けるとvision pipelineが自動認識してくれる!(らしい……未テスト)

という感じです。特にグループ登録は素晴らしいですね。テープごとに高さと座標をセットするのは煩雑(特に高さ調整は老眼にはきつい)なのですが、グループとして保存しておけばあとは周辺座標合わせるだけ!というのはとても楽です。楽すぎます。

なお、この続きを書きました(Blinds Feederの改善(むしろ3Dプリントねた))。例えばSOT23についても別のアプローチで「窓を開けられない問題」を解決しています。

OpenSCADへのデータ(一例です……というか私のための解説)

0603

tape0603 = TapeDefinition(
    tape_width=8,
    tape_thickness=1.1,    // メーカーごとシリーズごとに異なるので毎回計測推奨
    pocket_pitch=4,
    pocket_width=2.5,
    tape_play=-0.0,
    cover_play=0.05);

SOT-23など

SOT23-3/-5などはテープに隙間無く入っていてフタをズラして窓を開く余地がないので、フタは保存時の紛失防止みたいな感じです。使用する時全開して使うのが前提となります。

tapeSOT3 = TapeDefinition(
    tape_width=8,    //    テープ幅、誤差は含めない。なお以下もwidthはテープの幅方向
    tape_thickness=0.4,    // テープの厚さ:スプロケの高さ
    pocket_portrusion=1.6,    // プラスチックパッケージの裏のでっぱり深さ
    pocket_pitch=4,    // 部品の間隔
    pocket_width=4,    // 部品の幅
    tape_play=0.05,    // テープの遊び
    cover_play=0.05,    // カバーの遊び
    blinds=false);      // true : フタに穴が開く

ESP32など

でかい部品はテープ幅広すぎて、縁にひっかからず落ちます。そういう部品は土台の穴に一つずつ部品を投げ込む仕組みになります。めんどくさい?でもLoose Parts Feederで光学認識が思うように動かないと泣き崩れるよりも楽です。

なお、遊びについては数値に含めずplayで調整してくれと公式に書いてありますが、これはテープとカバーと本体との隙間にかんする話で、部品を納めるポケットの話ではないようで……チップの仕様書あるいは実測値そのままだと部品入りません。これは出力を繰り返して調整するしかないでしょうね。

trayESP32C3 = TapeDefinition(

    tape_width=28,        // 部品幅20 + 隙間 + 側壁余裕 → 4mmの倍数で28
    tape_thickness=3.2,   // くぼみの壁の高さ = 部品の高さ
    pocket_pitch=24,      // ポケット長18.5 + 仕切り壁0.9 + 余裕 → 4mmの倍数で24
    pocket_width=20.5,    // テープ幅方向(20mm辺)+0.5の遊び
    pocket_length=18.5,   // テープ長さ方向(18mm辺)+0.5の遊び
    tape_play=0.1,
    cover_play=0.05,
    blinds=false,    // フタに窓不要
    sprocket_thorns=0);    // スプロケを差し込む突起の間隔。1は4mm、0は突起なし

3Dプリントについて

デフォルトは層厚layer_height=0.2に設定されていて、「うちのP1Sなら0.08mmでイケるだろ」と思ったのですが、スライサーのデフォルト値とぶつかったりでうまくいきません。たとえばBumbu Studioだと定着層が0.2mmでその上の端数が切り捨てられて1層しか出力されなかったりします。ので結局0.2に戻しました。

ともあれ、最初はデフォルトで出力してみることをオススメします。

と書いておいてなんですが、底板の厚さについて。

デフォルトだと底板の厚さは2層ですが、うすすぎてゴム磁石で固定しずらいので少し厚くして使いたいと思います。その場合には、BlindsFeeder-Library.scadのfloor_thicknessにミリ単位の値を設定します。この時、積層厚の整数倍にすると良です。

ただし、それでも低すぎてノズルが届かいので、なにか台を使うか、フィラメントの消費は気にしないで底板を厚くするか迷ってます(P1Sの場合10mm程度の厚さが必要)。公式ではslateに貼れって書いてますね。PSE-3000は基盤が鉄板なので、磁石なら簡単に固定できるのですが、簡単で使いまわしができて設定も楽という天国を求めております。

なお、3Dプリントと調整済のパラメータについては別の記事にまとめました(Blinds Feederの改善(むしろ3Dプリントねた))。

フィラメントの色

公式ではフィラメントは鮮やかな緑色を使ってクロマキーのようにスパッと抜く設定が入っています。ただ、何故かいま、Bambu Labは緑色フィラメントがないので、手元の青色で試してみました。

手順としては、3DプリントしたフィーダーをPSE-3000に固定して、top visionの画像を表示します。その画像を切り取ってClaudeに送り、「上限値255のHSVの範囲を調べて」とお願いします。そうすると色相・彩度・明度を解析してくれますので、edit pipelineから入力して切り取り具合(3Dプリントした部分が黒、それ以外は白になればOKです)を調整し、Save Pipelineします。なるべく広域で影になっているところなんかも写った状態のスクショを撮ってClaudeさんに分析してもらうと楽です。

こうしてできたのが以下のMaskHsv設定です。hue(色相)がだいぶ狭くできました。

なかなか一発では行かないと思いますので、光源を変えたり向きを変えたり、直接数字をいじって黒い範囲が出たり消えたりするのを確認しながら進めましょう。地味な作業ではありますが、Claudeさんに解析丸投げできてだいぶ楽でした。

まぁ青だと例えばKOAの厚膜抵抗の上面が水色なのでそれと被らないか心配ではあるのですが……その場合はオレンジ色で出力してみます。