ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示
ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示

2022年7月23日土曜日

太陽電池駆動装置をサクッと作る

本格稼働前に防水ボックス作らないと……

今日は簡単な電子工作を一つ。


  「ベランダのカメ水槽に太陽電池駆動フィルターを付ける」

です。

……工作以前ですね。

うちのベランダにはコンセントがないし、サッシの隙間を通すのもイヤなので、

  太陽電池→コンディショナー→インバーター→カメ用フィルター

という構成で、作りました。コンディショナーは鉛蓄電池でバックアップしています。全部秋月電子通商で揃います。届いたものを配線してベランダに設置するだけです。太陽電池は定格12W、バッテリは12V 7.2Ah、カメ用フィルターは5W程度らしいので、8時間晴れていれば17時間ぐらい動いてくれます。夜は止まっていて欲しいので、十分です。

これでカメの水換え頻度を減らせると良いのですが。

太陽電池:M-08233
コンディショナー:M-06167(太陽電池、バッテリー、インバーターを制御)
シガーライター型インバーター:M-02998(12VからAC100Vを作ります)
シガーソケット:C-10622(上のインバーターは安いけど自動車用なので)
バッテリー:B-04961

インバーターが擬似正弦波出力なのでちょっと心配でしたが、幸いフィルターに使われているのはやっすいポンプなので問題なく動作しました(DCブラシレスモーターなどだとうまく動かない場合があります)。

シガーソケットには太い導線をがっつりはんだ付けして、その上から古河電工のエフコテープ1号, 2号でしっかり保護しました。1号は自己融着型でしっかり巻いて固めると粘土のようにカタマリになります。2号をその上に巻いて保護しますが、ビニールテープのようにノリでベタベタになることがないそうです(Twitterで教えてくださった方、ありがとうございました)。

他にファストン端子、電線、太陽電池を支えるあれこれ、はんだ付け……などが必要です。なおバッテリーは大電流を取り出せるので取り扱いに注意が必要です。インバーターも小さいながらもAC100Vを出力するので、それなりに危険です。

こういうものが欲しいけど市販品はフィットしないという方、どうぞお気軽にご相談ください。

なお、カメ用のフィルターには「水作 タートルフィルター L2」を買いました。私が小学生の頃、こういうペット用品は死ぬほど高かったんですが……安くなりましたね。

動かしてみたら結構音がデカイので、ご近所迷惑にならないよう夜は停止するタイマーを設置しようと思います。

LTC3118のVcc出力について


デュアル入力昇降圧DCDCのLTC3118にはVccという3.8Vの出力端子があり内部用に定電圧化されています。引っ張れる電流は、Vin>6V で60mAとのこと。


Voutが12Vのときにマイコン用電源を別に用意するのは面倒なので、どのぐらい使えるかちょっと調べてみました。

Vin1-Run1, Vin2-Run2に別々の電源を接続して、モードをV1優先モードと理想ダイオードモードに切り替えてみます。都合4パターンですね。

結果として、モードに関わらずどちらかが生きている状態(=Run xが有効電圧を越えている)ならば、3.8Vは常に出力されます。Vin xに十分な電圧がかかっていてもRun xが低ければ、Voutも3.8Vも出力されません。

まぁ当たり前の結果ですね……実は、そういう判断をするための内部回路を生かしておくために、モード設定やRun xに関わらず、Voutは出なくてもVccは出てくれるんじゃないかと少し期待してました。

そこまで世の中甘くないっす……

まぁでも3.8V 60mAならESP32は無理としても動くCPUたくさんあるので、なかなか便利です。Run xにはVinを分圧した電圧を入れられるので、例えばバッテリの最低放電電圧にしておけば過放電を防止できます(ただRun xには0.2uA流れるのと分圧抵抗での消費電流には要注意)。薄曇りのときに太陽電池が中途半端に電圧を出してきてON/OFFを繰り返すような事態もさけられます。

入力に理想ダイオードがついている2入力DCDCというユニークなLTC3118。今後とも使っていこうと思います。

ストロベリー・リナックスさんのモジュールならすぐ使えます。
データーシートはこちらです(日本語版は参考程度に)。

2022年5月10日火曜日

抵抗の小分け

 よく使うチップ抵抗、MLCCはこんな感じで100均一の「旅行用クリーム小分け容器」に入れてます。最初左のでかいのに入れてたんですが引き出しがいっぱいになったので右の小さいのに順次更新中です。



便利なんですが……100均ってモデルチャンジが激しいというか売り切れたらそれまでの商品が多いので、なかなか同じものを買い足すことができません。

「そういえば皮膚科でもらう軟膏の入れ物、あれならモデルチェンジしないかも」

と思って探したら、出てきました。

あれ、軟膏壺っていうんですね。しぶいわぁ。

UG軟膏壺 PP(ポリプロピレン)製

2022年2月17日木曜日

パターンカット補修

カットしてレジスト塗ってUEW線ジャンパー飛ばした図
 

毎回、複数枚作業してて終わり頃になるとコツが掴めてくるので忘備録。

  1. 顕微鏡の倍率を上げまくる
  2. ほぼパターンが上下方向(1:35)に走るように向きを変える
  3. 新品の刃をつけたデザインナイフで手前から奥へ切り込みを入れる
  4. 基板を上限反転する
  5. デザインナイフでさっきの切込みの0.5-1.0mmほど手前からV字になるよう切り込みを入れるとポロリと銅箔が落ちる。

