2022年9月30日 星期五

使用電腦執行 Klipper 控制 MKS Gen_L V2.1

想使用 docker 來測試 klipper,參考 https://github.com/mkuf/prind


那個 type-B 的 USB 接頭實在很煩,線又很短,有空來換成 type-c 的接頭吧。連上後,使用 dmesg 顯示訊息如下。

------------------------------------
[   55.491549] usb 2-1.1: new full-speed USB device number 4 using ehci-pci
[   55.601246] usb 2-1.1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice=81.34
[   55.601265] usb 2-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[   55.601272] usb 2-1.1: Product: USB Serial
[   55.601901] ch341 2-1.1:1.0: ch341-uart converter detected
[   55.606120] usb 2-1.1: ch341-uart converter now attached to ttyUSB0
-----------------------------------

使用 Gentoo,必須設定和編譯 Kernel,新增 module「USB Winchiphead CH341 Single Port Serial Driver (USB_SERIAL_CH341)」。

--------------------
mks@mkspi:~/klipper$ make flash FLASH_DEVICE=/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
  Flashing out/klipper.elf.hex to /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 via avrdude

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9801 (probably m2560)
avrdude: reading input file "out/klipper.elf.hex"
avrdude: writing flash (30148 bytes):

Writing | ################################################## | 100% 4.83s

avrdude: 30148 bytes of flash written
avrdude: verifying flash memory against out/klipper.elf.hex:
avrdude: load data flash data from input file out/klipper.elf.hex:
avrdude: input file out/klipper.elf.hex contains 30148 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 3.68s

avrdude: verifying ...
avrdude: 30148 bytes of flash verified

avrdude: safemode: Fuses OK (E:FD, H:D8, L:FF)

avrdude done.  Thank you.

--------------------

從 MKS 的文件找到的 PIN 腳圖,把用到的 PIN 腳改成 Klipper 使用的標號。




2022年9月26日 星期一

占美 1037u 迷你電腦安裝 Ubuntu Linux

占美 1037u 迷你電腦,2013 年的產品,蠻舊的。在露天拍賣買的,$1,579,免運費。拿到機器就直接插電測試,卻看不到指示燈。拆開機殼查看,發現有2個藍色指示燈,卻沒有對準開孔,不曉得這樣裝是要幹嘛。後來再檢查接線,兩個LED是並聯的,就更讓人納悶這是在幹嘛。

主機板的型號 GHM7X VER. A,可惜找不到板子的相關資訊,這就是玩大陸生產的東西不好的地方,台灣生產的也差不多,都不願意公開技術資訊。

CPU 和晶片組焊在板子的背面,使用機殼散熱。



買它的目的是想用它來裝 Klipper,控制 3D印表機。蠻奇怪的,插上 USB 隨身碟就抓不到鍵盤,也無法從隨身碟開機。後來把 Thinkpad 已經裝好 Ubuntu 的SSD拔過來裝上,就可以開機了。

上面原來有一個 24GB 的 msata SDD,原來是裝 Win7。Ubuntu 裝好後,大約佔用 10GB 的空間,就用 cpio 把它 clone 到這個 msata SDD 上,再把控制3D印表機不需要用的軟體砍一砍。

整個安裝複製的過程大致整理如下。

先確認 Ubuntu 的 partition 和 file type。主分割區是 ext4,開機分割區是 vfat32。

root@ajax-ThinkPad-X220:~# df -Th

Filesystem Type   Size  Used Avail Use% Mounted on

tmpfs      tmpfs  382M  1.7M  381M   1% /run

/dev/sdb3  ext4   219G  9.2G  199G   5% /

tmpfs      tmpfs  1.9G 0  1.9G   0% /dev/shm

tmpfs      tmpfs  5.0M  4.0K  5.0M   1% /run/lock

/dev/sdb2  vfat   512M  5.3M  507M   2% /boot/efi

tmpfs      tmpfs  382M  112K  382M   1% /run/user/1000

msata ssd 原來的分割區。

                            Disk: /dev/sda

           Size: 22.37 GiB, 24015495168 bytes, 46905264 sectors

                    Label: dos, identifier: 0x89b50dd4


Device   Boot  Start   End   Sectors  Size  Id Type

>>  /dev/sda1   *     2048 206847 204800   100M   7 HPFS/NTFS/exFAT

/dev/sda2        206848  46901247  46694400 22.3G  7 HPFS/NTFS/exFAT

Free space      46901248  46905263  4016 2M



Ubuntu 的分割區,使用 gpt 分割表。

                            Disk: /dev/sdb

         Size: 223.57 GiB, 240057409536 bytes, 468862128 sectors

       Label: gpt, identifier: 7F3A45A7-012A-4334-A4D6-56D8572C44BE


Device         Start     End Sectors Size Type

>>  /dev/sdb1       2048    4095    2048   1M BIOS boot     

/dev/sdb2       4096 1054719 1050624 513M EFI System

/dev/sdb3    1054720   468860927   467806208   223.1G Linux filesystem


格式化磁區,然後再用 cpio 複製磁區。

root@ajax-ThinkPad-X220:/# mkfs.vfat -F 32 /dev/sda2

root@ajax-ThinkPad-X220:/# mkfs.ext4 /dev/sda3


root@ajax-ThinkPad-X220:/# mount /dev/sda2 /mnt

root@ajax-ThinkPad-X220:/# cd /boot/efi

root@ajax-ThinkPad-X220:/# find ./ -xdev -print0 | cpio -pa0V /mnt

root@ajax-ThinkPad-X220:/# umount /mnt


root@ajax-ThinkPad-X220:/# mount /dev/sda3 /mnt

root@ajax-ThinkPad-X220:/# cd /

root@ajax-ThinkPad-X220:/# find ./ -xdev -print0 | cpio -pa0V /mnt


參考下面的連結,使用 chroot 設定開機磁區,How to Repair or Re-install GRUB using the chroot command/

步驟如下

# 掛載磁區

root@ajax-ThinkPad-X220:/# mount /dev/sda3 /mnt

root@ajax-ThinkPad-X220:/# mount /dev/sda2 /mnt/boot/efi/

root@ajax-ThinkPad-X220:/# mount --bind /dev /mnt/dev

root@ajax-ThinkPad-X220:/# mount --bind /dev/pts /mnt/dev/pts

root@ajax-ThinkPad-X220:/# mount --bind /proc /mnt/proc

root@ajax-ThinkPad-X220:/# mount --bind /sys /mnt/sys

root@ajax-ThinkPad-X220:/#  chroot /mnt

-----------

# 進入 chroot,設定開機

root@ajax-ThinkPad-X220:/# grub-install /dev/sda

Installing for x86_64-efi platform.

grub-install: warning: EFI variables cannot be set on this system.

grub-install: warning: You will have to complete the GRUB setup manually.

Installation finished. No error reported.

root@ajax-ThinkPad-X220:/# grub-install --recheck /dev/sda

Installing for x86_64-efi platform.

grub-install: warning: EFI variables cannot be set on this system.

grub-install: warning: You will have to complete the GRUB setup manually.

Installation finished. No error reported.

root@ajax-ThinkPad-X220:/# update-grub

Sourcing file `/etc/default/grub'

Sourcing file `/etc/default/grub.d/init-select.cfg'

Generating grub configuration file ...

Found linux image: /boot/vmlinuz-5.15.0-48-generic

Found initrd image: /boot/initrd.img-5.15.0-48-generic

Found linux image: /boot/vmlinuz-5.15.0-25-generic

Found initrd image: /boot/initrd.img-5.15.0-25-generic

Memtest86+ needs a 16-bit boot, that is not available on EFI, exiting

Warning: os-prober will not be executed to detect other bootable partitions.

Systems on them will not be added to the GRUB boot configuration.

Check GRUB_DISABLE_OS_PROBER documentation entry.

done






2022年8月31日 星期三

Voron 3D 印表機 DIY

散件,重量 20.920kg。集運總重 23.058kg,運費總計:¥288.00。

規格

挑的是最便宜的方案


voron2.4散件沃隆diy套件高配置树莓派触控屏高速打印自动调平,颜色分类:250尺寸散件套餐,¥3500.00,浩成工作室,tb4865026374。发货地址: 广西壮族自治区百色市右江区

網友意見 -- V6 不適合快速打印,你可以考慮便宜的中國蚊子高流量,印象中不到 90CNY


----
ajax@x201 ~ $ !ssh
ssh mks@192.168.1.27
mks@192.168.1.27's password: 
           _              _ 
 _ __ ___ | | _____ _ __ (_)
| '_ ` _ \| |/ / __| '_ \| |
| | | | | |   <\__ \ |_) | |
|_| |_| |_|_|\_\___/ .__/|_|
                   |_|      
Welcome to Armbian 22.05.0-trunk  with bleeding edge Linux 5.16.20-rockchip64

No end-user support: built from trunk

System load:   80%            Up time:       1 min
Memory usage:  24% of 976M    IP:        192.168.1.27
CPU temp:      50°C            Usage of /:    34% of 14G   

[ General system configuration (beta): armbian-config ]

Last login: Fri Sep 16 01:42:53 2022 from 192.168.1.51
-bash: warning: setlocale: LC_ALL: cannot change locale (zh_TW.UTF-8)
mks@mkspi:~$ ls
------
23:06:57 $ PROBE_CALIBRATE
23:06:57 // probe: TRIGGERED
23:06:57 // Attaching Probe
23:07:00 // probe: open
23:07:09 // probe at 124.000,128.000 is z=0.148108
23:07:10 // probe at 124.000,128.000 is z=0.150608
23:07:11 // probe at 124.000,128.000 is z=0.150608
23:07:11 // Starting manual Z probe. Use TESTZ to adjust position.
         // Finish with ACCEPT or ABORT command.
23:07:11 // Z position: ?????? --> 5.151 <-- ??????
23:07:11 // Docking Probe
23:07:25 // probe: TRIGGERED
-----

整理在FB社團的文章,先copy過來再慢慢整理。

------------------

看大家都在玩 Voron 2.4,跟風去買了一台散件來裝。實在是都很貴,就挑一個最便宜,但有評價可參考的。列印大小 250*250,3,500RMB,用MKS pi 和 monster 的板子。重量超過20KG,淘寶集運超過台幣一千。

説明書常對不起來,裝到一半要問賣家,才能繼續往下裝,還好賣家回覆很快。搞了半個多月,機器終於會動。至於整線,向來是我的短板,先不管了。

心得是,終於了解大家討論的klipper 是怎麼樣的東西,還蠻炫的,可以從網頁看到好多資訊,可以除錯。打算這台裝好,要把另一台corexy 的控制也改成 klipper。

------------------

,從組好機構後,又過了快一個月,才可以印出東西,雖然沒有成功。

這段期間,都在了解 Klipper,和printer.cfg奮鬥,或者説,比較像在平時在設定電腦伺服器的感覺。

往往要失敗幾次,像是列印頭撞平台,要步進馬達往上,它卻往下,要左邊升,卻右邊一直升。爬一陣子網路,讀一堆東西,思考問題,然後往前一小步。

最後,上傳一個檔案試印,只看到噴頭從半公分高的空中開始印。試了幾次,才知道要把某一段G-code貼到檔案開頭。但是又發生頭不斷的去撞板子。再花了幾天找答案,才知道賣家提供的是 Klippy probe 的作法,可以自動計算噴頭高度,但設定檔的switch座標值設錯了。

經過了這麼久的摸索,終於可以讓噴頭貼著板子印出東西。

為此還買一部中古筆電,幾乎都是在用網頁控制印表機。

在這同時,也想著要如何改另外的機器,klipper 的控制方式的實在太方便了,只要設定好,就不用手動調整,雖然在開始時,手動調整比較直覺。

----------------------

上次調整printer.cfg的參數後,可以貼著平台開始列印,但印了兩三層後,物件就會脫落。調整不同的offset,還是一樣。仔細觀察列印過程,發現列印底層,還蠻漂亮的,著床情況良好。再往上印,底下就翹邊,然後整個脫落。

上網爬解答,幾年前社群有人有同樣的問題,最後發現是軟磁板熱阻太大,感測器的溫度和平台表面溫度相差幾十度,後來把熱床溫度設到一百度以上解決此問題。

自己決定也測試一下,看實際情況是怎樣。另做一條感溫線,插到列印頭的感溫插座,再將熱床加溫。感謝klipper超讚的界面,有溫度變化的曲線,可以看到溫度差很多,穩定後約相差20度。

簡單的解決辦法是將熱床溫度設高一點,但是看溫度曲線,可以看出平台的溫度落後感測器的變化很多,因為原感測器直接貼在發熱片上。這樣很難穩定的控制熱床表面的溫度。

最後決定在軟磁板上挖洞,把感測器埋在鋁板上方。軟磁板用美工刀很好挖,只是要有點耐心。熱床最多一百度,線的絕縁應不致於融化,即使真的融化,也沒有危險。

