9- Arduino. Estructura de c贸digo y sintaxis.

Un microcontrolador es, por decirlo suavemente, est煤pido, incapaz de pensar e improvisar, y solo capaz de seguir instrucciones precisas.聽La comunicaci贸n con el microcontrolador se realiza por escrito en un lenguaje de programaci贸n, el lenguaje es muy claro, estricto y tiene una sintaxis propia y unos est谩ndares de dise帽o.聽Y si un error de sintaxis conduce a un error en la compilaci贸n del c贸digo o al funcionamiento incorrecto del dispositivo que ha flasheado, entonces el dise帽o del c贸digo no sirve para la conveniencia del programador, as铆 como para aquellos que intentar谩n lidiar con su c贸digo.

El c贸digo de m谩quina binario se carga directamente en el propio microcontrolador, que parece un conjunto ca贸tico de letras y n煤meros.聽Este c贸digo se puede obtener de cualquier lenguaje de programaci贸n, todo depende del entorno de desarrollo y de un聽int茅rprete.聽El entorno de desarrollo oficial es Arduino IDE, donde la programaci贸n se realiza en C++, uno de los lenguajes m谩s populares y poderosos.聽Los propios desarrolladores llaman al lenguaje Arduino Wiring, ya que la biblioteca est谩ndar arduino.h usa funciones y herramientas del marco聽Wiring.聽Pero el lenguaje, el lenguaje del cual se toma la sintaxis, es C++, por lo tanto, en paralelo con el estudio de funciones est谩ndar, es recomendable estudiar cualquier libro de referencia sobre las programaci贸n C++.聽En 茅l puedes encontrar mucha m谩s informaci贸n sobre el idioma que en todas las lecciones de Arduino combinadas (estamos hablando del idioma y la sintaxis, y no de las funciones de Wiring).聽Adem谩s de C, existen entornos de desarrollo que le permiten escribir en Java, por ejemplo聽Espruino WEB IDE, o聽B4R– en Basic.聽O聽XOD: tendr谩s que programar con bloques visuales.聽Pero francamente hablando, tal para m铆, solo consideraremos C.


Sintaxis.

  • Los cuerpos de funciones se encierran entre llaves聽{ }.
  • Cada comando termina con un punto y coma聽;
  • El m茅todo se aplica al objeto a trav茅s de un punto.聽Ejemplo: Serial.begin();
  • Una llamada a una funci贸n o m茅todo siempre termina entre par茅ntesis, incluso si la funci贸n no toma par谩metros.聽Ejemplo: loop().
  • El separador decimal es un聽punto.聽Ejemplo: 0.25聽La coma tiene un uso diferente aqu铆.
  • Los argumentos de las funciones y m茅todos, as铆 como los miembros de una matriz, se enumeran con comas.聽Ejemplo: digitalWrite(3, HIGH);聽 matriz –聽int myArray[] = {3, 4, 5, 6};聽Adem谩s, la coma es un operador independiente, pero hablaremos de esto por separado en otra lecci贸n.
  • Los caracteres aislados se encierran entre comillas simples聽‘邪’.
  • Las cadenas y las matrices de caracteres se incluyen entre comillas dobles聽芦l铆nea芦.
  • Los nombres de las variables pueden contener聽letras latinas may煤sculas聽y聽min煤sculas,聽n煤meros聽y聽guiones bajos.聽Ejemplo: myVal_35.
  • Los nombres de las variables聽no pueden comenzar con un d铆gito.聽Solo con letra o subrayado
  • Es case sensitive, es decir聽la may煤scula es diferente a la min煤scula.聽Ejemplo: las variables val聽y聽Val聽No son lo mismo.

La sintaxis tambi茅n puede incluir comentarios, ya que聽se destacan de manera diferente en diferentes idiomas.聽Un comentario es texto sin formato que se ignora durante la compilaci贸n.聽Se necesitan comentarios para explicar el c贸digo, tanto para usted como para otros posibles lectores.聽En C++, tenemos dos tipos de comentarios:

  • Comentario de una sola l铆nea.
// comentario de una l铆nea
// el compilador me ignora = (
  • Comentario de varias l铆neas.
/ * Multil铆nea
comentario * /

Registro.

Formateo.