はず。あとは銅クズを丁寧に拾ってからブロワーで掃除し、レジスト保護液を塗る。

あ。

レジスト保護液の塗り方も毎回忘れるので、忘備録2。
  1. 蓋についた筆は使わない
  2. 工業用の尖った綿棒の綿球2/3を浸す
  3. 瓶の口の筒になった部分でくるりと2周してしずくを切る
  4. 目的の場所に綿棒の先端を当てる
  5. こうするとダラーっと広がったりしない
  6. だんだん濃度が濃くなるので、量が少なくなる。そうしたら、しずくを切るための回転数を少しずつ減らし、浸す量も増やす。
……これで万全だ。

…………書いたことすら忘れるというオチが待っているけども。

2021年10月19日火曜日

JLCPCBで基板を作ろう! - (1) 注文方法

二度のPCB A不良(BGA短絡)と納期遅延(基板実装5-6日の予定だったのものが基板完了後10日間放置状態)が続いたことについてクレームを入れた後、新しい注文を入れることができなくなりました。クレームとの関連等についての問い合わせにも回答が得られていません。残念です。

JLCPCB様、今までありがとうございました。加筆:2026年7月27日

※この原稿はJLCPCB社からの依頼により執筆しています。依頼だからといって手心は加えていないつもりですが、その旨、ご承知おきください※

■はじめに■

先日私引っ越しをしたのですが、40年前、社会人として仕事する前のバイト時代のお仕事メモが出てきてしまいました。知人の会社でZ80 CPUボードを作るお手伝いをした記録なのですが……A4サイズの両面基板で1枚28万円と書いてあります。当時は基本料金の他にスルーホール1個いくら、ドリル穴1個あたりいくら、という課金方式だったんですよね。回路図を渡してから2ヶ月ぐらいかかったような記憶があります。

それからさらに10年ほど前、自宅で塩化第二鉄で生基板をエッチングしてプリント基板を作っていました。廃液処理に悩んだもんです。

そして今。インターネット経由で基板を注文して、数千円で10日ほどで基板が届いてしまうのだから、びっくりです。21世紀ですねー(年寄りの感想)。

というわけで、2回にわたって、基板設計〜JLCPCBさんに基板発注〜届いた基板を評価〜実装……というあたりをお伝えしようと思います。

CADはEagleを使います。私が使い始めたころは結構高かったんですが……いまはFusion 360のおまけみたいになっちゃいましたね。時代は変わる。


■基板ですが■

今回作る基板は技術的にはそう難しくないけれど、同じものが繰り返しなのでできれば手で配線したくない、というタイプです。

24Vの信号入力が32本あって、それをフォトカプラで受けてラズパイに読み込むのですが、24Vの信号がプラスかマイナスかわからない(!)ので双方向性のフォトカプラを使い、ラズパイのI/Oも足りないのでMCP23017を2個使います。

作ることが決まったのが月曜日で、2週間後には現場に設置しなければいけない、という割と忙しいスケジュール。

現場で仕様を確認したのが10/4日、設計が終わったのは10/5日でした。

うちで基板を作る場合、だいたいこんな流れです。

  1. ブレッドボードなどで予備実験。DCDCなどシビアな回路の場合にはユニバーサル基板でプロトタイプを作ることもあります。
  2. Eagleで回路図を起こす
  3. Eagleでプリント基板を設計する
    1. 何はともあれERCで確認
    2. 各配線の太さなどを設定
    3. 「1点アース」を軽く意識しつつ、電流の方向を考えつつ部品を配置
    4. さっとAuto Routeを試してみる。ICの向きが間違っていたりすると無理な配線が生成されるので、間隔、向き、レイアウトを調整する
    5. ときどきDRC
    6. ある程度いい感じになってきたら、GND、大事な信号線(アナログや高速デジタル)を手動で配線します。簡単な回路の場合にはAuto Routeだけで済ませることもありますが、それでもGNDだけは手で貼っておいた方がいい結果になります。
    7. 残りのわりとどうでもいい配線をAuto Routeと手動で、Air Wireがゼロになるまで繰り返し
    8. 100%になったところでsch / brdファイルをコピー
    9. ベタGNDを配置してAuto Route
    10. 最後にもう一度DRC
    11. CAM Processorでガーバーを作る
  4. 一晩寝かせる
  5. 基板業者に発注する
  6. 届いたら実装する

という流れです。

今回は時間がないし単純な基板なので上記6なし。AutoRouteのみで作りました。


■ガーバーファイルを作る■

プリント基板はガーバーファイルで発注します。ガーバーファイルはCAM Processorで作ります。PCB屋さん各社、自社用のCAMを用意しているところが多いです。JLCPCBさんのEagle gerberはこちらから。お使いのEagleのバージョンに合ったCAMファイルをダウンロードして、所定のディレクトリに置きます。ファイルはレイヤー数ごとに用意されています。普通の両面基板なら2_layersです。

WindowsとLinuxについては記述がありますが、Macについては書いてないですね……Macの場合は、~/書類/eagle/cam/の下に入れておくとよいかと思います。あと、私のところではダウンロードすると.cam.txtという拡張子になってしまったので.camに修正します。

How to Generate Gerber and Drill Files in Autodesk Eagle

Eagleをbrdウィンドウに切り換えます。

ツールバーのCAM processorアイコン、あるいはFileメニューから「CAM Processor...」を選びます。


