рд░реЗрдХ рдореЗрдВ рдЪрд▓рдирд╛ред Arduino


рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХреБрдЫ "рдирд┐рдореНрди рд╕реНрддрд░" рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд╛рд░реНрдп рджрд┐рд╡рд╕ рдореЗрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рд▓рд┐рдП рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдмрдВрдзрдХреАрдп рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред рдмреЗрд╢рдХ, рдХрднреА-рдХрднреА рдореИрдВ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреБрд░реНрд▓рдн рд╣реИ, рдФрд░, рд╢рд╛рдпрдж, рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЖрдирдВрдж рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░ Amperka рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЯреЗрдЯреНрд░рд╛ тАЭ, рдЬреЛ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдФрд░ рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рдЖрдк рд╕рд░реНрдХрд┐рдЯреНрд░реА рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ, рдХрд┐рд╕реА рднреА рд╕реЗрдВрд╕рд░ рдХреЗ рдирд╛рдо рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реНрдХреНрд░реАрди рдкрд░ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрдм рдЖрдк рдПрдХ рд╡рдпрд╕реНрдХ рджрд╛рдврд╝реА рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рд╣реЛрддреЗ рд╣реИрдВ - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рд╣реЛрддрд╛ рд╣реИред


, , ( ), , Bluetooth, - ( , ), , . , , .

, , . ( Arduino Leonardo) Scratch ( , ), S4A, тАж , , , , - . . ? .


Toys That Made Us Lego, ┬л┬╗. , , ( ) System. TECHNIC ┬л┬╗, . , , , , , ┬л , ..?┬╗, , , .

┬лTroyka┬╗, , . , , , . . , .


┬л ┬╗ (!)


. , , ( , ), , ┬л!!!┬╗, , , . , , тАФ  , . , , , -   !


, . ┬л┬╗ Troyka- , , : 8 8, , . , , - .



( , , ? ), , ┬л, ┬╗ , , , , ┬л ┬╗. тАФ  S4A (Scratch for Arduino), , . , S4A macOS ( , ), apt-getтАЩ ( ), ( , , ), .


┬л┬╗, . , , , - LED, . .



, . , - , , . тАФ  . , , , . , . :


  • . , , 13, 12 10, 11   ? _
  • , , . , ┬л ┬╗, , , .
  • ( , , ) S4A , . /, , . WeDo ( - ) ( ), тАФ , AnalogN/DigitalN. , .

. , S4A .


, - :


  • -, , ( , ?!).
  • -, ( , - , , , ). . , . , . BreadboardтАЩ . Troyka-. , !

S4A , , .


, , . , тАФ  ┬л ┬╗. . , , , .

?


, , , Swift ( iOS ). , . Tetra ( USB, ), , , .


: Swift, :


  • ,
  • ,
  • .

, , S4A. ┬лfirmware┬╗ ( ), , ┬л┬╗ , , .


:


  • , ,
  • , , , ,
  • (, , ). , , , .

? ! , .



, S4A . , , , , . , , PicoBoard, , Scratch . .


/++, . ++- , .

void send(byte sensor, int value) {
    Serial.write(B10000000 | ((sensor & B1111) << 3) | ((value >> 7) & B111));
    Serial.write(value & B1111111);
}

void receive(byte first, byte second) {
    pin = (first >> 3) & 0x0F;
    newVal = ((first & 0x07) << 7) | (second & 0x7F);
    ...
}

, . , ( , ) :


1SSSSVVV 0VVVVVVV

SSSS тАФ  , , VVVVVVVVVV тАФ  10- . - 0 1023, ┬л┬╗ ( ) 0 255. . ( , ) , , , - . , , . , , , , S4A , .


. тАФ  . , , , - .



. / -. Serial Swift, ( - , -, ), https://github.com/yeokm1/SwiftSerial/blob/master/Sources/SwiftSerial.swift. Serial.begin(38400), 38400, тАФ ┬л ┬╗. ? , . . , SwiftSerial, Linux- read/write, . ? , , -, open. , . , macOS, , O_NONBLOCK. , , !


open(path, readWriteParam | O_NOCTTY | O_EXLOCK | O_NONBLOCK)

https://github.com/bealex/TetraSwift/blob/master/Sources/Serial/SerialPort.swift. , . , Linux-, Raspberry Pi.


,


- -. , .


  • , , 10-, ( 0 1023). , , .
  • , тАФ HIGH LOW. HIGH тАФ  - 1023 ( 1, ), LOW тАФ 0. , ┬л┬╗ тАФ  , . ┬п\_(уГД)_/┬п
  • , тАФ 8-, ( 0 255). , , . , тАФ  .
  • , , 4- ( 0 15). , . ┬л ┬╗, :
    • 1тАФ4  ( ), тАФ 0.
    • (): тАФ  , тАФ .
    • ┬л┬╗ ( , ) : тАФ  , тАФ  , тАФ  . 3/7/8 4/3/8
    • , 10 13 .

, . , ┬л┬╗ PicoBoard, , . : https://github.com/bealex/TetraSwift/blob/master/Sources/IOPort.swift. .


, . , . !


? , . / , , , , , . -.


- .



Swift, - ┬л Scratch┬╗. . - ( -):


let tetra = Tetra(...) { event in
    //     .
}

// !
tetra.start()
//  13 .
tetra.write(actuator: .ledDigital13(true))
//  .
Thread.sleep(forTimeInterval: 1)
//  13 .
tetra.write(actuator: .ledDigital13(false))
// . :)
tetra.stop()

- , . .


let tetra = Tetra(...)

