Controlem un robot Lego Mindstorms
Per controlar remotament un robot Lego Mindstorms EV3, a més de l'objecte Bluetooth, usat en els apartats anteriors, ens caldran una sèrie de blocs que ens permetran:
- esbrinar les característiques del robot,
- comandar els motors,
- i fer lectures d'un sensor de distància.
El robot amb el qual connectarem el nostre dispositiu hauria de disposar d'un parell de motors grans que el permetin desplaçar-se i un sensor ultrasònic. Com a guió de muntatge, podeu usar l’estructura que es proposa en el següent manual de muntatge.
El robot muntat hauria de tenir una aparença semblant a la imatge següent:
Preparem la interfície i els objectes
Per establir la connexió amb el robot haurem d’utilitzar l’objecte BluetoothClient tal com l’hem utilitzat en el bloc Comuniquem dos dispositius mòbils via bluetooth. Si voleu aprofundir més en la configuració del Bluetooth podeu consultar el bloc esmentat.
La interfície de l'app pot tenir una aparença com la següent imatge:
Com a objectes visibles tenim un ListPicker amb el text Connecta que ens permetrà iniciar la connexió amb el robot i un botó per aturar la connexió, Desconnecta, i diferents etiquetes organitzades en Table Arrangements i Horizontal Arrangements que ens permetran monitoritzar el robot.
Com a objectes no visibles destacarem els objectes que ens permetran comunicar-nos amb el robot: EV3Commands1, EV3Motors1 i EV3UltrasonicSensor1 i l'objecte BluetoothClient1 que ens permetrà establir la connexió amb el robot.
Abans de començar a programar però, haurem de modificar alguns paràmetres dels objectes esmentats. El primer, i comú en tots ells consisteix en definir la propietat BluetoothClient amb el nom de l'objecte que ens permetrà utilitzar l'antena bluetooth del dispositiu mòbil. En el cas que ens ocupa és BluetoothClient1.
La següent imatge correspon a l'objecte EV3Commands, del qual tan sols configurem la propietat ja esmentada.
Per configurar la connexió amb els motors del robot hem de definir-ne les propietats com segueix.
De la imatge anterior destacarem les propietats:
- MotorPorts: Els robots LegoMindstorms EV3 disposen de quatre connexions on es poden connectar els motors anomenats A, B, C i D. Haurem de vetllar que els ports on estiguin connectats coincideixin amb els valors que tenim configurats en aquest objecte.
- WheelDiameter: Podem ajustar la mida de les rodes en cas que volguem fer avançar el robot una distància determinada amb el mètode RotateInDistance.
L'objecte EV3 Ultrasonic Sensor el configurarem més endavant.
Connectem-nos amb el robot
Per començar a programar, començarem comprovant, en iniciar l'app, que l'antena bluetooth està connectada.
El nostre dispositiu actuarà de client i per tant caldrà cercar dins el ListPicker el llistat de dispositius disponibles (prèviament aparellats):
I en seleccionar-ne un intentarà connectar-s’hi:
Un cop establerta la comunicació, la primera informació que recollirem serà sobre paràmetres del robot amb el que ens comuniquem, que mostrarem per la pantalla del dispositiu mòbil. Per fer-ho modificarem l'esdeveniment anterior afegint-li les crides a les funcions que ens permetran consultar diferents paràmetres del robot.
La crida a la funció KeepAlive ens permetrà que el robot no s'apagui per falta d'activitat almenys durant 5 minuts.
Dirigim el robot
Per dirigir el robot utilitzarem el sensor d’inclinació, explicat més extensament en l'apartat Sensors d'inclinació i orientació. Utilitzarem les lectures de pitch i roll , valors que obtindrem de l'objecte OrientationSensor1, per fer moure el robot tal com mostra la següent taula:
Els valors que prenen els paràmetres pitch i roll els podeu consultar a l'apartat Sensors d'inclinació i d'orientació.
Quan el sensor d'orientació detecti un canvi, s'activarà l'esdeveniment OrientationSensorChanged. Utilitzarem els valors que ens retornarà per indicar al robot en quina direcció, turnRatio, i amb quina velocitat, power, s'ha de moure.
Utilitzant el procediment RotateSinchIndefinitelly aconseguim que el robot mai es pari a menys que posem el dispositiu mòbil totalment horitzontal, situació en la qual les variables pitch i roll tendiran a valdre zero.
Evitem que xoqui
Per completar el comandament del robot, ampliarem les possibilitats de control i farem lectures periòdiques del sensor d’ultrasons per evitar que topi amb un obstacle.
Per accedir al sensor del robot utilitzarem l’objecte EV3UltrasonicSensor1, que configurarem segons la imatge següent.
D'aquest objecte en destacarem les propietats:
- BottomOfRange/TopOfRange: Per defecte aquestes dues propietats no estan definides. Els valors que hi introduïm faran que, quan el robot detecti, mitjançant aquest sensor de distància, que la distància supera aquests límits o està entre aquests límits, s'enviï un missatge a la nostra app que podrem detectar mitjançant algun dels següents esdeveniments
- SensorPort: Indiquem a quin port està connectat el sensor.
- BluetoothClient: Definim quin objecte utilitzem per connectar-nos amb el robot.
Si no ho heu fet encara, en aquest enllaç teniu les instruccions que expliquen com incorporar un sensor d’ultrasons a l’estructura que ja heu muntat.
Quan el robot es trobi a punt de xocar amb algun objecte s'activarà l'esdeveniment EV3UltrasonicSensor.BelowRange, i ho aprofitarem per avisar a l'usuari de l'app per tal que ho tingui present.
Tot i que mitjançant l'esdeveniment Timer del l'objecte Clock1 s'anirà actualitzant l'etiqueta que ens informa de la distància a la qual es troben els objectes.