次に、Load Job Fileアイコン(フロッピーディスクアイコンの左)をクリック、Local CAM jobs >can > jlcpcb_2_layer_v9.camを選びます。




右のOutput Files一覧のTop Copper, Bottom CopperなどをクリックするとGerberとして出力されるファイルの中身を見ることができます。長方形以外の基板だとときどき外形が間違って認識されていたりするので、Board Outlineで確認します。あと、標準状態だとシルクにはNameしか出力されませんが、tValueも出力したい場合にはSlikscreeen Topを選んでLayers一覧の左下アイコンをクリックしてtValueを追加します。

確認して間違いがなければ、右下のProcess Jobsボタンをクリックします。数秒でファイル保存ダイアログが開きます。任意の場所・ファイル名を指定してSaveをクリックします。

Gerberファイルは通常はzipで圧縮されています。

以上で発注に必要なGerberは用意できました! 


■発注!■

ブラウザでjlcpcb.comをアクセスします。Sign Inからログインしますが、初めてのアクセスの場合には、Sign In → New Customer Start Hereからアカウントを登録してください。

私はGoogleからサインアップしています。


するとトップページの中断左側に「Add gerber file」のリンクがあるので、ここからさっき作った.zip形式のgerberファイルをアップロードします。数秒〜数十秒後、画面が切り替わり、さっき作った brd が表示されるはずです。

以前は寸法など手入力しなければいけなかったんですが、今はガーバーアップロードすると自動的に読み込んでくれるので楽になりました(しみじみ)。

さて、あとはPCB製造に必要な条件を入力していきます。

  • Base Material……基板の材質、普通のFR-4がデフォルトです。
  • Layers……ここはGerberを読み取って必要な層数が設定されますが、古いEagleの設定のままだと変わってしまったりするので念の為確認します。
  • Dimensions……基板サイズ、Gerberから読み込まれます。設定通りか確認します。
  • PCB Qty……製造枚数です。5枚でも10枚でもあまり変わらないから金額をみながら適当に……と必要以上に作っていると家の中があっという間に使わない基板でうまるので気をつけます。
  • Different Design……一つのガーバーに複数の基板が含まれている場合、申告します。カットなどの手間もかかることですし。
  • Delivery Format……ここはパネライズの指定です。1枚=1枚ならSingle PCB、自分でパネライズするならby Customer、JLCPCBにやってもらうならby JLCPCBです。JLCPCBを指定すると、縦横何枚並べるかを指定する入力欄が出てきます。
  • PCB Thickness……基板の厚さ、標準は1.6mmです。1.0mmとかちょっとオシャレです(※個人の感想です)。
  • PCB Color……レジストの色を指定します。緑が標準です。黒はつや消しでいい感じですがフラックスが目立ちます。白はもっと目立ちますので、ご自身のはんだ付け技術(あるいは洗浄技術)に自身のある方のみチャレンジしましょう。
  • Silkscreen……シルクの色はレジスタ色によって自動的に決まります。
  • Surface Finish……パッドの仕上げです。HASLはハンダメッキ、with Leadは共晶、LeadFreeは鉛フリー、ENIG-RoHSは無電解金メッキです。
  • Outer Copper Weight……外層(両面)の銅の厚さで1ozは35um、2ozは70umに相当します。通常は1oz = 35umで十分です。うっかり70umを指定して広いベタグラウンドを貼ったりするとはんだが溶けなくて大変ですので、ご利用は計画的にどうぞ。
  • Gold Fingers……いわゆるカードエッジコネクタを作り込む場合に指定します。
  • Confirm Production file……JLCPCBのエンジニアに事前確認してもらうか否か。慣れないうちはYesにしておくと、レイヤーの指定ミスなどを指摘してもらえるので安心です。
  • Flying Probe Test……製造後の導通チェック。チェックしてもらえるならやってもらった方が?と思いますけども、どうしてもチェックで基板に傷がついてしまうので、それを嫌う場合にはNot Testを選びます。
  • Castellated Holes……いわゆる端面エッジがある場合にはYES
  • Remove Order Number……JLCPCBの製造管理番号を入れないようにする場合はYESを選びます。小さく開いている場所に入るので私は気にしないです。

以上、選ぶごとに右の金額がその都度、変わっていきますので、金額を確かめながらいろいろためしてみてください。

私は今回、業務用の基板なので、100x85mm、5枚、緑1.6mm共晶ハンダメッキ仕上げ、すべてデフォルトのままで作ってもらいます。

仕方ないこととはいえ、送料の方が高いんですよね……。でも、冒頭書いたように昔は数十万円だったものが数百円、送料いれても数千円でできちゃうんだから……いやー長生きはするものでございます。

あとはSAVE TO CART、住所を入力したり、クレジットカードを登録したり、という海外通販おなじみの作業をして発注するだけです。

……未だに、発注ボタンを押す前にはつい祈ってしまいます。

数千円なんですけどもね……。

というわけで、以上、発注まで、でした。

■コメント欄について■

コメント欄にコメントできなくなってしまいましたのでこちらでお答えします。お取引のある商社さんに相談されるのがよろしいかと存じます。JLCPCBには発注しデーター承認後に支払う、というオプションがありますので、その際にPayPal支払いを指定して商社さんから支払ってもらい、発送先を商社さんにするとか……。あとJLCPCBには日本語達者なスタッフさんもいらっしゃるので、そちらと相談されるとか。