弄好,再跑一次測試,溫度變化如第二張曲線,兩條曲線的變化很一致,中間黏的感測器翹起來,因此溫度掉下來,最後的溫度大約差十度。

切片時,將熱床溫度設在90,列印成功。終於,可以開始印想要的東西了,等好久才走到這裏。

以上,供大家參考,我也要看在高溫下,線能撐多久。

使用零件摘要

熱嵌螺母

構件接合,很多地方會使用到熱嵌螺母,或叫熱熔螺母,英文名稱 M3 Brass heatstake inserts,或 heat set inserts。規格標示,Voron 文件 BOM 的規格為 "M3 Brass heatstake inserts - short M3x5x4",和淘寶的標示法略有不同。淘寶的名稱 "土八斜纹滚花黄铜螺母",規格中間一碼為長度,第 3 碼為外徑。






2022年8月4日 星期四

APC UPS Pro 1000 換電池

先看一下原廠的電池的樣子,兩面的顏色不同。電池兩面都能插,新的 UPS 是紅色向上,電池沒有接上。要反過來,綠上向上,電池才有作用。

2019年 3月換的,當時有經費,就交給廠商處理吧。總共 3,200元,不太便宜,算服務費吧。,但也不能算貴,因為他換的是自己拼湊的電池,若是原廠的,聽說光電池就超過 2千元。


當時他把換下來的電池帶走了,不肯留給我。現在知道值錢的是那個組裝的接頭盒子,他要帶回去,在幫下一個客戶換電池時可以用。

搜尋時,英文品名為 "APC UPS Replacement Battery Cartridge, for use with UPS"。網購從台幣 3千多到 7千都有,不過業界是這樣子的,對高檔客戶,若報價不貴,會顯得不夠專業,所以那價格不適用於我。

下面的電池,是後來廠商換的,無法分正反面。


只能靠接頭的文字標示來分別,插的時候再留意一下。插反沒有危險,但電池沒作用,主要是長期不用,或搬運時使用。

下面幾張是內部接頭的照片,接頭旁邊有文字標示 BLACK/RED。


背後的插座,左右分別為只有濾波和有UPS功能的。灰色部分,有一個是電腦插座,為主控,當電腦關機,受控插座也會斷電。


電池買到了,2顆總共 652元,蝦皮免運。組裝後,用布膠帶固定。


在上面綁根束帶,方便抽出電池,也可用來分辨方向。

買的時候要注意電極規格為 B-type (寬版PIN頭),寬度約 6.5mm。另外,儘量挑可靠的廠牌,有的電池會漏液,會毀了昂貴的 UPS,不值得。像辦公室有一台便宜的 UPS,使用 RITAR 的電池,拆開來就看到電池漏液,電路板燒毀。

系統顯示的狀態。使用 sys-power/apcupsd。





2022年7月27日 星期三

PHP 8.1 測試

PHP 8.1 使用 VS 2016 來編譯的。

ODBC 的考量

參考 Microsoft 的 [Docs/SQL  連線/ODBC/Windows] 的 系統需求、安裝和驅動程式檔案

SQL 的版本相容性,因為不曉得連結那時會失效,擷圖如下


支援的作業系統,擷圖如下。測試的結果,在 Windows 7 和 Windows 10 上都可以用。


但是在使用 sqlsrv_connect() 來連 SQL Server 2008 時,還是碰到一些問題。

連接的程式片段如下。注意必須指定語言編碼,不然 SQL 丟回的錯誤訊息會變一堆亂碼。

$serverName = "10.161.86.186";
$connectionInfo = array(
    "UID" => 'sa', "PWD" => 'abcd1234', "Database"=>"db_test" , 
    "CharacterSet" => "UTF-8"
);

$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
    echo "Could not connect.\n";
	echo '<pre>'.print_r( sqlsrv_errors(), true).'</pre>';
    exit;
}

由瀏覽器觀看結果如下

Could not connect.
Array
(
    [0] => Array
        (
            [0] => IM006
            [SQLSTATE] => IM006
            [1] => 0
            [code] => 0
            [2] => [Microsoft][ODBC 驅動程式管理員] 驅動程式的 SQLSetConnectAttr 失敗
            [message] => [Microsoft][ODBC 驅動程式管理員] 驅動程式的 SQLSetConnectAttr 失敗
        )

    [1] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5701
            [code] => 5701
            [2] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將資料庫內容變更為 'NTU_test'。
            [message] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將資料庫內容變更為 'NTU_test'。
        )

    [2] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5703
            [code] => 5703
            [2] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將語言設定變更為 繁體中文。
            [message] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將語言設定變更為 繁體中文。
        )

)

