顯示具有 firmware 標籤的文章。 顯示所有文章
顯示具有 firmware 標籤的文章。 顯示所有文章

2025-04-18

在Linux使用非QMK鍵盤

 對於不是使用QMK firmware的鍵盤,我們還是可以用其他軟體來設定,之前用過xmodmap, setxkbmap, xcape來設定鍵盤,讓它更能快速、方便操作不同組合疊層(layer),但都需要交互搭配,使用起來有點麻煩。後來試用keyd之後發現前幾個都不必,只要一支keyd全部搞定!

 keyd的開發者還在繼續研發中,像device.c, config.c 最後更新時間是兩個禮拜前。keyd的config是純文字檔,位置在/etc/keyd/default.conf,相對的簡單明瞭,不像有些鍵盤設定軟體的config檔不太好維護。

 keyd是用C寫的,體積很小,執行檔不到兩百多KB,它是從kernel level來改變鍵盤行為與佈局,跟前面那幾支僅限在X11環境不同,所以keyd不論在X11/Wayland/tty console都能使用,反應速度快而且是透過systemctl來啟動、停止,簡單好用。

 如果請大家來投票鍵盤上哪個鍵最沒用?我想CapsLock應該會是第一名!它最沒用卻佔住最有用的位置之一,所以把它改成常用的功能吧!只要以下內容放在default.conf裡

[ids]
*
[main]
capslock = C-space 

這四行就足夠了,這樣按一下CapsLock就等同按Ctrl-space切換中文輸入程式

 不過這太簡單了,我們的需求應該不止這樣。鍵盤上另一個沒什麼用的按鍵就是右手下方的Ctrl,我把一個簡單的功能加給它,用來彈出或收回類比時鐘oclock,已經把它定義在fluxbox的「Control加F12」。當「右Ctrl」只按一下,而不跟任何鍵搭配時,就會執行「Ctrl-F12」呼叫出oclock。

 左或右的Shift僅按一下的話,便是用來切換左側或右側的桌面,fluxbox稱為NextWorkspace, PrevWorkspace,把它定義在fluxbox的「Super_L(左Win)-a」及「Super_L-f」。「左Alt」按住不放的同時再按[navig]所定義的某個鍵,可以「僅執行一次[navig]」的功能,「右Alt」跟「j」同時按住,可以鎖定[navig]功能,再一次按「右Alt」跟「j」解除已鎖定的[navig]功能。以下是我目前使用的設定例子:

[ids]
*
# *號的意思是宣告不限制特定輸入來源,凡接在這台電腦上的都受這個設定管控
[main]
capslock = overload(caps, C-space)
leftshift = overload(shift, M-a)
rightshift = overload(shift, M-f)
rightalt = layer(rightalt)
alt = overload(navig, leftalt)
rightcontrol = overload(control, C-f12)

# 以下自訂三個疊層 caps, navig, rightalt:A
[caps]
f = esc
g = `

[navig]
i = up
j = left
k = down
l = right
h = home
' = end
y = backspace
p = pageup
u = delete
; = pagedown
m = mute
, = volumedown
. = volumeup
n = M-n
space = space
[ = A-left
] = A-right
left = A-left
right = A-right

[rightalt:A]
j = toggle(navig)
# 這裡加了 :A 的意思是這個疊層除了按j用來固定(或解除)navig疊層之外,其餘都遵行原始的Alt搭配鍵。

CapsLock定義成 overload(caps, C-space) 意思是「按一下CapsLock」便執行Ctrl-space,如果搭配其他鍵,就執行「caps」這個自定疊層,當按住CapsLock以及f時,等同按了Esc,當按住CapsLock以及g時,等同按了「`」讓中文輸入列出同音字(例如在倉頡輸入時)。 A-left及A-right是定義成在terminator裡切換next_tab或prev_tab用。以上只是簡單的例子,大家可以根據自己的喜好任意修改,搭疊出更多好用的功能。
keyd可以找linux distribution本身repository裡的來用,或是抓github的source來安裝,keyd放在
https://github.com/rvaiya/keyd

2024-06-26