あるいは、ココナラかクラウドワークスにビジネスアカウントを登録していただければ、私が代行することも可能です。ココナラもクラウドワークスも請求書支払いが可能ですので、会社取引としては、ココナラ/クラウドワークスとの取引になります。ただ、これらは手数料が20-30%程度取られますし、あと私の手数料も必要です。

2021年4月28日水曜日

Thermal Seek Compact買いました

 今までM5Stackの簡易版で何とかやってきたんですが、もっと高性能高解像度のサーモグラフィーがあればリワークなどの際に対象位置の温度を正確に把握できて修理品質があがる!

てことに今更ながら気付いてですね。

買いました。まぁ、わりと強力な電源とちょっとした電源、2件の開発案件が来ていて、その検証用に使えば元が取れますし。

スマフォ対応サーモグラフィーとしては「FLiR」が有名なのですが……これはAmazonのレギューを見ると正規品・1年保証であっても、「正常に使っていれば壊れるはずがない。故にお前の使い方が悪いのだ」というスーパーロジックで修理拒否される、という感じなので、欲しいけど壊れたら……と手が出せませんでした。

FLIR(フリアー)【国内正規品】iPhone/iPad用 FLIR ONE Pro LT版 4800画素 1年保証 赤外線サーモグラフィ

と、煩悶していたところ先輩氏から「Thermal Seekも良いぞ」と教えていただいて。今まで全然知らなかったのですが、とりあえずレビューに悪いこと書いてないですし(重視)、値段も手頃なので購入しました。FLIRのウリであるスマフォのカメラで撮影した可視光画像と重ねる機能はないんですが、こんだけ解像度高ければ、チップ部品も把握できるじゃろ、と。

【国内正規品】Seek Thermal シークサーマル Compact iPhone/iPad用 サーモグラフィーカメラ 赤外線カメラ

で、到着して5日、やっと開封して使ってみました。iPhone 12 miniに取り付けると、「アプリがねえよ」と言われ、App Storeへ行けばそのままインストーラーが起動する。全然探したり迷ったりする手間もなく起動します。


私の中の小学生はとりあえずマグカップを撮影したりしていたのですが、おおっと思ったのがこの写真。お仕事中のiMac 5kにカメラを向けてみた画像です。


上の方はiMac自身の発熱だと思うのですが、中央付近、巨大なウンコのような物体が左側の手を上げているのがおわかりでしょうか。モニターの前の私です。反射した像がそのまま写ってるんですね。

表面温度を捉える、という意味では、どーなの?という気もしますけど、反応速度や感度はとりあえず問題なさそうです。

キーボードの奥にあるマグカップを撮影したのがこれです。マグカップが温かいのはあたりまえですが、その手前にあるキーボード、ホームポジション付近がほんのり緑色になっているのがおわりいただけるでしょうか。


駅のベンチなどで他人の体温を感じるのは微妙に不快だったりしますが、これがあれば事前に観察して冷たいベンチにだけ座れます(何の意味が)。あと、フローリングで立ち仕事した後なんかもはっきり残りますね。

いやー、おもしろいわー。

あ、もちろん本来の目的である電源動作確認なども進めます。どうぞよしなに。

2020年10月3日土曜日

昇圧DCDCの実験


ニキシー管用の昇圧回路、一度トランスを使ってみたかったのですが、なかなかいい感じのトランスが見つからず。

が、黒井宏一さんの名著「最新のチップで動かすニキシー管」の巻末に、いい感じのカップル度インダクタが紹介されていて、早速注文しました。

高昇圧率DCDCについてはここを参考にしました。

DC/DC Converter Topologies and Techniques to Obtain High Boost Ratios

黒井さんの回路だと、タップ付きトランスで使うような回路で実験されているのですが、私は素直にトランスとして使ってみました。

NJW4131もLT1930も、トランスの配線は

  1. Vin
  2. SW(電流はVinからSW方向へ)
  3. SBDを通して出力
  4. GND
です。

■NJW4131■

スイッチ内蔵で、スイッチング周波数を300Khz-1Mhzの間で可変できます。秋月で入手できるのもポイント高いっす。

昇圧用スイッチングレギュレータIC 40V NJW4131GM1-A-TE2 (2個入)

普通のチョッパー型昇圧インバーター回路のインダクタンスをトランスにした形で、「High Boost Ratios」のFigure 4の形式に近い配線です。


結果は、最初700khzでは発熱が多くてパッとしなかったのですが、300khzまで落としてみたところ、入力0.80Wに対して、出力164V負荷36KΩ=0.75W、効率93%が得られました。約4Vから一応動作しますが、発熱が多く、入力電圧8Vぐらいが一番効率が良かったです。ただトランスが1:10に昇圧しているのでインバーターとしての昇圧は約2倍程度、ちょっと物足りないですが、ここは効率優先ということで……。

あとトランスの接続に関して黒井さんの方法も試してみたのですが書籍と同様効率75%でインダクタンスが80度近くまで暖かくなりました。タップ付きインダクタを使えばもっと良い結果がでるのではないでしょうか。

■LT1930■

こっちはスイッチング周波数1.2Mhz、実験前からダメだろうと思っていたのですが、試してみないとね。あと、トランスの二次側の極性も実験してみました。


