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です。

ご参考まで。

2025年12月7日日曜日

電池電極用溶接器

埃が落ちているようにみえるけど溶接点なのよ

ニッケルタブ用溶接機を買うのは2台目です。1台目は保管している間にバッテリーが干上がってしまい、必要に迫られて2代目を買いました。

今度のはポータブルオシロなどでもなじみのあるFNIRSIの製品です。

FNIRSI SWM-10 スポット溶接機

使い方は動画で何となくあたりをつけつつ、とりあえず初期設定のままで使って見ました。

  1. 予め溶接機をフル充電。USB TypeC充電器につなぐと緑の点滅、フル充電で常時点灯になります。
  2. テストに使う電池を万力に固定。今回使用済アルカリ乾電池を使いましたが、生きている電池は締めすぎるとよくないので治具などを使った方が良いと思います。
  3. 付属のニッケル板を電池にしっかり固定。
  4. 溶接機に溶接棒をセットする。差し込み口がかなり固いので、なにか間違えたのかと思いましたが、垂直に立てると刺さります。
  5. 電源スイッチ長押しで溶接機の電源ON
  6. 片手で電極棒の片側をしっかりニッケル板を押さえつつ電池まで押しつけます。
  7. もう片手で電極棒のもう1本でニッケル板ごしに電池までグイイイ、と押します。
  8. 1秒ほどで火花が散って溶接されます。
電極棒同士を短絡させないよう(短絡検知はついてますが)、ニッケル板だけでなくしっかり電池まで押しつけるのがコツかもしれません。

日本語マニュアルはPDFで送ってくれるようですが、とりあえずデフォルトそのままで十分溶接できました。初期設定のままですが、かなりチカラを入れても剥がれない程度にしっかり溶接できていると思います。

エネループを束ねてバッテリーパックを作る、という程度の作業であれば、十分対応できるんじゃないでしょうか。

先日、15AhのLiFePO4電池を買って評価していますが、1台目の溶接機が使えなかったので電極は丸めた金属板を押しつけただけでした。これでしっかり電極を溶接して、溶接した電極に配線をハンダづけ、という状態での評価ができます。


余談ですが、アリエクで買った15Ah表記のLiFePO4電池はしっかり15Ahの容量がありました。最初の放電→充電は挙動不審でしたが2回目からは表記通りの容量です。0.1Cでの充放電ですが、放電では最後まで発熱せず充電でも容量の90%ぐらいまではほぼ発熱なかったので、かなり良いですね。三元Li-Ion電池よりも安全ですし、もっと普及してくれると良いなぁと思います。取り寄せるのも大変ですので。



2025年12月3日水曜日

電池ボックスの製作(LiFePO4用)


アリエクプレスから32140サイズの大きなLiFePO4バッテリーが届きました。容量15Ah、重さは300g近いです。10Ahのリポ電池が200g弱なので、電流容量あたりの重量はそんなに遜色ないですね(表記が正しければ)。なおLiFePO4の方が電圧が低いので、電流容量が同じなら電力容量は15%ほど少ない計算になります。

電池ボックス、市販されていないか一応探したんですが、無いですねw

こういう場合に持っていてよかった3Dプリンタ。テストなのでFusion 360で簡単な形のボックスを作り、スリットにニッケルのストリップを通して電極バネとして使う方針です。

デザインに小一時間、お昼休みの間に出力して、電極作りとテスト条件設定が30分。作業時間は90分ほどで簡易電池ボックスのできあがりです。実験用で1回使うだけなので再出力は避けたい。そこでキツくて入らないよりゆるめに作ったら少し緩すぎました。

電池溶接用のニッケル板を使ったんですがバネ効果はあんまり期待できません。ニッケルメッキのリン青銅板って売ってないですかね……。

とりあえずサーモグラフィーで温度を測りながら1A放電で容量を確認中です。

