電子工作」カテゴリーアーカイブ

レーザーカッターでステンシルを作ってみる2

レーザーカッターでステンシルを作ってみる1の続き

下図のように枠線で出力されているDFXファイルにてカプトンシート(ポリイミドフィルム)そのままレーザーカッターでカットしてみた。

30wのCO2レーザー(Beamo)で「出力24%、速度20、パス1回」と普段コピー用紙をさくっと切る設定でまずは試した。

切り抜けていない箇所と、パッドが隣とつながってしまっている個所が混在。つながったりつながらなかったりしているパッド間は0.6mm程なので今の出力だと0.3mm程レーザーのカット幅で予定より大きくなっている模様。また、切り抜けていない箇所があるので出力を上げるか、複数回カットが必要。

レーザーのカット幅分切り抜く位置を内側に寄せたいがDFXファイルだと編集が面倒そう。塗りつぶしで出力されるSVGでオフセットをかけて内側にカットラインを寄せてみる。具体的な手順はこちらを参考にした。

Inkscapeで枠線を0.2mmオフセット。出力24%、速度20、パス2回にして再実行。

カットしたシートはゆがんでいる。ただし、カット前に一度ヘッドに巻き込まれて折り目がついてしまったので、カット時の熱のせいか、巻き込みのせいかは不明。

暫定対処でマスキングテープで角を止めてみる。見た感じは悪くなさそう。少なくともつまようじ等でペーストを乗せるよりはいい感じになる予感。

今日はここまで。

レーザーカッターでステンシルを作ってみる3

レーザーカッターでステンシルを作ってみる1

PCB用のステンシルは試作用基板で作るには高いのでカプトンシート(ポリイミドフィルム)で作ってみる。CO2レーザーでカットしてみる予定。

カプトンシート

購入先はAliのこちら

1/25発注で1/30到着

A4大封筒にビニール包みで届いた。気になる折り目等は無し。ただ、他の荷物と同根なので段ボールの端が刺さったりとかはありそう。

耐熱等も書いていなかったのでとりあえずきれっぱしを温めてみた。

1分ほど240℃で温めてみたが特に変化なし。(はんだペーストで問題でないか確認するつもりだったがそもそもリフローの時には熱がかからないこと後で気づいた。カットの時の熱でどうなるかはこれから)

ステンシル用データ

KiCAD9.0.6を使用。

2面基板(実装部品は表のみ)の場合は、パッドのデータは「PCBエディタ->ファイル製造用出力->ガーバー」から「左上のプルダウンからDXFまたはSVGを選択」F.Pasteのみ選びプロットで出力できた。裏面を出す場合はB.Pasteだろうけど試していない。

2026.2.3追記

F.pasteのみだと外径が出ていなかった下図のように含めるレイヤーF.pasteとすべてのレイヤーでEdge.Cutsを選択すると基盤外径も出力される。

紙ベースでやっているブログがあったのでこちらを色々参考にする

追記終り

DXF形式だとパッドの枠のみ出力、SVGだと塗りつぶしで出力された。DXFでそのままレーザーでカットできれば楽だけど塗りつぶしの方が微調整必要になったときにやりやすいかも。

出力の際にインチ指定だと、(今回インストールしたての)LibreCADでmmを指定してもインチで認識されてしまった。mm指定で出力した場合はmmで認識してくれた。LibreCADの使い方の問題かもしれないが自分が編集しやすい単位で出しておいた方がよさそう。

今日はここまで

続き

Aliで買ったフォトリフレクタITR9909使えた

買ったもの

買ったのはこちらのものとこちらのもの。買ったの忘れて別の場所から2回買ったけど物は多分同じ。

スケッチ

手元のArduino UNO R3で以下のスケッチで動作確認。(LED側の抵抗は220Ω、フォトトランジスタ側の抵抗は10kΩ。配線は下の方に記載)

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println( analogRead(0));//A0ピン
  delay(200);  //測定間隔
}

出力は5-10mmの距離で白い紙を置くとAnalog値で100

979
977
954
809
288
125
117

回路

データシートは購入先のこちらに抜粋

物理的な配置ではグランドにつなぐエミッタとカソードが対角線にあるので注意。

Aliexpressで買った3wレーザーダイオードモジュール

おそらく同じもの複数売られているけどこいつ

Vfは3.05ぐらいだったのでおおよそ表示通り。30mA(15mAの定電流ダイオード2並列)でしっかりと光る。それより若干電流が小さくてもレーザーとして光ったはず。(試して時間がたったので記憶が曖昧)