原因不明のトラブルでチップを1個死なせてべったりハンダ付けしたSOT23を交換するというつらい事件はありましたが、なんとか組み立てて試した結果、一番効率のいい電圧での入力1.82Wに対して、出力170V負荷36KΩ=0.80W、効率43%……ICもインダクタもチンチンに熱くなります。スイッチング周波数1.2Mhzに対して20uHのカプルドインダクターはデカすぎますね。


で、トランスの二次側を入れ替えてみたののですが、電圧がぜんぜん上がりませんでした。まぁそりゃそうですね……でも実験は大事。

2020年9月24日木曜日

PCBWay使ってみた

※この度、PCBWayさんからの無償オファーをいただき、試用させていただきました。利用者としての公平な視点で記述したつもりですが、レビューの前提としてご承知おきください※

■発注感■

中国のPCB屋さん、どこも発注入力ページのデザインがかなり似通っていて、オープンソースがあるのか同じ業者さんがWebつくっているのだろうか。

ということで、他社とあまり変わりなくサクサク入力設定できます。丁度作ろうと思っていた45x40mmの基板があったので、両面、1.6mm、レジスト黒、鉛フリー仕上げ、あとはデフォルトで指定。$18。発注確定9月15日 14:12、完了予定は9月19日。レジスト緑で1.6mm厚だとキレイでない業者でもあんまり外れないので、今度はあえて黒にしてみました。黒はシルクがかすれるとすぐ目立ちます。

なお日本の住所とフォーマットが違うため、郵便番号入力から出てきた市町村名に都道府県名を付記する必要がありました。レポート入れたけど、改善されるかな。

便はDHLを指定しました。

個人的にはOCS/ANA好きなんですが、知っている限りElecrowとFusionしか扱っていないのが残念。

■発送■

そろそろ進捗を確認しようと思っていたらその前にDHLから「荷物届くぞ」の連絡。DHL引き取りが9月17日 23:00。早い。

安心のDHL。と思ったら、配達予定9月24日になっておる……せっかくの連休のお楽しみがDHLによってツブされてしまう……orz 

まぁ届くのは連休明けかな、と思っていたけどさー……。

■受領・結果■

ってことで、9月24日、DHLで届きました。梱包は段ボール箱に入ってDHLのビニール袋。DHLなので中身が潰れている、なんてこともなく。


上の写真は表面の拡大。

パッと見てシルクはズレやカスレなし。非常にクリア。ただし50um程度のズレがある。大きさ指定忘れてた24mil大の文字(「J3」ってやつ)はちょっと潰れ気味。

レジストについてはドリル穴との相対位置誤差はうちのツールでは誤差の範囲で測れません。塗りムラも特になくきれい。

断端は国産並みにツルツルです。こんなにツルツルなのは中華では初めてかも。

ハンダメッキは国産に比べるとちょっとムラがあるけども実用上問題なし。

お試しの機会をありがとうがございました。

2020年9月11日金曜日

老眼への完璧な対策

 

はんだ付け作業はルーペ必須です。

※高齢者の感想です♡

ただ、モニター画面上の回路図を確認しながらはんだ付けをする際には、ルーペを上げたり下げたり上げたり下げたりを無限に繰り返すことになりうざいです。

ってことで、自動化しました。もうオートフォーカス老眼鏡も時代遅れさ(何を根拠に)。



■仕組み■

市販の安い中華ヘッドルーペを改造します。

Nikayoni Stores ヘッドルーペ 拡大鏡 レンズ メガネ タイプ 2灯式 LED ライト 倍率 1.2倍 1.8倍 2.5倍 3.5倍

レンズホルダーとフレームを3Dプリンタで作成し、ホルダーとフレームの間を2個のサーボモーターで駆動します。バイザーの上に加速度センサー(ADXL345)とマイコン(Seeduino XIAO)を搭載し、はんだ付けするのにいい感じに頭を前傾させたらサーボを動かしてレンズを目の前におろします。

このアイディアそのものは最初にヘッドルーペを買った日に思いついたんですが、サーボモーターを固定するいい感じの方法が見つからず、ずっと放置して忘れてました。さらに、3Dプリンタを買って10ヶ月ほど経過したところで、このプロジェクトを思い出し、3Dプリンタの故障や不慣れなFDM機などにも翻弄されながら、ついに日の目をみた次第です。

ご笑覧ください ^ ^

■レンズホルダーとフレーム■

Fusion360で設計し、Snapmaker 2.0のFDMプリンタで出力しました。FDM初めてなので、なかなかキレイにだせず、10回目の試作で何とかきちんと収まりました。

ここからダウンロードできます(github.com/TareObjects/3D-Datas)。



■回路■

XIAOからサーボモーターSG-90を直接駆動しています。よくある中華基板のADXL345も直結です。秋月の45x45mm基板にのせました。サーボとの配線、手持ちのMolex 5051が丁度いい感じで使えたので、使ってます。

XIAOADXL345Servo RServo L
5V5V5V
GNDGNDGNDGND
8SIGNAL
9SIGNAL
3V3VCC
4SDA
5SCL
3V3!CS

あれ罫線が足りない。まぁいいや。



■ソフト■

もうちょっといじりたいけど……とりあえず動くやつ。角度にヒステリシスつけないといけないし、中断モードも必要ですね。

2020年8月19日水曜日

縦の温度分布計測:電子工作

 

M5 Atom Matrixを使って、40cm間隔の室温を計ってみました。

