Windows を再インストールして、
wsl --import-in-place Ubuntu D:\wsl\ubuntu\ext4.vhdx
みたいなことをしたら以上のようなエラーをいわれるようになってしまった……
ただ、管理者権限だと起動できる。該当する .vhdx ファイルのプロパティのセキュリティタブを見てみると変更権限などが一般ユーザになかったため追加したらうまくいった。
Windows を再インストールして、
wsl --import-in-place Ubuntu D:\wsl\ubuntu\ext4.vhdx
みたいなことをしたら以上のようなエラーをいわれるようになってしまった……
ただ、管理者権限だと起動できる。該当する .vhdx ファイルのプロパティのセキュリティタブを見てみると変更権限などが一般ユーザになかったため追加したらうまくいった。
Windows11 にしたところ Intel X520-DA1 な NICが認識しなかった。
ドライバを検索しても「ないよ」と言われる。天下の Intel だぞおかしいと検索すると無情にも Intel 公式に「解決方法X520 対応の次のドライバーリリースは バグ修正のみであり、新しい機能や OS のサポートがないため、Windows 11 では X520 用のドライバーはありません。」 とか言われる。解決方法じゃない……
同様に困っている人はいるようだ。このエントリではセットアップファイルからドライバを抜き出して、手動で認識させる方法でうまくいっている。 のでこれを試してみた。
Windows 10 向けドライバダウンロードページから Wired_driver_27.6_x64.zip をダウンロードして、展開し、さらに 7-zip で Wired_driver_27.6_x64.exe を展開するとドライバファイルがでてくる。
デバイスマネージャからNIC選択し、ドライバを検索→手動でディレクトリを検索→展開したディレクトリを指定。でうまくいった。
2011年のQ2に発売された製品らしいから10年は経過してるから仕方ないのかもしれないけどウーン……
regedit.exe で適当な場所 (HKEY_CURRENT_USER など) に新規キーを作る。ここでは OLD とする。OLD を選択した状態で「ファイル」→「インポート」して、ファイル種別に「レジストリハイブ」を選択すると NTUSER.dat を選択できる。
NTUSER.dat を選択する「OLD」以下を削除して置き換えるが良いか?という旨のダイアログが出るのでOKする。
これで読みこめるのでキーを探してなんとかする。
ただ以下のような問題があるのでお勧めできるかというと微妙……
Administrator アカウントでもアクセス不可能で削除もできず、アクセス許可も編集できないエントリができてしまう。どうやら SYSTEM アカウントでだけアクセスできるらしい。
sysinternals というツール集に含まれている psexec という実行ファイルを使うと SYSTEM アカウントで実行することができる。
.\PsExec64.exe -i -s c:\windows\regedit.exe
さらに SYSTEM 所有のレジストリエントリの子で TrustedInstaller が所有者になっているみたいなややこしいことなっている場合がある。この場合、所有者を SYSTEM にしつつ、SYSTEM にフルコントロールを与えると消せるようになる。とても面倒くさい。
親エントリで所有者を SYSTEM にすると (既にSYSTEMでも)「サブコンテナーとオブジェクトの所有者を置き換える」というチェックボックスがでる。これで一括でサブオブジェクトなどの所有権を置き換えできる。
液晶風の画面は決まった形をオン・オフするだけなので、canvas にコードで描くのは大変なだけで無駄が多い。かといってセグメントを1つ1つ画像にわけて座標指定で配置していくのも面倒くさい。
と考えていくと SVG を埋めこんで、SVG の要素を JS で操作するのが効率が良い。ワークフローとしては SVG の作成と JS の実装で綺麗に境界を作ることができる。
Inkscape の良いところは以下の点
Inkscape でオブジェクトに名前をつけると、svg 上では inkscape:label 属性に入る。これを利用して JS から操作すれば Inkscape で保存した SVG をそのまま利用できる。
Inkscape で保存した SVG をそのままファイルとして置いて、fetch() で取得し、HTML5 な HTML で特定の要素の innerHTML に入れてしまうのが手っ取りばやい。(XML の Processing Instruction については Chrome ではコメントに変換されるが、仕様上パースエラーなので消しておく)
名前空間の扱いが謎だが、querySelector() の場合以下のような形で指定することができる (つまり名前空間を扱わず、prefix も含めて属性名とする)
svg.querySelectorAll('g[inkscape\\:label="digits"] > g')
あとは適当に style.visibility を操作するだけなので省略
svg 要素は HTML では SVG 2 で定義されると書いてある。つまり「HTML は SVG を知っている」。SVG 2 では HTML 内でも svg が使えることを考慮して書かれている。
SVG の仕様上、HTML 内では SVG の名前空間は HTML パーサによって与えられると書いてある。このため、HTML 内 svg 要素には xmlns は必要ない。 https://svgwg.org/svg2-draft/single-page.html#struct-Namespace
HTML LS
また https://html.spec.whatwg.org/#elements-2 に例示があるが、HTML としては xmlns は何の効果もうみ出さない。例えば svg 要素の中に xmlns:foo="foo" という宣言と共に <foo:bar /> というのがあっても、これは HTML パーサによって自動的に与えられる svg の名前空間に属し、foo:bar
という要素名になる。
2016年の6月に組んでからCPUマザボを変更せずにきたが、この Core i7 6700 が Windows11 非対応だったり、今時さすがに4コア8スレだったり、PCIe レーン数が少なすぎて NVMe SSD が使いにくかったりで、そろそろかと思い組替えることにした。
ケースとグラボ以外はほぼ新調。ここに書いてない SATA のドライブは継続して接続している。あとはケースファンもすべて入れ替えた。
電源は 80+ Platinum で安かったやつ(1万円ぐらい)を買ってみたがパッケージやケーブルが良くできていて非常に豪華だった。
プロセスルールの数字が良いからなんとなく最近なら AM5 ソケットになった Ryzen 7000 シリーズかなと思っていたが、13th Intel が結構強いようだった。個人的には以下の点で Intel 優勢とおもった
DDR5 が十分性能と価格が落ちつくには何年もかかりそう。そして AM5 なマザーボードはだいぶ高い。Intel なら手元の DDR4 メモリも利用できる。
i9 は水冷するような超ハイエンド向けというイメージがあり、i5 はちょっと微妙というイメージがある (別にそんなことないみたいだが)。
と考えていくと理性的に最適なのは i5 ではないかと思うが、大は小を兼ねるので i7 とした。i9 は高すぎる。
フルロードせず電力制限をかけたとしても、その制限においてはクロックが上がるので上位CPUが無駄というわけではない。
Windows 11 にアップグレード不可な PC に入っていた Windows 10 のライセンスだったが、普通に Windows 11 のインストールメディアをつくってインストールし、構成を変更したという宣言をしたら引き継ぐことができた。
マザーボードデフォルト設定だとCPU電力無制限になるようだ。つまりサーマルスロットリングが常時起こるまで発熱し、クーラーの排熱性能上限ぐらいのパッケージ消費電力で落ちつくという挙動になる。
アイドル時の CPU の Package Power は 5W~10W ぐらい。GPU Power が 15W ぐらい。Z690チップセットが TDP としては 6W。
効率カーブが載っているPSU の評価結果 2% of spec = 13.2W 出力時の効率が 42% 程度で、20~30W ぐらいの効率は50~60%程度のように見える。つまりセンサ読み Package Power が 25W なら電源クランプで読むと 50W ぐらいになってしまう (実際はマザボ上のVRMの効率もあるわけで)。
なおこのマザボは多少光るけどオフにしても消費電力への影響は微々たるもの。
電力無制限で cinebench を回すと当然サーマルスロットリングが起き、最初は250Wぐらいだが徐々に Package Power が落ちて 220W 前後で落ちついてくる。これがこのクーラーの限界ということになる。実際、AS500 というクーラーはTDP 220Wまで対応と書いてあるので、実測でもその通りといえる。
あんまり限界性能を出すのも恐いので、UEFI から最大電力 (long / short duration power limit) を 180W に制限することにした。PL は原理的にシングルスレッド~数スレッドでは超えないので、全コア使い尽くすようなときに若干性能が下がるイメージだと思う。
定格は3.4GHz(Pコア)/2.5GHz(Eコア)ターボブーストで5.3GHz(Pコア)/4.2GHz(Eコア)。
なお Tjunction max はいわゆる絶対最大定格ではないようだ。Intel 的な絶対定格は内部に非公開で持っており、必要とあらばシャットダウンする仕掛けで、Tjunction max はこれを目標にサーマルスロットリングするぞという値。
つまり基本的には CPU 側で防衛しており、サーマルスロットリング自体も「問題ない」とされている。クーラーの性能上限(=サーマルスロットリングが起こる状態)までCPUは電力を消費して発熱する設計になっている。
Widgets.exe 関係で msedgewebview2.exe がやたら VRAM (GPUメモリ) を消費している。全く使わない機能なのでアンインストールする。
winget uninstall "windows web experience pack"
https://github.com/FaqT0tum/Orbion_3D_Space_Mouse
良い点
悪い点
ちゃんと使おうと作ろうとすると以下3つの知識がそれぞれある程度ないと難しい。
Arduino のライブラリごりごりで書かれているのであまりコード量はなく複雑なこともやってない。
メニューを開いたとき、エンコーダの反応がすこぶる悪いが、ビジーループでエンコーダを読む設計なのに、i2c ディスプレイに毎ループデータを送ってるせいなので、そのへんのコードを直すとよくなる。結構同様のロジックがちらばっており、直すのに若干手間がかかる。
エンコーダを読むコード (scroll()) もなんか変なコードになっているので書きなおしたほうが手を入れやすい。
NDでコードを公開できないのでやったことだけ
あんまり作ってる人がいなくてなんでかなーと思っていたが難易度の高さの割に得るものがそれほどでもない点にあるのかなと思った。ハードウェアの形的にはかっこいい。
CoreXY な駆動方式の3Dプリンタには元々興味があって、とはいえ現状の Original Prusa i3 2.5 でそれほど問題もなかったのだが、Voron 2.4 という3Dプリンタを知り、なんかわからんが格好がいいので急に作ってみたくなった。
3Dプリントパーツ以外をセットにして売ってるところがいくつかある。今回は FORMBOT の Aliexpress から買ってみた。UPS で結構届くのがはやかった。
Voron 2.4 はデフォルトでは Afterburner という名前がついたエクストルーダだが、実は Stealthburner という新しいバージョンがでており、新規で作るならこちらを作ったほうがよい。パーツに一部非互換があるので別途部品を買う必要がある。
exhaustまわり、操作画面部まわり、エンドストップ、Afterburner 相当のインジェクションモールドのプラパーツが「オマケ」でついてきた。ほぼプリント済みだったが Afterburner はまるっとプリントせずにいたので、とりあえず動かすことができそうでありがたい。
このプラパーツは機能的にはオリジナル同様だが細部が違う。インジェクションモールドでは袋状のものは作れないので2パーツ貼りあわせる必要があったりする。
Raspberry Pi は付属しないが SD カードは SunDisk の A1 のちゃんとしたのがついていた。パチもんではなくちゃんと製品登録もできた。
Voron は基本的に全てのパーツを ABS (104℃ぐらいで軟化する) で出力することとしている。局所的に温度が高くなることがあるので PETG (84℃ぐらいで軟化する) も推奨されていないようだ。(Original Prusa はホットエンドダクト以外は PETG になっており ABS 出力も今のところ問題ないが……)
PETG は非常にプリントしやすいため、できれば PETG でやりたかったが、ここで不安を残すのも精神に良くないので ABS との和解を試みてすべて ABS で出力することにした。
だいぶ前に Original Prusa i3 にかぶせていたエンクロージャはABSをプリントしないこととなかなか邪魔なこともあって捨ててしまったので、一時的にということでダンボールで箱をつくった。これで内部は40~50℃ぐらいになる。
ABS はとにかくあらゆる部分が反るので嫌なのだがこのぐらいの温度なら割とマシになる。とはいえ接着性が低いのでベッドとノズルの調整がよりシビアだったり、パーツ形状によっては一時的に反った部分ができてノズルにあたるので気を使う。
出力するパーツ数は結構多い (Prusa が 3D プリント部品を最小限にしているのと対照的)し、大きいものが多い。動作に必須な部品だけでも3~4日かかる。全部プリントするには一週間以上かかると思ったほうが良い。パーツを注文しても全部届くまで1ヶ月ぐらいかかるだろうからのんびりやって良い。
IPA(無水エタノールでもいいけど高いので…)と柔らかめのグリスが必要。この手順でやった。グリスはSuper Lube 21030というNLGI(ちょう度) 2 で PTFE系のプラスチックに安全なやつ。
グリスポートがあればグリスポートから注射器で注入するのが正しいようだが、安いリニアレールでは見せ掛けのグリスポートで中に入っていかない場合があるようだ。
マニュアルがよくできていて迷うところはほぼない。Gantry の組み立てまわりはマニュアルだけだと完璧にできないと思うので YouTube とかを見るべき。
あとはA/Bベルトを通すのが以下の点でなかなか困難
https://github.com/VoronDesign/Voron-Trident/issues/65
Voron 2.4 のマニュアルにはデッキサポートが抜けてる。使いかたは Trident のドキュメントを見るとわかる。あとからだとやりにくいので罠
あまり気にしてなかったが部品セットには配線も含まれており、これがとてもよくできていた。すべてのコネクタが圧着済みかつ長さも適切なので、デフォルト設計なら何も考えずに組み立てできる。
WAGO の接続端子が複数ついており、配線部分でははんだ付けをする必要がなかった (マニュアルの5端子WAGOコネクタに加えてヒーター接続用と思われるの2端子WAGOコネクタもついていた)。
制御は Klipper という3Dプリンタ向けファームウェアを使うのが一般的のようだ。
Klipper は Raspberry Pi で動く Python のコードと、コントローラーボードに書きこむファームウェアからなる。gcode の解釈や補正など計算負荷が高いことは Raspberry Pi 上で行ない、コントローラボードはIOの制御だけをする。LinuxCNC と同じようなイメージ。
そして Klipper は既存の3Dプリンタのシリアルポートでの通信をエミュレートするようなインターフェイスになっている (/tmp/printer)。つまり Klipper 自体は gcode (など) を受けとってデバイスを制御するだけの役割を持つ。
UI はこのシリアルポートを利用できるものならなんでも使える。Voron のドキュメントではMainsail, Fluidd, Octoprint が列挙されている。
Rasbperry Pi 3 B に Mainsail のイメージを書きこんで使うことにした。Mainsail は Raspberry Pi Imager のメニューに入ってるので気楽。Mainsail は Klipper のインターフェイスとなるソフトウェア。イメージを書きこめば GUI なしで、ウェブインターフェイスが勝手に起動するようにセットアップされている。
より正確にいうと Klipper とやりとりしているのは Moonraker という Klipper のウェブAPIフロントエンドで、Mainsail はそのクライアント実装といえる。
とりあえず燃えずにQGLできるとこまではきた。Afterburnerはオマケでついてきたやつ。換装するとき楽なように4芯のケーブルを一緒に配線したがどうなるか…… pic.twitter.com/kn7tA4ZXZp
— ショ糖 (@cho45) November 19, 2022
Stealthburner 用の部品が届く前に本体の部品が一通りきてしまったので、とりあえず Afterburner を乗せて組み立てて動作確認をした。
テンプレートの printer.cfgからたくさん書きかえていく。最低限の設定をしたあと、G-code で動かしつつ調整する。
とりあえずステッピングモーターの方向がすべて逆だったので dir を反転した。
ベッドの max_power が 0.6 になっている。Rule of thumb is 0.4 watts / cm^2 と書いてある (経験則では 0.4W/cm^2 ぐらいが適切)。250x250mm なら 625cm^2 なので、250Wぐらいが適切。300Wヒーターなため、0.83 に設定する。
なんで最大パワーを出さないかというと、ヒーターは中央を加熱するため熱伝導が十分されていないとベッドが歪んでしまうからで、早く加熱してもメリットがないということのようだ。
なおヒーターは100V AC商用電源を SSR で PWM 制御する設計になってる。
結局 Afterburner をつけて動作確認しているうちにすぐ部品が届いてしまったので、一度もホットエンドにフィラメントを通すことなく Stealthburner に換装した。
Afterburner と Stealthburner だと NeoPixel LED 用の配線が増えている。このことはわかっていたので、Afterburner をつけて組み立てる時点で1セット配線を追加しておいた。
X-carriage にも互換性がないのでA/Bベルトも外す必要があった。思ったより苦労はしなかった。
Stealthburner は gear_ratio: 50:10 なので printer.cfg を直す必要がある。NeoPixel はとりあえず Voron 公式の stealthburner_leds.cfg を使った。
そしていろいろ調整して一発目のプリントはとりあえず成功。角がちょっと膨らむのは Pressure Advance というので調整していくらしい。
Voron 2.4 のいいところ
Voron 2.4 のよくはないところ
DS18B20 デジタル温度センサが便利。1-wire で複数のデバイスを同時に扱える。Klipper も対応している。
Raspberry Pi の場合 1-wire を有効にして GPIO4 (PIN7) に信号線を接続する。3.3Vから 4.7kΩ (信号線の長さで調整する)) でプルアップする。
あたりをモニタリングする。庫内温度は上と下で10℃ぐらい差があるのでどっちも見たい。
以下のように見える。22312 は1000倍した℃なのでこの場合は22.3℃
$ ls /sys/bus/w1/devices/ 28-03039794629e 28-0306979425a5 28-030f979445fd w1_bus_master1 $ cat /sys/bus/w1/devices/28-03039794629e/w1_slave 65 01 55 05 7f a5 a5 66 c5 : crc=c5 YES 65 01 55 05 7f a5 a5 66 c5 t=22312
以下のように設定する。
[temperature_sensor temp1] sensor_type: DS18B20 serial_no: 28-03039794629e sensor_mcu: host_mcu min_temp: 0 max_temp: 100
ただし、以下のように host_mcu が定義されていないとエラーになる。
Unknown config object 'mcu host_mcu'
rpi 自身をセカンダリーmcuとしてセットアップする必要がある。
上記ページの指示に従って host_mcu のサービスを起動する。そして printer.cfg に設定を追加する
[mcu host_mcu] serial: /tmp/klipper_host_mcu
これで動くようになる
しょうがないけど 1-wire は遅い。
OS起動直後、なんらかの原因で一部の 1-wire デバイスと通信できずに serial_no が認識されないと Klipper が起動に失敗する。
また 1-wire の通信に失敗すると Kilipper がエラーを吐いて止まることがある (1度あった)。のであまり大量に繋げたりしないほうが安全そう。念のためフェライトコアを噛ませている。
立方体とかをプリントすると角が膨らんでいることに気付くと思う。こういうのをできるだけなくすのが Pressure Advance 機能になる。
https://note.com/eitoku_note/n/n78f0d240940a このマクロをつかわせてもらう。
一番下は現在の設定値なので、その次のラインから console に表示されている値と突きあわせて見ていくのが早い。今回は 0.03 が適切だった。
Klipper はなるべく早く起動して、ディプレイに起動してますよというアピールをしてほしい。しかしいろいろ設定した printer.cfg だと、なるはやで起動というのが難しいことがある。例えば 1-wire のデバイスを設定していると、1-wire のデバイスが OS に認識されるまで klipper を起動できなくなってしまう (さもなくばエラーになる)
ということで、最小限の cfg を作って最小限の gcode を実行してすぐ終了するようなことを OS 起動初期にやりたい。
klippy.py に -i で gcode 入力ファイルを渡すとそのファイルだけ実行して終了してくれる。これをバッチモードという。
mcu のファームウェアを make したときにできる out/klipper.dict が必要になる。これは形式的にはJSONファイルで、mcu との通信プロトコルの規約が入っている。
以下のように cfg と gcode と dict を渡すと gcode の実行をして終了する。
/home/pi/klippy-env/bin/python /home/pi/klipper/klippy/klippy.py /home/pi/klipper_config/bootstrap.cfg -i /home/pi/klipper_config/bootstrap.gcode -d /home/pi/klipper/out/mcu_klipper.dict
以下のようにする。なるはやで起動してさっさと終了してほしい意図がある。もっといい方法があるかもだけどとりあえずうまくいっている。
$ cat /etc/systemd/system/klipper_bootstrap.service #Systemd Klipper Service [Unit] Description=Bootstrap klipper Before=klipper.service Wants=udev.target [Install] WantedBy=multi-user.target [Service] Type=oneshot User=pi RemainAfterExit=yes ExecStart= /home/pi/klippy-env/bin/python /home/pi/klipper/klippy/klippy.py /home/pi/klipper_config/bootstrap.cfg -i /home/pi/klipper_config/bootstrap.gcode -d /home/pi/klipper/out/mcu_klipper.dict
systemctl enable klipper_bootstrap.service
shutdown 時も同様のことをしたいが、batch モードではない klipper が終了するときに mcu を shutdown 状態 (estop) にしてしまいうまくいかない。batch モードではこの shutdown 状態を解除する方法がおそらくない (FIRMWARE_RESTART する前にエラーで死んでしまう)
一番良いのは Klipper を経由せずに (Rapsberry Pi の GPIO で) 起動状態を示す LED などを外出しすること。
Octopus の基板上の RGBヘッダは Stealthburner が使うので、さらにストリップを追加しようと思うとなかなかピンが見当らない。BLTouch のところがあいてるなら使える。(PB6)
片側15個、合計30個の NeoPixel ストリップを固定した。
LED Strip Holder for Voron 2.4 の 250mm を2つ。上の左右フレームの内側にとりつけた。ついでに diffuser もつけている
デフォルトで設定されているメニュー を完全に無効化して設定しなおす方法
デフォルトのメニューは type: disabled にすると部分的に無効化できるが、順番を変えるのが index を指定したりでめんどうさい。
以下のように display セクションで menu_root を指定してやると、自分で好きなように定義できる。
[display] menu_root: __main0 [menu __main0] type: list name: Main ...
原則として、オーバーヒートしない限りできるだけたくさん電流を流すほうが安定する (トルクが高い)。
手元の Voron 2.4 の ABZ のモーターは Ralted Current 2A となっている。
RMS電流の最大は 0.707 をかけて 1.414A、ただし TMC2209 の最大電流が1.2Aなのでそっちで最大がきまる。
デフォルトは0.8Aになっていた。Zモーターは外に出ていて4つで重量を分けあってるが、A/B モーターは庫内でかなり加熱するのでちょっとこわい。
TMC2209 のリミットにあてるのも恐いので、とりあえず 1.0A にすることにした。→ 長時間やったあとサーモカメラでA/Bモーターの温度を見たところ60℃いかないぐらいだったので 1.1A に増やした。→音がやたらうるさくなったと感じたので1.0Aに戻した
スペック上130℃の絶縁階級(B種)となっている。これは絶対最大定格にあたるので内部がこれを超えることがあってはいけない。
だいたい目安としてはケースで100℃ぐらいまで。触れないレベルで熱いのは危険。
ref. https://docs.vorondesign.com/community/howto/120decibell/calculating_driver_current.html