Ejercicio: Coche robótico: control Android

De Edutec Wiki
Saltar a: navegación, buscar

RTENOTITLE

Document

Document al Google Drive

Los componentes

Para esta práctica, necesitaremos los siguientes componentes para el montaje del coche:

RTENOTITLE La placa Arduino será lo que nos permitirá interactuar con los sensores y los actuadores desde S4A.
RTENOTITLE El módulo Bluetooth será necesario para enviar datos desde el dispositivo Android a la placa Arduino. Recomendamos el modelo JY-MCU.
RTENOTITLE El servomotor es capaz de convertir energía eléctrica en mecánica, dando como resultado un movimiento rotatorio continuo y bidireccional (sentido horario o antihorario).
RTENOTITLE Para conectar los componentes en la placa, necesitaremos cables de prototipado. La ventaja de estos cables sobre los convencionales es que no necesitaremos soldarlos, ya que cuentan con conectores integrados.
RTENOTITLE La placa de prototipado está preparada para conectar los cables de prototipado y los diferentes componentes sin necesidad de soldadura. Esta placa en concreto, está preparada para acoplarse al Arduino directamente.

Esquema del circuito

Este es un posible esquema del montaje necesario para llevar a cabo este ejercicio.

Coche control android 02.png

Los servomotores pueden ir conectados de igual forma que en el ejercicio Coche robótico: salva-obstáculos. La única diferencia ahora es la inclusión del módulo Bluetooth, el cual deberemos insertar en la protoboard y conectar los pines de la siguiente forma:

  • VCC: pin de alimentación 5V
  • GND: pin de tierra GND
  • TXD: pin digital 4
  • RXD: pin digital 5

 

AppInventor - Tutorial aplicació de control de robot amb Arduino

 

En aquest altre document es tractarà de desenvolupar una aplicació capaç de control·lar un robot format per un arduino, un txassis adequat i un parell de servomotors de rotació contínua. Per tal de prescindir d’un cable físic pel qual alimentar-lo i enviar-li les ordres, necessitarem una bateria externa i un mòdul Bluetooth, en aquest cas el HC-05.

 

Començarem programant la placa l’Arduino. Obrim la IDE i carreguem l’exemple Archivo > Ejemplos > Basics > Bareminimum:

 

Com farem servir un parell de servos de rotació contínua, afegirem la llibrería Servos.h (Programa > Incluir Librería > Servo), declararem un parell d’objectes de tipo servo i els assignarem els pins corresponents en la funció setup():

 

Ara, per poder rebre les ordres per Bluetooth, cal que inicialitzem la connexió sèrie en el setup() a la mateixa velocitat amb la que està programat el Bluetooth (en el nostre cas 57600). A més, definirem i farem servir una variable on guardar la ordre que arribarà per Bluetooth:

 

Per moure un servo, hem de fer servir la funció de Servo writeMicroseconds(), per lo que necessitem saber quants microsegons dura el pols per cada acció d’aquest. En el nostre cas i amb els servos que farem servir, el valor dels polsos són els següents:

 

  • Horari: 1 ms (1000 µs)
  • Antihorari: 2 ms (2000 µs)
  • Aturat: 1.5 ms (1500 µs)

 

Opcionalment podem definir unes variables (o com aquest valor no variarà, millor unes constants) per fer servir aquests valors:

 

 

Ara només queda fer que, depenent del valor de la ordre, els servos actuïn d’una forma o d’una altra. Per tal de fer-ho fàcil, farem servir números per codiIficar cada ordre:

Valor ordre

Moviment

Acció servo esquerre

Acció servo dret

1

Endavant

Antihorari

Horari

2

Enrere

Horari

Antihorari

3

Dreta

AntiHorari

AntiHorari

4

Esquerra

Horari

Horari

5

Aturar

Aturat

Aturat

 

I ara només falta implementar-lo amb condicionals:

 

Endollem la placa a l’ordinador, seleccionem la placa i el port corresponent a Herramientas > Placa/Puerto:

 

I carreguem el codi:

 

Si tot va bé, a sota hauria de surtir un missatge confirmant la càrrega a la placa:

 

Ara mirarem de conectar tots els elements a la placa. El que té una mica de complicació és el Bluetooth, ja que ens hem d’assegurar de que creuar els cables que van als pins RX/TX de la placa al Bluetooth. És a dir, el pin TX de l’Arduino ha d’anar connectat al RX del Bluetooth i viceversa:

 

Ara conectarem els servos, per exemple l’esquerre al pins 4 i el dret al pin 5:

 

Ara anem a l’AppInventor i crearem un nou projecte, on afegirem els elements necessaris per connectar per Bluetooth amb el mòdul i per enviar les ordres:

 

Per col·locar els botons és recomanable fer servir una DisposiciónTabular, canviar el número de files i columnes a 3x3 i després de col·locar els botons fixar la mida de cadascun a 100x100 píxels:

 

És recomanable canviar els noms i les propietats adients per a fer més entenible el codi. A més, podem afegir un altre disposició per separar una mica el SelectorDeLista i la DisposicióTabular:

 

NOTA: Els símbols de les fletxes de direcció i d’aturar els podem trobar a la següent web: https://unicode-table.com/es/

 

No ens podem oblidar del component que ens permet fer servir les funcionalitats del Bluetooth del nostre dispositiu:

 

Com podem veure, tenim els components ClienteBluetooth i ServidorBluetooth. En el nostre cas, com és el nostre dispositiu Android el que es connecta al robot, cal fer servir el client.

 

Ara podem canviar a l’editor de Blocs i començar a programar la nostra aplicació. Farem servir el SelectorBluetooth per a escollir un dispositiu Bluetooth ja enllaçat i connectar amb ell. Per a això serà necessari enllaçar prèviament el nostre dispositiu Android amb aquest.

 

Conectarem la placa a l’alimentació i veurem que la llum del Bluetooth fa pampallugues:

 

En el nostre dispositiu Android, anem a Configuració > Bluetooth i enllaçem amb el mòdul Bluetooth del robot (en aquest cas TN07):

 

Quan ens demani el pin, posem “0000” o “1234” i acceptem:

 

Tornant a l’editor de Blocs, necessitarem fer servir els dos primers blocs del SelectorBluetooth:

 

Aquest tipus de selector pot mostrar llistes a través de la seva propietat Elements. Assignarem en aquesta propietat la llista d’adreces Bluetooth ja vinculades amb el nostre dispositiu que es pot trobar a ClienteBluetooth, en el moment abans de seleccionar-ne cap:

 

Si ja tenim enllaçat el nostre dispositiu amb l’AppInventor a través de l’aplicació MIT AI2 Companion, podem provar si funciona:

 

Sembla que sí que rutlla. Ara si seleccionem l’adreça del mòdul BT del robot, no farà res. Cal que li diguem que després de seleccionar, connecti amb aquest.

 

Per a això, necessitem el següent bloc:

 

Obviament, aquest bloc necessita la direcció MAC que escollim per poder-s’hi connectar, i la tenim en la propietat Selección del SelectorBluetooth:

 

Com es pot observar, necessitem connectar aquest bloc en un condicional, ja que retorna cert si la connexió ha estat exitosa i fals en cas contrari. Podem aprofitar per notificar a l’usuari si el dispositiu Android s’ha connectat correctament amb el robot. En cas de que vulguem estalviar-nos afegir un Notificador per mostrar missatges flotants, podem fer servir la barra de títol de la pantalla:

 

Ho provem:

 

I sembla que ha connectat. Ara només queda enviar les ordres corresponents, fent servir el següent bloc:

 

Ja que hem escollit números enters molt petits, amb 1 byte en tenim prou. Enviem el número corresponent a cada botó, tal i com hem decidit anteriorment:

 

I ara només queda provar-ho!


 

Extra: rebre informació d’un o més sensors connectats a la placa Arduino

 

També tenim la possibilitat de, en el cas de disposar de sensors digitals o analògics per poder-los connectar a la placa, enviar la informació que rep aquest sensor a l’aplicació. Per fer això, afegirem les següents línees en el codi de l’Arduino, dintre de la funció loop():

 

Això el que farà serà, en cas de no rebre cap ordre de moviment des de l’aplicació, enviar amb un interval de 100 mil·lisegons i separats per salts de línia (println) la informació dels sensors connectats, en aquest exemple, als pins analògics 0 i 1. Farem servir un potenciómetre al primer i un sensor de temperatura al segon:

 

Un cop carregat el codi a l’Arduino, anem a l’AppInventor i afegirem un parell d’Etiquetes (Interfaz de usuario) i un Reloj (Sensores). Aquest últim el necessitem per llegir periòdicament, amb el mateix interval que hem definit en el codi d’Arduino (100 ms), la informació dels sensors que envia la placa:

 

Canviem a l’editor de blocs, on buscarem el bloc que s’executa cada interval especificat a Reloj:

 

I el bloc necessari per rebre un array (text) des de Bluetooth:

 

Com cal especificar-li el número de bytes, també necessitem el següent bloc:

 

A més, abans de rebre les dades, cal comprovar que el Bluetooth estigui connectat (si no donaria un error) i que hi hagin dades disponibles per rebre, de forma similar a la funció Serial.available() de l’Arduino. Això ho podem fer amb l’operador lògic y:

 

Com estem enviant múltiples dades en un sol array, caldria separar-les amb el següent bloc:

 

El qual és capaç de dividir un text en trossos amb un del·limitador concret, i tornar-los com una llista.

 

En aquest cas, el del·limitador es el salt de línia (representat amb \n). Per guardar aquesta llista temporalment per poder accedir als seus elements a l’hora de visualitzar els valors, seria bona idea crear una variable:

 

Decidim un nom per identificar-la i la inicial·litzem com una llista buida:

 

Ara ja podem guardar els valors rebuts:

 

Un cop tenim aquests valors guardats, cal representar-los en les etiquetes. Abans d’això, per tal d’evitar comportaments estranys (per exemple que surti més de dos valors, ja que pot fallar puntualment el sincronisme entre placa i aplicació), ens assegurarem de que la longitud de la llista sigui la desitjada:

 

En el cas de que això es compleixi, només cal assignar a la propietat Text de cada etiqueta l’element corresponent de la llista de valors amb el següent bloc:

 

El valor del primer sensor estarà a l’índex 1 de la llista guardada a data i el segon a l’índex 2:

 

I ja ho tenim: