2024年2月19日 星期一

STM32F103 的 timer 的使用

目的

在改裝 3D 印表機時,需要在有限的空間內加上一些調整時會用的裝置,只要把它安裝在可動的座上。參考網路的作法,使用舵機 MG90S 來改變位置。MG90S 是使用 50Hz 的方波的 duty cycle 寬度來控制舵的角度。

為了瞭解 MG90S 的運作方式,使用 STM32F103 的開發板來控制它,程式語言則是使用 Forth。Forth 兼具 interactive 和 compile 的特性,可以在 terminal 直接發送指令,也可將一堆指令包成一個 word (等同於其他程式言的 function),然後在 terminal 直接測試新的 word。並且有能夠直接存取特定 IO 的低階指令,在開發硬體上很方便。

參考 

STM32 的 PWM 原理

STM32 有不同編號的 MCU,功能上差不多,但控制上稍微不同,必須找對應的 Reference manual 來看,如 STM32F101xx 要看 RM0008 的文件,STM32F407/417 則要看 RM0090 的文件。

一張圖勝於長篇解說,下面的圖借自網站 deepbluembedded 的圖。



STM32F103 微控制器采用 Cortex-M3 内核,CPU 最高速度达 72 MHz。MG90S 控制信號的頻率為 50Hz。

以下參考 embeddedexpert 的關於 timer 使用的說明。

1. stm32 的 timer 的工作簡要說明:

A Timer Module in its most basic form is a digital logic circuit that counts up every clock cycle. More functionalities are implemented in hardware to support the timer module so it can count up or down. It can have a Prescaler to divide the input clock frequency by a selectable value. It can also have circuitry for input capture, PWM signal generation, and much more as we’ll see in this tutorial.

Let’s consider a basic 16-Bit timer like the one shown below. As a 16-Bit time, it can count from 0 up to 65535. Every clock cycle, the value of the timer is incremented by 1. And as you can see, the Fsys is not the frequency that is incrementing the timer module. But it gets divided by the Prescaler, then it gets fed to the timer.

Basically, in timer mode, the TCNT register is incremented by 1 each clock cycle @ the following frequency (Fsys/PSC). This means if the Fsys is 80MHz & PSC is 1:1024, the TCNT gets incremented by 1 every 12.8μSec. Therefore, if you start this timer to count from 0 until it reaches overflow (at 65535), a flag will be set and starts over from zero.

2. 設定延遲時間:

Since STM32F103 has multiple timers, we shall use timer2 for this guide.

First, we need to enable clock access to TIM2 of STM32F1. In order to find which bus is connected to, we need the block diagram of STM32F103 which can be found in datasheet of STM32F1.

From the block diagram, we can find that TIM2 is connected to APB1 bus:


Hence, to enable clock access to TIM2:
/*Enable clock access to timer2*/
RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;

Now, we can create a function named delay which takes ms as argument to indicate the amount to be delayed as following:

void delay(uint16_t ms)

Within the function, set the prescaller for the timer, since STM32F103C8 by default runs at 8MHz, we shall use prescaller of 8000-1 as following:

TIM2->PSC=8000-1; //8 000 000 Hz / 8 000 = 1 000 Hz (1 ms) 

Set the Auto reload register the desired delay -1 :

TIM2->ARR=ms-1;   // desired delay

Enable the timer from control register 1 (CR1):

TIM2->CR1|=TIM_CR1_CEN; 

Wait until the update flag is set in status register and then clear it once it is set:

while(!(TIM2->SR&TIM_SR_UIF)){} //wait UIF to be set
TIM2->SR&=~TIM_SR_UIF; //reset UIF 

Finally, disable the timer:

TIM2->CR1&=~TIM_CR1_CEN;

3. 全部的程式碼:

Hence, the entire code as following::

#include "stm32f1xx.h"

void delay(uint16_t ms)
{
	TIM2->PSC=8000-1; //8 000 000 Hz / 8 000 = 1 000 Hz (1 ms)
	TIM2->ARR=ms-1;   // desired delay
	TIM2->CR1|=TIM_CR1_CEN;
	while(!(TIM2->SR&TIM_SR_UIF)){} //wait UIF to be set
	TIM2->SR&=~TIM_SR_UIF; //reset UIF
	TIM2->CR1&=~TIM_CR1_CEN; // Disable the timer
}

int main(void)
{
	/*Enable clock access to GPIOA*/
	RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;

	/*Configure PA0 as output*/
	GPIOA->CRL|=GPIO_CRL_MODE0;
	GPIOA->CRL&=~(GPIO_CRL_CNF0);
  
	/*Enable clock access to timer2*/
	RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;

	while(1)
	{

		GPIOA->BSRR=GPIO_BSRR_BS0;//Set PA0 to high
		delay(1000); //Delay for 1 seconds
		GPIOA->BSRR=GPIO_BSRR_BR0; // Set PA0 to low
		delay(1000); // Delay for 1 seconds

	}
}


Forth 程式

依據上面的說明,以及參考其他的 Forth 程式,撰寫的 PWM 測試程式如下

\ STM32f103 PWM functiontest
\ 由 GPIO 可用的 alternate function 決定使用的 timer 和 channel
\ PA1 -- USART2_RTS / ADC12_IN1 / TIM2_CH2

\ 8000000 constant HCLK
72 1000 1000 * *  constant HCLK  \ 72 MHz ?
\ 80 1000 1000 * *  constant HCLK 