こういう充電放電テストの間に過熱している部分がないか監視するデバイスを作らなきゃと思いつつ何年が過ぎたんでしょう……8x8のサーモパイル程度で良いと思うんですが、自分の物となるとなかなか手が動きません ^ ^

2025年10月24日金曜日

新しいスミチューブ(熱収縮チューブ)


秋月で「スミチューブ」という熱収縮チューブを売ってます。とりあえず不満はないけども、新しく「スミチューブF(Z)」というタイプが入荷したので注文してみました。

パッと見、思っていたよりも厚手で、触った感触はざらざらしています。旧タイプのものは半透明でツルツルでしたがこっちは不透明でざらざらです。

0.3mmと0.5mmの架橋ビニール被覆線を通して、手芸用のヒートガンで加熱してみました。

芯線0.3mmの方は少し長めに熱を加えないとしっかり粘着しない感じですが、0.5mmの方は十分固定されています。

従来のものよりも収縮率が高いかな?と思います。収縮後は厚手ですが収縮率高いわりにカチカチに硬くならないのでモノタロウで売っている高収縮タイプよりも使いやすそうです。まぁモノタロウのは硬さ・厚さを必要とする用途に使う物だと思いますが。

ところで……私、先日、旧タイプの熱収縮チューブを20本ほど買ったばかりなのですが……。

2025年10月9日木曜日

XIAO MG24の消費電流なにこれwww

 delay(500), digitalWriteを繰り返すだけのコード。

DMMの表示がチカチカして読み取れないので、いったんUSBメモリに記録してから平均値を求めたところ

0.00354A = 3.54mA

でした。え? マジで? と二度目してしまうほど低い。

次にsin関数ぶん回し

0.00360A = 3.60mA

でした。え? マジで?? いや、ビックリするほど少ないっすね。計測ミスを疑って直流電源装置の出力をみても0.003-0.004Aをウロウロするだけだし。

これで78MHz ARM Cortex-M33……クロック50uA / MHzぐらい。うそーん。

2025年9月23日火曜日

XIAO RA4M1、Pi Picoの消費電流

外部から3.3Vを3.3V端子に給電。

外にLEDを付けないで、500mSecごとにON/OFFするLチカ実行中……19.1mA
全部LED消してsin関数ぶんまわし……24.0mA

本当はクロック周波数毎の違いを見たかったんだけども、どうも分周比やらのレジスタをいじらないといけないようで、「setClockFrequency一発」みたいに簡単にクロック周波数は変えられないっぽい。

48uA/MHzっていうのは圧倒的低消費電流なので「暇な時には1MHzでこき使ってやるぜうひひひひ」っていう目論見は潰えたのだった。

うーん、人生甘くない。

ついでなのでRaspberry Pi Picoも計ってみました。

LED未点灯しない500mSecごとのLチカ……25.9mA
sin関数ぶん回し……29.9mA

Raspberry Pi Picoは set_sys_clock_khz(<khz>, true); で変更が可能。2番目のパラメーターは成否を返す、とChatGPTさんが言っている。20MHz(20000)を試して見ると、

LED点灯しない500mSecごとのLチカ……7.8mA
sin関数ぶんまわし……11.0mA

おお効いている! ただ、USBまわりの初期化が正常にできていないようで、クロック変更したままだとBOOTSELを押してからUSBをつなぎ直さないと書き込みができなくなります。ちょっと不便だけどまぁしょうがない。

65MHzのLED非点灯……14.5mA
130/4のLED非点灯……9.4mA
130/8のLED非点灯……失敗

1MHz, 2MHz, 6.5MHz, 10MHz, 13MHzなども失敗でした……分周比などがわかればもうちょっと下げられるかもしれませんが、今のところ20MHzが下限です。

周辺回路付きで20MHzで7.8mA、390uA/MHzというのはまぁまぁ良い数字です。MSP430G25の220uA/MHzってのは単体ですしね。

2025年8月16日土曜日

GreenPAK:I2Cでone shotの待ち時間を書き換える

AtomからCounterの書き換えを実験している図

