樹莓派2 GPIO 和 SwiftyGPIO

作者:Joe,原文鏈接,原文日期:2016-02-08
譯者:Crystal Sun;校對:numbbbbb;定稿:littledogboy

和全球的開源項目開發者一起工作非常有趣并且可以從中獲得很多經驗。隨著計算機設備和寬帶成本逐漸降低,給全世界的人帶來了新技術,來自不同文化、不同背景的開發者們走到一起努力合作,共同創造了不起的成就。

自從蘋果去年開源 Swift 編程語言以來,熱心人們已經創建了 Ubuntu 安裝包移植到 ARM 設備上如 Raspberry Pi 2,創建了網頁開發框架,而現在Umberto Raimondi 發布了 SwiftyGPIO,一個 Swift 庫,能夠和 ARM 設備(如 Raspberry Pi 和 BeagleBone Black)上的 GPIO 接口進行交互。

SwiftyGPIO README 詳細解釋了如何使用模塊。正如 Umberto 所說,Swift Package Manager 目前還不能在 ARM 上使用(我曾經嘗試進行編譯,不過有時候發生搶占),所以我們還是下載 SwiftyGPIO.swift 文件,通過 wget 和 swiftc 來進行編譯,將所有的東西連起來。

Rock Chalk 加油

去年,我參與過使用 Xcode 開發 Arduino 項目,寫過一些關于 LED 燈閃爍的代碼。這次我們在 Raspberry Pi 2 上用 Swift 語言再實現一次。

如果你打算嘗試一下,我們需要:

我們會用到 GPIO4 針腳 和 GPIO27針腳,因為這兩個在 Pi 2 GPIO 數據頭中靠的很近。

下面是 mian.swift 文件,能夠讓兩個 LED 燈來回閃爍。

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
  }
}

直到 SwiftPM for ARM 被修復之前,為了能夠完成編譯成功運行這段代碼,我們需要這樣做:

# wget https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SwiftyGPIO.swift
# swiftc main.swift SwiftyGPIO.swift
# ./main

正確連接 LED 燈后,這兩個燈會來回閃爍!

閃爍 閃爍
閃爍 閃爍

選擇顏色

我有一個閑置的 Linrose Tricolor LED 燈,我打算物盡其用。在這段示例代碼中,我們已經寫了一條命令行程序,允許你設置 LED 燈的顏色(或者關燈)。我在代碼中用 //1, //2 標注出來了。

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 狀態的語法,比如 On 或者 Off。如果我們刪掉這部分,估計整個代碼看起來會整潔一些。
  3. LedColor 是個結構體,定義 off, Green, Ogrange 和 Red。
  4. 三色 LED 燈有兩個正極接口,我們將其中一個接口連接到 GPIO4 上,另外一個連接到 GPIO27 上,應用啟動后會先將接口方向設置為 .OUT 和 OFF。然后,因為我們用枚舉創建的 GPIOState ,所以我們應該用 .rawValue 。
  5. setLedColor 方法通過一個元組(GPIOState,GPIOState)和 一個數組 [GPIO] 把 一對兒 GPIO 接口設置為肯定狀態。
  6. 我們的應用只有一個參數,所以 guard 方法中只有兩個,一個是應用名字,另外一個是顏色。
  7. 使用 switch 語句來轉換顏色,通過調用 setLedColor 來設置顏色。

結束語

SwiftyGPIO 這個 API 能讓你在 ARM 板子上用 Swift 使用 GPIO 。隨著 Swift 語言的日新月異、與時俱進,Swift 儼然已進軍制造業,很有可能成為單板計算機開發項目的不二選擇。

本文由 SwiftGG 翻譯組翻譯,已經獲得作者翻譯授權,最新文章請訪問 http://swift.gg

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容