$40021000 constant RCC_BASE    
  RCC_BASE $18 + constant RCC_APB2ENR   
  RCC_BASE $1C + constant RCC_APB1ENR   

4 constant GPIOAEN 
1 constant TIM2EN

$40010800 constant GPIOA  
    GPIOA $0 + constant GPIOA_CRL
    GPIOA $4 + constant GPIOA_CRH
    GPIOA $8 + constant GPIOA_IDR
    GPIOA $C + constant GPIOA_ODR
    GPIOA $10 + constant GPIOA_BSRR
    GPIOA $14 + constant GPIOA_BRR
    GPIOA $18 + constant GPIOA_LCKR

$40000000 constant TIM2 ( Advanced timer ) 
TIM2 $0 + constant TIM2_CR1 ( read-write )  \ control register 1
TIM2 $4 + constant TIM2_CR2 ( read-write )  \ control register 2
TIM2 $8 + constant TIM2_SMCR ( read-write )  \ slave mode control register
TIM2 $C + constant TIM2_DIER ( read-write )  \ DMA/Interrupt enable register
TIM2 $10 + constant TIM2_SR ( read-write )  \ status register
TIM2 $14 + constant TIM2_EGR ( write-only )  \ event generation register
TIM2 $18 + constant TIM2_CCMR1 ( read-write )  \ capture/compare mode register output  mode
TIM2 $1C + constant TIM2_CCMR2 ( read-write )  \ capture/compare mode register output  mode
TIM2 $20 + constant TIM2_CCER ( read-write )  \ capture/compare enable  register
TIM2 $24 + constant TIM2_CNT ( read-write )  \ counter
TIM2 $28 + constant TIM2_PSC ( read-write )  \ prescaler
TIM2 $2C + constant TIM2_ARR ( read-write )   \ auto-reload register
TIM2 $34 + constant TIM2_CCR1 ( read-write )  \ capture/compare register 1
TIM2 $38 + constant TIM2_CCR2 ( read-write )  \ capture/compare register 2
TIM2 $3C + constant TIM2_CCR3 ( read-write )  \ capture/compare register 3
TIM2 $40 + constant TIM2_CCR4 ( read-write )  \ capture/compare register 4
TIM2 $48 + constant TIM2_DCR ( read-write )  \ DMA control register
TIM2 $4C + constant TIM2_DMAR ( read-write )  \ DMA address for full transfer
TIM2 $30 + constant TIM2_RCR ( read-write )  \ repetition counter register
TIM2 $44 + constant TIM2_BDTR ( read-write )  \ break and dead-time register

1 7 lshift constant ARPE 			\ Auto-reload preload enable
1 constant CEN								\ Counter enable
1 3 lshift constant OPM	 			\ One-pulse mode
1 constant UG		              \ Update generation

