[译]在树莓派2GPIO上使用SwiftyGPIO

原文连接: Raspberry Pi 2 GPIO with SwiftyGPIO
原文发布日期:2016-1-16
文章来源:iAchieved.it
作者:Joe
译者:Crystal Sun
校对:
定稿:

和全球的开源项目开发者一起工作是一件有趣的工作,能从中获得很多经验。随着计算机设备和宽带成本逐渐降低,给全世界的人带来了新技术,来自不同文化、不同背景的开发者们,有机会走到一起合作,共同创造了不起的成就。

自从苹果去年开源 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 方法将一个元组()和 数组 作为
  6. 我们的应用只有一个参数,所以 guard 方法中只有两个,一个是应用名字,另外一个是颜色。
  7. 使用 switch 语句来转换颜色,通过调用 setLedColor 来设置颜色。

结束语

SwiftyGPIO 这个 API 能让你在 ARM 板子上用 Swift 使用 GPIO 。随着 Swift 语言的日新月异、与时俱进,Swift 俨然已进军制造业,很有可能成为单板计算机开发项目的不二选择。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容