Image
19.2.2018 0 Comments

Ako na to: Ovládanie Arduina z iPhone

V decembrovom PC REVUE bol článok s kompletným postupom vývoja aplikácie pre najpopulárnejšiu dosku Arduino. V aktuálnom čísle nájdete kompletný návod na vývoj aplikácie pre iOS, čiže pre iPhone a iPad.  Aby sme ilustrovali praktické použitie obidvoch tém ukážeme kompletný príklad ako ovládať Arduino z iPhone. Príklad využíva obojstrannú komunikáciu cez Bluetooth LE. Námet príkladu aj výsledok si pozrite v našom videu

Softvér pre Arduino 101
V našom príklade použijeme ako externé zariadenie vývojovú dosku ARDUINO Genuino 101, ktorá má integrovaný Bluetooth je cenovo dostupná, stojí okolo 38 eur a má zbernicu kompatibilnú so systémom Arduino. Ak chcete ovládať len LED diódu na doske, nepotrebujete pripájať nič, ak chcete aby bola komunikácia obojsmerná, je potrebné na pin 4 pripojiť tlačidlo, ktoré je cez 10 kilo Ohmový odpor pripojeny na GND, takže ak nie je stlačené tlačidlo na vstupe 4 je úroveň LOW (0V). Po zatlačení tlačidla bude na vstupe úroveň HIGH (3,3 V) K pinu 13 môžete pripojiť aj externú LED diódu cez odpor 220 Ohm.

Zapojenie externého tlačidla.

Aby ste mohli vyvíjať aplikáciu, treba do vývojového prostredia pre Arduino pridať podporu pre dosku Arduino 101. V menu Tools -> Boards -> Boards Manager zobrazte dialógové okno Arduino Boards Manager page. Dajte hľadať frázu Intel Curie, alebo 101 a nainštalujte Curie Core. Doska Arduino Genuino 101 totiž nevyužíva procesory ATMEL podobne ako väčšina dosiek z rodiny Arduino, ale procesor Intel Curie.

Inštalácia podpory IntelCurie pre Genuino 101 do vývojového prostredia pre Arduino.

Do dosky Arduino 101 je potrebné zaviesť príklad Button LED

Test aplikácie. Vpravo je zobrazenie stránky na ktorú odkazuje QR kód.

Zdrojový kód príkladu získate jednoducho. Vo vývojovom prostredí pre Arduino (nie v XCode ) ho nájdete v položke menu File > Examples > CurieBLE > ButtonLED

Zdrojový kód programu pre ARDUINO Genuino 101

#include

const int ledPin = 13;

const int buttonPin = 4;

BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214"); // služba

// povolenie zápisu a čítania pre externé zariadenie

BLECharCharacteristic ledCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

// povolenie prijímať notofikácie

BLECharCharacteristic buttonCharacteristic("19B10012-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify);

void setup() {

  Serial.begin(9600); //prípadné ladenie po ériovom porte

  pinMode(ledPin, OUTPUT); // pin pre led jako výstupný

  pinMode(buttonPin, INPUT); // pin pre tlačidlo jako vstupn

  BLE.begin();

  BLE.setLocalName("BtnLED");

  BLE.setAdvertisedService(ledService);

  ledService.addCharacteristic(ledCharacteristic);

  ledService.addCharacteristic(buttonCharacteristic);

  BLE.addService(ledService);

  ledCharacteristic.setValue(0);

  buttonCharacteristic.setValue(0);

   BLE.advertise();

  Serial.println("Bluetooth čakanie na pripojenoe...");

}

//hlavná slučka programu

void loop() {

  BLE.poll();

  char buttonValue = digitalRead(buttonPin);

  boolean buttonChanged = (buttonCharacteristic.value() != buttonValue);

  if (buttonChanged) {

    ledCharacteristic.setValue(buttonValue);

    buttonCharacteristic.setValue(buttonValue);

  }

  if (ledCharacteristic.written() || buttonChanged) {

    if (ledCharacteristic.value()) {

      Serial.println("LED on");

      digitalWrite(ledPin, HIGH);

    } else {

      Serial.println("LED off");

      digitalWrite(ledPin, LOW);

    }

  }

}

Fungovanie firmvéru a zapojenia tlačidla vyskúšate jednoducho. Po zatlačení tlačidla sa rozsvieti zelená LED dióda na doske. Zariadenie s ktorým bude naša iOS aplikácia komunikovať máme pripravené, môžeme ju vytvoriť a otestovať

Aplikácia pre iOS na Bluetooth komunikáciu.
Bluetooth LE (Low Energy) ďalej budeme používať aj skratku BLE rozpoznáva dva typy zariadení: periférne a centrálne. Periférne zariadenie je zariadenie, ktoré vykonáva akcie, prípadne zbiera údaje. V našom príklade bude periférnym zariadením Arduino 101. Centrálne zariadenie je zariadenie, ktoré sa pripája k periférnym zariadeniam na čítanie alebo zápis údajov. V našom prípade to bude aplikácia na iOS zariadení.

Periférne zariadenie môže mať jednu alebo viac služieb a každá služba môže mať jednu alebo viac charakteristík. V našom príklade má Arduino jednu službu s dvoma charakteristikami: Jednu, zapisovateľnú na ovládanie LED diódy a druhú len na čítanie na načítanie aktuálneho stavu tlačidla. Aplikácia naskenuje periférne zariadenia a pripája sa na príslušnú služby, ktorú identifikuje pomocou identifikátora služby UUID služby. Po vytvorení spojenia môže začať komunikácia.

BLE má dva komunikačné režimy:

Advertising: Periférne zariadenie odosiela informácie, ktoré sú k dispozícii všetkým centrálnym zariadením. Tento režim umožňuje, aby periférne zariadenie bolo viditeľné a jednoduché informácie je možné vysielať a prijímať pomocou vysielania typu GAP. Z pohľadu periférneho zariadenia je to režim one-to-many.
Connected: umožňuje ústredni vymieňať si údaje s periférnymi zariadeniami pomocou protokolu GATT opisuje, ako sa konverzácia uskutočňuje v tomto režime. Z pohľadu periférneho zariadenia je to režim one-to-one. Protokol GATT definuje, ako ústredňa môže komunikovať s pripojenou perifériou.

Vytvorte projekt aplikácie podľa šablóny Single View Application.

Používateľské rozhranie aplikácie bude obsahovať dve tlačidlá, jedno na zapnutie LED, kedy sa doske Arduino pošle hodnota 0x01 a druhé na vypnutie LED, kedy sa pošle hodnota 0x00. Udalosť stlačenie tlačidla na doske Arduino 101 je signalizovaná zelenou farbou pozadia.

Vytvorili sme triedu bleIO, ktorá aby bol kód prehľadnejší má dve rozšírenia CBCentralManagerDelegate a CBPeripheralDelegate. Kód v súbore bleIO.swift. Na začiatku súboru je rozšírenie triedy Data (NSData) aby sa dalo vložiť nielen pole, ale aj jedna hodnota

extension Data {

    static func dataHodnota(value: Int8) -> Data {

        var hodnota = value

        return Data(buffer: UnsafeBufferPointer(start: &hodnota, count: 1))

    }   

    func int8Value() -> Int8 {

        return Int8(bitPattern: self[0])

    }

}

protocol bleDelegate: class {

    func bleDelegat(bleInstancia: bleIO, didReceiveValue value: Int8)

}

class bleIO: NSObject {

    let serviceUUID: String

    weak var delegate: bleDelegate?   

    var central: CBCentralManager!

    var periferia: CBPeripheral?

    var sluzba: CBService?

    var charakteristika: CBCharacteristic?   

    init(serviceUUID: String, delegate: bleDelegate?) {

        self.serviceUUID = serviceUUID

        self.delegate = delegate

        super.init()

        central = CBCentralManager(delegate: self, queue: nil)

    }   

    func zapis(value: Int8) {

        guard let peripheral = periferia, let characteristic = charakteristika else {

            return

        }       

        let data = Data.dataHodnota(value: value)

        peripheral.writeValue(data, for: characteristic, type: .withResponse)

    }   

}

extension bleIO: CBCentralManagerDelegate {

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {

        peripheral.discoverServices(nil)

    }   

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

        periferia = peripheral     

        if let connectedPeripheral = periferia {

            connectedPeripheral.delegate = self

            central.connect(connectedPeripheral, options: nil)

        }

        central.stopScan()

    }   

    func centralManagerDidUpdateState(_ central: CBCentralManager) {

        if central.state == .poweredOn {

            central.scanForPeripherals(withServices: [CBUUID(string: serviceUUID)], options: nil)

        }

    }

}

 extension bleIO: CBPeripheralDelegate {

    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {

       guard let services = peripheral.services else {

            return

        }    

        sluzba = services.first

        if let service = services.first {

            sluzba = service

            peripheral.discoverCharacteristics(nil, for: service)

        }

    }  

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {

        guard let charakteristiky = service.characteristics else {

            return

        }      

        for charak in charakteristiky {

            if charak.properties.contains(.write) || charak.properties.contains(.writeWithoutResponse) {

                charakteristika = charak

            }

            peripheral.setNotifyValue(true, for: charak)

        }

    }

    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {

        guard let data = characteristic.value, let delegate = delegate else {

            return

        }    

        delegate.bleDelegat(bleInstancia: self, didReceiveValue: data.int8Value())

    }

}

 

Kód v súbore ViewController.swift.

import UIKit

class ViewController: UIViewController {   

    var instanciaBLE: bleIO!

    override func viewDidLoad() {

        super.viewDidLoad()

       

        instanciaBLE = bleIO(serviceUUID: "19B10010-E8F2-537E-4F6C-D104768A1214", delegate: self as bleDelegate)

    }

    @IBAction func rozsvietLED(_ sender: Any) {

     instanciaBLE.zapis(value: 1)

    } 

    @IBAction func zhasniLED(_ sender: Any) {

     instanciaBLE.zapis(value: 0)

    }

}

     extension ViewController: bleDelegate {

        func bleDelegat(bleInstancia: bleIO, didReceiveValue value: Int8) {

            if value > 0 {

                view.backgroundColor = UIColor.green

            } else {

                view.backgroundColor = UIColor.white

            }

        }

  }

 

Aplikácia síce v tejto podobe dokáže „len“ poslaním bajtu cez rozhranie Bluetooth rozsvietiť a zhasnúť LED a zareagovať na zmenu stavu portu, v našom prípade máme na ňom pripojené tlačidlo. Po rozšírení aplikácií na obidvoch stranách, čiže v aplikáciách pre iOS a Arduino dokážete z iOS získať plnú kontrolu nad celosvetovo najpopulárnejšou hobby platformou Arduino

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Technológie 2

Slováci uviedli na trh kryptomenu krytú zlatom

22.06.2018 00:40

Komunita technologických, marketingových a biznis inovátorov - 01People, spustila  pre svojho klienta z Dubaja technológiu blockchain a ako vôbec prvým Slovákom sa podarilo uviesť do obehu kryptomenu ...

Technológie

ASUS uvádza do predaja ZenFone 5 s bezrámikovým dizajnom, duálnym fotoaparátom a podporou UI

22.06.2018 00:35

ASUS oznámil spustenie predaja úplne nového smartfónu ZenFone 5 na Slovensku. Telefón disponuje 6,2-palcovým displejom, duálnym fotoaparátom a prvýkrát v histórii rad ZenFone vyniká aj umelou intelige ...

Technológie

Robot odoberie vzorky krvi pacientom zo žily a sám ich aj zanalyzuje

22.06.2018 00:25

Výskumníci z Rutgers University vytvorili automatické zariadenie na odoberanie vzoriek krvi a ich testovanie, ktoré prináša rýchle výsledky. Takýto robot by mohol uľahčiť prácu v nemocniciach a iných ...

q

Žiadne komentáre

Vyhľadávanie

HAMA_06

Najnovšie videá



PC forum button