電線は蚊トンボの足のようにもげやすい。(付け直しのはんだはやりやすかった)

電池2本駆動だとレーザーダイオードで3Vつかい、昇圧しないと定電流回路を動かす分の電圧が足りない。

というわけでAliで売っているいつもの昇圧コンバーターで昇圧。どうせ、昇圧するなら作るの簡単な定電流ダイオード2並列で雑に作ろうということで定電流ダイオード(秋月のこいつ)の動作に必要な4.3vをたして3V(レーザー)+4.3V(定電流ダイオード)の7.3V以上に昇圧。(ちょっと余裕持たせて8.5Vぐらい)

単三電池*2->昇圧コンバーター->定電流ダイオード(15mAの2並列)->スイッチ->ダイオードのシンプル構成

余っていた使わない基盤に張り付けて完成。1月ほど使っているけど今のところ安定動作。

電流はおおよそしか制御できていないはずだけど安い部品なのでざっくり。

試していないけど、Aliに使えそうな定電流ICがあった。電池2本だと厳しいだろうけどリチウム電池やスマホから5Vとれるならシンプルに使えそうなきがする

(2025/10/1追記)

壊れたレーザーポインターの基板に取り付けて使っていた動いた。よく見るとその基盤は、22Ω抵抗とスイッチのみ(単三2本で動作)。レーザーの劣化が若干早い気はしたけど、いつもスイッチが下手るのが先。そんな単純な構成でもおおよそ動く模様。部品高いものでもないし壊れたら交換するぐらいに割り切って使ってもよいかもしれない。

LTspiceのコンデンサ初期電圧設定

久しぶりにLTspiceを使ったらコンデンサの初期電圧設定方法がわからなかったのでメモ。

バージョンは24.1.10

上部のアイコン欄にあるSPICE DIRECTIVE(“.t”アイコン)をクリック

出てくるテキスト入力欄に、コンデンサの電圧初期状態を指定してあげる。例

.ic V(n002)=0

chatgptに書かせた開設がわかりやすいのでそのままぺたっと

.ic コマンドとは

.ic は Initial Condition(初期条件) の略です。

回路シミュレーションで コンデンサやインダクタなどの状態を初期値から始めたいときに指定します。

形式:

.ic V(node)=値


V(node):指定するノードの電圧

値:初期値(V単位)

2. 具体例:.ic V(n002)=0
.ic V(n002)=0


ノード n002 の電圧を シミュレーション開始時に 0V に固定

これは、コンデンサや回路の「立ち上がり電圧」を指定するときに使います

例:

回路にコンデンサ C1 があって、ノード n002 がコンデンサの一端に接続されているとします

.ic V(n002)=0 を指定すると、LTspiceはシミュレーション開始時に C1の電圧を0Vとして計算を始める

これにより、シミュレーションで不要な初期トランジェントを避けたり、特定の初期状態を作ったりできます

3. 注意点

.ic は DC解析やトランジェント解析で使う

トランジェント解析の場合、コンデンサやインダクタの初期値として作用

代わりに、コンデンサの属性で IC=0 を設定することもできます

💡 まとめ

V(n002)=0 → ノード n002 の電圧を初期値0Vとしてシミュレーション

コンデンサやインダクタが絡む回路で、シミュレーションの開始状態を制御するために使う

解説にはコンデンサの属性で指定できると書いてあるけど、GUI上の入力欄はなくなっているっぽい

こわれた3Dプリンターからはぎ取ったステッピングモーターの動作確認

少し前に、最初に買った3DPが壊れた。(というかいじっていて壊した。)こわれたものはiUSEとかかいてある格安のやつ。(写真内から同じもののブログ記事

ステッピングモーターを一つ外したところXY42STH40-1684Aというものがついていた。(XYSLDJがブランド名?)

6pinのコネクターがついている。6ピンあるけど2番ピンと5番ピンは使用していない。

1,3番ピンと4,6番ピンがセットで使用する物。

コネクターの種類はモーター側は6ピンのJST-XHコネクター、プリンター側は4ピンのJST-XHコネクターだった。ケーブルの色は黒1番ピン、緑3番ピン、赤4番ピン、青6番ピンだった。

元々の3DPはモータードライバーがA4988だったのでアリでこちらのモジュールを購入

ステッピングモータの(コイルが内部でつながっている)1&3番ピンをモジュールのA1/B1のペア、4&6番ピンをA2/B2のペアに接続。

モーターの動作用に12Vの外部電源を接続。

モジュールの大まかな使い方イメージはこちら参考

以下のソースで動作確認。12Vの外部電源でパルスが5000マイクロセカンド未満だと、早すぎてうまく回ってくれなかった。

const int DIR  = 8;
const int STEP = 9;
const int SLEEP_PIN = 7;
const int ENABLE_PIN = 6;
const int pals = 5000;

void setup() {
  Serial.begin(115200);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, LOW);
}

