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.

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/ 底下進行改造, 再將改造出來的整個目錄打包,
就可以塞進手機裡「寄生」了!

2016-05-31

用compton 讓桌面像抬頭顯示器(HUD)

原則上要使用 DE/CE 才能讓桌面及應用程式達到透明。
例如使用KDE、Xfce………等等包山包海的桌面環境,可以設成讓應用軟體(例如終端機)
可以看到桌面完整的圖及其它軟體投射的資訊。

而使用多數 WM (如icewm, openbox, fluxbox....) 最多只能讓應用軟體做到模擬透明

,而不是真正透明。

像說使用某些終端機(terminal,如terminator) 可以設成透明而看到桌面wallpaper 圖樣,
但卻看不到投射在桌面的資訊,例如conky 所顯示的系統負載狀態。

其實有個出來已經好幾年的 compton 可以讓一般 WM 也能達到真正透明。各主要的distro
都有打包好的 binary 可以用管理程式安裝,或者可以從這裡下載回來自己compile

https://github.com/chjj/compton

如果是打包好的package, 會包含一個 compton.conf 的範例,可以 copy 到 $HOME/.config/
下面, 它是個文字檔,主要包括 陰影(shadow)、透明度(opacity及模糊blur)、淡出淡入
(fading),以及其它事項,也可以在網路上搜詢到一些例子。

利用這個可以做到全部透明的工具,讓你的在用終端機工作時,搭配像是 conky 來投射、
即時更新你要的資訊,例如室外溫度、風速、雲層、天候、股價指數……或甚至是攝影機
的動態影像。

這樣你工作的終端機就可以俱有類似 HUD(抬頭顯示器)的效果,不必每次切換到不同的
桌面區或軟體才看得到你要的資訊。

2016-04-03

USB Live Linux 開機進 Macbook Air 更簡單

上一篇提到可以經由 isohybrid 來轉一個 image 再 dd 到 USB
專門做為 Macbook 開機,再導引到原有的 USB Live Linux.

現在找到比那種方式更簡便的辦法,就是直接用原有的 USB Live Linux
設定好讓 Macbook 的 EFI 認識,就能由 USB 開機進入 Live Linux.

最主要的就是我們需要一個 efi 的 bootloader, 可以找現成的抓來用,
像是包在 Ubuntu 15.10 ISO 檔案裡的
/EFI/BOOT/grubx64.efi

我們可以在以下這裡列表裡找到它
ftp://ftp.yzu.edu.tw/Linux/ubuntu-cdimage/ubuntu-gnome/15.10/
ubuntu-gnome-15.10-desktop-amd64.list

不過還是把 ISO 檔抓下來,
ftp://ftp.yzu.edu.tw/Linux/ubuntu-cdimage/ubuntu-gnome/15.10/
ubuntu-gnome-15.10-desktop-amd64.iso

mount -o loop /PATH/ubuntu-gnome-15.10-desktop-amd64.iso /media/ISO
再從其中 copy 出來, 改成另一個名字 bootx64.efi。

假設我們把 USB disk 掛載在 /media/USB/ 之下

mkdir -p /media/USB/efi/boot
cp /media/ISO/EFI/BOOT/grubx64.efi /media/USB/efi/boot/bootx64.efi
然後
mkdir -p /media/USB/boot/grub
再 vi /media/USB/boot/grub/grub.cfg

基本格式如下(kernel 後面的參數請依實際的代入):

set default=0
set timeout=10
manuentry 'Debian 8.3' {
linux /deb83/vmlinuz opt1 opt2 opt3 live-media-path=deb83
initrd /deb83/initrd.xyz
}
manuentry 'Ubuntu 15.10' {
linux /ub1510/vmlinuz opt1 opt2 opt3 live-media-path=ub1510
initrd /ub1510/initrd.aa
}
manuentry 'Ubuntu 15.04' {
linux /ub1504/vmlinuz opt1 opt2 opt3 live-media-path=ub1504
initrd /ub1504/initrd.kk
}

這樣製作出來的 USB disk 本身就可以在 Macboot 環境開機,又保持為 read/write,相當方便。

2016-03-24

製作 Macbook 可執行的多重 Linux Live USB

這裡所謂「多重」是指一支 USB disk 上有多種版本的 Linux, 例如 Debian, Mint,
Ubuntu, CentOS, 或是包括 Ubuntu 14.10, 15.04, 15.10, 16.04 多版本全放在一支
USB disk, 因為現在 USB disk 越來越大,一支 64GB 的可以裝10個以上不同Linux.