用mpv做簡報

 前面提到用mpv可以看youtube並且載入不同語文的字幕,後來想到是不是可以利用自製的vtt格式字幕來搭配mpv播放影片做簡報?

 一樣是影音播放軟體,VLC可能比mpv更出名,但我認為mpv比VLC好用,因為mpv可以在command line加上各種參數或由script來執行,達到把各種組合自動化的結果。

 這個試作是以最基本的簡報為目標,只用「圖片+文字」來構成,對於不想使用現成簡報軟體的時候,mpv是個不錯的選項,可以透過python或bash script呼叫ffmpeg,把「圖片、文字」組合成影片,再交給mpv播放,就達到基本簡報的目的了。

 關於影片製作以及字幕時序,是以每一秒換一張圖、一次字幕來算,或許會懷疑一秒不是太快了?不會!因為可以控制mpv的播放速度,如果設為0.1倍,原本的速度就變成10秒換一張圖、一次字幕的簡報速度。如果10秒不夠,那就按下暫停在某一張圖,便有充裕的時間進行講解,然後前進到下一個畫面,直到結束。

 vtt字幕的格式,以"WEBVTT"為第一行。
-----------
WEBVTT

1
00:00:00.000 --> 00:00:00.900
簡報文字第一行
簡報文字第二行

2
00:00:01.000 --> 00:00:01.900
簡報文字第三行
簡報文字第四行

3
00:00:02.000 --> 00:00:02.900
簡報文字第五行
簡報文字第六行

-----------
將文字檔存成例如 present.vtt 的檔名。1是搭配第一張圖的文字,2就是搭配第二張圖的文字,以此類推,可以只用一行,或很多行也可以,字很多的話,再把字體調小一些。

假設有十張圖要做簡報,我們用ffmpeg來組合圖片變成影片:
ffmpeg -framerate 1 -pattern_type glob -i 'present*.jpg' -c:a copy -c:v libx264 -r 1 present.mp4
"-framerate 1" 是一秒一張圖的意思(一般影片是30fps,一秒播30張圖),之後用mpv來播放時再把速度放慢到 "--speed=0.1" 就是一秒的十分之一,變成一張圖停留10秒(最慢可以設成 0.01秒,就是一張圖會停留100秒)。

然後在播放影片時,帶上自己做的字幕,播放時用的最基本參數是:
mpv --speed=0.1 present.mp4 --sub-file=present.vtt

mpv帶字幕時還有很多參數可用像是:
 --sub-border-color=\#000000\
 --sub-border-size=3\
 --sub-color=\#d0d0a0\
 --sub-shadow-color=\#2020d0\
 --sub-shadow-offset=15\
 --sub-back-color=\#3506080a\
 --sub-visibility=yes \
 --sub-align-x=left \
 --sub-align-y=top \
 --sub-pos=95\
 --speed=0.1\
(詳細說明請參考man mpv)

這樣製作出來的簡報mp4影片及自製字幕vtt加起來體積很小,很方便攜帶或傳送。

如果有RP2040微控器,也就是Pi Pico或Waveshare Zero之類的,焊上一個紅外線接收器,可以搭配circuitpython加上irremote(紅外線遙控)以及 adafruit-hid 來模擬鍵盤。
circuitpython的code.py可以加上以下模擬鍵盤的控制

kbd.send(Keycode.SPACE) #mpv 暫停/播放
kbd.send(Keycode.V) #mpv 字幕 顯示/隱藏
kbd.send(Keycode.LEFT_ARROW) #mpv 倒退10秒
kbd.send(Keycode.RIGHT_ARROW) #mpv 前進10秒
kbd.send(Keycode.SHIFT, Keycode.LEFT_ARROW) #mpv 倒退1秒
kbd.send(Keycode.SHIFT, Keycode.RIGHT_ARROW) #mpv 前進1秒
kbd.send(Keycode.R) #mpv 字幕上升
kbd.send(Keycode.SHIFT, Keycode.R) #mpv 字幕下降
kbd.send(Keycode.SHIFT, Keycode.G) #mpv 字體變大
kbd.send(Keycode.SHIFT, Keycode.F) #mpv 字體變小
(這些都是mpv內建控制播放用的按鍵。)

