bclose

Nuestro primer programa

Blinking LED

Objetivos

.

    • Fijar algunas ideas básicas sobre  programación.
    • Comprender la estructura de un programa Arduino (Sketch).
    • Definir las estructuras de bloques.
    • Las primeras instrucciones.

 

Material requerido.

 ArduinoUNO

Arduino Uno o similar.

Esta sesión acepta cualquier otro modelo de Arduino.

 CableUSB Un cable USB adecuado al conector de tu Arduino.
 PC Un PC con el entorno de Arduino correctamente instalado y configurado..
tienda online prometec

Algunas ideas básicas sobre programación.

.

Un programa de ordenador es básicamente el equivalente a una receta de cocina… pero destinado a un público distinto.

Mientras que las personas somos razonablemente buenas interpretando las instrucciones, generalmente vagas, de una receta de cocina, cuando programamos  quien debe entendernos es un ordenador que espera instrucciones precisas respecto a lo que debe hacer y que además carece por completo de la imaginación o capacidad de improvisación humana.

Por ello se desarrollan los lenguajes de ordenador, para dar instrucciones a una máquina de forma:

 
  • Precisa: Sin ambigüedades inherentes a la comunicación humana.
  • Univoca: Solo se puede interpretar de una manera.
  • Concisa: Preferiblemente ordenes cortas.
 

El IDE de Arduino se programa en una variante de C++ , que es un lenguaje muy extendido por sus características, aunque no es un lenguaje sencillo.  C++, que fija reglas estrictas de cómo escribir estas instrucciones.

Un programa es una serie de instrucciones que se ejecutan en secuencia ( salvo que indiquemos expresamente condiciones precisas en las que esta secuencia se altera).

Un programa interno  comprueba que la sintaxis de nuestro programa es acorde a la norma de C++, y si hay cualquier cosa que no le convence dará un error y finalizará la comprobación obligándonos a revisar lo que hemos escrito.

Cuando el comprobador acepta nuestro programa, invoca otro programa que traduce lo que hemos escrito a instrucciones comprensibles para el procesador de nuestro Arduino. A este nuevo programa se le llama compilador.

Compilador

Funcion del compilador

El compilador convierte nuestras instrucciones (código fuente) en instrucciones del procesador (código ejecutable).

 

Estructura de un programa Arduino.

 

Un programa o sketch de Arduino consiste en dos secciones o funciones básicas:

 
  • Setup: Sus instrucciones se ejecutan solo una vez, cuando se arranca el programa al encender Arduino o cuando pulsamos el botón de reset. Generalmente incluye definiciones e inicializaciones de ahí su nombre.
  • Loop: Sus instrucciones se van ejecutando en secuencia hasta el final…. Y cuando acaba, vuelve a empezar desde el principio haciendo un ciclo sin fin.
 

Cuando abrimos el IDE de Arduino (o hacemos [Menú]\Archivo\nuevo) él nos escribe ya estas dos funciones (en color cobre):

Nótese que el principio de cada función es indicado por la apertura de llave “ { “ y el fin de la misma corresponde al símbolo de cerrar llaves “ } “.

De hecho el conjunto de instrucciones contenidas entre una apertura y cierre de llaves se llama bloque y es de capital importancia a la hora de que nuestro Arduino interprete de una u otra manera las instrucciones que le damos.

Es imperativo que a cada apertura de una llave corresponda un cierre de llave. En sucesivos capítulos ampliaremos este concepto.

Por ahora resaltar las líneas que aparecen dentro de los bloques principales:

// put your setup code here, to run once
// put your main code here, to run repeatedly

Cualquier cosa que escribamos precedido por “ // “ son comentarios, y serán ignorados. Es decir podemos dejarnos mensajes dentro del código,(que de otro modo darían errores). El compilador ignorará cualquier cosa entre // y el fin de línea.

 

Primeras instrucciones en Arduino C++.

 

Parece obligado en el mundo Arduino, que el primer programa que hagamos sea el blinking LED, y está bien porque ilustra algunas ideas interesantes en cuanto a sus posibilidades:

 
  • La capacidad de Arduino para interactuar con el mundo externo. Algo bastante inusitado para quienes estén acostumbrados a la informática tradicional, donde la potencia de cálculo ha crecido de forma espectacular, pero sigue siendo imposible (o casi), influir en el mundo exterior.
  • La sencillez del entorno de trabajo. En contraposición a un sistema tradicional de editor / compilador / linker.
 