void loop() {
  
  digitalWrite(DIR, HIGH);
  Serial.println("HIGH");
  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(pals);
    digitalWrite(STEP, LOW);
    delayMicroseconds(pals);
  }

  delay(1000);

  digitalWrite(DIR, LOW);
  Serial.println("LOW");
  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(pals);
    digitalWrite(STEP, LOW);
    delayMicroseconds(pals);
  }

  delay(1000);

}

自宅用通知マシン作成(5)

前回の続き

スタックチャンがしゃべれるようになったので、次は外部からしゃべる指令を出す端末のバージョンアップ。呼び出しは予約確認のための自宅用通知マシンと兼用。

エッジ検出処理&疑似的な並列処理はこちらに大体まとめた感じ。

メインのループ(Arduinoのloop関数)は並行処理するループ(yoyakuCheckLoop,yobidashiCheckLoop)をそれぞれ呼び出しyobidashiCheckLoopの中でボタンが押されている判定をして押されていたらネットワーク越しにスタックチャンがしゃべるURLをたたいてしゃべらせる。

最初はPOSTで叩こうとしたけどPOSTの引数違うぞみたいなエラーメッセージが出たのでとりいそぎGETメソッド(5秒も調べていない)

メインのループの中でyobidashiCheckLoopを呼び出し。下に張った中のyobidashiCheckLoopでやっていることはこちらに大体まとめた感じ。で、execYobidashi(開発環境ならexecDevYobidashi)で、httpsのリクエストを投げているだけ。セキュリティ的なものはつけていないのでそのまま叩ける。

一応全体

続けてネットワーク回り

ESP8266でエッジ検出処理

やりたいこと

ボタンを押したときにそれを検出して処理をしたい。ループの中とかで検出処理をごにょごにょやるのはつらいのでボタン検知の割り込み処理を試す。LOWからHIGHになったとき(立ち上がりエッジ:RISING)や逆にHIGHからLOW(立ち下がりエッジ:FALLING)になった時を検出するやつ。

概要

void ICACHE_RAM_ATTR shopYobidashiCallback() {
  Serial.println("working");
}
void setup() {
  pinMode(INPUT_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(INPUT_PIN), shopYobidashiCallback, FALLING);
}

割り込みが効くGPIOでattachInterruptを呼び出し。GPIOがどれかはちゃんと確認していない。(データシート参照)とりあえず、12は効いて1-15が効くと思う。

呼び出し元

attachInterrupt(割り込み番号,コールバック関数名,検出エッジ)の引数。

割り込み番号はdigitalPinToInterrupt(ピン番号)で取得できる。

コールバック関数名はそのまま関数名

検出エッジはLOW/CHANGING/RISING/FALLINGが選べる模様。LOWはLOWの時常に。実際に試したのはFALLINGのみ。(参照 ESPでなくArduinoのドキュメントなので少し違うかもしれない)

コールバック

ドキュメントはこちら

コールバックには関数をRAM上に配置する指定のIRAM_ATTRまたはICACHE_RAM_ATTR(多分こっちはDupricated)がいる。

つけ忘れると下みたいなメッセージが出て再起動するはず。

ISR not in IRAM!

User exception (panic/abort/assert)
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Abort called

>>>stack>>>

ctx: cont

RAMにない=Flashにあるとそっちの書き込みとかぶってだめよという事らしい。