やっぱ天井は少し暑いですね……。ちなみに27.0-28.5度が青、30.5-32.0度が赤、その中間はグラデーションです。

LEDには1分ごとの温度変化をグラフにしていますが、そのぐらいだと変わりませんね……Ambientだとこんな感じです。

10:25ぐらいにサーキュレーターを作動させました。てきめん、天井付近の温度が下がり始めて、LEDにも変化が。

いや、君、下がりすぎでしょ?!


こういう楽しさをあなたに ^ ^


■使用部品■

  • M5 Atom Matrix、表示不要ならAtom Liteでも大丈夫です。
  • 抵抗5.1KΩ
  • 温度センサーDS18B20+、結構高いっすね……AliExpressで激安なのは偽物が混ざっているそうなので避けましょう。

■配線■

M5 Atomの裏に出ているコネクタを使います。
  1. AtomのGNDとDS18B20+の1番
  2. Atomの25ピンとDS18B20+の2番
  3. Atomの3V3とDS18B20+の3番
  4. Atomの3V3と25ピンの間に5.1KΩの抵抗(プルアップ)
簡単。これでデジタル12ビット精度の温度計測ができちゃう。マルチポイントも楽勝、とても素晴らしいです。

なお、私はミス配線を減らすために秋月E基板とロングピンソケットを使って下駄を作りました。ATOMの裏のソケットってピンヘッダだとスカスカなんですよね。一方ロングソケットだと長過ぎる。なので、E基板からロングピンソケットが浮く感じになります。作業はこんな感じ。
  1. 6Pのロングピンソケットを2個用意して、カットして4ピンと5ピンにする。
  2. ATOMをうつぶせにおいて、E基板を乗せ、E基板の穴を通してカットしたロングピンソケットを通す。
  3. E基板が斜めにならないように押さえつつ、E基板にロングピンソケットを2箇所ずつはんだ付けする。ゆっくりやりすぎるとATOM側が溶けたりしますので仮止めで良いです。
  4. E基板+ソケットをATOMから抜く。残りのピンをはんだ付けする。仮止めもしっかりはんだ付けする。
  5. 5.1KΩの抵抗を3V3 - 25ピンの間にはんだ付けする。
できあがったものがこちらでございます。


■ソース■

需要あります?
memo : M5AtomMatrix_Ambient_DS18B20.ino

2020年7月27日月曜日

EagleでV-cutを指定してJLCPCBに注文する

*2020年07月29日 コピー手順を加筆しました。

V-cutは、端から端まで横断するV字の溝です。小さな基板を複数まとめて作り、実装が終わったところでポキンと折ります。スキージング回数は減るしpick&placeもまとめてできるし基板費用も安く済むので大変ありがたいです。

今までわたしは、Panel by JLCPCB、つまり1枚分の基板データを渡して、「あとは縦x枚、横y枚に割り付けてください」ってお願いするだけでした。

が、これだと同じ基板を複数作ることはできますが、異なった種類のものを同じ基板に割り付けるのは自分でやらないといけません。

ってことで、やってみました。

■コピー元のデータを用意する■

当然、Eagleを使って基板を設計します。今回は、秋月で売ってるGaN MOSFETブレイクアウト基板を2種類作りました。

■パネライズする■

出来上がったボードデータをそのままコピーしようとしても、部品番号が自動的にインクリメントされたりでうまくいきません。そこで、パネライズします。なお、パネライズしたあと、Saveしてはいけません。

パネライズはツールバーのオレンジ色の「Run ULPボタン」をクリックし、


検索欄にpaneと入力すると絞り込まれてpanelizeが残ります。panelizeをダブルクリックします。


これでtNames, bNamesが部品番号と切り離れた_tNames, _bNamesにコピーされます。

基板全体をGoup Copyし、SaveせずにWindowを閉じます(Panelizeした状態で上書きするとこの後の修正時などに掃除が大変)。

【追記07/29】全体のGroup Copyの際には 、以下の手順がオススメです。

  1. 表示LayerでShow Layersボタンを押して全レイヤーを選択
  2. 20 Dimensionだけを除外してOKボタン
  3. cmd+Aで全選択
  4. カーソル位置を原点にあわせて座標表示が0,0になるのを確かめてcmd+C
特に4番大事。これやるとペースト先で座標がずれません。え?知ってました? 私知らなかったです……。Windowsの方は適宜キーを読み替えてください。【追記終わり】


■新しいボードを作りペースト■

File->New->Boardで新しいbrdを作ります。回路schは不要です。

JLCPCBの場合、パネライズの最低サイズは70x70mmなのでこれ以上になるようにします。あまった部分に詰め込んでもいいですし、さくっとカットしてもいいです。

カーソルを原点に合わせてからcmd+Vでさっきコピーしたボード図をペーストし、正しい位置に置きます。同じものが複数必要ならば、正しい位置に必要な回数コピーします。saveします。複数の回路を組み込む場合は、パネライズとペーストを繰り返します。

基板の配置は、かならず碁盤の目のように縦横が並んでいないといけません。冒頭に書いたように、V-cutラインは端から端まで一直線に横切らないといけないからです。

■V-cutのラインを入れる■

アイコンからLineを選び、レイヤーとしてVscore、太さ0.5mmを指定します。太さは0でもいいですが、カットする幅が必要なのでカット幅がパターンやシルクをケズらないか確認する意味でも太さを指定した方が良いと思います。

端から端まで縦縦縦縦横横横……と線を入れていきます。なお、下の図で、下の方にやたらスキマが開いているのは、70x70mmというルールに後から気づいた(指摘された)からです……。 もともとの設計は60x50mmだったのですが、今回の基板、四隅の固定ネジの間隔は決まっているので、もったいないですが左右と下に余白を追加しました。なお、V-cutを依頼する場合、JLCPCBでは70x70mm、ALLPCBは80x80mmが最低外形寸法です。


■Gerber出力■

いつものCam processerを使ってGerberを出力しますが、いつもと違う点が2つ。processorによって違うかもしれないので、私がいつも使っているSystem Example -> Third Party -> OSH Park -> OSHPark_2_Layer.camを例に説明します。


まず、Gerber下のBoard Outlineには、Edit Layersのボタンから「Vscore」を追加します。これをしないとV-cut用に書いた線がgerberに出力されません。


Vscoreを追加すると、右の窓にgerber線が追加されます。


次に、Top Silkscreenでは、同様にEdit LayersボタンからもともとのtNamesを除外し、_tNamesを選びます。裏面にもシルクがある場合も同様にbNamesを除外して_bNamesを選びます。

あとは、Process Jobをクリックすれば、.zipが出来上がります。

■発注時の注意■

JLCPCBに注文を入力する際に、何種類のデザインが混在しているか、を忘れずに選びます。Different Designを2以上にすると自動的にDelivery Formatが「panel by Customer」に切り替わります。


あとは、いつものように発注しましょう。

あ、パネライズ初体験の場合は、チェックアウトの3.Submit Orderのところで「Review Before Payment」を選んだほうが良いと思います。私もやらかしてキャンセル→再注文になってしまいましたので……。

2020年7月15日水曜日

インターフォンからSMSを送りXiaomi mi bandへ通知



耳が聞こえないとインターフォンが聞こえないのでsmart bandに通知を送りたい。

ずっと考えていましたが、小雨降るお散歩中に簡単な方法を思いついたので、作ってみました。構想半年、アイデア30分、実装1時間、ブログ2時間ってやつです。

なお、タイトルは途中経過を大幅に端折ってます。

実際には
  1. 呼び鈴を押す
  2. インターフォンの画面が明るくなる
  3. APDS9930で明るさを検知
  4. ESP32でIFTTTを叩く
  5. IFTTTが私のiPhoneにSMSを送る
  6. iPhoneが着信
  7. Xiaomi mi bandに着信通知
という流れです。

■SMSは有償です■

ところでSMSの送信は有償です。今回使うclicksend.comだと1回約5円です。clicksend.comのアカウントを取得すると100円分のチャージが7日間使えます。実験であればそれで試せます。それでイケるとなったらカード番号など登録しましょう。

なんで自分ちのインターフォンが有償なんじゃい?!という気持ちがないではないですが、まぁ聴覚障害者として生まれちゃったのでしょうがないですね。

我が家の場合、比較的単価の安い荷物はみんな宅配ボックス、そうでない荷物や書留などについては電話で呼び出してもらってます。残りは生協ぐらいですが、生協は対面で受け取ると保冷ボックスが不要で手間がかからないというメリットがあって、それはまぁ5円に見合うのではないかと思っています。

■必要資材■


■IFTTTの設定■

アカウントのとり方などは他の方のブログを参考にしてください。以下の手順でIFTTTにサービスを追加します……「サービス」であってます?呼び方がわからん。
  1. ブラウザでHOME画面の右上、Createをクリック
  2. 「If」の後の「+」をクリック
  3. Search Servicesで「Webhook」と入力し「Webhooks」をクリック
    WebhooksはIFTTTの特定のURLを叩くと起動します。ESP32からのアクセスにうってつけですね。
  4. 「Receive a web request」をクリック
  5. 「Event Name」を入力します。今回は画面の明かりが点灯したことをトリガーにするので「light_up」と入力し、create triggerボタンをクリックします。
  6. If Thenのあとの「+」をクリック
  7. ClickSend SMSを選びます。
  8. 青い「Send SMS」をクリックします。
  9. Toにスマフォの電話番号を入力してCreate actionをクリックします。
  10. Finishをクリックします。
と、すみません。6-10のどこかでclicksend.comのアカウント取得画面に飛ぶのですが、スクショ取りそこねてしまいました。特に難しいことはないと思います。

ともあれ、これで特定のURLを叩くとSMSに通知が飛ぶ、というサービスができました。試すには
  1. ブラウザ上でIFTTTのHomeに戻る。
  2. Webhooksをクリック
  3. 右上のDocumentationをクリック
  4. 「Make a POST or GET web request to:」下の{event}にlight_upと入力
  5. value1, value2, value3には適当な文字列などを入れてみる。
    入力するとそれにつれてcurlのパラメータが変わっていきます。
  6. Test itのボタンをクリック
数秒後にさっきToで登録した電話番号にSMSが届きます。

ここでcurlの-d以降の部分をhttp postすれば中身がメッセージとして送られますが、 今回の用途ではSMSだけ送ればいいのでhttps以降だけを叩くのが簡単です。今回もそれで済ませてます。ごめんなさい。

■ハードウェアの接続■

私は以下のブログを参考にしました。ってわしのブログや。どんなつまらないことでもブログに残しておくべきだなぁとしみじみ思う今日このごろです。

CJMCU-9930ESP32
VL3.3v
GNDGND
VCC3.3v
SCL22
SDA21

