今回の話は、 サーバーサイドSwiftでLチカです。Swiftで直接LEDを光らせることができるってすごい時代ですよね。
国内で事例記事がなさそうだったので書いてみました。
LチカはLEDをチカチカと点滅させる電子工作でいう
ハローワールドです
(Swiftやアプリ界隈だと伝わらないかもと思ったので念のため解説)
この間、VaporでサーバーサイドSwiftに入門してみる。 (swiftenv + Swift Package Manager利用)という記事を書きましたが、最近、サーバーサイドSwiftで少し遊んでいました。
調べていたら、SwiftyGPIOというサーバーサイドのSwiftでLEDやセンサーなどハードウェアを制御できそうなライブラリを発見したので使ってみました。
IoTな雰囲気がある取り組みです。
環境
こんな環境で試してみました。
- Raspberry Pi 2 model B
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)の記事を参考にやってみました。ほぼほぼ日本語訳みたいな感じになります。
まずはapt-getでclangをインストールしましょう。
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get install clang
Swift3.0のRaspbian向けビルドを作者の方が公開しているみたいなので落としてきて解凍します。
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フォルダがでてきます。
pi@raspberrypi ~ $ ls
usr
usrフォルダ内にSwiftのコマンドたちが入っています。
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
を作ってみます。
pi@raspberrypi ~ $ echo 'print("hello!!!!")' >> hello.swift
print("hello!!!!")
swiftcコマンド
でhello.swift
をコンパイルするとhello
というファイルが生成されるので実行してみましょう。
pi@raspberrypi ~ $ ./usr/bin/swiftc hello.swift
pi@raspberrypi ~ $ ./hello
hello!!!!
とりあえずここまででRaspberry PiにSwiftを入れてハローワールドができました。
SwiftyGPIOを使ってみる
さて、ここからが本番ですね。
SwiftyGPIOはサーバーサイドSwiftでGPIOを制御するやつです。 (GPIOはセンサーを扱うためのポートみたいなものです)
前衛的すぎますねw
中ではglibcというC言語のライブラリが使われているみたいですね。
他のRasPiシリーズやBeagleBone Blackなどにも対応しています。詳しくはREADME.mdをみましょう。
wgetでSwiftyGPIO.swift
をDLしましょう。
pi@raspberrypi ~ $ wget https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SwiftyGPIO.swift
pi@raspberrypi ~ $ ls
SwifryGPIO.swfit
main.swiftを作成しましょう。
以下はRaspberryPi2のGPIO3でLEDをチカチカさせるコードです。
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()
にサポートしてるボードの情報をいれます。
var gp = gpios[.P3]!
の部分はGPIOのピン番号です。
一旦ソースコード側の準備はOKです。
配線
SwiftyGPIOのWikiにあるのですが、RasPiのピンの読み方表です。
これをもとにGPIO3
にLEDをつなげてみます。
こんな感じです。
LEDとブレットボードとオス-メスのジャンプワイヤが必要になります。 (全部で500円くらい? )
いよいよ実行
記述できたらビルドしましょう。main
というファイルができるので実行します。 sudo
をつけて実行してください。
pi@raspberrypi$ ./usr/bin/swiftc SwiftyGPIO.swift main.swift
pi@raspberrypi$ sudo ./main
どうでしょうか?
サーバーサイドSwiftでLチカができました!
うまくいかなかったら以下を実行してreboot
してから再実行してみるといいかもです。
pi@raspberrypi ~ $ sudo usermod -aG gpio pi
まとめ
サーバーサイドのSwiftからLEDを光らせることができました。
SwiftyGPIOに注目ですね。
サーバーサイドのSwiftでGPIOを触れるなんてかなり衝撃的です笑
サーバーサイドSwiftはまだまだ安定はしてないけど、
IoTへの活用はSwiftの可能性が広がる良い事例なのではないでしょうか。
PS.試しに、他のセンサーなどの値も取ってみたかったんですけどうまくいかなくて時間切れでした。また挑戦してみます。
参考にした記事など
全て英語リソースで日本語記事は現時点では見かけませんでした。