\ GPIOA_CRL - only for PA0 - PA7
: gpioa-mode! ( mode pin# -- )
  4 * dup
  $F swap lshift not GPIOA_CRL @ and
  -rot lshift or GPIOA_CRL !
;

: set-pwm ( period dutycyle -- )
	1- TIM2_CCR2 !	  \ duty cycle
	1- TIM2_ARR !	  \ period
;

: s-psc 
  1- TIM2_PSC !	
;

: p-psc 
  TIM2_PSC @ 1+ .	
;

: s-arr
	1- TIM2_ARR !	  \ period
;

: p-arr
	TIM2_ARR @ 1+ .	  \ period
;

: s-ccr 
  1- TIM2_CCR2 !	
;

: p-ccr 
   TIM2_CCR2 @ 1+ .
;

\  --- init output PA1
: init-PA1 ( -- )
  \ IO port A clock enabled
  GPIOAEN RCC_APB2ENR bis!

  \ PA1 -> mode: alternate -> set value 1010 
  \ CNF  - 10 -> 1: Alternate Function, output, 0: Push-pull
  \ MODE - 10: Maximum output speed 2 MHz
  %1010 1 gpioa-mode!
;

  \ 110: PWM mode 1 - In upcounting, channel 1 is active as long as TIMx_CNT<TIMx_CCR1
  \ else inactive. In downcounting, channel 1 is inactive (OC1REF=‘0) as long as
  \ TIMx_CNT>TIMx_CCR1 else active (OC1REF=1).

\ --- init TIM2_CH2
: init-tim2_ch2 ( -- )
	TIM2EN RCC_APB1ENR bis!			\ TIM2 clock enabled
	ARPE TIM2_CR1 ! 			\ ch2 Auto-reload preload enable

  \ Bit 5 CC2P: Capture/Compare 2 output polarity, 0: OC2 active high.
  \ Bit 4 CC2E: Capture/Compare 2 output enable
	1 4 lshift TIM2_CCER ! 				\ CC2E -> OC2 signal is output on the corresponding output pin
	1 11 lshift TIM2_CCMR1 bis!			\ OC2PE (bit 11) -> Output compare 2 preload enable

	%110 12 lshift TIM2_CCMR1 bis!	\ Output compare 2 mode -> 110: PWM mode 1

  \ Update generation - Reinitialize the counter and generates an update of the registers.
	UG  TIM2_EGR !	
;
	
: pwm-init ( -- )
  init-PA1
  init-tim2_ch2

  \ HCLK 是 72MHz,prescaler 不能超過 65536
  \ 所以只能設到 2KHz
  HCLK 2000 / 1- TIM2_PSC !		\ prescaler -> 2000 Hz = 0.5 ms
  2000 50 set-pwm			\ 1000ms - 50ms period - dutycycle as initial value

  \ counter enable
	CEN TIM2_CR1 bis! 
;



舵機控制



MG90S - (S: 金屬齒輪),模拟舵机,180度 - 才能控制角度,360 度只能旋轉
数字舵机Digital Servo和模拟舵机Analog Servo

PWM 測試

控制信號頻率 50Hz,週期 20ms


8MHz = 8*1000*1000


prescaler: 1000 => 8*1000



prescaler for 1us => 1MHz



-----------

   舵機是一種位置(角度)伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。目前在高檔遙控玩具,如航模,包括飛機模型,潛艇模型;遙控機器人中已經使用得比較普遍。舵機是一種俗稱,其實是一種伺服馬達。


其工作原理是:


控制信號由接收機的通道進入信號調製晶片,獲得直流偏置電壓。它內部有一個基準電路,產生週期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最後,電壓差的正負輸出到電機驅動晶片決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。當然我們可以不用去瞭解它的具體工作原理,知道它的控制原理就夠了。就象我們使用電晶體一樣,知道可以拿它來做開關管或放大管就行了,至於管內的電子具體怎麼流動是可以完全不用去考慮的。


舵機的控制:


舵機的控制一般需要一個20ms左右的時基脈衝,該脈衝的高電平部分一般為0.5ms~2.5ms範圍內的角度控制脈衝部分。以180度角度伺服為例,那麼對應的控制關係是這樣的:


   0.5ms--------------0度;

   1.0ms------------45度;

   1.5ms------------90度;

   2.0ms-----------135度;

   2.5ms-----------180度;


這只是一種參考數值,具體的參數,請參見舵機的技術參數。


   小型舵機的工作電壓一般為4.8V或6V,轉速也不是很快,一般為0.22/60度或0.18/60度,所以假如你更改角度控制脈衝的寬度太快時,舵機可能反應不過來。如果需要更快速的反應,就需要更高的轉速了。


要精確的控制舵機,其實沒有那麼容易,很多舵機的位置等級有1024個,那麼,如果舵機的有效角度範圍為180度的話,其控制的角度精度是可以達到180/1024度約0.18度了,從時間上看其實要求的脈寬控制精度為2000/1024us約2us。如果你拿了個舵機,連控制精度為1度都達不到的話,而且還看到舵機在發抖。在這種情況下,只要舵機的電壓沒有抖動,那抖動的就是你的控制脈衝了。而這個脈衝為什麼會抖動呢?當然和你選用的脈衝發生器有關了。


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


0.5ms - 0 度

14.7ms - 90度

24.5ms - 180度 


stm32f103

較佳的設定

psc - 7200 --> 10KHz -- 0.1ms

arr - 2000 ->  0.1ms * 200 = 20ms -> 50Hz

0.1ms * 500 = 50ms


0.5ms -- -90度  

150 -- 0度

crr = 250 -- 90度


hclk = 72000000 

hclk 100000 / s-psc   => 100k -- 10us

20ms = 10us*100 *20


0.5ms = 500us = 10us *  50

150ms = 10us * 100*150


1Hz - 100us*10*1000


使用這個設定

hclk 100000 / s-psc     => 100k -- 10us                                             
2000 s-arr  => 20ms -> 50Hz                                                                              
50 s-ccr   ok.       (0 度)                                                                         
150 s-ccr  ok.      (90 度)                                                                        
250 s-ccr  ok.     (180 度)









2024年2月4日 星期日

在 STM32F103 上執行 Mecrisp-Stellaris Forth

Forth,是一種宗教

1980 年代,黃大一 (1948-12-26 -- 2023-01-18) 所撰寫的《符式(FORTH) F83 入門 》(松崗出版社 1986) 是我接觸 Forth 的開始。黃大一對 Forth 如宗教般的推崇,也反應了許多人對 Forth 如宗教般的信仰。雖然如此,因為 Forth 的特性,在一般電腦上其實無法和其他語言競爭,其強項為兼具 interactive/compiling 和精簡的基本系統,很適合在嵌入式系統上使用。

因此,我雖然很早就接觸 Forth,但幾乎沒有實際派上用場。直到最近 (2024),一片獨立的 32位元單晶片系統,如 stm32f103,不到台幣 100元,最適合在上面執行 Forth 了。

Mecrisp-Stellaris Forth

下載版本 mecrisp-stellaris-2.6.5,使用 precompiled 目錄下的 mecrisp-stellaris-stm32f103-with-usb-terminal.bin。使用 ST-LINK 燒錄時,不用切換 BOOT0 的狀態。

連上之後,傳回的裝置為 

---------------------------------
[1217966.500259] usb 1-7.3.1: new full-speed USB device number 16 using xhci_hcd
[1217966.591866] usb 1-7.3.1: New USB device found, idVendor=0483, idProduct=5740, bcdDevice= 2.00
[1217966.591871] usb 1-7.3.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1217966.591872] usb 1-7.3.1: Product: Forth Serial Port
[1217966.591873] usb 1-7.3.1: Manufacturer: Mecrisp (STM32F10x)
[1217966.591874] usb 1-7.3.1: SerialNumber: 0F775724
[1217966.600191] cdc_acm 1-7.3.1:1.0: ttyACM0: USB ACM device
--------------------------------

