Descrición:
Nas anteriores prácticas xa vimos como visualizar datos na consola serie do Arduíno. Nesta sección imos ver algunhas posibilidades máis da comunicación entre o Arduíno e o PC.
Unha vez conectado Arduíno por USB, o primeiro que hai que facer é establecer a comunicación co PC a través do setup()
Serial.begin(9600); Inicia a comunicación serial a unha velocidade de 9600 baudios ou bps.
while(!Serial); Agarda ata que se conecte
Para desactivar a comunicación nalgún momento do programa e poder usar os pins 0 e 1 como E/S dixitais, pódese usar a función: Serial.end();
Para ver a consola ou monitor serie, unha vez cargado o programa no Arduíno, debemos premer na icona que aparece na parte superior dereita:
Algúns comandos:
Enviar datos á consola
Podemos enviar a través da pantalla do ordenador (consola serial) os valores dunha entrada analóxica ou dixital, o valor dunha variable, un comentario de texto, etc. enviado por Arduíno, a través das seguintes instrucións:
Serial.print(a); | Imprime o valor da variable a |
Serial.println(a); | Imprime o valor da variable a con salto de carro |
Serial.print(a, formato); | Imprime o valor da variable a indicando o sistema de numeración
Serial.println(78, BIN); // Imprime 1001110 (binario) Serial.println(78,DEC); // Imprime 78 (decimal) Serial.println(78,HEX); // Imprime 4E (hexadecimal) Serial.println(char(78)); // Imprime “N” (78 no ASCII = N) |
Serial.write(dato); | Imprime na consola un carácter en ASCII
Serial.write(78); // Transmite “N” (78 no ASCII = N) |
Se queremos imprimir unha cadea de texto hai que utilizar aspas dobres. Para un carácter aspas simples. |
Serial.println("Ola, Bo día"); Serial.print('a'); |
Se queremos expresar unha variable enteira como texto e concatenala a unha cadea, previamente témola que transformar a tipo String: |
int a; Serial.println( “O resultado é: ” + String(a) + " cm"); |
Recibir datos desde a consola
O Arduíno tamén pode recibir datos que lle chegan desde a consola.
Serial.available(); | Indica se hai datos que chegan da consola (true ou false) | |
Serial.parseInt(); | Entrega o enteiro que se escribe no monitor serie | |
Serial.parseFloat(); | Entrega o decimal que se escribe no monitor serie | |
Serial.read(); | Entrega o decimal correspondente co ASCII | |
Exemplo:
dato=Serial.read(); // Le un carácter e almacénao en decimal correspondente co ASCII Serial.write(dato); // Imprime na consola o carácter recibido en ASCII |
Prácticas:
1. Decide ti os escintileos
1. Decide ti os escintileos: Conectamos un LED coa súa resistencia ao pin 13 e introducimos pola consola o número de veces que queiramos que un LED escintile
// Declaración de variables: int escintileos; int led = 13; // Configuración: void setup(){ Serial.begin(9600); // Inicia a comunicación serial while(!Serial); // Agarda ata que conecte pinMode(led, OUTPUT); } // Programa: void loop(){ Serial.println("Indica cantos escintileos queres (entre 1 e 9)"); while(! Serial.available()); // Agarda a que haxa datos no buffer escintileos = Serial.parseInt(); // lemos o número de escintileos if (escintileos >= 1 && escintileos <= 9){ // Se o valor está entre 1 y 9 Serial.println("O LED vai escintilar "+ String(escintileos) + " veces"); delay(500); for(int i=0;i<escintileos;i++){ // O LED escintila o nº de veces introducido digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(200); } } else { Serial.println("O dato debe estar comprendido entre 1 e 9"); } Serial.println(" "); // Imprime unha liña en branco Serial.println("preme a tecla 'r' para repetir de novo"); while(Serial.read() != 'r'); // Agarda ata ler o carácter 'r' Serial.println(" "); }
2. Xogo binario
2. Xogo binario: Imos facer o seguinte cogo: O ordenador indica un número en binario e hai que introducir o valor en decimal. Se o resultado é correcto acéndese un LED verde, e se é falso acéndese un LED vermello. Ao mesmo tempo indica no monitor a solución.
Poderiamos facelo con calquera sistema de numeración. Para escribir na consola un número nun sistema determinado utilizamos a expresión Serial.println(valor,formato); sendo os formatos posibles DEC (decimal), HEX (hexadecimal), BIN (binario), OCT(octal), BYTE(ASCII)
// Declaración de variables: int ledverde= 13; int ledvermello= 12; int numero; int dato; // Configuración: void setup() { Serial.begin(9600); // Iniciamos a comunicación while(!Serial); // Agarda ata que conecte pinMode(ledverde, OUTPUT); pinMode(ledvermello, OUTPUT); randomSeed (analogRead(A0)); // para que non se repita a secuencia de números aleatorios lemos unha entrada sen conectar } // Programa: void loop(){ Serial.println("Para este número binario, cal é o valor en decimal?"); numero= random(32); // Xera un número aleatorio de 0 a 31 Serial.println(numero,BIN); // Expresa o seu equivalente en binario while(!Serial.available()); // Agarda a que haxa datos no buffer dato= Serial.parseInt(); // Garda o valor introducido na variable dato if(dato== numero){ Serial.println("Correcto! é "+ String(numero)); digitalWrite(ledverde, HIGH); digitalWrite(ledvermello, LOW); } else{ Serial.println("Mal, a solución era " + String(numero)); digitalWrite(ledverde, LOW); digitalWrite(ledvermello, HIGH); } delay(1000); digitalWrite(ledverde, LOW); digitalWrite(ledvermello, LOW); Serial.println(" "); }
Propostas
- Control do xiro dun servo: Controla o ángulo de xiro dun servo introducíndoo desde o teclado. Coida que o ángulo debe estar comprendido entre 0 e 180º. Podes tomar o exemplo visto en “A posición dun servo” e modificalo.
- Puntuación: Engade ao programa do xogo binario o necesario para establecer a puntuación. Despois de 10 xogadas debe mostrar a puntuación obtida.
- Táboa: Xera na consola unha táboa cos n primeiros números en decimal, hexadecimal e binario. n debe ser introducido polo usuario ao principio do programa.