その他制限として

  • delay() or yield()を読んだり内部で使うものを使用できない
  • 1ms以上かかる処理をすると不安定orクラッシュ引き起こす。よって、時間かかる処理は他でして極力そのためのフラグ操作など推奨。フラグはvolatileつける(参照
  • ヒープ操作は不具合起こしえる。malloc最小限にしてreallocとfreeは使うなと。stringやvectorも要注意。詳細はドキュメント。
  • C++のnewやdeleteも

あとは、ドキュメントに書いてないけどコールバックの宣言は使う前に。

チャタリング対策

立ち上がり、立ち上がりを検出したいが変化した時に押しているのか押していないのか中間の状態を経由するのでその際に何度もコールバック関数が呼ばれてしまう。(参照

今ブレッドボードでやっているけどイメージは下。

0件だよ
0
working
working
working
working
working
working
working
working

呼ばれたときの処理で出力される”working”が一回であってほしいが何度も出力される。

参照先に色々な対策があるが、ソフトウェアで対策できれば楽。今回の使用用途としては押されたときにあるURLをたたければよい。また、即時に何度も呼ばれなくてもよい。なので、エッジ検出後一定期間その状態が続いていれば処理を実行するとすればよい。

  1. ボタン押す
  2. 最初の立ち上がり/立下りを検出後最初数100msはチャタリングしているかもしれないので読み飛ばす
  3. その後、100ms間隔で数回状態が継続していたら押されていると判断する

みたいな感じで今回は大丈夫。

ソフトウェア的にやらないなら積分回路組んだり、ラッチ回路組んだり、いいスイッチ使ったりとあるが要件厳しくなければソフトで切り抜けた方が大体良い気がする。(というかそういう要件に収めたい)

で、ループからボタン検知と状況確認の並行処理しようとしたらESP8266はスレッドなかった。並行処理するためにFreeRTOSいれる。FreeRTOSを使おうと思ったら「ESP8266などいまさら開発する暇ないんじゃ!」とのお言葉。ESP32-C3なら使えるらしい。

ループ切り替えながらやる。2つの処理があるけど、時間はざっくりでよい。

下のイメージになった。

コールバック(shopYobidashiCallback)はフラグの設定のみ

メインのループ(Arduinoのloop関数)は並行処理するループ(yoyakuCheckLoop,yobidashiCheckLoop)をそれぞれ呼び出しのみ。

yobidashiCheckInterval 経過していなかったらスキップする処理を入れつつチェックをいれる。yobidashiCheckLoopが走っている間はもう一個の処理(yoyakuCheckLoop)は順番回ってこない。

ESP8266には基本INPUT_PULLDOWNなかった。

ESP8266(ESP-WROOM-02)で内部プルダウン使おうと思ったら怒られた。

C:\Users\kitam\git\yobidashi\client\home_yobidashi\home_yobidashi.ino:109:22: error: 'INPUT_PULLDOWN' was not declared in this scope; did you mean 'INPUT_PULLDOWN_16'?
109 | pinMode(INPUT_PIN, INPUT_PULLDOWN);
| ^~~~~~~~~~~~~~
| INPUT_PULLDOWN_16

ESP8266のGPIO1から15にはPULL_DOWN抵抗はない。INPUT/OUTPUT/INPUT_PULLUPのいずれか指定。

GPIO16だけプルダウン抵抗がある。GPIO16はディープスリープ用の特別なやつ。指定する場合はINPUT_PULLDOWN_16。

https://links2004.github.io/Arduino/dc/d6f/md_esp8266_doc_reference.html

ブレッドボードの配線的にPULL_DOWNの方が指しやすかっただけなのでおとなしくPULL_UP使う。

自宅用通知マシン作成(4)

音声関連クラス化

見通しが悪くなりそうなので音声周りは別クラスに。多分まだ予想してない改造をしそなのでパラメーター渡すとか考えずに単純な別ファイル化だけ。(StackSpeaker.h)

呼び出しは

しておいて使いたいところで

通信

次に外部から呼び出せるようにserver機能を持たせる。店の外から呼び出す計画のでまずはhttpでそのまま外からつなげられるようする。そのうちリバースプロキシの後ろに隠すかもしれないけどとりあえずルーターにNAPTでさばかせておく。

wifi周り

スマートコンフィグ使おうかと考えたけど、ip指定で起動するときにデフォゲとサブネット与えないといけなかった。そいつらをしっかりと渡すとなると外から与えてスマートコンフィグの意味なくなるか、一回目の接続で取れた値を使用と面倒になりそう。というわけでおとなしく明示的に指定することにした。

と、サンプルにありそうなやつそのまま

server周り

これもよくありそうなやつ。

WebServer.hつかって、呼び出し処理があったら音声を流す処理を行う。

handleYobidashiの中で、speaker#stopVoice/speaker#startVoiceを直接呼んでいるので同期処理になっている。音声が流れ終わってから呼び出し側にはレスポンス返る。使うケース次第では非同期呼び出しにするためにさらにスレッドを呼ぶ形にする方が良い場合は多そう。

続き 呼び出し側の自宅端末バージョンアップ