自分へのメモです。

いろいろな超低消費電流タイマーICが市販されていますが……ちょっと用途に即していなくて、「探すより作った方が早い……しかし、超低消費電流は無理」と思っていたのですが……GreenPAKで試して見たら、デバッガー画面に0.5uAぐらいの数値が表示されているではありませんか! これなら専用ICに勝てないまでも電池の自己消費には勝てる!

ということで何度目かの挑戦です。

やりたい動作は、

  • 起動時にはHIGHのままでマイコンに電源を供給する(でないと何もできない)
  • あるビットをHIGHにすると、x秒後に制御ピンをLOWにした後、y秒後にHIGHにする。
  • xとyはI2Cで書き換え可能だけど、電源入れ直すと初期化される
という処理です。

Grid Alignmentが欲しい

TP2が制御入力、TP13が制御出力。

SetとResetタイマーはワンショットで、設定した秒数後にLOWになります。そのあとにもう1個ずつワンショットを入れて、前段のダウンエッジから短いパルスを作ります。

そのあとにLUTを4つも使っているのは教科書に出ているSET優先RSフリップフロップです。ルネサスさんがD-FF x 2で作れるRSフリップフロップってのを公開していて試したんですが、なんか動いてくれず……それでNAND x 4で作りました。

動きました。半日かかりましたけどもね……。

で、次に、I2C制御です。初期設定のままだとGreenPAKさんは0x08がI2Cアドレスとのことで、そこにレジスタアドレスと値を書き込んでやれば、OKです。

レジスタアドレスはどこかのドキュメントに出ているんでしょうか……探しても見つからなかったので、

  • NVM Viewerを開く
  • 目的のCounterを選ぶとそれに関する設定ビットが青で表示される

  • 青の幅の広いところをクリックする

  • 値が表示される。counter dataには7が入っているので、0xA6-0xA5がソレではないだろうかとあたりをつけてcounter dataに65535を入力してApplyボタン

  • 変わったビットが緑色になる。0xA6-0xA5を見るとちゃんと全部1になっているのでこれだ!

……という方法で調べました。

もっと良い方法(=楽な方法)があるんじゃないか?と思って探したんですが見つからず。たぶん、これをTwitter(X)に貼ると「ここ見ると一瞬だぜ」って方法を教えてもらえるんですよね……。

I2Cでの書き換えはごく単純に8bitずつ書き換えます。今回は止まっている時に書き込みますが、動いている時だと順番や状態に気を付けましょう。

    Wire.beginTransmission(GREENPAK_ADDR);
    Wire.write(REG_ADDR);
    Wire.write(value);
    Wire.endTransmission();

これだけです。

消費電流はDMMでの計測で2-4uAぐらいでした。

以下、うっかりへのメモです。

  • DIP基板のピン番号はデバッガ画面のTPボタンを押して出てくるヤツ。設定画面のPIN xxを信じて「動かねえ」とか言っちゃダメ。以前Lチカやったときはたまたま一致しているピンだったんですかね。
  • 上記TPボタンを押すとVDDもVDDもTP1って表示されるんですけども、実際にはTP1とTP14に電源を供給しないと動いてくれませんでした。設定の問題なのかしら。
  • PORはレベル(HIGH)、よくあるリセット回路みたいなパルスがくるわけではないので気を付ける。

2025年5月27日火曜日

SIM7080Gがネットワークを拾わない

俺たちのChatGPT先生に聞いたところ、アンテナが弱い、接続するモードを強制的に指定してはどうかとのアドバイス。

手持ちで一番立派なアンテナ(主観)に変えてみたけど変わらず。

モード指定……はい、2秒でつながりました。

modem.init() / modem.restart() をキメたあとで、以下の2行を指定します。


modem.sendAT("+CNMP=38");  // Network mode = LTE Cat-M
modem.sendAT("+CMNB=1");   // LTE only (no NB-IoT)


これでOKです。

ああもうChatGPT先生なしでは生きていけない……。