樹莓派2 GPIO 和 SwiftyGPIO

做者:Joe,原文連接,原文日期:2016-02-08
譯者:Crystal Sun;校對:numbbbbb;定稿:littledogboyios

和全球的開源項目開發者一塊兒工做很是有趣而且能夠從中得到不少經驗。隨着計算機設備和寬帶成本逐漸下降,給全世界的人帶來了新技術,來自不一樣文化、不一樣背景的開發者們走到一塊兒努力合做,共同創造了不得的成就。git

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

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

Rock Chalk 加油

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

若是你打算嘗試一下,咱們須要: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

相關文章
相關標籤/搜索