4. Arduino Serial Control¶
With the following program, the Arduino executes the commands it receives from the computer through the serial port.
Exercises¶
Run and test the following program on 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); }
Add a new command with the letter 'C' (clear) so that the Arduino turns off all the leds at once.
Add a new order with the letter 'S' (sequence) so that the Arduino turns on all the leds one by one from the first to the last with a cadence of one led per second.