Arduino puede relacionarse de diferentes maneras con el mundo que le rodea, Empezaremos por los pines digitales que pueden usarse como:

 
  • Entradas: Para leer  información digital del mundo exterior.
  • Salidas: Para activar una señal al mundo exterior.

 

Arduino dispone de 14 pines que pueden ser usados de este modo, numerados del 0 al 13:

Detalle Salidas digitales

pines del 0 al 13

 

En la sesión anterior cargamos un programa de ejemplo que hacia parpadear un LED en la placa con una cadencia definida. Veamos como programar esto.

Pediremos a Arduino que active su pin 13 como de salida digital y después encenderemos y apagaremos esta señal lo que hará que el LED que tiene conectado de serie se encienda o apague al ritmo que marquemos.

Para indicar al sistema que deseamos usar el pin 13 como salida digital utilizamos la instrucción:

pinMode ( 13, OUTPUT ) ;

El primer parámetro indica el pin a usar y “OUTPUT” es para usarlo como salida, y también podría usarse el valor “INPUT” para indicar que vamos a leer de este pin.

Estas definiciones se harán solo una vez al principio, en la función setup(). La nuestra quedará, con una única instrucción que declara que vamos a usar el pin 13 como salida digital:

     void setup()
          {
               // initialize the digital pin as an output
               pinMode( 13, OUTPUT) ;
          }
 
  • Es importante fijarse en que a pesar de ser una única instrucción, hemos delimitado el  bloque de esta función mediante abrir y cerrar llaves.
  •  Obsérvese que la instrucción finaliza en “ ;” . C++  obliga a acabar las instrucciones con un punto y coma que delimite la orden. Si se omite generará un error.
 

Para encender el LED usaremos la instrucción:

digitalWrite( 13 ,  HIGH) ;

Y otra instrucción similar que le ordena apagarlo:

digitalWrite( 13 ,  LOW) ;

El 13 indica el pin a utilizar y HIGH, LOW indican el valor que deseamos poner en esa salida, que en Arduino corresponden a 5V para HIGH y 0V para LOW.

 
  • Si en la función loop() escribiéramos estas dos instrucciones seguidas, Arduino cambiaría estos valores tan deprisa que no percibiríamos cambios, así que necesitamos frenarle un poco para que podamos percibir el cambio.
 

Para hacer este retraso de, digamos, un segundo, utilizaremos:

delay(1000) ;                       //  delay(n) “congela” Arduino n milisegundos

Por tanto para programar una luz que se enciende y se apaga, tendríamos que generar una secuencia de órdenes (Como en una receta e cocina) que hicieran:

 
  1. Informar a Arduino de que vamos a utilizar el pin13 para escribir valores( en el Setup).
  2. Encender el LED : Poner valor alto ( 5V) en dicho pin.
  3. Esperar un segundo.
  4. Apagar el LED: Poner valor bajo (0V) en dicho pin.
  5. Volver a esperar un segundo.
    • Si omitiéramos este segundo retraso, apagaría la luz y volvería a empezar encontrándose la orden de volver a encender. No apreciaríamos que se había apagado.(No espero que me creáis. Comprobadlo).
    • El procesador de Arduino UNO es muy lento desde el punto de vista electrónico, pero es capaz de conmutar la luz( pasar de encendido a apagado y vuelta a encender) unas 15.000 veces por segundo.
 

El primer concepto que tenéis que fijar, es que los ordenadores procesan las ordenes en secuencia, una instrucción después de otra y en el orden en que se las dais. Nuestro programa instruye al ordenador para que ejecute esas instrucciones y fija el orden en el que se ejecutan.

La forma de escribir un programa en Arduino C++ que haga lo anteriormente descrito es algo parecido a esto Descargar:

  void setup()
     {
         pinMode( 13 , OUTPUT); // Usaremos el pin 13 como salida
     }