Existe el formateo (alineaci贸n) del c贸digo, es decir, respetar los espacios y el espaciado. Por ejemplo, compare estos dos c贸digos. 驴Cu谩l se ve m谩s claro y visual?

formateo de codigo en el Ide de arduino
Formateo de c贸digo en el Ide de arduino

No temas, todos los IDE serios tienen formateo de c贸digo autom谩tico, funciona tanto en el proceso de escritura como de guardia. Arduino IDE – no es una excepci贸n, tiene el formateo de c贸digo y combinaciones de teclas calientes Ctrl + T.

  • Hay un espacio entre las operaciones matem谩ticas, los signos de comparaci贸n, la asignaci贸n y todo eso.
  • Como en el texto ordinario, se coloca un espacio despu茅s y no antes de una coma, dos puntos y un punto y coma.
  • La sangr铆a del borde izquierdo de la pantalla es un car谩cter de tabulaci贸n, el c贸digo se desplaza hacia la derecha y los comandos se forman a partir de un bloque de c贸digo a la misma distancia.聽En Arduino IDE, una tabulaci贸n equivale a dos espacios.
  • Cada acci贸n, sentencia, se realiza en una nueva l铆nea (el formato autom谩tico no soluciona esto).
  • Es habitual escribir llaves al principio y al final de un bloque de c贸digo en una l铆nea separada.聽Adem谩s, muchas personas escriben un par茅ntesis abierto en una l铆nea con un operador, esto ahorra espacio.

Nombres de Variables.

  • Es costumbre escribir los nombres de las variables comenzando con una letra min煤scula, para nombrarlas de manera que quede claro.聽S铆, ser铆a bueno mejorar nuestro ingl茅s.聽Ejemplo: value.
  • Si un nombre de variable consta de dos o m谩s palabras, est谩n separadas por la primera letra may煤scula de cada nueva palabra, o las palabras est谩n separadas por guiones bajos.聽Ejemplo: myButtonState, button_flag.
  • Es costumbre escribir los nombres de los tipos y clases de datos con may煤scula inicial.聽Ejemplo: Signal,聽Servo.
  • Es costumbre escribir los nombres de las constantes en may煤sculas, la separaci贸n es el subrayado.聽Ejemplo: MOTOR_SPEED.
  • Al escribir bibliotecas y clases, se acostumbra escribir los nombres de las variables internas comenzando con el car谩cter de subrayado.聽Ejemplo: _position.
  • Hay varias abreviaturas comunes para los nombres de variables, a menudo las ver谩 en el firmware y las bibliotecas de otras personas:
    • button– btn, bot贸n
    • 铆ndex聽– idx – i, 铆ndice
    • b煤ffer聽– buf, b煤fer
    • value – val, valor
    • variable聽– var, variable
    • pointer– ptr, puntero

  • Es habitual comenzar los nombres de funciones y m茅todos con un verbo que describa brevemente la acci贸n de la funci贸n.聽Estos son los que ver谩 todo el tiempo:
    • get – obtener el valor (getValue)
    • set聽– establecer valor (setTime)
    • print,聽show – mostrar algo
    • read– leer
    • write – escribir
    • change – cambiar
    • clear – borrar
    • begin,聽start – empezar
    • end,聽stop聽– terminar, detener

  • Una pregunta com煤n: 驴la longitud del nombre de la variable afecta la memoria ocupada por el firmware?聽El peso del archivo de firmware en la placa se ve afectado?.聽El peso del firmware cargado en el microcontrolador聽no se ve afectado, porque el c贸digo se convierte en c贸digo m谩quina y no hay nombres, solo direcciones.

Estructura de c贸digo.

Antes de pasar a la estructura y el orden de las piezas de c贸digo, hay algunas cosas para recordar:

  • Se debe llamar a una variable de cualquier tipo聽despu茅s de聽su declaraci贸n.聽De lo contrario, habr谩 un error.
  • La declaraci贸n y el uso de clases o tipos de datos de una biblioteca / archivo deben realizarse聽despu茅s de聽incluir la biblioteca / archivo.
  • La funci贸n se puede llamar聽tanto antes como despu茅s de la聽declaraci贸n, porque C++ es un lenguaje compilado, la compilaci贸n se lleva a cabo en varias etapas y las funciones se 芦asignan禄 por separado, por lo que se pueden llamar en cualquier parte del programa.

