Tôi yêu Swift, ngôn ngữ mới ra đời của Apple rất hiện đại, an toàn và trong sáng, mặc dù tốc độ phát triển có vẻ chậm hơn so với những scripting language khác như Python, nhưng với kiểu static type system thì các ứng dụng trở nên an toàn và cứng cáp hơn. Và với niềm đam mê đó, cộng thêm việc Swift đã mã nguồn mở, tôi muốn khám phá nó ở một khía cạnh khác, lập trình trên Raspberry Pi.

Tham khảo các khóa học lập trình online, onlab, và thực tập lập trình tại TechMaster

Swift logo taken from apple.com, Raspberry Pi logo from raspberrypi.org

Để lập trình Swift trên Raspberry Pi, chúng ta cần 2 thứ sau:

  • Một trình biên dịch Swift và một package manager
  • Một thư viện Swift hỗ trợ GPIO

Mặc dù Apple phát hành nền tảng mã nguồn Swift chỉ hỗ trợ cho Linux, và bộ xử lý x86, và sẽ không hỗ trợ cho những thiết bị ARM như Raspberry Pi. Nhưng Swift đã được mã nguồn mở, và với công sức tuyệt vời của những lập trình viên thì Swift nay đã được port lên nền ARM.

Umberto Raimondi đã công bố mã nguồn dịch Swift 3.0.2 chạy trên nền Pi. Umberto cũng là tác giả của thư viện GPIO viết bằng Swift. Bạn có thể cài thư viện này bằng Swift Package Manager.

Một trong những điều phiền toái khi lập trình Swift trên bất kỳ hệ thống linux nào đó là bạn không có một IDE thực sự. Phải khi lập trình trên từng dòng command line thì bạn mới cảm thấy yêu Xcode đến nhường nào. Chính vì Xcode không chạy được trên Linux, vậy làm thế nào để cài đặt nó trên Pi?. Thật ra thì bạn sẽ không muốn lập trình trên một cái máy Pi chậm chạp đâu. Do vậy chúng ta sẽ viết trên Mac.

Đầu tiên bạn cần cài đặt máy Pi, bạn có thể tham khảo tại Raspberry forums. Có rất nhiều bài tutorial hướng dẫn ở đây và bạn có thể làm theo. Bạn cần kết nối Pi với mạng Wifi, sau đó điều khiển nó bằng Mac qua SSH, sau đó bạn sử dụng lệnh nmap để scan các thiết bị trong network tại port 22.

Để tìm máy Pi của mình, bạn cần phải thay thế đoạn 192.168.6.0 với địa chỉ local của bạn. Sau khi tìm thấy, bạn kết nối Pi với Mac qua SSH.

ssh {your-pi-username}@{you-pi-ip-address}

Sau khi kết nối thành công, hãy thử chạy chương trình Swift đầu tiên trên Pi

// Create the script
echo "print(\"hello from swift\")" >> hello.swift
// Run it
swift hello.swift

Tiếp theo chúng ta hãy mở Xcode lên và cùng nhau tạo một ứng dụng bật tắt đèn LED được kết nối với máy Pi, khi bạn ấn phím Return trên máy MAC. Để hoán đổi giữa hai môi trường, chúng ta sẽ sử dụng Swift Package Manager, một dependency manager cho Swift. Nó chạy tốt trên cả 2 nền OSX và Linux và là một thành phần quan trọng để giúp chúng ta lập trình Swift trên Pi.

// create the project folder
mkdir led-blink
// go to the folder
cd led-blink
// initialize the swift project using SPM
swift package init --type executable

Bây giờ bạn đã có một thư mục và file main.swift tạo bởi SPM. Chúng ta sửa Package.swift để có thể thêm vào thư viện GPIO.

import PackageDescription
let package = Package(
    name: "led-blink",
    dependencies: [
        .Package(url: "https://github.com/uraimo/SwiftyGPIO.git", majorVersion: 0)
    ]
)

Sau đó chúng ta cài thư viện bằng câu lệnh sau:

swift package update

Rồi sử dụng SPM để khởi tạo một project Xcode:

swift package generate-xcodeproj

Mở project Xcode lên và build nó, vậy là trình biên dịch đã nhận biết được thư viện SwiftyGPIO. Vậy là từ bây giờ bạn có thể sử dụng Xcode để lập trình trên Pi rồi đó.

Chúng ta mở file main.swift và thêm vào đoạn code sau:

import SwiftyGPIO
import Foundation
// Get a dictionary of all the gpio pins
let gpios = SwiftyGPIO.GPIOs(for: .RaspberryPi2)
// Get the pin that you connected the LED to. Remember to set the right pin number, for me it was 27
guard let ledGpio = gpios[GPIOName.P27] else {
    fatalError("Could not initialize the gpio")
}
// Set the pin direction to .OUT and turn it off
ledGpio.direction = .OUT
ledGpio.value = 0
// Read user input from keyboard and switch the LED on/off each time the user presses the return key
print("Press return to switch the LED on/off. To quit type exit")
while let userInput = readLine(strippingNewline: true), userInput != "exit" {
    print("Switching LED")
    ledGpio.value = ledGpio.value == 0 ? 1 : 0
}

Ok, vậy là chương trình đã hoàn thành, việc còn lại là build và chạy nó trên Pi. Để làm việc này, chúng ta cần phải copy project mà bạn đã tạo trên Mac vào trong Pi. Bạn có thể tạo một repository trên GIT và host nó trên Github. Rồi ở máy Pi chúng ta pull về. Hoặc có thể dung SCP để copy về:

scp -r {path-to-project-folder-on-mac} {your-pi-username}@{you-pi-ip-address}:{path-to-folder-on-pi}

Sau khi copy project, bạn có thể SSH tới Pi và trỏ tới folder của project và build project bằng compiler trên Raspberry:

swift build

Done !. Các bạn có thể xem clip ở dưới để kiểm tra kết quả:

https://youtu.be/r1bNXMWGgjQ

Nguồn bài viết : https://hackernoon.com/setting-up-a-swift-development-environment-on-raspberry-pi-c7af7fceac1e#.15q80dkoa