2024-03-16

隨手關歪壞(Wifi)

日常生活中大家常說「要隨手關燈、要隨手關水龍頭」,但是沒有人說「要隨手關歪壞」?一來是人們使用歪壞也沒幾年,對歪壞認識不多,反正種花電信來安裝,可以用就好了,沒想過要關掉。二是歪壞設備大部份是沒有像電燈的開關,沒辦法讓人按一下就關、就開。

大部份歪壞設備要透過網路從瀏覽器畫面登入,再慢慢翻頁到可以關或開的選項,然後進行設定,而且幾乎只有透過時程控管開或關,沒有按一下就開或關的,而且按一下設定之後,還要等一段時間讓歪壞重新啟動才能生效。

現在市售歪壞設備更是標榜「穿牆」,功率越強越好,賣方跟買方都有這樣訴求。所以我們打開歪壞一掃,左右鄰居的AP名字都會出現,有的甚至比你家裡的更強!

嚴格一點來看,歪壞訊號到處射,也會有安全上的隱憂吧?如果能「隨手關歪壞」應該會比較安全,也比較環保。

要能夠隨手關歪壞,大概只有自己DIY一途,DIY需要哪些東西?(可能需要一點電子焊接工作) 

1.一組SBC ARM電腦,例如各種Pi,Banana pi Zero, NanoPi Neo, RPi zero……,不需要高規格硬體。
2.作業系統使用Linux,所以需要一些基本的使用經驗。
3.Wifi硬體,SBC板上內建的,或PCIe/MiniPCIe介面的,或USB介面的,最好有外接天線。(可能會遇到某些硬體沒有支援AP mode,或需要自行compile driver,要實際試才知道)
4.紅外線接收頭(有些SBC會內建),網路買一個5元以內(搜尋1838B這一款),紅外線發射器(家裡不用的紅外線遙控器,或壞掉只剩一個按鍵正常的遙控器,因為我們只要用一個鍵就夠了)
5.一個LED(可以是onboard的或接在GPIO腳上)來顯示歪壞On/Off,或是接一個WS2812(NeoPixel)多彩LED,這個好用,只要三支GPIO就能控制幾十個RGB LED。
6.板上內建的MCU或外接的MCU(例如RPi pico 或 RP2040-zero),用來解讀紅外線訊號,下指令控制歪壞的開、關。
7.用某種語言來寫控制介面,例如常見的python,以及MCU上面的程式(例如circuitpython)。
8.底層控制程式,一為控制AP的hostapd,另一為dhcpd(可以用dnsmasq或是更簡便的busybox udhcpd)分配IP,以及routing, iptables NAT給client端。

SBC上面內建紅外線接收頭是最方便的,如果沒有,就要在GPIO上面插紅外線接收頭,如果從GPIO插有問題,那就把紅外線接收頭插在USB外接式MCU(RPi pico 或RP2040-zero)上面也可以。

解碼紅外線發射器的某個按鍵所發出來訊號的值,如果是內建MCU,可以在SBC上面執行例如"sudo ir-keytable -c -t"來讀取按鍵值,以便寫入介面程式。如果用RPi pico或RP2040-zero這種外接MCU,可以用"adafruit_irremote"這個circuitpython用的library來讀取按鍵值。

用bash寫一個同時啟動dhcpd以及hostapd的介面程式。

最後寫一個銜接MCU到OS的介面程式,來「開」「關」歪壞AP。
1.紅外線『發射器』送出訊號
2.紅外線『接收頭』收到訊號
3.MCU確認這個訊號是要控制歪壞AP,而非其他按鍵
4.MCU向介面程式傳達『收到了』
5.介面程式檢查hostapd,若是未執行,就執行bash介面,啟動hostapd及dhcpd
6.介面程式檢查hostapd,若是執行中,就執行bash介面,中斷hostapd及dhcpd

完成之後,按下遙控器上某一個鍵,歪壞就開啟,LED就亮,再按一下同一鍵,歪壞就關閉,LED就滅,這樣就能「隨手關歪壞」了。