ブログと異なり、INT - 2の配線は不要です。

■ESP32の実装■

APDS9930のサンプルプログラムを元に、http secureのサンプルを切り貼りしました。コピペエンジニアリングです。ごめんなさい。
//
//  WiFi Secure, IFTTT
//

#include <WiFiClientSecure.h>

#define ssid     "....ssid...."
#define password "....password...."

const char*  server = "maker.ifttt.com";  // Server URL

const char* test_root_ca = \
 "-----BEGIN CERTIFICATE-----\n" \
"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \
"DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" \
"SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" \
"GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" \
"AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" \
"q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" \
"SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" \
"Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" \
"a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" \
"/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" \
"AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" \
"CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" \
"bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" \
"c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" \
"VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" \
"ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" \
"MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" \
"Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" \
"AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" \
"uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" \
"wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" \
"X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" \
"PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" \
"KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" \
"-----END CERTIFICATE-----\n";

WiFiClientSecure client;

void submit() {
  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!");
    // Make a HTTP request:
    client.println("POST https://maker.ifttt.com/trigger/light_up/with/key/....api key.... HTTP/1.0");
    client.println("Host: maker.ifttt.com");
    client.println("Connection: close");
    client.println();

    while (client.connected()) {
      String line = client.readStringUntil('\n');
      if (line == "\r") {
        Serial.println("headers received");
        break;
      }
    }
    while (client.available()) {
      char c = client.read();
      Serial.write(c);
    }

    client.stop();
  }
}


//
//  APDS9930
//

#include <Wire.h>
#include <APDS9930.h>

// Global Variables
APDS9930 apds = APDS9930();
float ambient_light = 0; // can also be an unsigned long
uint16_t ch0 = 0;
uint16_t ch1 = 1;



//
//  setup
//

void setup() {
  // Initialize Serial port
  Serial.begin(115200);

  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  // attempt to connect to Wifi network:
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }

  Serial.print("Connected to ");
  Serial.println(ssid);

  // Initialize APDS-9930 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9930 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9930 init!"));
  }

  // Start running the APDS-9930 light sensor (no interrupts)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Light sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during light sensor init!"));
  }

  delay(500);
}


//
//  loop
//
uint32_t prevMillis = 0;

void loop() {

  // Read the light levels (ambient)
  if (  !apds.readAmbientLightLux(ambient_light)) {
    Serial.println(F("Error reading light values"));
  } else {
    Serial.print(F("Ambient: "));
    Serial.println(ambient_light);

    uint32_t thisMillis = millis();
    if ((prevMillis == 0 || thisMillis - prevMillis > 180 * 1000) && ambient_light > 50) {

      submit();

      prevMillis = thisMillis;
    }

    //    char fstr[16];
    //    dtostrf(ambient_light, 5, 1, fstr);
    //    M5.Lcd.drawString(fstr, 80,  70);
  }

  delay(100);
}

2020年7月9日木曜日

Arduino IDE + DRV8835 + ステッピングモーター



Seeed Xiaoと秋月のDRV8835基板を使って、さくっと動かします。

モーターはオリジナルマインドから中古で買ったオリエントモーターの42mmサイズバイポーラー。定格17V。

XIAOとDRV8835の結線は以下の通り。

XIAODRV8835その他の接続相手
GNDGND外部電源のGND, Volumeのmin側
5V出力Vcc, MODE
3.3V出力Volumeのmax側
3AIN1
4AIN2
5BIN1
6BIN2
7Volumeの中間
AOUT1モーターの黒
AOUT2モーターの緑
BOUT1モーターの青
BOUT2モーターの赤
VM外部電源の+側(5-17V)


DRV8835をステッピングモーター用に使う場合には、MODEをHIGHにします。こうすると、AIN2, BIN2 = HIGHのときだけ出力が有効になり、LOWにすると出力の電流がカットされます。AIN1に1個パルス(LOW->HIGH->LOW)を入れると正転、BIN1だと逆転します(モーターの配線や仕様によって変わりますので注意)。

今回、両手が塞がる用途でモーターを使うので、ミシン用のフットペダルを用意しました。3.5mmφのモノラル用ミニプラグ出力で踏まないと0Ω、踏むと約10kΩになります。GND - ペダルの片方 - XIAOの7ピン - 10kΩの抵抗 - 3.3V出力、という風につなぎました。こうするとXIAOへの電圧は0-約1.65Vの間で変化します。これをアナログポートで読み取ります。

ところで、リファレンスやググると出てくるサンプルコードを見るとスピード指定関数setSpeedの引数が rpm になっているけど、試したところではpps(1秒あたりのパルス数)みたいです。本家ArduinoでStepperクラスを使ったことないけど(あるいは忘れている)、少なくともXIAOでは。

ということで、ソースコードはこんな感じ。


#include <Stepper.h>

Stepper myStepper(200, 3, 5);

bool running = false;

void setup() {
  Serial.begin(115200);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  int value = analogRead(7) / 2 - 5;
  if (value < 0) {
    if (running) {
      digitalWrite(4, LOW);
      digitalWrite(6, LOW);
      running = false;    
    }
    delay(50);
  } else {
    if (!running) {
      digitalWrite(4, HIGH);
      digitalWrite(6, HIGH);
      running = true;    
    }

    Serial.println(value);
    
    myStepper.setSpeed(value) ;
    myStepper.step(value / 10);
  }
}