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 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 esto es, 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 car谩cteres aislados se encierran entre comillas simples ‘邪’
  • La cadena y la matriz de caracteres se incluyen entre comillas dobles 芦l铆nea禄
  • Los nombres de las variables pueden contener letras latinas may煤sculas y min煤sculas (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
  • El caso importa, 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 pesta帽a equivale a dos espacios
  • Cada acci贸n 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 el 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 de 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 – valor establecido (setTime)
    • printshow – mostrar algo
    • read– leer
    • write – escribir
    • change – cambiar
    • clear – borrar
    • beginstart – empezar
    • endstop – 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 computadora 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 conectar 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 loop.

C贸digo en bloque setup() ejecutado 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 芦principales禄.

// 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 asunto)
  4. Bibliotecas conectadas y archivos externos, declaraci贸n de los tipos y clases de datos correspondientes
  5. Variables globales
  6. setup()
  7. loop()
  8. Sus 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 conveniente 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 < comprobar > 隆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 conectan mediante el comando 芦conectar 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 hermoso (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 portapapelesCombinaciones 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