搜尋得到的解答,最快的方法是升級 ODBC driver 的版本,但升級之後就不支援 SQL Server 2008 了,但有人提供一個簡單的作法,請參照 Cannot connect to SQL Server with PHP script

作法是在程式開頭加上 sqlsrv_configure('WarningsReturnAsErrors', 0); 。因為 sqlsrv_connect() 傳回的只是 warning,並非 error。

後來又測了 pdo_sqlsrv,就很正常,不會出現上面的錯誤。


關於 null array 的 element

到現在才知道,在 PHP 中,存取 null array 的 element 並不會出錯,直到 PHP 7.4 之後 ...

Actually, John Vargo was correct. If a variable is null, accessing it as if it were an array will simply return null without notices. This will change in the upcoming 7.4 version, then it will produce a notice.

Notice: Trying to access array offset on value of type null

The actual output is still the same.


2022年7月21日 星期四

使用 LibreOffice 將 doc 或 ppt 轉換成 pdf

動機

有些網頁服務,會要求使用者上傳文件,如課程大綱的摘要,有許多人會上傳 word 檔,在網頁無法直接預覽其上傳的內容。要在網頁預覽,必須將其轉換成 pdf 比較方便。Openoffice 有一種 headless 的執行模式,可用 PHP 來呼叫,於線上完成轉檔。

作法

本以為 Openoffice 都有這功能,我的電腦原來是裝 Apache Openoffice 4.1,在 cmd 視窗都輸入指令,都會開啟視窗。後來確認 Apache Openoffice 4.1 無法使用 headless 模式轉換 pdf。移除後,改裝 LibreOffice 7.3 即可成功執行。

使用命令視窗來測試

c:\Program Files\LibreOffice\program>soffice.com --headless --convert-to pdf c:\temp\test.doc --outdir c:\temp
convert C:\temp\test.doc -> c:\temp\test.pdf using filter : writer_pdf_Export
Overwriting: c:\temp\test.pdf

大約等 10 秒,順利完成轉檔。

透過 PHP 來執行轉檔

$soffice_cmd = 'c:\Program Files (x86)\LibreOffice\program\soffice.com';

$conv_cmd = "\"{$soffice_cmd}\" --headless --convert-to pdf c:/temp/test.dot --outdir c:/temp ";
        
echo "轉成PDF檔案: $conv_cmd<br>\n";
$exec_flg = exec($conv_cmd, $res_out, $res_code);

var_dump($exec_flg);
var_dump($res_out);
var_dump($res_code);

從瀏覽器執行,會等很久,超過執行時間而失敗。

在命令視窗,直接用 PHP 執行該 script 檔,則能順利執行。

從 Google 找答案,大約就是權限問題,因為透過 IIS 執行,其 home 目錄不曉得是那裡,LibreOffice 無法建立暫存檔,就掛在那邊。解決辦法是指定 -env 參數。

修正後的程式如下

$soffice_cmd = 'c:\Program Files (x86)\LibreOffice\program\soffice.com';

$conv_cmd = "\"{$soffice_cmd}\" -env:UserInstallation=file:///c:/temp --headless --convert-to pdf c:/temp/test.dot --outdir c:/temp ";
        
echo "轉檔指令: $conv_cmd<br>\n";
$exec_flg = exec($conv_cmd, $res_out, $res_code);

var_dump($exec_flg);
var_dump($res_out);
var_dump($res_code);

請注意,目錄的格式是URL的形式。

至於 Linux 下,則是指定 HOME 參數

$conv_cmd = "export HOME=/tmp && soffice --headless --convert-to pdf ".$doc_path." --outdir /tmp/";
echo "轉檔指令: $conv_cmd<br>\n";
exec($Linux_command);




2022年7月3日 星期日

Larevel 5.4 以後,設定 DB 的 fetch mode 為 PDO::FETCH_ASSOC

參考網址

Go to: app/Providers/EventServiceProvider.php

Add this to the top of the file:

use Illuminate\Database\Events\StatementPrepared;

In the boot method add:

Event::listen(StatementPrepared::class, function ($event) {
    $event->statement->setFetchMode(\PDO::FETCH_ASSOC);
});

In t

網誌存檔