原文連接: Raspberry Pi 2 GPIO with SwiftyGPIO
原文發(fā)布日期:2016-1-16
文章來(lái)源:iAchieved.it
作者:Joe
譯者:Crystal Sun
校對(duì):
定稿:
和全球的開(kāi)源項(xiàng)目開(kāi)發(fā)者一起工作是一件有趣的工作,能從中獲得很多經(jīng)驗(yàn)。隨著計(jì)算機(jī)設(shè)備和寬帶成本逐漸降低,給全世界的人帶來(lái)了新技術(shù),來(lái)自不同文化、不同背景的開(kāi)發(fā)者們,有機(jī)會(huì)走到一起合作,共同創(chuàng)造了不起的成就。
自從蘋(píng)果去年開(kāi)源 Swift 編程語(yǔ)言以來(lái),熱心人們已經(jīng)創(chuàng)建了 Ubuntu 安裝包,移植到 ARM 設(shè)備上如 Raspberry Pi 2,創(chuàng)建了網(wǎng)頁(yè)開(kāi)發(fā)框架,而現(xiàn)在Umberto Raimondi 發(fā)布了 SwiftyGPIO,一個(gè) Swift 庫(kù),能夠和 ARM 設(shè)備(如 Raspberry Pi 和 BeagleBone Black)上的 GPIO 接口進(jìn)行交互。
SwiftyGPIO README 詳細(xì)解釋了如何使用模塊。正如 Umberto 所說(shuō),Swift Package Manager 目前還不能在 ARM 上使用(我曾經(jīng)嘗試進(jìn)行編譯,不過(guò)有時(shí)候發(fā)生搶占),所以我們還是下載 SwiftyGPIO.swift
文件,通過(guò) wget 和 swiftc 來(lái)進(jìn)行編譯,將所有的東西連起來(lái)。
Rock Chalk 加油
去年,我參與過(guò)使用 Xcode 開(kāi)發(fā) Arduino 項(xiàng)目,寫(xiě)過(guò)一些關(guān)于 LED 燈閃爍的代碼。這次我們?cè)?Raspberry Pi 2 上用 Swift 語(yǔ)言再實(shí)現(xiàn)一次。
如果你打算嘗試一下,你需要具備下面幾條要求:
- 一個(gè) Raspberry Pi 2
- 一對(duì) LED 燈
- 連接用的電線(xiàn)
- 把 Swift 安裝到你的 Pi 2 上
我們會(huì)用到 GPIO4 和 GPIO27,因?yàn)檫@兩個(gè)在 Pi 2 GPIO 頭文件中功能相似。
下面是 mian.swift 文件,能夠讓兩個(gè) LED 燈來(lái)回閃爍。
import Glibc
let gpios = SwiftyGPIO.getGPIOsForBoard(.RaspberryPiPlus2Zero)
// GPIO4 and GPIO27
let leds = [gpios[.P4]!, gpios[.P27]!]
// Initialize our GPIOs
for led in leds {
led.direction = .OUT
led.value = 0
}
// Blink
while true {
for led in leds {
led.value = 1
sleep(1)
led.value = 0
}
}
為了能夠完成編譯成功運(yùn)行這段代碼,直到 SwiftPM for ARM 修復(fù),我們需要這樣做:
# wget https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SwiftyGPIO.swift
# swiftc main.swift SwiftyGPIO.swift
# ./main
正確連接 LED 燈后,這兩個(gè)燈會(huì)來(lái)回閃爍!
選擇顏色
我有一個(gè)閑置的 Linrose Tricolor LED 燈,我打算物盡其用。在這段示例代碼中,我們已經(jīng)寫(xiě)了一條命令行程序,允許你設(shè)置 LED 燈的顏色(或者關(guān)上燈)。我在代碼中用 //1, //2 標(biāo)注出來(lái)了。
import Glibc
// 1
let gpiodefs = SwiftyGPIO.getGPIOsForBoard(.RaspberryPiPlus2Zero)
// 2
enum GPIOState:Int {
case Off = 0
case On
}
// 3
struct LedColor {
static let Off = (GPIOState.Off, GPIOState.Off)
static let Green = (GPIOState.On, GPIOState.Off)
static let Orange = (GPIOState.On, GPIOState.On)
static let Red = (GPIOState.Off, GPIOState.On)
}
// 4
let gpios = [gpiodefs[.P4]!, gpiodefs[.P27]!]
for gpio in gpios {
gpio.direction = .OUT
gpio.value = GPIOState.Off.rawValue
}
// 5
func setLedColor(color:(GPIOState,GPIOState), gpios:[GPIO]) {
gpios[0].value = color.0.rawValue
gpios[1].value = color.1.rawValue
}
// 6
guard Process.arguments.count == 2 else {
print("Usage: ./main off|green|orange|red")
exit(0)
}
let color = Process.arguments[1]
// 7
switch color {
case "off":
setLedColor(LedColor.Off, gpios:gpios)
case "green":
setLedColor(LedColor.Green, gpios:gpios)
case "orange":
setLedColor(LedColor.Orange, gpios:gpios)
case "red":
setLedColor(LedColor.Red, gpios:gpios)
default:
print("Invalid color")
}
- SwiftGPIO 為比較流行的板子提供了封裝好的 GPIO。在我們的例子中,我們用的是 Raspberry Pi 2。
- 純粹就是描述 GPIO 狀態(tài)的語(yǔ)法,比如 On 或者 Off。如果我們刪掉這部分,估計(jì)整個(gè)代碼看起來(lái)會(huì)整潔一些。
- LedColor 是個(gè)結(jié)構(gòu)體,定義 off, Green, Ogrange 和 Red。
- 三色 LED 燈有兩個(gè)正極接口,我們將其中一個(gè)接口連接到 GPIO4 上,另外一個(gè)連接到 GPIO27 上,應(yīng)用啟動(dòng)后會(huì)先將接口方向設(shè)置為 .OUT 和 OFF。然后,因?yàn)槲覀冇妹杜e創(chuàng)建的 GPIOState ,所以我們必須用 .rawValue 。
- setLedColor 方法將一個(gè)元組()和 數(shù)組 作為
- 我們的應(yīng)用只有一個(gè)參數(shù),所以 guard 方法中只有兩個(gè),一個(gè)是應(yīng)用名字,另外一個(gè)是顏色。
- 使用 switch 語(yǔ)句來(lái)轉(zhuǎn)換顏色,通過(guò)調(diào)用 setLedColor 來(lái)設(shè)置顏色。
結(jié)束語(yǔ)
SwiftyGPIO 這個(gè) API 能讓你在 ARM 板子上用 Swift 使用 GPIO 。隨著 Swift 語(yǔ)言的日新月異、與時(shí)俱進(jìn),Swift 儼然已進(jìn)軍制造業(yè),很有可能成為單板計(jì)算機(jī)開(kāi)發(fā)項(xiàng)目的不二選擇。
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán)。