ラズパイとサーバーサイドSwiftでLチカ！ ( Raspberry Pi 2 + SwiftyGPIO )


今回の話は、 **サーバーサイドSwiftでLチカです**。Swiftで直接LEDを光らせることができるってすごい時代ですよね。
国内で事例記事がなさそうだったので書いてみました。

>LチカはLEDをチカチカと点滅させる電子工作でいう`ハローワールドです` (Swiftやアプリ界隈だと伝わらないかもと思ったので念のため解説)

この間、[VaporでサーバーサイドSwiftに入門してみる。 (swiftenv + Swift Package Manager利用)](http://qiita.com/n0bisuke/items/ed10deba4b9db2c1652b)という記事を書きましたが、最近、サーバーサイドSwiftで少し遊んでいました。

調べていたら、[SwiftyGPIO](https://github.com/uraimo/SwiftyGPIO)というサーバーサイドのSwiftでLEDやセンサーなどハードウェアを制御できそうなライブラリを発見したので使ってみました。 

![](https://i.gyazo.com/1c6f37f9f82cc4ac3744020fbf2ed80c.png)

IoTな雰囲気がある取り組みです。

>[Swift愛好会](http://love-swift.connpass.com/event/31796/)と[IoTLT](http://iotlt.connpass.com/event/31396/)が二夜連続なのでネタ作りも兼ねてます笑

## 環境

こんな環境で試してみました。

* Raspberry Pi 2 model B

```bash
pi@raspberrypi ~ $ uname -a
Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux 

pi@raspberrypi ~ $ cat /proc/version
Linux version 4.1.19-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #858 SMP Tue Mar 15 15:56:00 GMT 2016

pi@raspberrypi ~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 8.0 (jessie)
Release:	8.0
Codename:	jessie
``` 

* Swift 3.0-dev
* SwiftyGPIO v0.7(バージョン情報は正しいか自信ない)

## RasPiのセットアップ

* いろいろな記事が出てるので割愛します。

## RasPiにSwift3.0をインストール

[Swift 3.0 now available for all the ARMv6 RaspberryPi (1,Zero)](https://www.uraimo.com/2016/03/10/swift-3-available-on-armv6-raspberry-1-zero/)の記事を参考にやってみました。ほぼほぼ日本語訳みたいな感じになります。

まずはapt-getで[clang](https://ja.wikipedia.org/wiki/Clang)をインストールしましょう。

```bash
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get install clang
```

Swift3.0のRaspbian向けビルドを作者の方が公開しているみたいなので落としてきて解凍します。

```bash
pi@raspberrypi ~ $ wget https://www.dropbox.com/s/smk3ek5lfa8ae09/swift-2016-02-15.tar.gz
pi@raspberrypi ~ $ tar xzf swift-2016-02-15.tar.gz
```

解凍するとusrフォルダがでてきます。

```bash
pi@raspberrypi ~ $ ls
usr
```

usrフォルダ内にSwiftのコマンドたちが入っています。

```bash
pi@raspberrypi ~ $ ./usr/bin/swift -v
Swift version 3.0-dev (LLVM b361b0fc05, Clang 11493b0f62, Swift 525f8ecbe1)
Target: armv6-unknown-linux-gnueabihf
/home/pi/usr/bin/swift -frontend -repl -target armv6-unknown-linux-gnueabihf -disable-objc-interop -color-diagnostics -module-name REPL
LLVM ERROR: Compiler-internal integrated REPL unimplemented for this platform; use the LLDB-enhanced REPL instead.
```

無事に確認できました。

### ハローワールドしてみる

`hello.swift`を作ってみます。

```bash
pi@raspberrypi ~ $ echo 'print("hello!!!!")' >> hello.swift
```

```hello.swift
print("hello!!!!")
```

`swiftcコマンド`で`hello.swift`をコンパイルすると`hello`というファイルが生成されるので実行してみましょう。

```bash
pi@raspberrypi ~ $ ./usr/bin/swiftc hello.swift
pi@raspberrypi ~ $ ./hello
hello!!!!
```

とりあえずここまででRaspberry PiにSwiftを入れてハローワールドができました。

## SwiftyGPIOを使ってみる

さて、ここからが本番ですね。

![](https://i.gyazo.com/1c6f37f9f82cc4ac3744020fbf2ed80c.png)

SwiftyGPIOはサーバーサイドSwiftでGPIOを制御するやつです。 (GPIOはセンサーを扱うためのポートみたいなものです)
前衛的すぎますねw

中では[glibc](https://www.gnu.org/software/libc/)というC言語のライブラリが使われているみたいですね。
他のRasPiシリーズやBeagleBone Blackなどにも対応しています。詳しくは[README.md](https://github.com/uraimo/SwiftyGPIO)をみましょう。

wgetで`SwiftyGPIO.swift`をDLしましょう。

```bash
pi@raspberrypi ~ $ wget https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SwiftyGPIO.swift
```

```bash
pi@raspberrypi ~ $ ls 
SwifryGPIO.swfit 
```

main.swiftを作成しましょう。

以下はRaspberryPi2のGPIO3でLEDをチカチカさせるコードです。

```main.swift
import Glibc

let gpios = SwiftyGPIO.getGPIOsForBoard(.RaspberryPi2)
var gp = gpios[.P3]!
gp.direction = .OUT

repeat{
    gp.value = (gp.value == 0) ? 1 : 0
    usleep(150*1000)
}while(true)
```

`SwiftyGPIO.getGPIOsForBoard()`に[サポートしてるボード](https://github.com/uraimo/SwiftyGPIO#supported-boards)の情報をいれます。
`var gp = gpios[.P3]!`の部分はGPIOのピン番号です。

一旦ソースコード側の準備はOKです。

### 配線

[SwiftyGPIOのWiki](https://github.com/uraimo/SwiftyGPIO/wiki/GPIO-Pinout)にあるのですが、RasPiのピンの読み方表です。

![](https://camo.githubusercontent.com/30194d1907a5333546f5e295cbe34780c9e7f7fa/687474703a2f2f72617370692e74762f77702d636f6e74656e742f75706c6f6164732f323031342f30372f5261737062657272792d50692d4750494f2d70696e6f7574732e706e67)

これをもとに`GPIO3`にLEDをつなげてみます。

![](https://i.gyazo.com/983a80480190e6b98730ea399970d822.png)

こんな感じです。

[LED](http://akizukidenshi.com/catalog/g/gP-00286/)と[ブレットボード](http://akizukidenshi.com/catalog/g/gP-05155/)と[オス-メスのジャンプワイヤ](http://akizukidenshi.com/catalog/g/gP-03473/)が必要になります。 (全部で500円くらい? )

### いよいよ実行

記述できたらビルドしましょう。`main`というファイルができるので実行します。 `sudo`をつけて実行してください。

```bash
pi@raspberrypi$ ./usr/bin/swiftc SwiftyGPIO.swift main.swift
pi@raspberrypi$ sudo ./main
```

![](https://i.gyazo.com/5d09e7de97ea9f35ce8b57f7b5a0e2a1.gif)

どうでしょうか? 

**サーバーサイドSwiftでLチカができました！**

うまくいかなかったら以下を実行して`reboot`してから再実行してみるといいかもです。

```bash
pi@raspberrypi ~ $ sudo usermod -aG gpio pi
```


## まとめ

サーバーサイドのSwiftからLEDを光らせることができました。
SwiftyGPIOに注目ですね。

サーバーサイドのSwiftでGPIOを触れるなんてかなり衝撃的です笑 

サーバーサイドSwiftはまだまだ安定はしてないけど、
IoTへの活用はSwiftの可能性が広がる良い事例なのではないでしょうか。

PS.試しに、他のセンサーなどの値も取ってみたかったんですけどうまくいかなくて時間切れでした。また挑戦してみます。

## 参考にした記事など

全て英語リソースで日本語記事は現時点では見かけませんでした。

* [Swift 3.0 now available for all the ARMv6 RaspberryPi (1,Zero)](https://www.uraimo.com/2016/03/10/swift-3-available-on-armv6-raspberry-1-zero/)
* [dht.swift](https://github.com/pj4533/dhtxx)
* [Raspberry Pi 2 GPIO with SwiftyGPIO](http://dev.iachieved.it/iachievedit/raspberry-pi-2-gpio-with-swiftygpio/)
* [Swift for the Raspberry Pi](http://dev.iachieved.it/iachievedit/open-source-swift-on-raspberry-pi-2/)
* [SwiftyBones](https://www.swiftpkgs.com/package/hoffmanjon/SwiftyBones)