2023-10-27

UV-K5 firmware資訊更新

使用了一段時間之後,在收接飛航通訊方面效果最好的是使用
https://github.com/egzumer/uv-k5-firmware-custom
這個github的firmware,它針對AM mode改良,所以聽起來不輸Uniden的scanner.

它包括spectrum功能,可以開啟頻譜模式來掃描飛航通訊,而且可以用到12.8MHz寬的範圍來掃描。

 

 按F以及5啟動頻譜模式,以截圖中的掃描來說,凸出來這一支訊號就是128.5MHz, 所謂12.8MHz寬,是在頻譜模式按4切換成128,再按1(7減少)增加到100.00k,最左端是118.1MHz最右端是130.9MHz。這個範圍掃描時會停在ATIS,因為它是不間斷發射(RCSS ATIS=127.4),所以按一下PTT下方的第一個按鍵Fn1,會把這個頻率列為不接收,下一輪掃到這裡就跳過,如果你所在環境還有其他強雜訊,使得掃描時停在那個訊號,就按一下Fn1來跳過。

 這裡說切換為100.00k是因為幾乎全部的通訊都落在小數後一位,即NNN.M,例如127.4 118.1 125.5 119.7 128.5,除了131.95外都適用。

 幾個重要按鍵:
1/7 增減掃描頻率間隔
4 掃描總數(循環改變)
2/8 增減掃描時改變頻率的間隔(按上/下鍵來改變頻率)
5 直接輸入你要起始的頻率(用*來輸入小數點)
3/9 改變收聽訊號的dB值
6 收聽頻率的頻寬
0 切換FM/AM/SSB
F/# 改變squelch線的高低
Fn1(PTT下面第一個鍵) 把出現的頻率列為跳過
Fn2(PTT下面第二個鍵) 頻譜掃描中,按Fn2可以切換背光
PTT 可以停在掃到的頻率

 從頻譜掃描來找出會出現的頻率,然後把頻率寫入記憶,常態收聽時切換到記憶模式(非VFO模式),按*鍵啟動記憶掃描。

 記憶掃描途中可以長按*鍵來切換 I 跟 II 兩個群組或是不分群組全部掃描
在非掃描時的記憶頻率,按5可以把這個頻率切換為第I或第II群組,或不屬群組.

 

 這是非掃描時的畫面,同時顯示兩個記憶頻道名稱及頻率,目前收到的是119.7000

 如果不想用web界面的方式燒錄(在Linux只能用chrome,不能用firefox),可以用k5prog這個工具,它已經修正bug,可以正常使用(之前版本會在半途中斷無法完成)。
https://github.com/sq5bpf/k5prog
在使用k5prog燒錄之前,要把下載來的bin或自己compile出來的bin拆解開,工具是這一支程式 https://github.com/amnemonic/Quansheng_UV-K5_Firmware/blob/main/uvmod_kitchen/qsfirm.py

 進入燒錄模式的按鍵是
1.先關機,插入連接線(3.5mm/2.5mm耳機接頭)
2.按住PTT不放,開電源,這時螢幕無顯示,照明用LED必須亮起來

執行方式如以下這一行
qsfirm.py unpack abc-xyz.bin k5flash.bin abc-xyz_ver.bin
"unpack" 這個就是拆解出給k5prog燒錄的格式
abc-xyz.bin 就是下載來或自行compile出來的bin檔
abc-xyz_ver.bin 只是看看它是什麼版本用的,與燒錄無關
k5flash.bin 是要交給 k5prog 燒錄用的格式檔bin,然後開始燒錄

k5prog -b k5flash.bin -YYYYY -F
這裡一定要加 -YYYYY -F
開始它會列出一些資訊,其中包括firmware的大小:
Writing blocks from address 0x0 until 0xf000, firmware size is 0xefec
然後看它的最後一行是不是 0xef00 跟 0x00ec
*** FLASH at 0xef00 length 0x00ec  result=1
這樣就表示全部燒錄完成了

記憶頻道的管理要用chirp, 請找next裡新的版本才有支援UV-K5機種
https://trac.chirp.danplanet.com/chirp_next/