Primer programa con Arduino

En realidad no es mi primer programa (código, sketch) pero bueno, ya tenia tiempo que no le metía mano a una tarjeta Arduino, aunque muchos dicen que quieren programar con Arduino , en si es la plataforma y la tarjeta pero quienes tal vez tengan nociones de electrónica digital, muy bien saben, que lo principal y quien recibe las instrucciones es el microcontrolador que tiene la tarjeta.

Imagen tomada como referencia, la verdad no se si actualmente se vea así, pero en si no cambiado tanto, de unos años para acá, las primeras si estaban mas rusticas por así decirlo, yo la tengo a la mano es una Arduino Nano. En esta imagen se puede ver las partes principales del Arduino y entre ellas el microcontrolador ATmega328, un integrado que tiene varios periféricos incluidos en un solo chip. este es de montaje “through hole” (THT) o de pines pues, el que tengo que es de una tarjeta Nano tiene el mismo microcontrolador (bueno casi el mismo , tienen el mismo nombre) pero de montaje superficial o SMD.

Esta es la tarjeta que tengo a la mano o PCB (print circuit board) o tarjeta de circuito impreso. Va que empeze a ver en que pin tiene el led que tiene integrado como para verificar su funcionamiento con el sketch o codigo de ejemplo que hace que se apague y se prenda, lo que tiene es que no necesitas agregar nada mas para encederlo, solo cargar el codigo de ejemplo y empezara a parpadear. El pin marcado donde va conectado el led, es el pin 13.

Cada modelo de tarjeta Arduino tiene su pin con un led ya puesto en la PCB, a este pin se le llama LED_BUILTIN en el código, este en el ejemplo se toma para configurarlo, y pues al escoger la tarjeta se cambia, el compilador toma un valor dependiendo el modelo de la tarjeta Arduino.


  This example code is in the public domain.

  https://docs.arduino.cc/built-in-examples/basics/Blink/
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

Aqui el porgrama de ejemplo que mencionaba, como ves esta la constante LED_BUILTIN.

Pero yo que empiezo agregar el puerto serial, un puerto serie que se puede leer por medio de la interfaz de USB-Serial, con el circuito integrado que trae por debajo la tarjeta Nano.

De forma simple se ve el convertidor de protocolos (ya luego en pondré algo referente a estos). Esto es otra razón por cual se volvió popular estas tarjetas, que traen todo en una sola, solo conectas y listo. Con el mismo cable USB me puedo comunicar con el microcontrolador y así mandarle instrucciones o recibir información como lectura de un sensor, que se activo alguna salida digital y acciona algún actuador por medio de un relevador, etc.

Ahora si después de todo este contexto, empecé a agregar el la parte de configurar el puerto serie, esto es demasiado sencillo usando el lenguaje y las librerías ya integradas de la IDE. Solo una instrucción y listo, ya tenemos activado el puerto serie de la tarjeta.

Serial.begin(9600);

Aunque tambien vi que le agregan este “cacho de codigo” para verificar que el puerto este conectado.

while (!Serial) {
    ;  // wait for serial port to connect. Needed for native USB port only
  }

Creo leyendo ahorita bien, dice que solo es necesario para puerto USB nativo únicamente. Bueno igual se lo deje, ya que tenemos eso, decidí entonces cambiar el blink del programa principal o la parte principal del código (void loop), este es un ciclo o bucle infinito, esto quiere decir que se repite esta parte hasta que sea desconectada la tarjeta.

La parte de control del encendido del LED, la pase a un función, que igual es fácil de declarar, solo se pone el tipo de dato, si es que devolverá un valor, o se puede poner void (sin valor) para que solo se ejecute y no regrese ningún valor. Después el nombre de la función (parapadeoLed o parapadeo-LED, o como quieras ponerle) y entre paréntesis las variables que vas a recibir, si va a recibir ningún valor la función se deja sin nada, así ( ), y luego desde luego los corchetes. Me quedo de la siguiente forma

void led_blink(int ms){

  digitalWrite(pin_led,HIGH);
  delay(ms);
  digitalWrite(pin_led, LOW);
  delay(ms);
}

