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

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-03-31

pico解譯各種紅外線訊號

利用Raspberry Pi Pico + Adafruit 的 IR remote library 來做個泛用型紅外線接收器,插到電腦的USB就可以用來遙控任何電腦。

https://github.com/adafruit/Adafruit_CircuitPython_IRRemote

只需要 copy adafruit_irremote.py 放到 pico 的lib/ 目錄下面即可

這裡所謂泛用是說,因為同樣是按數字「2」,但不同遙控器發射出來的訊號卻不一樣。任何市面上有的紅外線遙控器,像是控制電視、播放機、機上盒、DVD機、選台器,甚至市售萬用型紅外線遙控器也是,都可以拿來做為遙控pico用。

IR receiver 有三支腳,接到pico的GPIO腳,一支接3V3 一支接GND 一支接任何GPIO, 然後把GPIO腳的GPXX 代入 pulsein 裡,這裡以GP18為例。

import board, pulseio, adafruit_irremote
pulsein = pulseio.PulseIn(board.GP18, maxlen=128, idle_state=True)

def draw():
  decoder = adafruit_irremote.GenericDecode()
  while True:
    try:
      pulses = decoder.read_pulses(pulsein)
      code = decoder.decode_bits(pulses)
      pulses.clear()
      print(code)
    except Exception as ex:
      print(str(ex))

然後從電腦用 pyserial-miniterm /dev/ttyACM0 115200 --raw 指令就可以連上pico, 來看你用的紅外線遙控器發射什麼訊號碼?

大部份解出來的都有四組數字,以我手上的幾支發射器,解出來像是
(255, 0, 183, 72)
(255, 0, 191, 64)
(255, 0, 199, 56)
或是
(49, 107, 69, 186)
(49, 107, 203, 52)
(49, 107, 163, 92)
或是
(158, 41, 15, 240)
(158, 41, 159, 96)
(158, 41, 191, 64)
或是
(191, 191, 167, 88)
(191, 191, 143, 112)
(191, 191, 39, 216)
但也有只發射兩組數字的,像是
(29, 191)
(29, 79)
(29, 207)
(這種是市售的一種包含USB接收器的遙控組,一組一百多台幣)
以四組碼的來說,前兩碼是固定,可以用第三碼來辨識發射的是哪個鍵
而兩組訊號碼的,第一碼是固定,可以用第二碼來辨識發射的是哪個鍵

知道這些訊號碼之後,就可以搭配像是Adafruit HID linbrary 來模擬鍵盤或老鼠來控制電腦,或單純從serial port送按鍵碼給電腦來做操控。

https://github.com/adafruit/Adafruit_CircuitPython_HID

較早的版本有分給circuitpython 7 或 8 版用,現在都用 8 所以只有一個目錄
adafruit_hid
把整個目錄copy到pico lib/ 下面即可使用。
例如:

elif code[2] == 63:
    kbd.send(Keycode.CONTROL, Keycode.W)
    如果第三碼是 63 就按下 Ctrl 跟 w 關閉分頁
 

elif code[2] == 123:
    kbd.send(Keycode.CONTROL, Keycode.SHIFT, Keycode.EQUALS)
    如果第三碼是123就按下Ctrl 跟 + 放大(zoom in)

2023-02-26

Circuitpython IR receiver 的問題