連接指令 "sudo minicom -b 115200  -D /dev/ttyACM0",要修改設定,加入在按 Enter 時,送出 CRLF。按鍵順序 Ctrl-A -> Z -> U,即可 "開啟加入換列字元" 或 "關閉加入換列字元"。

--------------------
STM32F103 的 USART I/O
USART1:PA9 - TX,PA10 - RX
USART2:PA2 - TX,PA3 - RX
USART3:PB10 - TX,PB11 - RX
--------------------

假如燒錄完成,連線之後,不斷出現 "Unhandled Interrupt 00000003 !",可能是因為 flash 中有其他先前存在的程式,可以將 flash 完整清除看看,參考 Bugs or Benefits ?

差別在於,stm32f103 的 memmap 定義如下

--------------------
MEMORY
{
   rom(RX)   : ORIGIN = 0x00000000, LENGTH = 0x4000
   ram(WAIL) : ORIGIN = 0x20000000, LENGTH = 0x4000
}
--------------------

stm32f103-ra 的 memmap 定義則為

--------------------
MEMORY
{
   rom(RX)   : ORIGIN = 0x00000000, LENGTH = 0x5000
   ram(WAIL) : ORIGIN = 0x20000000, LENGTH = 0x4000
}
--------------------

相關說明 RA Kernel,"Activate RA compiler optimisations by increasing the reserved core size to 0x5000 (up from the 0x4000 of the classic cores) and by adding an assembler switch"。


Forth 專用連工具 e4thcom - A Terminal for Embedded Forth Systems,方便下載程式。

連線指令 "sudo ./e4thcom -t mecrisp-st -d ttyUSB0 -b B115200 --idm"

ascii      ascii-xfr -dsv -l 200  










2024年1月4日 星期四

小米 2S

 https://www.techbang.com/posts/14921-transmission-lines-millet-2s-easily-root

https://blog.twtnn.com/2016/09/22snote-4g-root.html

https://sixu.life/xiaomi-2s-international-version-of-root-tutorial.html


https://zhidao.baidu.com/question/173620507582411934


https://mi.ezbox.idv.tw/thread-1662-1-1.html

小米2S - 小米MIUI ROM 官方刷機包下載

http://www.android5.online/Android/androidsj/Androidsj/xmsj/201702/42860.html

https://onfix.cn/course/319?bid=1&mid=44


2024年1月3日 星期三

Orange pi zero 3 安裝 Klipper

Orange pi zero 3,1GB 記憶體,RMB 99,大概是目前能找到的最便宜的 clone PI3,適合用來當 Klipper 的上位機 (host)。

官網連結 - Orange-Pi-Zero-3

安裝參考 -- https://github.com/nhchiu/Klipper-on-Orange-Pi-Zero-2/tree/main

下載 image 及啟動

有提供各種版本的 image。其中 Orange Pi OS Arch System,沒有預設帳號/密碼,必須要有 HDMI 螢幕,透過界面啟始系統。

因此只能挑選 debian 或 ubuntu,版本代號如下

  • Debian 12 (bookworm) — 當前的穩定(stable)版
  • Debian 11 (bullseye) — 當前的舊的穩定(oldstable)版

另外,可到 Armbian - Orange Pi Zero 3 下載社群維護的 Image,版本較新。可下載較小的 [Debian 12 (Bookworm)],2025年6月的 kernel 版本為 6.12.30-current-sunxi64。

剛開始,沒有網路之前,只能用 uart 連上系統。

在 Linux 下,使用 USB-RS連結,tx - rx, rx - tx,線要交換才行件。連線指令如下,視使用的 USB-UART,裝置可能是 /dev/ttyUSB0 或 /dev/ttyACM0。

sudo minicom -b 115200 -D /dev/ttyUSB0

或者,putty 比較好用,在 Linux 和 Windows 的環境下使用,功能是一致的。

開機後的訊息大致如下。下面是較舊版本的畫面。

--------------
=== 開機後的畫面 ===
[  OK  ] Finished lircd(8) initialization helper tool.                          
[  OK  ] Finished Permit User Sessions.                                         
         Starting LSB: set CPUFreq kernel parameters...                         
         Starting Flexible IR remote input/output application support...        
         Starting Hold until boot process finishes up...                        
         Starting Terminate Plymouth Boot Screen...                             
                                                                                
orangepizero3 login: orangepi (automatic login)                                 
                                                                                
  ___  ____ ___   _____             _____                                       
 / _ \|  _ \_ _| |__  /___ _ __ ___|___ /                                       
| | | | |_) | |    / // _ \ '__/ _ \ |_ \                                       
| |_| |  __/| |   / /|  __/ | | (_) |__) |                                      
 \___/|_|  |___| /____\___|_|  \___/____/                                       
                                                                                
Welcome to Orange Pi 1.0.0 Bullseye with Linux 5.4.125                          
                                                                                
System load:   63%              Up time:       1 min                            
Memory usage:  21% of 952M      IP:                                             
CPU temp:      48°C             Usage of /:    6% of 29G                        
                                                                                
[ General system configuration (beta): orangepi-config ]                        
                                                                                
Last login: Fri Jun 30 06:37:41 UTC 2023 on tty1                                
orangepi@orangepizero3:~$
--------------

第一次開機,會執行 resize filesystem 的指令,"[   22.451445] EXT4-fs (mmcblk1p2): resizing filesystem from 1274075 to 7738843 ..."

預設帳號是 orangepi,密碼也是 orangepi。

使用 Armbian 的 image,第一次開機,會要求設定密碼,建立一般使用者帳號密碼。

網路

沒有連上網路就一無所用。接上有線的網路,找到 IP,再從遠端進入是最快的方式。若要接 HDMI 螢幕,再用滑鼠鍵盤設定 WIFI,可能有點麻煩,因為只有一個 USB 孔,也許還推不動鍵盤和滑鼠。

可以使用下面的指令來設定網路。

$ sudo orangepi-config

亦可參考 Orange PI 的 WIKI WIFI connection test,用下指令的方式連上 WIFI。

但是,因為環境的關係,必須要設定固定 IP,得用下面的一長串指令完成。

最後的選項 "connection.autoconnect yes",可在系統重開後重新連線。 

$ nmcli dev wifi                                           
IN-USE  BSSID              SSID                           MODE   CHAN  RATE   
        40:EE:15:DA:6B:D8  Samsung-A50-cc                 Infra  9     270 Mbit
        04:D9:F5:DD:52:A0  PressRoom2019                  Infra  10    195 Mbit
        20:9C:B4:C8:57:41  eduroam                        Infra  1     130 Mbit

$ sudo nmcli con add con-name "Samsung-A50-cc" \
   type wifi ifname wlan0 \
   ssid "Samsung-A50-cc"  -- \
   wifi-sec.key-mgmt wpa-psk \
   wifi-sec.psk "wifi-password" \
   ipv4.method manual \
   ipv4.address 10.161.86.113/20 \
   ipv4.dns 8.8.8.8,8.8.8.4 \
   ipv4.gateway 10.161.80.1 \
   connection.autoconnect yes
Connection 'Samsung-A50-cc' (39d9f647-c090-4b83-9a41-30d02411cc26) successfully added.

可以使用 "nmcli con del Samsung-A50-cc" 刪除連線,再次測試上述指令。也可用下述指令變更設定。

# nmcli con mod Samsung-A50-cc ipv4.addresses 10.161.86.113/20
# nmcli con mod Samsung-A50-cc ipv4.gateway 10.161.80.1 eth0

或者直接修改設定檔,其存放目錄為 /etc/NetworkManager/system-connections/

若可以先用網路線連上,使用 nmtui 設定比較快。

$ sudo ip a add 10.161.86.115/20 dev eth0

執行 apt update 及 apt upgrade,更新系統。

執行更新,apt update --allow-releaseinfo-change。若出現 "Certificate verification failed: The certificate is NOT trusted" 的錯誤,執行下列指令,"apt-get install ca-certificates --reinstall"。

使用 Armbian 的 image,可以用 armbian-config 設定網路,可以設固定 IP,不用像上面這麼麻煩。

安裝 Klipper

接下來就可以透過 KIAUH 安裝 Klipper 了。在裝 Klipper 之前,磁碟使用空間 2.1G,裝完後為 4.2G。

注意,使用普通的使用者來執行。

$ git clone https://github.com/dw-0/kiauh
$ ./kiauh/kiauh.sh

進入安裝畫面如下。


移除 netplain

Armbian 的 image,使用 netplain 啟動網路,會造成開機卡關。若沒有停掉 netplan 和 systemd-networkd,開機會要等 3分鐘才完成。

設定好 NetworkManager 後,Disable networkd and purge netplan:

$ sudo systemctl disable --now systemd-networkd.service systemd-networkd.socket networkd-dispatcher.service 
$ sudo systemctl restart NetworkManager
$ sudo apt purge netplan netplan.io -y

移除後,開機就變快很多了。

ADXL345

參考 Setting up ADXL345 on orange pi lite 2 的討論。

ADXL345 PinOrgange Pi Pin
3.3V VCCCON12-P01
GNDCON12-P06
CSCON12-P24
SDOCON12-P21
SDACON12-P19
SCLCON12-P23





2023年12月14日 星期四

在 Linux 下使用 Autodesk Fusion 360

 https://github.com/cryinkfly/Autodesk-Fusion-360-for-Linux

3D 列印,很多分享的檔案都用 step 檔。Autodesk Fusion 360 雖然是付費軟體,但提供個人用途的免費使用,就來試試吧。

unset LANG,unset LC_ALL 後,安裝 app-emulation/wine-staging, app-emulation/dxvk。執行 install.sh 時,只要把語言改成 English,選擇 Gentoo,會要求 su 的權限,自動安裝缺少的 package。


https://askubuntu.com/questions/516307/how-do-i-change-default-wine-browser-to-native-ubuntu-browser-instead-of-ie


2023年12月12日 星期二

點焊機 DIY

NY-D02 點焊機控制板

此控制板是寧洋科技的產品,NY,應為 "寧洋" 的縮寫吧。關於控制板的資訊,在淘寶的產品頁面有詳細的說明,將一些資訊整理在此,方便參考。

NY-D02,雙脈衝控制板。

雙脈衝輸出,第一個脈衝除掉焊件表面的髒並預熱,第二個脈衝焊接。增強焊接功能,並且焊點不發黑。

電壓校準

因本控制器帶有網壓補償功能,所以,第一次裝機時,要進行電壓校準。以後只要不更換電源變壓器,就不用再校準。

