树莓派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

相关文章
相关标签/搜索