4. Arduino Serial Control

With the following program, the Arduino executes the commands it receives from the computer through the serial port.

Exercises

  1. 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);
    }
    
  2. Add a new command with the letter 'C' (clear) so that the Arduino turns off all the leds at once.

  3. 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.