void loop()
     {
        digitalWrite(13 , HIGH); // Enciende el LED
        delay(1000); // Esperar un segundo
        digitalWrite(13 , LOW); // Apagar el LED
        delay(1000); // Esperar otro segundo
    }
 
  • Nótese el sangrado de las líneas para destacar los bloques de código. Esto se considera buena práctica y os lo recomendamos encarecidamente, porque facilita mucho la comprensión del programa.
  • Cuando os equivoquéis ( y creadme, os vais a equivocar) el sangrado ayuda,y mucho, a visualizar el programa.
  • Solo hay dos tipos de programadores. Los que se equivocan y los que se van a equivocar
 

Solo nos falta ya, comprobar si hay errores y para ello pulsamos el icono en amarillo:

captura


Si todo va bien,( si no hay errores en rojo) podemos compilar y volcar con la siguiente flecha, En caso contrario ( y creedme que os pasará con frecuencia) habrá que revisar los posibles errores y corregirlos. Volveremos sobre esto en el futuro.

Captura

 

La flecha en amarillo  volcara nuestro programa al Arduino y podremos comprobar que la luz del pin 13 parpadea con un retraso de un segundo entre encendido y apagado.

 
  • Sugerencia: Si modificamos los valores del delay, modificaremos la cadencia del parpadeo.
  • Nota: Esto no funcionara con ningún otro Pin del Arduino UNO, porque solo el 13 tiene un LED conectado.
 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

    • El concepto clave de un programa, como secuencia de instrucciones que se ejecuta en el orden marcado.
    • Hay dos funciones básicas en todo programa Arduino: Setup() y Loop()..
    • Para delimitar un bloque de instrucciones usamos apertura y cierre de llaves..
    • Todas las instrucciones acaban en punto y coma (Aunque hay excepciones)…
    • Podemos usar comentarios usando // .
    • Hemos aprendido algunas instrucciones iniciales del Arduino C++.

 

 

 

 