Al iniciar el IDE de Arduino, nos da un espacio en blanco en forma de dos funciones requeridas:聽setup() y聽loop().

El c贸digo en bloque聽setup() se ejecuta una vez cada vez que se inicia el microcontrolador.聽El c贸digo en el bloque loop()聽se realiza 芦en c铆rculo禄 durante todo el funcionamiento del microcontrolador, a partir del momento de finalizaci贸n聽de setup().

Para los curiosos: si ya est谩 familiarizado con el lenguaje C++, probablemente se pregunte 芦驴d贸nde est谩 int main () y generalmente el archivo聽main.cpp?.聽Todo es muy sencillo: int main()聽ya han escrito para usted dentro del archivo main.cpp, que se encuentra en lo profundo de los archivos de Arduino.

// main.cpp
// en alg煤n lugar de las profundidades del n煤cleo de Arduino
int main () {  
  setup () ;    
    for ( ;; ) {  
      loop () ;
    }        
  return 0;
}

En el transcurso de varios a帽os de trabajo con Arduino, me he formado la siguiente estructura de聽boceto:

  1. Descripci贸n del firmware, enlaces 煤tiles, notas, autor铆a.
  2. Constantes de ajuste (definidas y regulares).
  3. Constantes de servicio (que solo deben cambiarse con pleno conocimiento del tema).
  4. Bibliotecas conectadas y archivos externos, declaraci贸n de los tipos y clases de datos correspondientes.
  5. Variables globales.
  6. setup().
  7. loop().
  8. Las funciones.

C贸digo de muestra:

// -------- AJUSTES ---------
#define SERVO_PIN 13 // El servo est谩 conectado aqu铆
#define SERVO_SPEED 3 // velocidad del servo
#define MIN_ANGLE 50 // min. 谩ngulo
#define MAX_ANGLE 120 // m谩x. 谩ngulo
// ------- BIBLIOTECAS -------
#include <Servo.h>
Servo myservo;
// ------- VARIABLES -------
uint32_t servoTimer;
servoDirection boolean;
int servoAngle;
// --------- SETUP ----------
void setup() {
  myservo.attach(SERVO_PIN);
}
// ---------- LOOP ----------
void loop() {
  turnServo();
}
// --------- FUNCIONES --------
void turnServo() {
  if (millis() - servoTimer >= 50) { 
    servoTimer = millis();
    if (servoDirection) {
      servoAngle += SERVO_SPEED;
      if (servoAngle >= MAX_ANGLE) {
        servoAngle = MAX_ANGLE;
        servoDirection = false;
      }
    } else {
      servoAngle -= SERVO_SPEED;
      if (servoAngle <= MIN_ANGLE) {
        servoAngle = MIN_ANGLE;
        servoDirection = true;
      }
    }
    myservo.write(servoAngle);
  }
}

Esta es una estructura adecuada para 芦bosquejar禄, no se recomienda escribir proyectos grandes como ese y debe acostumbrarse a los enfoques m谩s maduros descritos en la lecci贸n聽sobre el desarrollo de proyectos grandes.


Conectando bibliotecas y archivos.

En el trabajo real, muy a menudo usar谩 bibliotecas o solo archivos externos, est谩n conectados al archivo principal (archivo de firmware) usando la directiva聽#include, esta directiva le dice al preprocesador que busque e incluya el archivo especificado en la compilaci贸n.聽El archivo especificado puede extraer otros archivos junto con 茅l, pero todo ya est谩 escrito all铆 y conectado autom谩ticamente.聽Consideremos un ejemplo:

#include <Servo.h> // incluye la biblioteca Servo.h
#include "Servo.h" // tambi茅n incluye la biblioteca Servo.h

Cual es la diferencia聽<>聽y聽禄 芦?聽Cuando indicamos el nombre 芦entre comillas禄, el compilador busca primero el archivo en la carpeta de bocetos y luego en la carpeta de bibliotecas.聽Utilizando < >聽隆el compilador solo busca el archivo en la carpeta de la biblioteca!