//         ,   .
//     ,      .
tetra.run {
//    .
    tetra.waitFor(.button2, is: true) {
    //   .
        tetra.write(actuator: .ledDigital13(true))
        Thread.sleep(forTimeInterval: 1)
        tetra.write(actuator: .ledDigital13(false))
    }
}

, tetra.write(actuator: .ledDigital13(true)) ( ?), - : tetra.digitalLED13.on(). .


let tetra = Tetra(...)

tetra.run {
    //     .
    tetra.whenOn(.button2) {
        tetra.digitalLED13.on()
    }
//    тАФ .
    tetra.whenOn(.button3) {
        tetra.digitalLED13.off()
    }

    // ,    .
    tetra.digitalLED12.on()
    tetra.sleep(0.3)
    tetra.digitalLED12.off()
}

, - . , -.


let tetra = Tetra(...)
tetra.installSensors(
    analog: [
        AnalogSensor(kind: .light, port: .analogSensor5),
        ...
        AnalogSensor(kind: .temperature, port: .analogSensor3),
    ],
    digital: [
        ...
        DigitalSensor(kind: .button, port: .digitalSensor3),
    ]
)
tetra.installActuators(
    analog: [
        AnalogActuator(kind: .motor, port: .motor4, maxValue: 180),
        AnalogActuator(kind: .buzzer, port: .analog9, maxValue: 200),
        AnalogActuator(kind: .analogLED(.green), port: .analog5, maxValue: 200),
        ...
    ],
    digital: [
        DigitalActuator(kind: .digitalLED(.green), port: .digital10),
        ...
    ]
)

? . . ? , :


  • -, . - , - .
  • -, . analog, digital, . ( , ) тАФ  , . , ?

: , . . , , .

, . . .


tetra.install(sensors: [
    .analog0: AnalogSensor(kind: .light),
    .analog1: AnalogSensor(kind: .potentiometer),
    .analog2: AnalogSensor(kind: .magnetic),
    .analog3: AnalogSensor(kind: .temperature),
    .analog4: DigitalSensor(kind: .infrared),
    .digital6: DigitalSensor(kind: .button),
    .digital7: DigitalSensor(kind: .button),
])
tetra.install(actuators: [
    .digital4: AnalogActuator(kind: .motor),
    .digital9: AnalogActuator(kind: .buzzer),
    .digital5: AnalogActuator(kind: .analogLED(.green)),
    .digital6: AnalogActuator(kind: .analogLED(.red)),
    .digital10: DigitalActuator(kind: .digitalLED(.green)),
    .digital11: DigitalActuator(kind: .digitalLED(.yellow)),
    .digital12: DigitalActuator(kind: .digitalLED(.yellow)),
    .digital13: DigitalActuator(kind: .digitalLED(.red)),
    .digital7: LEDMatrixActuator(kind: .ledMatrix(.monochrome)),
    .digital8: QuadNumericDisplayActuator(kind: .quadDisplay),
])

, !


, S4A. , . , , тАФ  0.0 1.0.


, .


// ,     -, .
//        .
AnalogSensor(
    kind: .temperature,
    sampleTimes: 32,
    tolerance: 0.05,
    calculate: Calculators.celsiusTemperature
)

//      ,  180.
AnalogActuator(kind: .motor, maxValue: 180)

. , . ┬л, ┬╗. ┬л, , ┬╗.


. тАФ . , , , .


! , , - . .



class Tetra: TetraInterface {
    let temperatureSensor = TemperatureSensor()
    let potentiometer = Potentiometer()
    ...

    let quadDisplay = QuadNumericDisplayActuator()
    let redAnalogLED = AnalogLED()
    let greenAnalogLED = AnalogLED()

    init(pathToSerialPort: String) {
        let serialPort = HardwareSerialPort(path: pathToSerialPort, rate: .baud115200)
        super.init(serialPort: serialPort, useTetraProtocol: true)
        add(sensor: temperatureSensor, on: .analog3)
        add(sensor: potentiometer, on: .analog1)
        ...

        add(actuator: greenAnalogLED, on: .digital5)
        add(actuator: redAnalogLED, on: .digital6)
        add(actuator: quadDisplay, on: .digital8)
        ...
    }
}

, :


Tetra(pathToSerialPort: serialPort).run {
    guard let tetra = $0 as? Tetra else { return }

    //      .
    tetra.potentiometer.whenValueChanged { value in
        if value < 0.5 {
            tetra.greenAnalogLED.value = 0
            tetra.redAnalogLED.value = (0.5 - value) * 2
        } else {
            tetra.greenAnalogLED.value = (value - 0.5) * 2
            tetra.redAnalogLED.value = 0
        }
    }

    //    .
    tetra.temperatureSensor.whenValueChanged { value in
        tetra.quadDisplay.value = String(format: "%.1f╦Ъ", value)
    }
}

, ? .



. , тАФ  . , PicoBoard . , 0 1 ? , , - . , , . . .

, :


  • . , , тАФ  Swift, , , . !
  • , . , .
  • . , ?
  • .

. , , . , . , - Protocol Buffers. ( nanopb), , Protocol Buffers , . ( , ).


. :


  • . , .
  • .
  • , - .

, , ( , ), . , . .



, . , . - ? , -, . , . - , .


, . , . , , . ? / тАФ  , . , , .


:


  • DevicePort, start/stop/write/read.
  • , тАФ  SerialPort, тАФ  , , ( , ), .

, .


?


. , ? . , , . , . , -- , . , , , . . . , , тАФ .


!


:тАУ)


tetra.quadDisplay.value = "L8R"

All Articles