(62) Comments

  • Buenas noches, acaban de regalarme una placa arduino UNO china.. y para hacer los primeros experimentos sin arriesgarme a quemar la placa (No tengo ni idea de electrónica) he comprado una de esas fuentes pequeñitas que se pinchan en la protoboard, una especie de cargador de móvil) que da 9v y 1A.. y unos ledes y cables. Las primeras dudas que me surgen son:

    1 – Es normal que la minifuente esa, de 4.79v.. y 3.18v ajustándola en 5 y 3.3 respectivamente? Lo he medido con el multímetro, (que tb es chino, como el resto de los componentes), y que midiendo otros voltajes conocidos como un puerto USB o el propio cargador ese que utilizo da los voltajes clavados, por lo que asumo que es razonablemente exacto)
    2 – Esa diferencia de voltaje puede acarrear algún tipo de problema con los ejercicios o no es relevante?
    3 – No os riais, pero lo primero que hice al recibir todo fue testear uno por uno los cables y los ledes, para descartar que hubiese alguno mal que me pudiese hacer la Pascua posteriormente al montarlo… Es habitual que fallen los cables y esos componentes o es una precaución innecesaria?
    4 – Hay algún tipo de procedimiento de inicio, algún programa como el Blinking Led este que trae cargado por defecto, que se pueda cargar y que realice un autochequeo de la placa, para saber si esta todo correcto después de una metedura de pata o al comprar una placa nueva? (Esta que me han dado es usada, y no huele a chamusco por ningun lado, peeero…)

    No se si estaré posteando estas dudas en el lugar adecuado del foro, de no ser asi, por favor indicadme cual sería el correcto.
    Agradezco de antemano la atención y la ayuda que me podais prestar, nunca había hecho nada con estos temas y me resultan muy interesantes, pero estoy mas verde que el sobaco de Hulk. Muchas gracias.

    • Hola Amncio, las dudas son siempre normales, pero tranqui que nos asaltan a todos
      No suele ser necesario probar cables y demas porque tu pequeño arduino aguanta mas de lo que parece a primera vista, por lo que yo iria bastante tranquilo con las pruebas. La lectura de salida de 4.7V me parece un poco baja porque deberia dar mas cerca de 5 pero he visto alguna de esas placas que no entregan toda la tension si no hay carga.
      Puedes probar a poner una resisten cia de 1K por ejemplo y hacer pasar la tension por ella a ver que resultado lees ahora, pero yo haria las pruebas bastante tranquilo

    • Lucas

    Hola me podrian ayudar con el problema que me aparecio ??? ya que no entiendo que es lo que tengo que hacer

    avrdude: ser_open(): can’t open device “\\.\COM1”: The system cannot find the file specified.

    Problem uploading to board. See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.

    • Hola Lucas, tienes que seleccionar el puerto al que está conectada la placa en la pestaña de herramientas del IDE.

  • Todo muy bien explicado, gracias. Así da gusto.

    • Nacho

    Hola soy Nacho y quisiera si es posible contactar en vivo con admin pues soy novato en arduino y no se nada de como programarel arduino250 para recrear el pane de mandos de un avión para flihgt simulator x te lo agradeciria muchisimo

    • Hola Nacho, lo mejor es que pongas tu proyecto en el foro y te echemos una mano entre todos. Un saludo.

  • Arduino:1.8.1 (Windows 10), Tarjeta:”Arduino/Genuino Uno”

    C:\Users\Carlos Etxeberria\Documents\Arduino\PROG0001\PROG0001.ino: In function ‘void setup()’:

    PROG0001:4: error: ‘output’ was not declared in this scope

    pinMode( 13, output);
    Hola tocayo, como ves he empezado a enredar, me aparece este mensaje y la verdad que cuando compruebo el programa parece estar igual que el del ejemplo, así que o se que puede ser. Entiendo que esa salida no esta activada o algo así.
    Gracias

    ^

    C:\Users\Carlos Etxeberria\Documents\Arduino\PROG0001\PROG0001.ino: In function ‘void loop()’:

    PROG0001:10: error: ‘high’ was not declared in this scope

    digitalWrite( 13, high);

    ^

    PROG0001:12: error: ‘low’ was not declared in this scope

    digitalWrite( 13, low);

    ^

    exit status 1
    ‘output’ was not declared in this scope

    Este reporte podría tener más información con
    “Mostrar salida detallada durante la compilación”
    opción habilitada en Archivo -> Preferencias.

    • Hola Txarli, el error viene porque tanto OUTPUT, como HIGH y LOW van en mayúsculas.Es importante tener en cuenta que se diferencia entre mayúsculas y minúsculas. Un saludo.

      • Canuro

      verifica la declaracion de las variables, osea que nombre les pusistes y ojo es el mismo que debes de usar en el programa, sino te saldra ese mensaje, otra cosa respeta la sintaxis del lenguaje de Arduino que basicamente es un C standar

    • Andre

    Arduino:1.8.0 (Mac OS X), Tarjeta:”Arduino/Genuino Uno”

    /Users/andrebolivar/Downloads/Arduino.app/Contents/Java/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld: /Users/andrebolivar/Downloads/Arduino.app/Contents/Java/hardware/tools/avr/bin/../libexec/gcc/avr/4.9.2/liblto_plugin.so: error loading plugin: dlopen(/Users/andrebolivar/Downloads/Arduino.app/Contents/Java/hardware/tools/avr/bin/../libexec/gcc/avr/4.9.2/liblto_plugin.so, 2): Symbol not found: _environ
    Referenced from: /Users/andrebolivar/Downloads/Arduino.app/Contents/Java/hardware/tools/avr/bin/../libexec/gcc/avr/4.9.2/liblto_plugin.so
    Expected in: /usr/lib/libSystem.B.dylib

    collect2: error: ld returned 1 exit status
    exit status 1
    Error compilación en tarjeta Arduino/Genuino Uno.

    • Andre, tiene toda la pinta de que has seleciconado mal la tarjeta arduino que usas

  • Hola:
    Acabo de iniciarme en esto y ya estoy tropezando.
    Tengo un Arduino UNO y cuando quiero cargarle cualquiera de los programas que vienen de ejemplo en el IDE me contesta con:

    “avrdude: no programmer has been specified on the command line or the config file
    Specify a programmer using the -c option and try again”

    ¿Me podéis ayudar? Y ya que estamos, otra pregunta: ¿Se puede descargar en IDE el programa que esté corriendo por un Arduino?

    Como podéis comprobar, un experto sí que no soy

    • Hola! No se puede sacar el programa que tiene cargado el Arduino al IDE. He mirado un pococ y parece que el problema que tienes se debe a alguna incompatibilidad con tu placa y la version de Arduino AVR Board. Prueba a actualizarla en “Herramientas->Placa->Gestor de tarjetas”. Saludos.

    • Aupa Iñaki,

      Por partes. Asegurate de que en el ide has seleccionado la tarjeta arduino uno o la que tengas y luego que has seleccionado tambien el puerto com correspondiente, y con eso deberia ser suficiente

      Cuando le pides a tu arduino que compile lo que has escrito, hay un programa debajo que traduce lo que escribes a un lenguaje especial binario que es lo que entiende tu arduino. Hay un program llamado compilador que hace eso, pero no existe un programa que haga la operacion a la inversa (no seria muy util) y por eso no puede haverse lo que nos preguntas

      No tengas miedo de aprender que todos hemos empezado en un momento

    • Miguel Leyva

    justo lo que esta buscando, mil gracias por este curso, ya quisiera mas profes asi en mi escuela.

  • hola amigo, si tienes razón solo quería saber si existe una librería!! gracias,
    j.

  • consulta, como puedo interpretar 1 hora en milisegundos ya que equivale a 3,600,000 milisegundo o sea como puedo simplificar? en ves de poner 1000 miliseundo yo quiero poner 1 hora tego que poner 3,600,000 milisegundo no ahi otra forma mas simple.
    saludos,
    j.

    • Hola Nuno, puedes utilizar la libreria Time para poder hacer cosas un poco mas complicadas como manejar horas dias y fechas, pero aun es un poco pronto si estas en el curso de incio ¿Vale?

  • hola amigo, ya pude!! tal vez fue que no copie bien el archivo!! pero ya funciona.

  • hola amigo, copie el archivo y me aparece un error —collect2.exe: error: ld returned 5 exit status—- que sera.
    saludos,
    j.

    • Nuno, copianos el error que te da completo y veremos que puede ser

  • Gracias por el curso! Me metí hace tiempo en el mundillo de arduino empezando la casa por el tejado; y ahora, gracias a estos cursos, puedo hacerlos de cero e ir cubriendo muchas lagunas que me había dejado.

    • Hola Gonzalo! Nos alegramos mucho de que te esté siendo útil, y si necesitas ayuda en algún punto no dudes en pedirla.

      Un saludote!

  • Hola, porque si le cambio los valores de la parte de delay, no se me modifica nada, parece que tarde lo mismo, y so que los cambio, los guardo, lo compilo y lo ejecuto, que peude estar pasando

    • Algo raro, porque deberia cambiar de inmediato. COmprueba todo porque algo esta fuera de lo debido

      • Yasmina

      Hola,

      A mi me pasa lo mismo…tengo seleccionada la placa “Arduino/Genuino Uno” y el puerto “/dev/cu.usbmodem431 (Arduino/Genuino Uno)”. Alguien lo ha conseguido resolver?

    • Juan

    Engancha, la parte electrónica no me asusta (30 años de profesión lo justifican) pero eso de programar nos viene grandes a algunos electrónicos, no pude con los PIC ni con sus sucesores. Pero esto gracias a sus explicaciones se me antoja digerible y comprensible. Magnífico trabajo.

    • Hola Juan , Animo que programar es mas faciul de lo que parece pero como para andar en bici requiere un poco de trabajo y hacer equilibrios. Te aseguro que no hay nada que no puedas comprender y dominar a pocas ganas que le pongas y los electronicos (Yo tambien soy del gremiso) tendemos a obviar la programacion pero veras que se complementan de maravilla

      Un saludo y bienvenido a nuestra pequeña comunidad

    • ANA FLORES

    HOLA, GRACIAS, EXCELENTE METODOLOGÍA, AUNQUE SOY ANALFABETA DIGITAL ENTENDÍ, LO QUE MOTIVA A CONTINUAR, MUY INTERESANTE

    • Bienvenida al club ana, enseguida veras que no hay ningun misterio y que si te gusta avanzaras enseguida

Responder a Ivan cancel reply

WordPress Anti-Spam by WP-SpamShield