BV1AL 之無所不記

2017-06-18

雨天裡公園的滑水道

這幾天的預報,下雨機率都是百分之百,也使得入夜後氣溫涼到只有廿三、廿四度,
端午之後這麼涼的天氣也很難得。

下午路過附近公園,因為下著雨,除了涼亭有少數下棋的人以外,整個公園只有
我一個行人,以及雨滴打在傘上的聲音,連鳥都去躲雨了。

走過遊戲區,有一套架高起來的溜滑梯以及攀爬平台,滑道分成有蓋式的、無蓋式
的,塑膠(或塑鋼、FRP ?)製大紅大綠的那種。

忽然聽到小孩的叫喊聲,轉頭看見一個大概幼稚園的小弟。

正在滑著雨水遍佈的滑道,像水上樂園的滑水道一樣,小弟從滑道的洞口出來,
然後站起身。

頭、衣服、褲子都是濕的。

溜下來,接著又爬上梯架,換到另外一個滑道,再滑下來。整個公園沒有人跟他
搶遊樂設施。

小孩的媽媽撐著傘,站在遊樂組合的旁邊,靜靜看著小弟一趟又一趟的滑著、
叫著。

生為這個媽媽的小孩,長大後一定有很多快樂的童年回憶。

我們的這一代、上一代,制式反應是『下雨天不要出去亂玩,淋雨會感冒、
會生病』。

標籤: ,

2017-06-10

空機執行CentOS Live(有關iPXE)

原本都是用CentOS Live放在USB,最近因為有需求用PXE執行CentOS,但是傳統上
PXE的tftp傳輸很慢,於是改用iPXE,因為iPXE可以使用像是http, iSCSI, AoE等等的
protocol,相較快很多,http又可以跨越local LAN。

網路上大多數談到PXE是以安裝Linux系統為主要,但是這裡的目的,不是要install
,而是直接跑live system在一台空機上面, 因此需要把整個live image傳送到clicnet端,
如果採用iPXE加上http會比tftp好太多!

不論PXE(或iPXE)基本上只能傳送kernel及initrd兩個檔給client,可是我們有
kernel(vmlinuz), initrd.img, squashfs.img三個檔案,沒辦法全都傳!
而三個檔中的squashfs.img很大,根本不適合用tftp傳送!

網路上有人寫了一個把CentOS Live ISO轉給PXE用的script
https://github.com/livecd-tools/livecd-tools/blob/master/tools/livecd-iso-to-pxeboot.sh

它主要就是把原生CentOS Live的ISO拆開,再重新打包成兩個檔(一個kernel
及一個initrd.img),雖然我已經customized的CentOS Live當然可以再反組裝
回去ISO,但那是多費力氣,並不需要。

只要把squashfs.img打包成ISO檔,塞進拆開的initrd裡面,就構成PXE必要的
兩個檔之一,加上kernel就能透過iPXE快速的傳送到client端執行了。

squashfs.img的customize在這裡只簡單說明,它裡面有一個LiveOS的目錄,
裡面塞了一個ext4的單一檔案,這個檔案可以用dd if=/dev/zero來打底,改變
大小,將整個system tree搬進去,修改後再重新打包回squashfs.img裡面,
就是customize完成。

將squashfs.img打包成ISO的方法如下:
genisoimage -J -joliet-long -r -T -o CentOS.iso --root LiveOS /PATH/squashfs.img
再挖一個坑,例如 myISO/,把產出的CentOS.iso丟進去,myISO/下面你也可以
放任何你要放的檔案。
cd myISO/
find . -print|cpio -H newc -L -o|gzip -9 |cat /PATH/initrd.img - > ../init4PXE.img
產出的init4PXE.img會在 myISO/的上一層。
請注意!上面的"- >" 「減號」跟「大於」之間有一個「空白」

新的init4PXE.img會是幾百MB或超過1GB,看你做了什麼而定。

