Arch Linux Arduino 無法使用串列埠(Serial Port)
平常都是在OS X上使用Arduino開發,後續因為接觸到Arch Linux後想把平常的操作看看能不能搬到Arch Linux上,結果程式上傳至Arduino板子時發生問題:
訊息中了解到沒有權限能開啟,查證後發現一般將USB裝置連接時,系統會有預設的權限,但這個權限並非讓使用者本身能使用: (以Arduino Leonardo為例)
[danny@nb-a1410 dev]$ ls -l /dev/ttyACM0 crw-rw---- 1 root uucp 166, 0 Mar 18 15:05 /dev/ttyACM0 [danny@nb-a1410 dev]$
所以只要將此裝置連接後讓使用者能有權限使用它就可解決問題,以下提供2個方法。
加入群組
Arch官方有提供它的做法點這裡,只要將使用者加入群組也能擁有此權限,官方建議加入2個群組uucp
、lock
:
gpasswd -a 使用者名稱 uucp gpasswd -a 使用者名稱 lock
如果再不行的話就加入tty
gpasswd -a 使用者名稱 tty
加入後能利用id
命令對使用者查詢目前所屬的群組:
id 使用者
結果:
uid=1000(danny) gid=1000(danny) groups=1000(danny)
確定無誤後重新啟動Arduino IDE
就解決問題,不過還有另外的方法,就是在USB裝置連接後,將USB裝置名稱的屬性變更為使用者能使用的屬性就行,下面會進行了解。
變更週邊名稱屬性
Linux中管理一些裝置連接的都使用udev,這是與kernel有關的功能,這主要是讓你在連接裝置設備後會產生對應的名稱讓應用程式去使用,像我們硬碟會有sda
、sdb
或是USB串列的ttySUSB0
…等,當然會提供一些規則(rule)做客製化的功能,接下來要利用此功能讓USB裝置連接後變更它的屬性。
建立規則檔後放入/etc/udev/rules.d/
後功能就會啟用,在這不說明udev的功能,直接將規則內容列出:
建立新規則檔案
sudo nano /etc/udev/rules.d/52-arduino.rules
將下面規則貼入檔案中並存檔
SUBSYSTEMS=="usb", KERNEL=="ttyACM[0-9]*", MODE="0777" SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", MODE="0777"
此規則功能主要將USB裝置中所產生的ttyACM0
~ttyACM9
、及ttyUSB0
~ttyUSB9
的屬性變0777
,開放所有人可以存取使用。
規則重新生效
存檔完成後執行命令讓規則生效
sudo udevadm trigger
查看屬性
之後再重新將Arudino重新連接,此時可以看一下屬性:
ls -l /dev/ttyACM0
應該就能看到屬性都變了:
crwxrwxrwx 1 root uucp 166, 0 Mar 18 15:39 /dev/ttyACM0
接下來重新啟動Arduino IDE
就能順利使用。