Hablando de carpetas con bibliotecas: hay dos de ellas, en ambas se buscar谩n bibliotecas.

  • Mis documentos / Arduino / libraries
  • C: / Archivos de programa (x86) / Arduino / bibliotecas (o C: / Archivos de programa / Arduino / libraries, para Windows de 32 bits).

Las bibliotecas llegan a la primera carpeta (en documentos) cuando se instalan mediante el comando 芦incluir biblioteca.zip禄.聽No se recomienda conectar las bibliotecas de esta manera, porque la biblioteca no siempre llega a usted en el archivo y ser谩 m谩s f谩cil copiarla manualmente en archivos de programa.聽Adem谩s, si en ambas carpetas hay bibliotecas con el mismo nombre, esto dar谩 lugar a un conflicto, por lo que simplemente copiamos las bibliotecas a la carpeta de bibliotecas en Archivos de programa / Arduino.

Nota importante: la carpeta de la biblioteca ubicada en C: / Archivos de programa (x86) / Arduino / libraries, debe contener los archivos y carpetas de la biblioteca, no una carpeta con el mismo nombre que la biblioteca en s铆.聽Esto dar谩 lugar a un error, 隆el compilador no puede encontrar los archivos!


隆No uses tu rat贸n!

Probablemente haya notado c贸mo los programadores y los piratas inform谩ticos hacen su trabajo en las pel铆culas tocando el teclado y sin tocar demasiado el mouse. Esto es cierto, cuanto m谩s programe, menos usar谩 el mouse para colocar el cursor en el lugar correcto y seleccionar palabras / l铆neas, 隆porque puede hacerlo mucho m谩s r谩pido desde el teclado!

  • Formato autom谩tico: el IDE de Arduino puede ordenar autom谩ticamente su c贸digo (es decir, sangr铆as, saltos de l铆nea y espacios).聽Para formateo autom谩tico, use la聽combinaci贸n CTRL + T聽聽en su teclado, o聽聽Herramientas / Autoformato聽聽en la ventana IDE.聽脷selo con m谩s frecuencia para hacer que su c贸digo sea vistoso (canon, cl谩sico) y m谩s legible para los dem谩s.
  • Ocultar partes de c贸digo: contraiga funciones largas y otras partes de c贸digo para ahorrar espacio y tiempo para el desplazamiento.聽Incluido aqu铆:聽聽Archivo / Preferencias / Habilitar plegado de c贸digo.
  • 隆No uses tu rat贸n!聽聽Cuanto mayor sea tu habilidad de programaci贸n, menos usar谩s el mouse (s铆, como en las pel铆culas de hackers).聽Use ambas manos para escribir y navegar por el c贸digo, aqu铆 hay algunas combinaciones y trucos 煤tiles que uso CONSTANTEMENTE:
    • Ctrl + 鈫,聽Ctrl + 鈫捖聽– mueve el cursor a la izquierda / derecha UNA PALABRA
    • Inicio,聽fin: mueva el cursor al principio / final de la l铆nea
    • Shift + 鈫,聽Shift + 鈫捖聽– selecciona un car谩cter a la izquierda / derecha del cursor
    • Shift + Ctrl + 鈫,聽聽Shift +聽Ctrl + 鈫捖聽– seleccionar una palabra a la izquierda / derecha del cursor
    • May煤s + Inicio,聽聽May煤s + Fin: selecciona todos los caracteres desde la posici贸n actual del cursor hasta el principio / final de la l铆nea
    • Ctrl + Z聽聽– deshacer la 煤ltima acci贸n
    • Ctrl + Y聽聽– rehacer la acci贸n deshecha
    • Ctrl + C聽聽– copiar texto seleccionado
    • Ctrl + X聽聽– cortar el texto seleccionado
    • Ctrl + V聽聽– pega texto del portapapeles
    • Combinaciones locales:
    • Ctrl + U聽聽– Cargar firmware a Arduino
    • Ctrl + R聽聽– compilar
    • Ctrl + Shift + M聽聽– Monitor de puerto serie abierto. Adem谩s, use聽TAB en聽lugar de聽聽SPACE聽para mover comentarios al lado derecho del c贸digo.聽Al presionar TAB se mueve el cursor sobre alguna tabla, lo que har谩 que sus comentarios se establezcan bien a la misma distancia en la mitad de la cantidad de clics.

Deja un comentario