LoginSignup
56
52

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-29

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

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

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

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

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

Swift愛好会IoTLTが二夜連続なのでネタ作りも兼ねてます笑

環境

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

  • 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
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をチカチカさせるコードです。

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()サポートしてるボードの情報をいれます。
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.試しに、他のセンサーなどの値も取ってみたかったんですけどうまくいかなくて時間切れでした。また挑戦してみます。

参考にした記事など

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

56
52
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
52