朋友送我一台ARM SBC(ESPRESSObin) 上面雖然有GPIO腳,但是用 Armbian_22.11.1_Espressobin_jammy_current_5.15.80.img.xz (https://www.armbian.com/espressobin/), 它的kernel config的 Remote Controller 沒有enable GPIO IR remote control, 所以就算在GPIO 上面插了 IR receiver(三支腳, VCC, GND, Signal), 但是在
/sys/class/rc/
下面是沒有任何東西出現, 所以無法使用 ir-keytables 來讀取紅外線訊號,除非去下載kernel source重新compile一個kernel,不過這比較麻煩。

正好手邊有便宜好用的Paspberry Pi pico, 把IR receiver 插在pico 就可以接收紅外線訊號,通過serial port可以傳送給ESPRESSObin 就能用網樂通的遙控器來控制了。

原本在Pi pico上面用的是circuitpython (https://circuitpython.org/downloads ), circuitpython 比micropython 好用的是它不必藉由其他editor, 只要把寫好的 python script copy 到 pico 裡面(它對任何電腦來說就是一個USB storage 隨身碟一樣) 或是直接用任何editor 在 USB storage上面編寫/修改,就能執行程式(主程式名為code.py)了。

但是問題發生了!遙控器按了幾下,pico那邊才有反應,漏失率大約在20%到30%之間,這樣是很不好用的,所以進行debug, 從code.py 到adfruit_irremote.py(https://github.com/adafruit/Adafruit_CircuitPython_IRRemote) 改來改去,甚至換了硬體(三支腳的IR接收器、發射的搖控器),但是結果都一樣, 訊號漏失還是一樣高比率。

有一天看到reddit上面有人也是用pico 來接IR receiver, 他提到沒用過7.x.x版的,而是一開始就用8.x.x版的circuitpython, (我手上的pico已經很久了,一開始就是裝7.x.x 一直沒換),所以就試試看換一下版本。

沒想到換了8.x.x 版之後,漏訊號的問題消失了!網樂通遙控器發射的訊號差不多是100%都正確反應!

這個Raspberry Pi pico既然能透過serial 送紅外線訊號給ESPRESSObin, 那就可以送訊號給一般沒有GPIO設備的x86 電腦,如果只是要玩紅外線接收,也就是pico上面只焊一支IR receiver, 這樣pico 體積就覺得很大,後來找到同樣是用RP2040 MCU的Waveshare RP2040-zero, 體積不到pico 的一半,一樣有circuitpython的支援(https://circuitpython.org/board/waveshare_rp2040_zero/),在露天拍賣的價格也跟pico大約相同,在台幣160元左右(未焊針腳, 2023年2月的價格)。如果是只當IR receiver用,不要針腳的比較方便自行焊上IR元件。

不過RP2040-zero板上的LED 跟Pi pico不同,pico是用一粒傳統LED,RP2040-zero用的是Neopixel RGB LED, 這個要用adafruit的library才方便控制, 可以從這裡下載:
https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel
跟adafruit_irremote.py 一樣要放在 lib/ 下面。

開頭可以這樣寫:
import board, neopixel
led = neopixel.NeoPixel(board.NEOPIXEL, 1)
led[0] = (64,16,0) <--這是RGB的比率
led.brightness = 0.02

NeoPixel 可以接好幾十個,可以指定led[0], led[1], led[2]....用不同顏色
關於RGB的顏色,我拿到的兩支RP2040-zero 一支是 RGB, 另一支是 GRB, 要試一下看看,才好定義 led[N] = (R, G, B) 或 (G, R, B)的比率。

2022-04-28

Raspberry Pi Pico 使用 circuitpython

 Raspberry Pi Pico 除了使用它出場的firmware之外,也能用micropython,
然而micropython要依賴editor才能方便把寫好的程式寫入Pico, 但是circuitpython
比它更方便,可以用任何editor來寫程式,寫好直接copy到Pico裡就完成了,完全
不需特定的editor.

0. https://circuitpython.org/board/raspberry_pi_pico/  <-- 在這裡download
   檔名: adafruit-circuitpython-raspberry_pi_pico-en_US-7.2.5.uf2 (目前最新)
1. Pico 先不要連到 Linux USB port
2. 按住Pico的 BOOTSEL 鍵不放
3. 把Pico USB連上 Linux USB port
4. 放開 BOOTSEL 按鍵
5. 檢查Pico在device的位置
   cat /proc/partitions to look /dev/sdX1 <-- 假設是 sdb1
   mount /dev/sdb1 /media/sdb1
6. cp adafruit-circuitpython-raspberry_pi_pico-en_US-7.2.5.uf2 /media/sdb1/

cp之後 Pico 會自行 reboot 然後變成 /dev/sdc1
mount /dev/sdc1 /media/sdc1/

看你要Pico做什麼事?就寫一個檔名叫做 code.py 然後把它
cp code.py /media/sdc1/ <-- 之後Pico一開機就會執行它的內容

就這麼簡單!

2021-09-19

孤兒Pi的救星Armbian

英國Raspberry Pi推出後大受歡迎,中國廠商也紛紛跳進去搶食這塊市場,因此出現
各種香蕉、芭樂、蓮霧……Pi, 但是在若干年後的現在一些比較早期出廠的中國品牌Pi
,廠商已經沒再推出新版OS,因此往往會有力不從心、軟體受到OS限制而無法更新
的問題,特別像是一些沒有Video out的小型Pi變成孤兒了。

 還好有一群熱心的自由軟體支持者在維護著"armbian"這套Linux OS for ARM.
https://github.com/armbian
可以到這裡找找有沒有適用你的孤兒Pi的版本?
https://www.armbian.com/download/?device_support=Supported

這裡的Download會有兩種流派Linux可以選,Ubuntu或Debian, 目前Ubuntu的版本
有Focal, 也就是20.04, 建議有興趣的人可以選這一支,它有一個好處就是LTS(Long Term 
Support), 就是一直到2025年都還會有來自Ubuntu的update可用, 因為Ubuntu在每
偶數年份會推出LTS, 為期五年。 

如果你的Pi一直健在,也可以換下一個LTS版本22.04,因為它又有另一個五年期到2027年的支援。

2021-07-17

Linux環境下的IR receiver

在Linux環要用紅外線遙控器來做一些事,找到最多都文章都是用lirc, 但是我發現
可以完全不用lirc, 只要裝了ir-keytable加上python pexpect就可以做任何事了。

對於有GPIO腳可以裝IR sensor的機器來說,例如各種pi(主要都是ARM電腦), 只要把
IR sensor三支腳的
信號腳接到GPIO
一支腳接供電
一支腳接地
就可以利用IR遙控你的電腦了。

至於沒有GPIO腳的電腦(例如一般X86電腦),最簡單的方法是買一支RTL-SDR(露天或
PCHome大約400元)它上面就有IR sensor, 而且附紅外線發射器。

至於要怎麼把接IR sensor的GPIO腳enable ?

在ARM電腦可能稍微麻煩一點,有的要在/boot/config.txt設定(如Raspberry Pi),
有的要用distribution附的工具設定(例如armbian-config).

而x86電腦只要把RTL-SDR插入就可以了,不用任何設定IR sensor.

再來就是要安裝 ir-keytable, 每個Linux distribution應該都有這個package,
用系統工具(例如apt-get, yum)就能裝好。

必需以root身份執行 ir-keytable,如果不知道發射器的協定,就用
sudo ir-keytable -c -p all -t
如果知道那個搖控器的protocol, 例如 NEC, 那就可以用
sudo ir-keytable -c -p nec -t
(我還在用網樂通的遙控器,它就是NEC protocol, 感謝黎智英先生,很多台灣人都有
黎先生贈送的網樂通,可惜香港蘋果已經在2021/6/24被中國政府強迫關門了)

然後拿著紅外線遙控器對著電腦把每個遙控鍵都按一遍,記錄一下每個鍵的值,
再來就是寫個程式讓你要的動作對應某個按鍵(或按鍵組合),這程式用
python3 + pexpect 就夠用了

import pexpect
ir = pexpect.spawn('sudo ir-keytable -c -p nec -t')

ir.timeout = None

while True:
    ir.expect("EV_SYN")
    T = ir.before.split()
    if not b'repeat' in T:
	K = str(T[-4])
	if '902' in K:	print('Mute') #0x732902
	elif '91e' in K:     print('Home')  #0x73291e
	elif '91d' in K:     print('Power') #0x73291d
        elif '940' in K:     print('Blue')  #0x732940
        elif '909' in K:     print('Up')    #0x732909
把對應按鍵的值找出來,做為你要執行的動作代碼,就能完全不必用鍵盤、螢幕來
操作一台電腦,不管是X86或是ARM。
用一台小小的什麼ARM pi,透過espeak-ng可以做為報時、報氣象、網路收音機,
不過pi本身的音效不太好,最好就是接一台USB DAC來撥放高品質的音樂。

2021-04-05

在Linux對Raspberry Pi Pico改裝micropython

 這是在純文字的 Linux shell 裡對 Pico 進行的基礎動作。
(也可以用來對 BBC micro:bit 動作)

使用 lsusb 可以看到這個 Pico 是這樣
Bus 001 Device 017: ID 2e8a:0003 Raspberry Pi RP2 Boot
再用 cat /proc/partitions 可以看到它預設 partition 已經割出一個
   8       32     131072 sdc
   8       33     131071 sdc1
(因為我已經插了一支 USB 佔掉 sdb, 所以這裡顯示 sdc)

如果用 fdisk -l 可以看到
/dev/sdc1 1 262143 262143 128M e W95 FAT16 (LBA)

在這裡可以下載 micropython for Pico
https://micropython.org/download/rp2-pico/

rp2-pico-20210403-unstable-v1.14-132-gd87f42b0e.uf2 (目前最新的)

按住 Pico USB旁邊的 BOOTSEL 然後插上 micro USB 到你的電腦
用手動掛載 Pico:
mount /dev/sdc1 /media/sdc1
再把下載來的 micropython 的 uf2 檔直接 copy 到 Pico 的 partition 1
cp rp2-pico-20210205-unstable-v1.14-8-g1f800cac3.uf2 /media/sdc1

然後 Pico 自己會 reboot 進入 micropython mode

使用 miniterm (只要裝了 python serial 就會有的一個好用 terminal)
miniterm /dev/ttyACM0 115200 --raw  就連進 Pico 的 micropython 提示符號

2021-03-31

Raspberry Pi 也發售微控器了

 2021年Raspberry Pi推出這一款微控器:
https://tutorials-raspberrypi.com/raspberry-pi-pico-programming-with-the-affordable-microcontroller/

這個Raspberry Pi Pico, 是一個比一般 Arduino 腳位多,還有 dual cores
售價一百多元台幣的 micro controller.
注意,它不是之前所有的 RPi 那種小型ARM電腦!

板上有26支 GPIO, 因為有 dual cores, 在使用 micropython 時可以跑兩個 threads.
133MHz, 內建溫度感測sensor.
Arduino IDE有支援,所以可以藉由Arduino來開發程式。

特點之一是低耗電,所以可以撐很久。
缺點之一是沒有對外連線,不過Microcontroller本來就不負責連線的事,只要加上週邊設備就能連了。

2018-01-09

UART with FTDI/PL23

一般來說ARM SBC是丟在某個角落, 只要它乖乖做事, 是不會去看它的. 最近拿到
一支OrangePi Zero, 就是以這個目的來使用, 這是一支沒有video out的SBC(RaspPi
有HDMI), 好處是它有獨立的UART debug port(RaspberryPi要另外config兩支GPIO
來當RX/TX才能接UART/TTL), 拿一台NB接上就能進系統改東西.

一般是在NB上插一支USB/TTL轉接器, 跑miniterm.py, 結果只有看到boot時的
messages, 但是messages到一個階段後就再也沒有東西出來, 也就是沒有login prompt.

於是東查西查(現在都改用systemd, 沒有/etc/inittab), 也查了systemctl的
getty@ttyS0以及/etc/systemd/system/ 還有 /lib/systemd/ 下面各種可能造成
沒有login的原因, 但是仍找不出來.

這支USB/TTL用在RaspberryPi 完全正常, 因此一直沒懷疑它, 今天想到之前用在
ESP8266時, 不同支ESP8266對不同USB/TTL的反應不一樣, 因此換一支FTDI的,
結果就能看到OrangePi Zero送出來的login prompt了!

看來這隻OPiZero的UART電壓可能跟RPi的不太一樣.

miniterm.py /dev/ttyUSB0 115200 --eol LF --raw
加--eol LF以及--raw 才能避開各種控制碼造成的混亂.

2017-12-02

telegram-cli觀察記

已經觀察了六天,發現telegram-cli拉高CPU loading的時間不一定,有時連續
一整天每個小時都出現很多(幾十次)衝到50%以上的情形,有時卻好幾個小時都
不曾出現10%以上的loading,但可以確定的是「不是OS造成程式loading high的
問題」,懷疑是網路通訊連接到telegram server有阻礙,因此一直retry導致
loading high。這六天的紀錄也沒有出現70%以上的(使用A10 single core)。

"-P XXXX"好用的地方在於telegram-cli仍可以續繼操作,又可以接受外部程式
送來的payload,並將它送出。

2017-04-14

Raspberry Pi 3 serial 通訊

Raspberry Pi 很多時候是靜靜躺在某個角落默默的做我們要它做的事
它不需要螢幕也不需要鍵盤,但偶而遇到網路不通時,這時如果還要
搬一台螢幕再接一台鍵盤才能操作,就太麻煩了。

如果可以透過serial port連進去,就可以隨便拿一台筆記型電腦來操作它了。

https://openclipart.org/download/264608/gpiopinsv2withpi.svg
從這個圖(這是RPi三代機)可以看出右側雙數腳6(接地),8(TX),10(RX)
可以用來做serial通訊。

由於三代Pi是用debian jessie, 隨著debian從sysvinit 改用systemd, 舊版Pi 的
修改/etc/inittab 的控制方式已經不適用, 必需用systemctl 來控制.
(有很多人討厭systemd, 但迫於情勢, 也不得不接受了)

我先是用dietpi-config 來啟用serial port, 但是無效, 後來手動修改
/boot/config.txt 以及/boot/cmdline.txt 裡面加上某些控制字串才能啟用。

config.txt: 加入以下
dtoverlay=pi3-disable-bt
enable_uart=1
這個config.txt 如果是在Raspberry系統執行中修改可能重開後會不見
所以改成把microSD 卡拿出來插到讀卡機裡, 用其它電腦editor來修改.

cmdline.txt: 插入以下
console=serial0,115200
這裡的"serial0"是一個sym link, 如果不通, 可以試試看ttyAMA0 或ttyS0

重開機後執行systemctl|grep serial 來確認一下serial 方面的service狀態.
當然在硬體方面你要準備一支USB to TTL的轉接器, 不管是FTDI或PL23xx 都可以,
TX 要接到RX 才能通訊, 總之不通的時候確認一下腳有沒接對.

2017-03-31

DietPi 網路收音機

前陣子Asus低調的出了一款Tinker board, 可以說是仿Raspberry Pi, 因為
整個尺寸跟layout可以說完全跟Raspberry Pi一樣, 大概就是RAM比較大,有2G,
在台灣的售價不高於2200元.(RPi 3 大約1350元)

http://dietpi.com 是個比較特別的Raspberry Pi Linux版本, 除了是源自
Raspbian, 可以用在Raspberry Pi 之外, 還有提供給各種不同ARM SoC的版本.

它不預裝一堆你可能用不到的東西,所以整個系統可以dd到1GB的MicroSD
卡上面使用.

當然by default也就沒有Xwindow, 但因為它仍是Raspbian base, 所以可以使用
Raspbian/Debian的repository來安裝自己想要的軟體.

它有幾個特別之處,就是把常有r/w的目錄, 改成tmpfs來使用,除了可以提高
r/w速度也能延長SD卡壽命.

因為Raspberry Pi 3有Wifi, 所以接著就利用它來做為網路收音機.

先收集喜好的網路電台URL, 利用python寫一個script用來變換電台
推薦這個德國的音樂網站,有很多種類的音樂
http://stream.klassikradio.de/
用樣的利用python/bash寫一個web CGI介面, 便可以用瀏覽器控制電台變換
這樣也不需login到Raspberry Pi裡面操作

最後再加上先前利用8x8LED 加一個Arduino Micro做的顯示器
用來在開機時顯示Raspberry Pi的IP, 共兼做各種資訊的顯示
(8x8LED至少可以顯示英文字母+數字+常用符號)

2016-08-20

寄生 Linux 系統到手機裡

最近一支舊手機螢幕壞了,要修也要花錢,所以就讓它退役下來做些不一樣的事好了。

由於手機有1G RAM,如果不做什麼事,其實可以「寄生」一套 Linux 在裡面,
「寄生」的Linux可以不具備 kernel 相關的東西,藉著 Android 的 kernel
就可以吃香喝辣,所以只要小小的體積就俱有不少功能。

希望能把系統控制在200MB以內,包含基本的sshd, sshfs, python, w3m, tmux....
等等就可以做不少事, 最後整包系統(刪除不必要的東西如 /usr/share 下, 以及
/var/ 下)大約在 220M左右, 還可以接受。

用 adb 進入手機內建立一個300M 的 RAM disk, 把這包系統解到 ramdisk 裡
再 chroot 進入就可以啟用這包沒有 kernel 的寄生 Linux 了.

為了要找一個合適的 Linux, 找來找去最後找到 http://dietpi.com 裡面有
很多專為各種單板電腦打造的版本,可以選用其中的 OrangePi PC 或 NanoPi Neo
的image 來當「寄生」的原型,特別說明一下,它是Debian Jessie base,
所以如果熟悉 Debian/Ubuntu 的話應該很容易上手.

這裡以 NanoPi NEO 的image 為例,下載後以 7z 解壓縮出原本大小約為 460M, 但是
它包含了一塊 vfat 及一塊 ext4 partition, vfat 是boot/kernel 相關, 用不到,
我們只要取出 ext4 也就是Linux 這一塊.

fdisk -l DietPi_v127_NanoPiNEO-armv7-(Jessie).img 可以看到

DietPi_v127_NanoPiNEO-armv7-(Jessie).img2          133120

這個 133120 就是它的起始位置,
133120 * 512(每 sector) = 68157440

來把它 mount 起來:
mkdir /media/dietpi
mount -o offset=68157440 -t ext4 DietPi_v127_NanoPiNEO-armv7-\(Jessie\).img /media/dietpi
cd /media/diatpi
cp -a * /PATH/my_dietpi/

然後 chroot 進入 /PATH/my_dietpi/ 底下進行改造, 再將改造出來的整個目錄打包,
就可以塞進手機裡「寄生」了!