作者: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 语言再实现一次。

如果你打算尝试一下,我们需要:

  • 一个 RaspBerry Pi 2

  • 一对 LED 灯

  • 连接用的电线

  • 把 Swift 安装到你的 Pi 2 上

我们会用到 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。

树莓派2 GPIO 和 SwiftyGPIO的更多相关文章

  1. 树莓派2 GPIO 和 SwiftyGPIO

    自从苹果去年开源Swift编程语言以来,热心人们已经创建了Ubuntu安装包,移植到ARM设备上如RaspberryPi2,创建了网页开发框架,而现在UmbertoRaimondi发布了SwiftyGPIO,一个Swift库,能够和ARM设备上的GPIO接口进行交互。SwiftyGPIOREADME详细解释了如何使用模块。这次我们在RaspBerryPi2上用Swift语言再实现一次。SwiftGPIO为比较流行的板子提供了封装好的GPIO。setLedColor方法通过一个元组和一个数组[GPIO]把一

  2. 在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解

    在树莓派上运行NodeJS并不需要特别的配置,你只需要确保可以用openssh远程连接到你的树莓派就ok了,关于在Debian(Raspberry Pi)树莓派上安装NodeJS的方法,大家可以通过本文了解下

  3. 树莓派3B+ 64位Ubuntu安装caffe

    树莓派3B+到货了,当然要把玩一番。背景树莓派从3代开始就用上了64位的处理器,奈何却没有更新上64位的系统。拿着RPi3B+的我就对这个更感兴趣了,先折腾一下64位系统,再装个caffe吧。比如说,没有针对于3B+完美的稳定的Ubuntu64位系统。再比如说,尽管大大的系统很牛逼了,但是Ubuntu16.04系统依然没法在RPi3B+上用,而Ubuntu18.04可以。对于树莓派3B+,编译OpenCV的主要问题有两个:内存不够,不够SWAP加了太热,自备小风扇或水冷谢谢(水冷真的不是开玩笑。。

  4. 【树莓派】为Ubuntu for ARM 更换中国软件源

    更换步骤以root身份打开/etc/apt/sources.list,至于用什么打开随意将http://ports.ubuntu.com/全部替换为http://mirrors.ustc.edu.cn/ubuntu-ports/,这是中科大的执行sudoapt-getupdate和sudoapt-getupgrade测试查看是否提供arm支持的方法打开一个镜像站点,然后以此打开/dists/xen

  5. 树莓派安装centos 7系统

    1,格式化https://www.sdcard.org/downloads/formatter_4/eula_windows/2,烧录,Win32diskimagerhttps://sourceforge.net/projects/win32diskimager/3,下载centos,最好都下载最新的raw.xzhttp://mirror.centos.org/altarch/7/isos/arm

  6. raspberry-pi – Ubuntu在启动后启动“启动内核”覆盆子pi 3

    我在覆盆子pi3上遇到了ubuntu16.04的一个主要问题.如果我重新启动安装和ssh后它.它会在“StartingKernel”消息打印到屏幕后开始然后停止并且永远不会进展.任何想法为什么以及如何解决它?麦克风的小费感谢user519274,这里就是我做了参考:从树莓取出SD卡,并把它放在另一台计算机将sd卡放回树莓中,它应该启动并且uname-r应该显示1034确保你没有sudo易于升级,否则你会再有同样的问题

  7. 树莓派3+centos7拓展存储空间LVM学习

    VG卷用户组LVM大磁盘就是将许多PV整合为一个VG,每个VG最多包含65534个PE,也就是VG最多为256GBPE物理拓展块LVM默认使用4M的PE,PE是LVM中最小的存储块,也就是文件数据都是由写入PE完成的LV逻辑卷最终的VG会被切成LV。LV的设备名通常指定为/dev/vgname/lvname实现流程通过PV,VG,LV的规划,最后利用mkfs命令将LV格式化成可利用的文件系统。

  8. 树莓派3+centos7实现git服务器

    六、git用户设置为不能shell登录找到:改为七、最终测试在客户端运行gitclone命令:gitclonegit@192.168.1.103:/home/git/test.git可以直接下载,不用输入密码。

  9. 树莓派 centos 内网 花生壳 ngrok 内网穿透

    opensslgenrsa-outrootCA.key2048opensslreq-new-x509-nodes-keyrootCA.key-days10000-subj"/CN=ngrok.ele.com"-outrootCA.pemopensslgenrsa-outserver.key2048opensslreq-new-keyserver.key-subj"/CN=ngrok.ele.com"-outserver.csropensslx509-req-inserver.csr-CArootCA.pe

  10. Hi3531与Hi3520 GPIO口的对比及驱动的修改

    2、然后因为内核的接口变化了,修改ioctl相关的部分,记得unlocked_ioctl参数比原来的参数少了一个inode。

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部