最後的重點就是bootloader的menu要怎麼寫,原本CentOS Live的bootloader
menu有一個參數
"root=live:CDLABEL=LIVEUSB" 這時候要改成
"root=live:/CentOS.iso" ←這個CentOS.iso是根據上面我們製作ISO給的
名字,然後boot option至少要保留"rd.live.image"這一個。
附註: 要拆解原生CentOS的initrd.img需要用到
CentOS自己的/usr/lib/dracut/skipcpio
這個工具。
(customize CentOS Live可能也要拆解initrd.img並且重新打包。
重新打包就是用上面的指令及參數
find . -print|cpio -H newc -L -o|gzip -c > initnew.img)

標籤: ,

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至少可以顯示英文字母+數字+常用符號)

標籤: , , , , ,

2017-01-26

Firmata Serial直送PWM,Servo

除了將各pin做為digital out用可以送出
serial.write(chr(0xf4)+chr(PIN)+chr(1)) 來定義之外,這裡再補充一下
PWM及Servo

PWM:
serial.write(chr(0xf4)+chr(13)+chr(3)) 將13pin定義成PWM
(第13pin在Arduino板子上有內建的LED可以做測試)
(Arduino限定3, 5, 6, 9, 10, 11, 13才俱有PWM功能)
不過328P的13pin不能當PWM用,32U4才可以。

定義某一支pin做為PWM之後,可以送出
serial.write(chr(0xe0+PIN)+chr(N)+chr(0或1))
來控制PWM LED的亮度,例如:
serial.write(chr(0xe0+13)+chr(127)+chr(0))
控制第13pin,亮度127
亮度數值從0到254,當亮度大於127時,第三byte要為1,其於則為0
serial.write(chr(0xe0+13)+chr(150)+chr(1))

Servo:
serial.write(chr(0xf4)+chr(13)+chr(4)) 將13pin定義成Servo
定義某一支pin做為Servo之後,可以送出
serial.write(chr(0xe0+PIN)+chr(A)+chr(0或1))
來控制Servo推動的角度,例如:
serial.write(chr(0xe0+13)+chr(127)+chr(0))
控制第13pin,Servo轉到127度
Servo的角度從0到179,當角度大於127時,第三byte要為1,其於則為0
serial.write(chr(0xe0+13)+chr(150)+chr(1))

當pin小於或等於15時,用上列的控制算法

當pin大於15時,用以下方法

當角度小於或等於127時,用
serial.write( chr(0xf0)+chr(0x6f)+chr(PIN)+chr(A)+chr(0xf7) )
例如:
serial.write( chr(0xf0)+chr(0x6f)+chr(16)+chr(120)+chr(0xf7) )
如果角度大於127時,用
serial.write( chr(0xf0)+chr(0x6f)+chr(16)+chr(150)+chr(0x1)+chr(0xf7) )

不過一般來說,Servo實際推動的角度範圍還不到180度。

標籤: , ,

2016-11-28

FirmataPlus Serial 直送碼

之前一直都用 pyfirmata 來控制 Arduino, 但是 digital pin 的數量受制, 所以要改
Board.h 又要改 pyfirmata.py 所以使用上不是很方便, 最近改用 PyMata 它可以
讓 mega32u4 用到更多 digital pins, 以 Leonardo 來說可以用到 23 支, 小一點的
Micro 也能用到 22 支, 更小的 Pro Micro 也能有 18 支可用, 所以不管是控制 7seg
LED 或 8x8 matrix LED 也夠用.

原本都要依賴 pyfirmata 或 PyMata 的 module, 但它的啟動有點長, 加上如果是要
透過別的機器不一定能提供完整的 library 給 pyfirmata/PyMata 呼叫, 因此嚐試
改用 python serial 直送 firmata 控制碼.

這裡以 digital pin 為例, 說明一下如何直接傳送控制碼, 以及 pin 腳的接法以達到
「最少傳送」而且能讓多支腳工作的方式.

Arduino (Leonardo/Micro/ProMicro)是裝了 PyMata 的 FirmataPlus32u4
這一支, 然後控制端只要用到 python serial 即可. Arduino 的腳分成幾個 port:
port 0: pin 0 -- 7
port 1: pin 8 -- 15
port 2: pin 16 -- 23

Firmata 的控制碼:
port 碼 + pin 碼 + 尾pin碼
例如要給 0(或 8 或 16) pin 拉 High, 就是送出
 第0腳:  0x90 + 1 + 0 三碼
 第8腳:  0x91 + 1 + 0 三碼
 第16腳: 0x92 + 1 + 0 三碼

 第7腳:  0x90 + 0 + 1 三碼
 第15腳: 0x91 + 0 + 1 三碼
 第23腳: 0x92 + 0 + 1 三碼
 (以上三支腳比較特別, 中間那一碼就保持原有的值, 不必加減)

 第3腳: 0x90 + 8 + 0 三碼
 第11腳: 0x91 + 8 + 0 三碼
 第19腳: 0x92 + 8 + 0 三碼

 同時 3 及 7 腳: 0x90 + 8 + 1 三碼
 同時 11 及 15 腳: 0x91 + 8 + 1 三碼
 同時 19 及 23 腳: 0x92 + 8 + 1 三碼

 同時 3 及 4 及 7 腳: 0x90 + (8+16) + 1 也就是 0x90 24 1 三碼

腳的算法是這個 port 的第幾支腳就是 2 的幾次方,
第3腳是 2的3次方, 所以是8
第11腳是 port 1 的第 3腳(由0開始), 所以也是 2 的 3次方, 也是8

第 8 腳是 port 1 的 0 腳, 所以 2 的 0次方, 及 第11腳同時 high 就是 1+8=9
所以送出的三碼是 0x91 9 0, 用 python serial 就是
serial.write(chr(0x91)+chr(9)+chr(0))
所以如果把同一個 port 的 pin 接在像是 8x8 LED 上相續的 row (或 column)
這樣就可以只送出一次控制碼, 便能同時讓多支 digital pin High/Low.
serial.write(chr(0x91)+chr(9)+chr(1))
可以讓 pin 8,11,15 三支同時 High.

標籤: , ,

2016-09-05

現在的 MicroPython for ESP8266

大概一年前看到 MicroPython 時,覺得很有趣,想抓來玩玩,但一看內容卻是零零落落
,一年後的現在再看,發現它基本功能都有,已經可以用了!
http://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/index.html

現有的 binary images 可以在這裡下載:
http://micropython.org/download/

請往下拉,找到給 ESP8266 用的檔案,大約 500KB.
esp8266-2016xxxx-v1.8.3-xxx-xxxxxxxx.bin

燒錄的方法跟燒 nodemcu image 一樣,可以用 esptool.py
(新版的燒錄工具在 https://github.com/themadinventor/esptool/ )

先清晶片裡的舊版 MicroPython:
esptool.py erase_flash (可以不必加 -p /dev/ttyUSB0 -b 115200)
再來便可以燒錄新版:
esptool.py write_flash -fm qio -fs 32m 0x00000 \
esp8266-2016xxxx-v1.8.3-xxx-xxxxxxxx.bin

-fm qio -fs 32m 的參數是給 4M Flash 的款式(如ESP-12) 用的
-fm dio -fs 8m 的參數是給 512K Flash 的款式(如ESP-01)用的

最基本的例子 LED 點滅:
from machine import Pin
p15=Pin(15,Pin.OUT)
p15.value(1) 點亮
p15.value(0) 熄滅

LED PWM 亮度控制:
from machine import PWM
pwm15=PWM(p15)
pwm15.freq(500)
pwm15.duty(128)
(例用PWM 就可以控制司服機(servo) 彎臂角度)

其它各項功能請自行參閱上面 tutorial.

標籤: ,