Como no va devolver valor lo deje en void, pero si va recibir el valor “ms” que es la cantidad de milisegundos que estará el LED encendido y apagado. Este valor hay que designar el tipo , en este caso es tipo entero (int), y ya el pin lo definí antes que seria el pin13 de la tarjeta Arduino Nano.

Ahora si, solo recibire un numero del 1 al 4 para difeentes tiempos de encendido y apagado del led, para no complicarlo mas, pienso ver si puedo hacer que no se quede esperando el programa a que termine el delay y por medio de una interrupcion “lea” el valor que le mande por puerto serie, y actualize el tiempo sin esperar a que termine de hacer la rutina de apagar y encender el led. Pero eso sera para otra entrada.

Asi que dejo el codigo que hice para empezar a recordar lo que daba en un curso, hace algunos años.

int pin_led = 13, seg = 0;
char inbyte;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  while (!Serial) {
    ;  // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Iniciando sistema");
  pinMode(pin_led, OUTPUT);
  Serial.println("LISTO...");

}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0){
    inbyte= Serial.read();
    if(inbyte == '1' || inbyte == '2' || inbyte == '3' || inbyte == '4'){
      seg = String(inbyte).toInt();
      Serial.print("valor leido: ");
      Serial.println(seg);
      seg = seg*1000;
      Serial.print("Milisegundos: ");
      Serial.println(seg);
      
    }
  }
  led_blink(seg);
}

void led_blink(int ms){

  digitalWrite(pin_led,HIGH);
  delay(ms);
  digitalWrite(pin_led, LOW);
  delay(ms);
}

como ven deje en el void loop el código principal de recepción de un dato por puerto serie y dependiendo que se reciba mandara el valor de milisegundos a la función led_blink. Falto agregarle un mensaje cuando el dato recibido no este dentro de los valores tomados como validos o que pasen el “filtro” del if.

Este código solo me sirve para usar lo que ya incluye la placa Arduino, uno de las cosas que puede usar sin necesidad de conectar algún modulo o alguna otro dispositivo, como es el led que trae para hacer un “Hola mundo” y el puerto serie para poder comunicarse con el microcontrolador. A mi me sirvió para repasar y hare otra entrada cuando haga otros códigos probando mas periféricos de la placa.

Les dejo el codigo con lo que le agregue, el unico detalle es que usando el monitor serial de la IDE de Arduino, se manda al final manda el caracter ASCII de control “nueva linea (LF), por lo que luego manda un mensaje de valor no valido.

Aquí es donde me di cuenta de eso, pero ya vi que dice a un lado “New Line”, trae un menú desplegable y lo cambie por la opción “No Line Ending” y ya solo envía el numero o letra que escriba.

Aaaaaa, el codigo no lo he puesto para que salgan las opciones y el mensaje de “valor no valido”, aqui lo dejo a continuacion:

int pin_led = 13, seg = 0;
char inbyte;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  while (!Serial) {
    ;  // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Iniciando sistema");
  pinMode(pin_led, OUTPUT);
  Serial.println("LISTO...");
  Serial.println("Opciones de tiempo de encendido y apagado");
  Serial.println("1 : 1 segundo");
  Serial.println("2 : 2 segundos");
  Serial.println("3 : 3 segundos");
  Serial.println("4 : 4 segundos");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0){
    inbyte= Serial.read();
    if(inbyte == '1' || inbyte == '2' || inbyte == '3' || inbyte == '4'){
      seg = String(inbyte).toInt();
      Serial.print("valor leido: ");
      Serial.println(seg);
      seg = seg*1000;
      Serial.print("Milisegundos: ");
      Serial.println(seg); 
    }
      else{
        Serial.println("Valor no valido.");
        Serial.println("Solo se permiten los numeros del 1 al 4.");
      }
  }
  led_blink(seg);
}

void led_blink(int ms){

  digitalWrite(pin_led,HIGH);
  delay(ms);
  digitalWrite(pin_led, LOW);
  delay(ms);
}

Ahora si, hasta aquí este entrada.


Posted

in

by

Tags:

Comments

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *