[譯]在樹(shù)莓派2GPIO上使用SwiftyGPIO

原文連接: 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)一次。

如果你打算嘗試一下,你需要具備下面幾條要求:

我們會(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")
}
  1. SwiftGPIO 為比較流行的板子提供了封裝好的 GPIO。在我們的例子中,我們用的是 Raspberry Pi 2。
  2. 純粹就是描述 GPIO 狀態(tài)的語(yǔ)法,比如 On 或者 Off。如果我們刪掉這部分,估計(jì)整個(gè)代碼看起來(lái)會(huì)整潔一些。
  3. LedColor 是個(gè)結(jié)構(gòu)體,定義 off, Green, Ogrange 和 Red。
  4. 三色 LED 燈有兩個(gè)正極接口,我們將其中一個(gè)接口連接到 GPIO4 上,另外一個(gè)連接到 GPIO27 上,應(yīng)用啟動(dòng)后會(huì)先將接口方向設(shè)置為 .OUT 和 OFF。然后,因?yàn)槲覀冇妹杜e創(chuàng)建的 GPIOState ,所以我們必須用 .rawValue 。
  5. setLedColor 方法將一個(gè)元組()和 數(shù)組 作為
  6. 我們的應(yīng)用只有一個(gè)參數(shù),所以 guard 方法中只有兩個(gè),一個(gè)是應(yīng)用名字,另外一個(gè)是顏色。
  7. 使用 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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容