對於想要拿Macbook 來跑Linux 的人,跑Live Linux on USB disk 應該最方便, 
不必動到 Macbook 硬碟,更不必藉由 virtual machine. 直接把一支 USB 碟
插在 Macbook 按住 Option 開機就能進入 Linux 環境工作。

長期以來我都是把 USB disk format 成 vfat 再用 grub 0.97 放在 boot/ 下,就可以
在任何 x86 電腦上開機進入 Linux 環境,只是這樣的 USB 遇到 Macbook 就不能開機,
沒得玩了!
(grub 0.97 既可以 boot CD/DVD 也可以 boot vfat USB disk)

從網路上找到的製作 Macboot 可開機的 Linux Live USB 的方式是:
1. 下載 ISO 檔(例如 Ubuntu_xxxx.iso)
2. 在Macbook 執行 hdiutil convert -format UDRW -o yyyy.img Ubuntu_xxxx.iso
3. dd if=yyyy.img of=/dev/diskN bs=1m

但這支USB disk 變成read only, 又只能塞進一種 Linux, 剩下的空間(幾GB ?)
完全用不到,而且這個 Linux 是原出廠設定, 這不是我要的操作方式.

那我來重製 ISO 檔,這樣做出來的 Linux Live USB 開機後就是我想要的環境。
可是發現修改過的ISO(改內容,再重製成 ISO file) 經過hdiutil 轉過後,卻不像
原廠 ISO 做出來那樣可開機,我改的ISO dd 出來的 USB 在 Macbook 開機時完全看不到。

幾過多次試作,發現有兩種原因造成自行改過的 ISO 無法被Macbook 用來開機,
因此要這樣才能開機:
1. boot loader 必需要用 isolinux
2. 用genisoimage/mkisofs 做出來的ISO 檔要再過一次 isohybrid

genisoimage --no-emul-boot --boot-info-table --boot-load-size 4 \
-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -J -r -l \
-o my_Linux.iso my_Linux_source_directory
然後執行
isohybrid my_Linux.iso

這樣做出來的 ISO 檔直接在 Linux 環境 dd 到 USB disk, 便可以插在 Macbook 開機,
完全不必再拿到 MacOS 環境下再用 hdiutil 轉換。
(dd if=my_Linux.iso of=/dev/sdX bs=1M)

只是,這樣就很不方便,因為對 Live Linux 內容任何大小的修改,每一次都必需重製成 ISO
再 dd 到 USB disk, 非常浪費時間。

換一個方式,把我原本可以在 x86 電腦開機的 USB disk 上各種 Linux 的 kernel/initrd
copy 出來,用上面提到的方式 改以 isolinux.cfg 來寫開機控制,參數可直接取用原有
那支 USB 的 grub/menu.lst 過來即可。

然後用上面的 genisoimage 指令及 isohybrid 做成一支可供 Macboot 開機的 USB disk,
在 Macbook 開機的時同時,也插入另一支我原本的 USB disk,

這樣在 boot loader 載入 kernel/initrd 後便會去另一支 USB disk(Macbook 不認定可開機的)
上面找對應的系統檔案,完成開機進入完整的 Linux 環境。

大部份的 Live Linux 都可以兩支同時插著開機(當然在按power 的同時也要按住 Option),
少數 Live Linux 要插拔一下非開機用的那支,才會被偵測到,載入完整系統。

2016-01-30

用 vlc 聽TuneIn radio

TuneIn Radio 是手機上相當好用的「網路電台」收音機,
可惜它沒出 for Linux 版本,不過還好有人寫了給 vlc
的小程式,掛上它就可以在 Linux 環境聽了。

藉由 vlc 媒體播放器,再加上三個小小的 lua 檔案,就可以在
Linux 環境下收聽 Tunein radio 一樣的內容。

三個 lua 檔案在: https://github.com/diegofn/TuneIn-Radio-VLC

下載後,把 tunein.lua 放在
$HOME/.local/share/vlc/lua/
把 radiotime.lua 及 streamtheworld.lua 放在
$HOME/.local/share/vlc/lua/playlist/

再改一下 $HOME/.config/Trolltech.conf 加入以下兩行
[Qt]
font="Sans Serif,14,-1,5,50,0,0,0,0,0"
(讓 vlc 打開後的電台列表字就不會那麼小)
(看你自己的喜好把上面的 14 改成你要的大小)

執行 vlc, 按 View(檢視) ---> Playlist(播放清單)
在左邊按 Internet(網際網路) ---> TuneIn Radio
就會有各種分類:
Local Radio (就是國內的電台)
Trending
Music
News 
Talk 
Sports
By Location
By Language