校準操作,在運行狀能時,長按微動開關,直到時間,電流,間隔的燈全部亮起,此時用萬用表測量一下巿電電壓,比如當時測量的電壓為225V,那麼,旋轉編碼器,使數碼管顯示的值為 225 即可,然後雙擊微動開關,退出校準。

操作顯示板指示燈說明


  1. 電源 - 系統電源,常亮
  2. 腳踏 - 當腳踏開關閉合時,此燈亮
  3. 觸發 - 當可控矽觸發時,此燈亮。亮的時間和焊接時間相等
  4. 運行 - 允許焊接時,此燈常亮。設置參數時,此燈滅
  5. 時間 - 第一次脈衝時間。運行時: 第一次脈衝同步點亮。參數查詢 :此燈亮,數碼管顯示當前設定的焊接時間值。參數設置:此燈亮,數碼管閃爍,通過編碼器修改當前值。
  6. 電流 - 第一次脈衝焊接電流。運行時: 脈衝同步點亮。參數查詢 :此燈亮,數碼管顯示當前設定的焊接電流值。參數設置:此燈亮,數碼管閃爍,通過編碼器修改當前值。
  7. 間隔 - 第一次脈衝焊接和第二次脈衝焊接間隔時間。運行時:間隔狀態同步點亮。參數查詢 :此燈亮,數碼管顯示當前設定的間隔時間值。參數設置:此燈亮,數碼管閃爍,通過編碼器修改當前值。
  8. 時間 - 第二次脈衝時間。運行時: 第二次脈衝同步點亮。參數查詢 :此燈亮,數碼管顯示當前設定的焊接時間值。參數設置:此燈亮,數碼管閃爍,通過編碼器修改當前值。
  9. 電流 - 第二次脈衝焊接電流。運行時: 脈衝同步點亮。參數查詢 :此燈亮,數碼管顯示當前設定的焊接電流值。參數設置:此燈亮,數碼管閃爍,通過編碼器修改當前值。
時間,1-100 個週波,一個週波 20ms。電流,300-999,步進值 0.1%。300-999 代表 30.0% - 99.9%。

DIY 点焊机教程

購買提示,40A 和 100A 都可以輕鬆點焊 0.15mm 及以下鍍鎳片。40A 和 100A的不同之處在於,40A 控制板配 16平方點焊筆,100A 控制板配 25平方點焊筆。100A 控制板可以後期擴展增加變壓器數量加大功率,40A 控制板則不行擴展。

四、焊接調試 -- 就是看焊接效果

接下來,進行焊接測試囉。將插頭插上 100V 巿電,可以清楚的看到數碼管顯示的時間和電流。NY-D01 控制板有兩個電位器,一個調節時間,一個調節電流,使用起來很方便。接下來就可以焊接了。個人建議,調試的時候,先將時間調節到 01,電流調節到 30,然後看看焊接效果。如果不行,逐漸增加電流,直到有明顯的火花出來,電流大小就可以了。如果焊接不牢,就適當的增加時間,時間建議每次增加一個週波。

下面是時間 02 / 電流 75 的焊接效果,亦即時間為 40ms,電流為 75%。


點焊機 DIY 制作提示單

點焊機 DIY 制作提示單,請大家自行對照改造。(非常重要,請先閱讀再製作)

1: 問: 為什麽上電後沒有觸發?

答: 點焊機控制板工作電源需要的是交流電,沒有觸發的,基本上都是用了直流電,而導致不觸發不工作。換了交流電源 (AC9V-AC12V 範圍內) 就可以啦。

2: 問: 為什麽焊不牢? 焊片一撕就掉? (注意以下四條都要符合才可以)

這個問題,分多個原因。1 答: 這個問題,分多個原因。下面一一講解,請對照一下自己是否存在這些問題。

A: 焊接變壓器功率不夠。大部分的 DIY朋友,都是用微波爐變壓器來改造的。首先,一個微波爐變壓器,(無論 800W 鋁 的還是 900E 銅的) 焊 0.15鍍鎳片和 0.1純鎳片是比較理想的。有的朋友想用一個微波爐變壓器來焊 0.2的鎳片,那就是比較困難了。所以,首先看下,自己的焊接變壓器功率是否夠。

B: 變壓器次級改造用線太細。改造次級,最少也要 25平方以上的電纜,而且需要那種細絲軟線 (紫銅材質最好),扒外皮做絕緣後再纏,纏四圈,次級電壓 3.5V左右的樣子。有的朋友次級用線太細,纏的圈數雖然多,電壓雖然高,但是卻限制了電流,導致焊接不上。所以,請對照電纜粗細,最少25平方以上 (說的是國標線哈,非標的不行的)。越粗效果越好呢。

C: 點焊筆過細過長。我們建議點焊筆越短越好,我們做的一般都是 50CM左右,同樣也是焊筆越粗效果越好。比如有的朋友用 16平方的線,長度一米,是焊不上了的呢。

D:變壓器是“水貨”嘍。近年DIY的興起,讓廢舊的微波爐變壓器一路走俏,有些不良商家也就打起了這個市場主意。親們觀察一下自己手裡的變壓器,有的雖然標稱 800W,但是厚度根本不夠。正常厚度應該在 77mm 左右,低於這個厚度的,功率都不夠,基本焊接厚度也就停留在 0.1mm 的鍍鎳焊片差不多,有的甚至連 0.1也焊不牢。

3: 問:我要焊18650電池,時間和電流參數設置多少?

答: 這個參數不是固定的,因為每個人 DIY 都是不一樣的。正常參數範圍應該是: D01 和 D03, D04款時間 05以內,電流 60以上,D02款電流 600以上,時間 05以內,並且第一個電流小於第二個電流,間隔時間同樣 05以內。時間盡量短,感覺火力不夠就調高電流,根據自己的情況進行調試,調試需要耐心,焊接需要多練習,大家都會焊出自己期望的漂亮焊點來。

4: 問: 關於散熱片,需不需要加?

答 :因為點焊機工作是瞬時工作,所以一般DIY自用的親們一般也不用加散熱片。也就是說散熱片不是必須的。當然如果想 加一片也是不錯的。關於散熱片也沒有規定必需的樣子,一般鋁散熱片就可以了。 

5: 問: 兩個微波爐變壓器如何改造?

答: 使用兩個微波爐變壓器的,建議選用兩個一模一樣的,初級並聯,次級串聯,一個兩圈,次級線越粗越好,最少50平方以 上。注意兩個變壓器,一定要使用 100A的控制板,41A的容易被擊穿呢。

NY-D01 單脈衝點焊機控制板

NY-D01 是單脈衝點焊機控制板。

以下擷錄自露天/淘寶網拍的說明,搜尋關鍵字 "NY-D01 點焊機控制板 調節時間電流數碼顯示單片機點焊機diy控制板"。

買前請充分了解點焊機基本原理和有關描述,比如交流電源也不懂的朋友,拍個板子回去接個路由器電源來責問怎么不能用?為什么買的時候不提醒一下?其實描述里都說了,只是個別朋友把插交流電上的 9V 12V 穩壓電源認為是交流電源了!那是交流電嘛?那是整流出來的直流電!DIY 也容易制作失敗和損壞板子,再者畢竟接觸的是 220V 交流強電,一不小心容易發生安全事故。無電子電工基礎知識的玩家一定勿拍!因為不懂也無法準確描述故障,出任何問題就說板子問題,比如曾有一個客戶點焊不穩,就臆想是板子的輸出電壓不穩,就去測變壓器的輸出電壓,顯示是一會兒大一會兒小的,但不想想數字表可以測脈沖電壓嘛?採樣 0.3秒的數字表可以去測 0.1-0.2秒的脈沖電壓?

自製點焊機很容易失敗(其實也不是失敗,就是達不到自己想象的效果而已),實質就是電流小唄,所以不是系統地去了解和學習,而學著其他朋友或憑自己想象隨便買了一堆東西是不一定做好的;強不強不是一個部件決定的,有人 900W 全銅也點不住 0.15mm 純鎳,有人 800W 鋁也能點 0.15 純鎳,這個能的知道變壓器是弱處,他繞組線就加強一下到 30平方,然后繞組線直接點焊針,不用快接座不用黃銅焊筆。

注意:售價 43元的控制板就是主圖中的裸板一塊,不含任何變壓器和其他配件!本板子是交流變壓器控制板,不能做法拉電容儲能的控制板!

      “NY-D01 單脈沖控制板 40A”就是板載 40A 可控硅;需要 100A 的就再拍一只 100A 可控硅,自己換一下,價格和出廠裝好 100A 的也差不多,自己換可以多下一只 40A 備用。

注意:41A 可控硅一般只能接一只微波爐變壓器,大約 700W-800W 初級鋁線,900E 全銅比較勉強,有時候會損壞,建議也換 100A,接 2只變壓器一定要換 100A 可控硅。其他環牛或其他未知參數變壓器一般也要 100A ,這樣保險一點。

        一直有客戶問這個 40A 可以多少電流去點焊?100A 可以多少電流?掌柜回答和點焊電流沒有直接關系,更不要理解為換 100A 會比 40A 的點焊電流大。可控硅大小主要是根據變壓器功率來選擇可控硅。可控硅可理解為家里的空氣開關(斷路器,閘刀)只負責開關而已,斷路器的電流根據負載功率而定。但不是換個大點的空氣開關會提高負載的功率!比如 40A 換 60A 的空氣開關,你家的 2匹空調也不可能會變成 3匹!但空調多了或換 5匹的了,你空氣開關肯定要換大的了!

      功率舉例:40A 可以接一個 900W 變壓器 (點焊時瞬間可以 2000W 左右),如果次級 2.5V,就可以 800A 的瞬間點焊電流,如果次級 5V,則是 400A 的電流,所以掌柜回答可控硅大小和點焊電流沒有直接關系就是這個道理,當然一般點焊電流大了,功率也大了,可控硅也需相應大了。

因為我們板子的響應非常快,假如您的腳法足夠快,連續踩 2次,可以等于雙脈沖點焊機,所以腳踏開關有腳踏開關的好處,用一體焊筆的微動開關的就難實現不了!用腳踏的好處是不影響手持焊筆的壓力,當你手腳協調好的情況下,其實還是手腳分離工作的好,人手是最靈活可控的,不同厚度鎳片和多種情況可以即時調整我們的手持壓力,一個固定壓力并不是完美的。

     本型號板子可以配有2種電流的可控硅,規格價格看選項。40A 和100A可控硅可相互直接替換,不用改變吸收RC大小。板子設計兼容 40A 和 100A。

    本板子的時間同步控制採用單片機的精密過零同步觸發,來保證每個輸出脈沖的同步度和精確個數,所以電流控制可以做在低壓的光耦前端,使用更安全。后面觸發電流兼容 40A和 100A管子,電流調節也不是傳統觸發電流的 RC,我們是直接控制的是脈沖寬度。

    以往市場較流行的控制板只是簡單通過調節 RC 單穩觸發電路的常數來控制時間,再通過一個光耦門來輸出周波,雖然在一定時間內可以大概控制多少個脈沖,但顯然不夠精確。而且 RC 調節里的 R是個高阻電位器,易收到自身脈沖大電流的干擾。使得每次點焊時間不穩定,所以也經常遇到有些朋友焊點忽大忽小的。更因為 555 時基電路觸發後復位需要等待時間的,連續腳踏觸發會引起時基誤差,所以設計者做了防誤觸發功能,實際就是讓頻繁的觸發失效,所以這些板子的觸發速度不會高于每秒 2次,一些點焊熟練點焊工和自動點焊機這個速度就不行了。

   掌柜做了個視頻對比,大家可以看 60秒的寶貝主圖視頻,我們的這個板子可以做到一秒 5-6 次以上的可靠觸發。而且是 1個 2個直至 50個脈沖的精密控制。

     國內廠家的幾十元 DIY 點焊機板子,更不可能去用日本阿爾卑斯電位器的,即使正規國產貨,壽命和 ALPS 相差甚遠,基本 1-2 年后就可能會有接觸不良,以前搞 DIY 音響的朋友特別明知,一會兒響一會兒低,還有很大的旋轉噪音。現在我們這個 N01 板子至少有個數顯,電位器調節的是壓控數字量,并不是直接延遲時間 RC 裡的 R,這點如同音響電路里的直流音量控制器,哪天電位器明顯接觸不良了,你還能知道數字的跳動;而沒有數顯的板子,哪天電位器接觸不良了,影響到焊接電流的忽大忽小,您可能也不知道~~

       目前較先進的交流脈沖點焊機控制板子有 2個關鍵要素,一個是過零觸發,第二個是精密周波數控制時間。所以我們的供電電源只能是交流輸入,不能直流電做電源的,直流電就實現不了過零觸發點了。而不是過零同步觸發的控制板,說是需要交流電供電,你給直流 9V電照樣工作的,就說明不是同步過零觸發板。

        注意:我們的板子可控硅部分的 RC 吸收是專為大多客戶的微波爐變壓器而優化設計的,在使用其他變壓器時,可能會發生抑制不完全而產生干擾影響正常工作,甚至損壞管子,所以更換到非微波爐變壓器時請有個心理準備。

安裝時:主板盡量離大變壓器遠一點!更不能座在變壓器上!因為大變壓器有強大的電磁干擾!

2023年12月7日 星期四

紅米2 手機安裝 Klipper

 紅米2手機 xiaomi redmi 2 

HM2LTE-sa

作業系統與版本 Android 4.4

處理器品牌 Qualcomm

處理器型號 Snapdragon 410

主螢幕尺寸 4.7 inch

主相機畫素 800 萬畫素

RAM記憶體 1 GB

ROM儲存空間 8 GB

電池容量 2200 mAh


Basically, in old Redmi devices, the bootloader is usually unlocked, unlike the new Redmi devices. So you just need to flash the TWRP or CWM zip file into the system replacing the stock recovery of Xiaomi.


參考 https://quickfever.com/root-redmi-2-without-pc/,完全不用 unlock bootloader,只要安裝 root 軟體即可 root。

  • 下載 Redmi2Root.zip
  • [系統工具] > [系統更新] > [...] > [手動選擇安裝檔案]
  • The new Root zip auto installs the SuperSu app on your phone, so any app will ask for root permission and you need to allow them to give root access.


主要參考這個 gaifeng8864 / klipper-on-android 

1. 安裝 kerneladiutor

高通处理器默认有个MPD功耗控制方案,默认情况下会关闭部分CPU核心来控制功耗。 由此带来的最大的问题就是在debian系统里会发现4核心的处理器大多数情况下却只识别出2个核心。 kerneladiutor是简单好用的安卓系统的内核管理软件,用来调整CPU和GPU的频率和性能。可以强制开启所有CPU核心,充分利用手机的性能。


2. 安裝 Linux Deploy,Android 版本較舊,只能安裝較舊的 2.5.1。參考說明,安裝 Debian / oldstable。

要把 print3d 加入 group,不然無法存取網路

 sudo usermod -a -G aid_inet,aid_net_raw print3d

因為紅米2 的儲存空間只有 8GB,系統使用後,剩餘空間只有 2GB 左右。不夠裝 Klipper,必須使用 SD卡。但 SD卡必須使用 ext4 的格式,不然無法安裝成功。但 ext4 格式,Android 的檔案管理無法存取,所以將 32GB 的 SD卡切割成雨部份, FAT32 的 12GB,其餘的 ext4。 

[GUIDE] How to mount ext4 formatted MicroSD card on Android 4.2.2 Phone/Tablet

[Linux Deploy]将linux安装在sd卡区的注意事项

使用 Terminal Emulator,cat /proc/partitions 列出 sd card 的分割區名稱,例如 mmcblk1p2。則在 Linux Deploy 中,Installation type --> Partition,Installation path --> /dev/block/mmcblk1p2。

裝好 klipper,moonraker,fluidd,KlipperScreen 这4个组件後,使用空間約 4GB。裝好後,print3d 的目錄如下。





網誌存檔