1. ラズパイでSwiftを動かす – GPIOを使って、LEDを点滅させる
この記事はiOSDC2022で発表したセッション、Swiftで我が家を より便利に、安全に!の発表の第1部の内容をまとめた記事になります。
「0.導入 – 発表やSwiftHomeの概要紹介 」の記事の続編です。もしまだ読んでいない方は読んでいただけると!
Lチカとは?
Lチカとは、LEDをチカチカ点滅させることで、プログラミングでいうところのHello world!
のようなものです!
この発表ではラズパイでSwiftを動かすための第一歩として、Lチカをまずは実装します。
なお今回はSwiftでラズパイのGPIOを操作するために、SwiftyGPIOというライブラリを使用します。
今回はLチカをするために、以下のような回路を作ります!
- ラズパイのGPIO16ピン(プラス) -> LEDのプラス(長い方)
- LEDのマイナス(短い方) -> 抵抗
- 抵抗 -> ラズパイのGPIOのGND(マイナス)ピン
を接続するように、回路を作りました!
ブレッドボードとは?
- 電子回路を半田付けなしに、簡単に作るための基盤
- LEDなどを部品を配置できる
- 以下の穴が内部で繋がっている
- 溝を隔てて縦1列
- 上下の2列は横一列
ラズパイでの開発
開発環境
$ cat /proc/device-tree/model # Raspberry Pi device information
> Raspberry Pi 4 Model B Rev 1.2
$ cat /etc/os-release # OS information in Raspberry Pi
> PRETTY_NAME="Ubuntu 22.04 LTS"
> NAME="Ubuntu"
> VERSION_ID="22.04"
> VERSION="22.04 (Jammy Jellyfish)"
> VERSION_CODENAME=jammy
$ swift --version
> Swift version 5.6.1 (swift-5.6.1-RELEASE)
> Target: aarch64-unknown-linux-gnu
今回はラズパイ4、OSはUbuntu
、swiftは v5.6.1
を使用しています。
ラズパイにUbuntuのOSをインストールしている理由は、今回Vaporを使う想定だが、標準的に使われているRaspberry Pi OSだと、Vaporの設定やビルドが通らなかったためです。
参考にしたサイトでも、同じ理由でUbuntuを使用する例が多かったです。
また執筆時点ではUbuntuでSwift5.6を使用できるが、Raspberry Pi OSだと、Swift5.1.5までしか利用できないので、開発のしやすさも考慮して、Ubuntuで進めることにしました!
ラズパイにSwiftをインストールする
Swiftをラズパイにインストールするには、以下のコマンドを実行すればOK(のはず)です!
# Setup
# Step1 - Update system app
$ sudo apt update && sudo apt upgrade
# Install curl
$ sudo apt install curl
# Step2 - Run the quick install script
$ curl -s https://archive.swiftlang.xyz/install.sh | sudo bash
# Step3 - Choose which version of Swift to install
# Choose swift version
# Step4 - Install Swift
$ sudo apt install swiftlang
$ swift --version
# Ref: https://swift-arm.com/installSwift/
サンプル用のプロジェクトを作成する
今回は、SwiftHomeLED
というパッケージを作成しました。
$ mkdir SwiftHomeLED
$ cd SwiftHomeLED
$ swift package init --name SwiftHomeLED --type executable
次にPackage.swift
にSwiftyGPIO
のdependenciesを設定する
// (Omit)
name: "SwiftHomeLED",
dependencies: [
.package(url: "https://github.com/uraimo/SwiftyGPIO.git", from: "1.0.0"),
],
targets: [
// (Omit)
dependencies: ["SwiftyGPIO"]),
最後にmain.swift
に0.2秒おきにLEDを点滅させる処理を実装します。
import Foundation
import SwiftyGPIO
let gpios = SwiftyGPIO.GPIOs(for: .RaspberryPi4) // ①instance for raspberry pi4
let ledGpio = gpios[.P16]! // ②instance to control GPIO16
ledGpio.direction = .OUT // ③This time, current will flow, so use .OUT instead of .IN.
while(true) {
Thread.sleep(forTimeInterval: 0.2) // ④Update GPIO16 value every 0.2 seconds
ledGpio.value = ledGpio.value == 0 ? 1 : 0 // ⑤1 turns the LED on, 0 turns it off
}
自分がこの状態で実行したら、エラーが出てしまいました。。。
wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem: Permission denied.
Aborting your program because if it can not access the GPIO
hardware then it most certianly won't work
よく見ると、/dev/gpiomemへ
の権限がないとエラーが出ているようでした
Ubuntuでは/dev/gpiomem
へのアクセスはroot権限が必要とのことで、調査した結果、以下のコマンドを実行することで、解消できました!(参考)
$ sudo apt install rpi.gpio-common
$ sudo adduser "${USER}" dialout
$ sudo reboot
準備ができたら、ラズパイとブレッドボードを繋げて、swift run
でSwiftHomeLEDを実行しましょう!
↓みたいに、LEDが点滅したら、成功です!!
ちなみにGPIOの値をSwiftのコード以外から簡単に操作する方法として、WiringPi
というツールがあります。
これを使うことで、TerminalからGPIOの状態を確認・操作できます!
まとめ
今回はSwiftをラズパイ上で動かして、Lチカする実装方法を紹介しました。
今回実装したコードは、SwiftHomeLEDで確認できます!
次は「2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信」です!