$30 off During Our Annual Pro Sale. View Details »

SwiftではじめるRaspberry Pi

SwiftではじめるRaspberry Pi

Satoshi Kobayashi

September 02, 2018
Tweet

Other Decks in Programming

Transcript

  1. 4XJGUͰ͸͡ΊΔ
    3BTQCFSSZ1J
    ͜͹΍͠͞ͱ͠
    !HVDDIJTL
    J04%$+BQBO-5

    View Slide

  2. ࠓ೔͸ͳ͢͜ͱ
    w 3BTQCFSSZ1Jॳ৺ऀͷࢲ͕4XJGUͰ3BTQCFSSZ1Jʹೖ໳
    ͨ͠࿩

    View Slide

  3. 3BTQCFSSZ1J
    w "3.ϓϩηοα౥ࡌͷ໊ࢗαΠζͷখܕίϯϐϡʔλ
    w ڭҭɾֶश༻
    w ҆Ձͳ*P5ػثʢʙԁʣ

    View Slide

  4. ͸͡ΊΑ͏3BTQCFSSZ1J
    ඞཁͳ΋ͷ
    w3BTQCFSSZ1Jຊମ
    wిݯΞμϓλ
    wNJDSP4%Χʔυ
    w1$
    wσΟεϓϨΠ
    w64#ΩʔϘʔυ
    w64#Ϛ΢ε

    View Slide

  5. 3BTCJBO
    /00#4μ΢ϯϩʔυ
    4%Χʔυʹίϐʔ
    ը໘ͷࢦࣔʹैͬͯ

    Πϯετʔϧ
    ׬ྃʂ
    IUUQTXXXSBTQCFSSZQJPSHEPXOMPBET

    View Slide

  6. ͙͢TTIͰ͖Δ
    TTISBTQCFSSZQJMPDBMMQJ
    QJ!SBTQCFSSZQJMPDBMTQBTTXPSE
    )PTUOBNF SBTQCFSSZQJMPDBM
    6TFS QJ
    1BTTXPSE SBTQCFSSZ
    ΋͏σΟεϓϨΠˍϚ΢εˍΩʔϘʔυ͸͍Βͳ͍ʂ
    TTIͰ͖Δ୺຤͕͋Ε͹0,

    View Slide

  7. 4XJGU
    μ΢ϯϩʔυղౚ

    View Slide

  8. ४උສ୺ʂ

    View Slide

  9. ·ͣ͸-νΧʂ

    View Slide

  10. 4XJGUZ(1*0
    ͜ͷϐϯΛ੍ޚ
    IUUQTXXXSBTQCFSSZQJPSH
    (1*0(FOFSBMQVSQPTFJOQVUPVUQVU

    View Slide

  11. (1*0
    IUUQTQJOPVUYZ[

    View Slide

  12. -νΧ1BDLBHFKTPO
    import PackageDescription
    let package = Package(
    name: "led",
    dependencies: [
    .Package(url: "https://github.com/uraimo/
    SwiftyGPIO.git", majorVersion: 1),
    ]
    )

    View Slide

  13. -νΧNBJOTXJGU
    import SwiftyGPIO
    import Glibc
    let gpios = SwiftyGPIO.GPIOs(for:.RaspberryPi3)
    let gp = gpios[.P25]!
    gp.direction = .OUT
    gp.value = 1
    repeat {
    gp.value = (gp.value == 0) ? 1 : 0
    usleep(500 * 1000)
    } while (true)

    View Slide

  14. -νΧ ?P?

    View Slide

  15. 5PHHMF4XJUDI
    w εΠονʹΑΓ0/0''͕ೖΕସΘΔ
    w ԡͨ͢ͼʹ-&%͕఺͍ͨΓফ͑ͨΓ

    View Slide

  16. 5PHHMF4XJUDI
    IUUQGSJU[JOHPSHIPNF
    7
    (/%
    (1*0
    (1*0
    4XJUDI
    ఍߅
    -&%

    View Slide

  17. let gpios = SwiftyGPIO.GPIOs(for: .RaspberryPi3)
    let gpo = gpios[.P25]!
    gpo.direction = .OUT
    gpo.value = 0
    let gpi = gpios[.P24]!
    gpi.direction = .IN
    gpi.pull = .down
    var ledState = false
    gpi.onRaising({(gpio) -> Void in
    ledState = !ledState
    if ledState {
    gpo.value = 1
    } else {
    gpo.value = 0
    }
    })

    View Slide

  18. View Slide

  19. TXJUDICPVODF
    ̍ճ໨
    ̎ճ໨
    0/
    0''
    0/
    0''
    ཧ૝
    ݱ࣮

    View Slide

  20. 4PGUXBSFEFCPVODJOH
    w ࠷ॳͷΠϕϯτݕ஌ޙҰఆ࣌ؒ͸ಉ͡ΠϕϯτΛແࢹ
    ̍ճ໨
    ̎ճ໨ ແࢹ͍ͨ͠

    Ұఆ࣌ؒݕग़͠ͳ͍
    0/
    0''

    View Slide

  21. CPVODFUJNF
    w31J(1*0 QZUIPO

    wHQJP[FSP QZUIPO

    # add rising edge detection on a channel, ignoring further
    edges for 200ms for switch bounce handling
    GPIO.add_event_detect(channel, GPIO.RISING,
    callback=my_callback, bouncetime=200)
    class gpiozero.Button(pin, *, pull_up=True,
    bounce_time=None, hold_time=1, hold_repeat=False,
    pin_factory=None)

    View Slide

  22. 4XJGUZ(1*0
    w EFCPVDFػೳͳ͠
    w ͳ͍ͳΒ࡞Ε͹ྑ͍

    View Slide

  23. %J⒎
    public class GPIO {
    + public var bounceTime: TimeInterval?
    - var intFuncFalling: ((GPIO) -> Void)?
    - var intFuncRaising: ((GPIO) -> Void)?
    - var intFuncChange: ((GPIO) -> Void)?
    + var intFalling: (func: ((GPIO) -> Void), lastCall: Date?)?
    + var intRaising: (func: ((GPIO) -> Void), lastCall: Date?)?
    + var intChange: (func: ((GPIO) -> Void), lastCall: Date?)?
    public func onRaising(_ closure: @escaping (GPIO) -> Void) {
    - intFuncRaising = closure
    + intRaising = (func: closure, lastCall: nil)
    if intThread == nil {
    intThread = makeInterruptThread()
    listening = true

    View Slide

  24. func interrupt(type: inout
    (func: ((GPIO) -> Void), lastCall: Date?)?) {
    guard let itype = type else {
    return
    }
    if let interval = self.bounceTime,
    let lastCall = itype.lastCall,
    Date().timeIntervalSince(lastCall) < interval {
    return
    }
    itype.func(self)
    type?.lastCall = Date()
    }

    View Slide

  25. while self.listening {
    let ready = poll(&pfd, 1, -1)
    if ready > -1 {

    switch res {
    case “0":
    - self.intFuncFalling?(self)
    + self.interrupt(type: &(self.intFalling))
    case “1":
    - self.intFuncRaising?(self)
    + self.interrupt(type: &(self.intRaising))
    default:
    break
    }
    - self.intFuncChange?(self)
    + self.interrupt(type: &(self.intChange))
    }
    }

    View Slide

  26. View Slide

  27. View Slide

  28. υΩυΩɻɻɻ

    View Slide

  29. ҰॠͰϚʔδ͞Εͨ

    View Slide

  30. ·ͱΊ
    w 3BTQCFSSZ1JͰ4XJGU͸௒؆୯ʹ࢝ΊΒΕΔʂ
    w 1VMM3FRVFTU͸ා͘ͳ͍ʂ
    w ͋͞͸͡ΊΑ͏ʂ

    View Slide

  31. 4XJGUͰ3BTQCFSSZ1JΛ੝Γ্͛·͠ΐ͏ʂ

    View Slide

  32. ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide