4. Control serie de Arduino¶
Con el siguiente programa, Arduino ejecuta las órdenes que recibe desde el ordenador a través del puerto serie.
Ejercicios¶
Ejecutar y probar el siguiente programa en Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
/* Programa para controlar Arduino desde el puerto serie del PC */ #include <Wire.h> #include <pc42.h> #define AND && /* Inicialización */ void setup() { Serial.begin(9600); // Inicializar las comunicaciones serie pc.begin(); // Inicializar el módulo PC42 } /* Bucle principal */ void loop() { int dato, orden; // Envía las instrucciones por el puerto serie Serial.println(); Serial.println("Instrucciones:"); Serial.println(" H3 - enciende el led 3"); Serial.println(" L3 - apaga el led 3"); Serial.println(" R1 - lee y devuelve el valor de la entrada analogica 1"); Serial.println(); // Lee del puerto serie una instrucción while(1) { // Espera la recepción de un dato while(Serial.available() == 0); // Si se recibe una orden correcta, sale al siguiente paso orden = Serial.read(); // Orden de encendido de un led if (orden == 'H') { dato = leer_num(); led_on(dato); } // Orden de apagado de un led if (orden == 'L') { dato = leer_num(); led_off(dato); } // Orden de lectura de puerto analógico if (orden == 'R') { dato = leer_num(); read_analog(dato); } } } /* Funciones */ // Lee un número desde el puerto serie int leer_num() { int dato; // Espera la recepción de un dato while(Serial.available() == 0); // Lee el dato dato = Serial.read(); // Si el dato es un número, devuelve el número if ((dato >= '0') AND (dato <= '9')) return dato - '0'; // En caso contrario, devuelve el dato return dato; } // Enciende un led void led_on(int argumento) { // Comprueba que el argumento no se sale de rango if (argumento > 8) argumento = 8; // Enciende el led pc.ledWrite(argumento, LED_ON); } // Apaga un led void led_off(int argumento) { // Comprueba que el argumento no se sale de rango if (argumento > 8) argumento = 8; // Apaga el led pc.ledWrite(argumento, LED_OFF); } // Lee un puerto analógico y envía el resultado por el puerto serie void read_analog(int argumento) { // Comprueba que el argumento no se sale de rango if (argumento > 3) argumento = 0; // Lee el valor analógicoEjecuta la instrucción int valor = analogRead(argumento); Serial.print("Valor="); Serial.println(valor); }
Añadir una nueva orden con la letra 'C' (clear) para que Arduino apague de una sola vez todos los ledes.
Añadir una nueva orden con la letra 'S' (secuencia) para que Arduino encienda uno a uno todos los ledes desde el primero hasta el último con una cadencia de un led por segundo.