Professional Documents
Culture Documents
1
Índice
1. 1. Comunicación serie 3
1.1. Vectores 3
1.2. Estructuras 10
1.3. Serial Plotter 33
2. Comunicación I2C 36
3. Comunicación SPI 60
SPI en Arduino 62
2
1. Comunicación serie
En este capítulo, ampliaremos lo aprendido en el segundo tomo del
nivel inicial sobre la comunicación serie. En este tema, empezamos a
trabajar con la forma en la que almacenamos los datos; los arrays y
las estructuras de datos.
1.1. Vectores
Ilustración 1.
Ilustración 2
3
La primera ventaja con la que nos encontramos es que, para
almacenar, por ejemplo, 6 datos tipo «int», ya no necesitamos
declarar 6 variables.
Ilustración 3
Ilustración 4
4
Ilustración 5
Ilustración 6
5
en cuenta que, si el vector consta de 6 posiciones, estas se empiezan
a enumerar desde la posición cero; por lo tanto, en caso de contener
6 posiciones, estas irían desde la posición 0 a la 5. Otra forma de
declarar un vector es asignando valores en cada posición.
Ilustración 7
Ilustración 8
6
Ilustración 9
Ilustración 10
7
Ilustración 11
Ilustración 12
Por lo tanto, si queremos crear tres filas, debemos crear tres campos
(de 0 a 2 posiciones) en el vector y, dentro de cada campo,
definiremos el valor de las columnas. Declararemos de la siguiente
forma, estructurándolo de manera similar a una matriz, para que se
entienda mejor:
8
Ilustración 13
Ilustración 14
Ilustración 15
9
Los vectores de caracteres son de gran uso cuando necesitamos
separar los caracteres de una cadena y trabajar de forma individual
con cada uno de ellos. También disponemos de vectores de cadenas
de caracteres.
Ilustración 16
Ilustración 17
1.2. Estructuras
10
En consecuencia, debemos emplear estructuras de datos («struct»).
Podemos crear tantas estructuras como necesitemos. «Declarar» una
estructura significa que definimos los campos que la formarán.
Ilustración 18
Ilustración 19
11
Ilustración 20
Ilustración 21
12
Podemos crear diferentes estructuras y, bajo una misma estructura,
crear diferentes variables, vectores o matrices.
Serial.flush();
Ilustración 22
13
Ilustración 23
Ilustración 24
14
Ilustración 25
Serial.event()
15
Ilustración 26
Serial.availableForWrite();
16
Ilustración 27
Ilustración 28
17
Ilustración 29
Ilustración 30
18
Ilustración 31
Ilustración 32
Serial.end();
19
Ilustración 33
Con este programa, lo que sucede es que, una vez que se envíe un
mensaje, se inhabilita la comunicación serie, tras lo cual no
devolvería ningún mensaje que enviemos desde el IDE.
Ilustración 34
Ilustración 35
20
Ilustración 36
Serial.peek();
Ilustración 37
21
Ilustración 38
Ilustración 39
Una vez que recibe datos, entra en este bucle y, como la función
«Serial.peek();» no borra los datos del buffer de entrada, cada vez
que se evalúe el bucle, este detectará que existen datos; por lo tanto,
nunca saldría.
22
Ilustración 40
Serial.setTimeout(parámetro);
Serial.parseInt();
23
Ilustración 41
Ilustración 42
24
Ilustración 43
Ilustración 44
Ilustración 45
25
Ilustración 46
Ilustración 47
Serial.parseFloat();
Ilustración 48
26
Ilustración 49
Ilustración 50
Serial.readBytes(parámetro1,parámetro2);
Ilustración 51
27
Ilustración 52
Ejercicio propuesto:
28
29
Serial.readBytesUntil(parámetro1,parámetro2,parámetro3);
Ilustración 53
Ilustración 54
30
Serial.readString();
Ilustración 55
Serial.readStringUntil(parámetro);
31
Ilustración 56
Ilustración 57
Serial.find(parámetro);
32
Ilustración 58
Ilustración 59
33
Ilustración 60
Ilustración 61
Ilustración 62
34
Para graficar varios datos:
Ilustración 63
Ilustración 64
35
2. Comunicación I2C
La comunicación I2C es un protocolo presente en muchos módulos
que podemos encontrar para Arduino: reloj, LCD, etc. Por eso vamos
a analizar este protocolo de comunicaciones, desde un punto de vista
general, entendiendo el funcionamiento de este protocolo, puesto
que, para cada módulo, disponemos de una librería concreta para
facilitar su programación.
36
Ilustración 65
Por lo tanto, entre dos Arduinos que se quieran comunicar por este
protocolo, deben conectarse de acuerdo con el sistema anterior; es
necesario unir las masas (GND-GND) siempre y cuando los
dispositivos trabajen a través de diferentes fuentes de alimentación.
Para operar con este protocolo, necesitamos usar la librería «wire».
Ilustración 66
Wire.begin();
• Como maestro:
«Wire.begin();». Si no pasamos parámetros a la
función, configura el dispositivo como maestro.
• Como esclavo:
«Wire.begin(4);» Si configuramos el dispositivo con
un identificativo, como es el caso, este queda
configurado como esclavo y con la dirección 4
asociada.
37
Ilustración 67
Ilustración 68
Wire.beginTransmission();
38
Wire.endTransmission();
Wire.onReceive(parámetro);
Wire.available();
Wire.read();
Wire.write();
39
Ilustración 69
Ilustración 70
40
Ilustración 71
Ilustración 72
41
Ejercicios propuestos:
42
2. Configurar dos Arduinos: uno como maestro y otro como
esclavo. En este caso, conectamos un botón al maestro y un
led al esclavo. Si se pulsa el botón, el led debe parpadear.
A
B
43
B
44
3. Configurar dos Arduinos: uno como maestro y otro como
esclavo. En este caso, conectamos un potenciómetro al
maestro y un led al esclavo. El led del esclavo debe regularse
en función del valor del potenciómetro del maestro.
B
A
45
B
46
Wire.requestFrom(parámetro1,parámetro2);
Wire.onRequest(parametro);
Ilustración 73
47
Ilustración 74
Ilustración 75
48
Ejercicios propuestos:
49
4. Con un Arduino configurado como maestro y otro como
esclavo, conectar un botón al esclavo y un led al maestro. El
led debe parpadear si se ha pulsado el botón.
A
B
50
A
51
5. Con un Arduino configurado como maestro y otro como
esclavo, conectar un potenciómetro al esclavo y un led al
maestro. El led debe regularse en función del potenciómetro.
A
B
52
A
53
6. Realizar un chat entre Arduinos a través de comunicación
I2C.
A B
54
A
55
B
56
B
57
7. Con un maestro y dos esclavos, conectar un potenciómetro
en uno de los esclavos y un led en el otro. Regular el led de un
esclavo en función del potenciómetro del otro.
B C
A
58
B
59
3. Comunicación SPI
SPI (Serial Peripheral Interface): al igual que el sistema I²C, el
sistema de comunicación SPI es un estándar que permite controlar (a
cortas distancias) casi cualquier dispositivo electrónico digital que
acepte un flujo de bits serie sincronizado (es decir, regulado por un
reloj), con un sistema maestro-esclavo. Una de las principales
diferencias con el I2C es que, como mínimo, necesita cuatro líneas
para establecer una comunicación.
Ilustración 76
Otra de las diferencias que nos encontramos con el I²C es que los
esclavos no disponen de una dirección asociada. Para establecer una
comunicación con un determinado esclavo, es necesaria una línea
independiente para cada uno que «active» la comunicación con ese
esclavo.
60
Ilustración 77
Ventajas e inconvenientes
∗ Ventajas:
∗ Alta velocidad de transmisión (hasta 8 Mhz en Arduino) y
«full dúplex».
∗ Puede enviar secuencias de bits de cualquier tamaño sin
dividir y sin interrupciones.
∗ Desventajas:
∗ Se necesitan tres cables (SCK, MOSI, MISO) y uno más
por cada esclavo (SS).
∗ No se dispone de ningún mecanismo de control, no se
sabe si ha sido recibido ni si ha sido recibido
correctamente.
∗ La longitud de los mensajes tienen que ser conocida por
ambos dispositivos.
61
SPI en Arduino
• 10–SS.
• 11-MOSI.
• 12-MISO.
• 13-SCK.
Ilustración 78
SPI.begin();
62
Ilustración 79
SPI.transfer();
Ilustración 80
63
Ilustración 81
SPCR | =_BV(SPE);
SPI.attachInterrupt();
ISR (SPI_STC_vect){}
SPDR
64
Con estas funciones definidas, podemos empezar a programar
nuestro esclavo. Lo primero que programaremos serán las
configuraciones:
Ilustración 82
Ilustración 83
65
en un buffer de entrada, en este caso, se almacena en el registro
SPDR. El programa final del esclavo es el siguiente:
Ilustración 84
66
Ilustración 85
67
Ilustración 86
Ejercicios propuestos:
68
8. Con tres Arduinos (dos configurados como esclavos y uno
como maestro), realizar el siguiente caso:
• El maestro dispone de un botón y un potenciómetro.
• Cada esclavo dispone de un led.
Encender el led de uno de los esclavos con el botón del
maestro y regular el led del otro Arduino con el potenciómetro
del maestro.
69
A
70
C
Ilustración 87
71
El hecho de solo poder enviar un dato de un tamaño máximo de un
byte nos limita, pero con lo que ya sabemos sobre programación,
podemos buscar la forma de superar esta limitación.
Ilustración 88
Ilustración 89
72
Si analizamos el programa anterior (que se corresponde con el
programa del maestro), recorremos la cadena de caracteres y los
enviamos uno a uno; una vez finalizado el mensaje, enviamos una
cadena «\r» para que el esclavo confirme que el mensaje ha
finalizado.
73
Ilustración 90
74
Ilustración 91
Ejercicio propuesto:
75
9. Con dos Arduinos (uno configurado como maestro y otro
como esclavo), el maestro reenvía los mensajes que recibe
por el monitor serie al esclavo y este, a su vez, almacena esos
mensajes y los muestra por el monitor serie.
76
77
78
Sabemos cómo enviar datos de un maestro a un esclavo. Para
finalizar, analizaremos el proceso inverso. Para ello, repasamos las
siguientes funciones:
SPCR | =_BV(SPE);
SPI.attachInterrupt();
ISR (SPI_STC_vect){}
SPDR
Ilustración 92
79
Ilustración 93
80
Ilustración 94
81