Event

1. ラズパイでSwiftを動かす – GPIOを使って、LEDを点滅させる

1. ラズパイでSwiftを動かす – GPIOを使って、LEDを点滅させる

この記事はiOSDC2022で発表したセッション、Swiftで我が家を より便利に、安全に!の発表の第1部の内容をまとめた記事になります。

0.導入 – 発表やSwiftHomeの概要紹介 」の記事の続編です。もしまだ読んでいない方は読んでいただけると!

0.導入 - 発表やSwiftHomeの概要紹介この記事は、「Swiftで我が家をより便利に、安全に」の発表の導入部分の内容をまとめた記事になります!...

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.swiftSwiftyGPIOの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の状態を確認・操作できます!

おまけ3. TerminalからGPIOの操作ができるWiring Piを Ubuntuでセットアップこの記事は、「Swiftで我が家をより便利に、安全に」の発表の「おまけ3. TerminalからGPIOの操作ができるWiring Piを Ubuntuでセットアップ」の内容をまとめた記事になります!...

 まとめ

今回はSwiftをラズパイ上で動かして、Lチカする実装方法を紹介しました。
今回実装したコードは、SwiftHomeLEDで確認できます!

次は「2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信」です!

2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信 1この記事は、「Swiftで我が家をより便利に、安全に」の発表の2部「2. Vaporを動かす- iPhoneとラズパイ間をVaporで通信 」の内容の一部をまとめた記事になります!...
+1

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA