Archivo de la etiqueta: Programación Visual

Programación Arduino

¿Qué es la programación/lenguaje de programación?:

El lenguaje de programación de Arduino es C++. No es un C++ puro sino que es una adaptación que proveniente de avr-libc que provee de una librería de C de alta calidad para usar con GCC (compilador de C y C++) en los microcontroladores AVR de Atmel y muchas utilidades específicas para las MCU AVR de Atmel como avrdude: https://learn.sparkfun.com/tutorials/pocket-avr-programmer-hookup-guide/using-avrdude

Las herramientas necesarias para programar los microcontroladores AVR de Atmel son avr-binutils, avr-gcc y avr-libc y ya están incluidas en el IDE de Arduino, pero cuando compilamos y cargamos un sketch estamos usando estas herramientas.

Aunque se hable de que hay un lenguaje propio de programación de Arduino, no es cierto, la programación se hace en C++ pero Arduino ofrece unas librerías o core que facilitan la programación de los pines de entrada y salida y de los puertos de comunicación, así como otras librerías para operaciones específicas. El propio IDE ya incluye estas librerías de forma automática y no es necesario declararlas expresamente. Otra diferencia frente a C++ standard es la estructuctura del programa que ya hemos visto anteriormente.

Toda la información para programar Arduino se encuentra en el reference de la web de Arduino: https://www.arduino.cc/en/Reference/HomePage. Este es el core o API de Arduino.

Lenguaje de programación C++

Es posible usar comandos estándar de C++ en la programación de Arduino siempre que estén incluidos en el avr libc:

Características de C:

  • Es el lenguaje de programación de propósito general asociado al sistema operativo UNIX.
  • Es un lenguaje de medio nivel. Trata con objetos básicos como caracteres, números, etc… también con bits y direcciones de memoria.
  • Posee una gran portabilidad
  • Se utiliza para la programación de sistemas: construcción de intérpretes, compiladores, editores de texto, etc

Un buen libro de referencia para C:

Y un libro que se puede descargar gratuitamente Essential C: http://cslibrary.stanford.edu/101/EssentialC.pdf

Por supuesto en Internet hay muchas webs de referencia donde consultar dudas a la hora de programar en C++:

C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.

Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma. Actualmente existe un estándar, denominado ISO C++.

C# es un lenguaje propietario de Microsoft que mezcla las características básicas de C++ (no las avanzadas) simplificandolas al estilo Java y ofreciendo un framework. C# forma parte de la plataforma .NET

Elementos básicos en la programación de Arduino

Un manual sencillo de entender para la programación es el “arduino programming notebook” de brian w. Evans. Puedes consultarlo o descargarlo desde:

Cuando compilamos y cargamos el programa en Arduino esto es lo que ocurre:

{} entre llaves

Las llaves sirven para definir el principio y el final de un bloque de instrucciones. Se utilizan para los bloques de programación setup(), loop(), if.., etc.

Una llave de apertura “{“ siempre debe ir seguida de una llave de cierre “}”, si no es así el compilador dará errores. El entorno de programación de Arduino incluye una herramienta de gran utilidad para comprobar el total de llaves. Sólo tienes que hacer click en el punto de inserción de una llave abierta e inmediatamente se marca el correspondiente cierre de ese bloque (llave cerrada).

Usando programación mediante bloques las llaves no son necesarias ya que todo lo que está dentro de un bloque ejecutar, es lo que va entre llaves.

; punto y coma

El punto y coma “;” se utiliza para separar instrucciones en el lenguaje de programación C. También se utiliza para separar elementos en una instrucción de tipo “bucle for”.

Nota: Si olvidáis poner fin a una línea con un punto y coma se producirá en un error de compilación.

/*… */ bloque de comentarios

Los bloques de comentarios, o comentarios multi-línea son áreas de texto ignorados por el programa que se utilizan para las descripciones del código o comentarios que ayudan a comprender el programa. Comienzan con / * y terminan con * / y pueden abarcar varias líneas.

Debido a que los comentarios son ignorados por el compilador y no ocupan espacio en la memoria de Arduino pueden ser utilizados con generosidad.

En Visualino no es posible poner comentarios.

// línea de comentarios

Una línea de comentario empieza con / / y terminan con la siguiente línea de código. Al igual que los comentarios de bloque, los de línea son ignoradas por el compilador y no ocupan espacio en la memoria. Una línea de comentario se utiliza a menudo después de una instrucción, para proporcionar más información acerca de lo que hace esta o para recordarla más adelante.

Guia de Estilo de programación

A la hora de programar Arduino, es fundamental usar la referencia que disponemos online en http://arduino.cc/en/Reference/HomePage o en la ayuda del IDE de Arduino. Cualquier duda sobre un comando, función, etc… debemos consultar en la referencia de Arduino.

Existe una guía de estilo para escribir código claro de Arduino y que sea fácil de entender. No es obligatorio, pero es una recomendación:

  • Documentar al máximo
  • Usar esquemas
  • Predominar la facilidad de lectura sobre la eficiencia del código
  • Poner el setup() y loop() al principio del programa
  • Usar variables descriptivas
  • Explicar el código al principio
  • Usar identación

Guia de estilo: http://arduino.cc/en/Reference/StyleGuide

También disponemos de varias cheat sheets o chuletas para cuando se empieza a programar:

Una buena guía de estilo de C++: http://informatica.uv.es/iiguia/AED/laboratorio/Estilocpp.pdf

Para documentar nuestros sketchs: http://busyducks.com/wp_4_1/2015/11/16/ascii-art-arduino-pinouts/

Anuncios

Construcción y Programación de Robot Minisumo

Este tutorial de construcción y programación de un robot minisumo para competiciones de minisumo está motivado por el Taller de construcción de Robot Minisumo celebrado el 15 de marzo del 2019 en el CEIP Obispo Blanco dentro del Arduino Day 2019 de Logroño https://www.aprendiendoarduino.com/talleres-arduino/arduino-day-logrono-2019/ y el posterior taller de perfecionamiento celebrado el 9 de mayo en el Área UR-Maker de la Universidad de La Rioja

Con el objetivo de acercar la robótica y la programación a los niños, proponemos un taller donde fabricar y programar un robot de sumo autónomo. El hardware y el software para fabricarlo y programarlo es libre y abierto. Los robots de sumo competirán por pares en un dohyo (tablero circular). El robot ganador será el que logre sacar a su contrincante fuera del dohyo.

También aprovechamos este taller para preparar los robots de minisumo para la competición en el 1er encuentro maker en tierra de Estella: https://encuentromaker.dictelweb.org/

Repositorio github de este tutorial: https://github.com/jecrespo/Robot-MiniSumo

Robots Minisumo

Este robot minisumo ha sido diseñado desde cero nos hemos basado en este robot: https://www.instructables.com/id/SimpleSumo-Educational-Fighting-Robots/

Se ha simplificado al no tener brazos ni botones de sensores de pulsación. El diseño 3D se ha rehecho desde el principio. Se trata de un fork del SimpleSumo robot kit https://www.instructables.com/id/SimpleSumo-Educational-Fighting-Robots/

Existen muchos tutoriales de robots minisumo como:

Reglas Competiciones Minisumo

Para un conjunto de reglas serias ver: Unified Sumo Robot Rules

Para un conjunto de reglas divertidas de leer ver: fully illustrated guide to robot sumo rules

Más enlaces con reglas de competiciones de robots sumo en español:

Lista de Materiales

Los materiales deben ser iguales o similares en dimensiones para encajar en el diseño del chasis:

Coste Aproximado Materiales Robot Minisumo: 20€

Construcción Robot

El chasis impreso en 3D consiste en dos piezas, en la pieza inferior se coloca el portapilas y los tres sensores IR TCRT5000 sujetos con tornillos. Luego se colocan los dos servos con las ruedas y el sensor de distancia ultrasónico HC-SR04 en los huecos a tal efecto.

Sobre la pieza superior se coloca la placa de expansión de Arduino nano y el Arduino ya instalado.

Una vez todo colocado, se conectarán los cables usando los jumpers dupont.

La parte principal para las conexiones es la Arduino Nano Expansion Board. Esta placa dispone de una expansión de los puertos del Arduino Nano junto con un pin de VCC y otro de GND para cada pin del Arduino.

Buena explicación de la expansion board: http://dyor.roboticafacil.es/en/arduino-intro/

Datasheet: https://roboticafacil.es/datasheets/nano_io_shield.pdf

Arduino nano data sheet:

Otro modelo de placa:

Conexionado de Placa y Dispositivos

Conexiones:

Dispositivo Pin Arduino
Sensor Suelo IR Izquierdo 2
Sensor Suelo IR Derecho 3
Sensor Suelo IR Trasero 4
Sensor Ultrasónico Distancia 5 (Trigger), 6 (Echo)
Servo Rueda Derecha 9
Servo Rueda Izquierda 10
Buzzer 12

Esquema Fritzing:

Imagen en Github: https://github.com/jecrespo/Robot-MiniSumo/blob/master/Robot%20Minisumo%20Sketch_bb.jpg

Esquema en Github: https://github.com/jecrespo/Robot-MiniSumo

Ejemplo parecido donde obtener algunas partes de Fritzing: http://fritzing.org/projects/bender-dyor

Programación por Bloques

Para programar el robot minisumo usaremos mBlock: http://www.mblock.cc/mblock-software/

Existen varias opciones:

Para la programación se ha usado la versión 3.4.12 de mBlock y no ha sido necesario instalar ninguna extensión.

Para programar es necesario usar el modo Arduino, que se selecciona desde edit – Arduino Mode. Si se usa un Arduino Nano, en boards poner Arduino UNO, si se selecciona Nano (mega328) no funciona.

En caso que no cargue, comprobar si el Arduino Nano tiene el bootloader viejo, en ese caso habrá que actualizar el bootloader o sino usar el IDE de Arduino y usar el bootloader antiguo como se explica en el siguiente punto.

Los códigos en mBlock usados se pueden encontrar en: https://github.com/jecrespo/Robot-MiniSumo/tree/master/Firmware%20mBlock

La primera parte de la programación es hacer las funciones básicas y ponerlas todas en un código de test que compruebe que funcionen los motores y todos los sensores y buzzer.

Funciones básicas a programar:

  • Marcha adelante
  • Marcha Atrás
  • Gira derecha
  • Gira Izquierda
  • Para
  • Pita (se pueden hacer diferentes tonos para identificar qué hace, por ejemplo inicio, detecta linea, detecta oponente, etc…)
  • Detecta distancia
  • Detecta linea (diferencia entre derecha, izquierda y trasero)

Los bloques de funciones básicas quedan así:

En mi caso en lugar de poner 0 y 180 para máxima velocidad de los servos (giro izda. y dcha.) he puesto 15 y 165 que funciona mejor.

El código de prueba es:

Este código comprueba el correcto funcionamiento de los motores y los movimientos, así como el buzzer y los sensores IR de suelo y el sensor de distancia ultrasónico.

Fotos

Frontal:

Lateral

Trasera

Bajo

Programación en las Escuelas

Una de las grandes ventajas en llevar a cabo proyectos con Arduino, aparte de su sencillez y las enormes posibilidades de comunicar e interaccionar con los objetos, es que podemos utilizar un buen surtido de herramientas de programación gráfica con lo que nos ahorraremos bastante tiempo durante el aprendizaje y el diseño del software.

En este taller hemos optado por centrarnos: mBloq, Snap4Arduino y Visualino.

Dirigido a:

  • Profesores que tengan que abordar la programación de Arduino con sus alumnos en los niveles de ESO, Bachillerato, Formación Profesional y Universidad.
  • Alumnos que estudien la plataforma Arduino y sus aplicaciones.
  • Aficionados y entusiastas de Arduino.
  • Artistas y diseñadores que trabajen con Arduino.
  • Interesados en las aplicaciones educativas y de interacción con Scratch.

Cada vez hay más defensores de enseñar programación en la educación obligatoria por mil motivos, pero especialmente porque va a ser difícil entender el mundo digital que estamos viviendo y que viene sin conceptos de programación, y además porque este es uno de los puntos que más se atascan en algunos centros: ¿Programación, de acuerdo… pero qué?

Por debajo de los 14 -15 años, prima aprender a programar jugando y definitivamente con un sistema de bloques: Scratch, Scratch for Arduino S4A, App inventor y similares y hasta mBlock. Todos estos lenguajes están basados en una lógica de bloques de colores que encajan o no entre sí de modo que se va completando una secuencia de operaciones clara, que representa el programa que cargaremos en el sistema de ejemplo.

Sea cual sea de los diferentes lenguajes el que se elija depende mucho del gusto del profesor y de los objetivos del centro, pero la razón básica de estos lenguajes es enseñar al alumno a pensar en los conceptos de programas secuenciales. Y es eso se consigue con cualquiera de ellos.

Parece que hay un acuerdo de empezar por Scratch que puede correr en un PC cualquiera, a partir de unos 8 años (antes puede usarse sea Makey Makey) e ir poco a poco incorporando conceptos como la programación de móviles Android con App Inventor e ir después a Arduino con S4A (Scratch for Arduino) porque es una manera muy sencilla de iniciarse no solo ya con la programación, sino también con la relación de los programas y el mundo físico.

Cuando vayamos acercándonos al final de la educación básica, la robótica con mBlock se ajusta magníficamente a todos estos conceptos y nos permitirán fijar ideas básicas de múltiples conceptos de un modo natural al ver los robots moviéndose. mBlock es ideal para todos los temas de robótica y es el paso siguiente a Scratch.

Una cuestión clave en todo esto es que parece haber un consenso general por ahí de no iniciar en C++ con Arduino a los chavales antes de los 14-15 años. La programación simbólica mediante frases propia de los lenguajes de alto nivel, no parece encajar con el desarrollo promedio de las personas de esta edad.

Más información: https://www.prometec.net/formacion-en-tecnologia-y-robotica-i/

Operadores

Un operador es un elemento de programa que se aplica a uno o varios operandos en una expresión o instrucción. Un operador, es un símbolo que indica al compilador que se lleve a cabo ciertas manipulaciones matemáticas o lógicas.

Los operadores son símbolos que representan una operación como las básicas de suma, resta, multiplicación y división, (+, -, *, /) existen las booleanas (true y false) para las operaciones de comparación como AND, O, NOT, o las de comparación ==, !=, =, que son muy utilizados en las instrucciones de tipo if.

Aritméticos

Los operadores aritméticos que se incluyen en el entorno de programación son suma, resta, multiplicación, división, módulo y asignación. Estos devuelven la suma, diferencia, producto, cociente o resto (respectivamente) de dos operandos.

La operación se efectúa teniendo en cuenta el tipo de datos que hemos definido para los operandos (int, double, float, etc..), por lo que, por ejemplo, si definimos 9 y 4 como enteros “int”, 9 / 4 devuelve de resultado 2 en lugar de 2,25 ya que el 9 y 4 se valores de tipo entero “int” (enteros) y no se reconocen los decimales con este tipo de datos.

Esto también significa que la operación puede sufrir un desbordamiento si el resultado es más grande que lo que puede ser almacenada en el tipo de datos. Recordemos el alcance de los tipos de datos numéricos explicado anteriormente.

Si los operandos son de diferente tipo, para el cálculo del resultado se utilizará el tipo más grande de los operandos en juego. Por ejemplo, si uno de los números (operandos) es del tipo float y otra de tipo integer, para el cálculo se utilizará el método de float es decir el método de coma flotante y el resultado será un float..

Elegir el tamaño de las variables de tal manera que sea lo suficientemente grande como para que los resultados sean lo precisos que deseamos. Para las operaciones que requieran decimales utilizar variables tipo float, pero hay que ser conscientes de que las operaciones con este tipo de variables son más lentas a la hora de realizarse el cómputo.

En Visualino podemos encontrar los operadores aritméticos en el apartado “Math”

Compuestos

Las operadores compuestos combinan una operación aritmética con una variable asignada. Estas son comúnmente utilizadas en los bucles tal como se describe más adelante. Estas asignaciones compuestas pueden ser:

En Visualino no hay operadores compuestos.

Comparación

Operadores de comparación. Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las estructuras condicionales del tipo if, while, etc.. para testear si una condición es verdadera.

En Visualino los operadores de comparación están en el apartado de “Logic”

Booleanos

Los operadores lógicos o booleanos son usualmente una forma de comparar dos expresiones y devuelve un VERDADERO o FALSO dependiendo del operador. Existen tres operadores lógicos, AND (&&), OR (||) y NOT (!), que a menudo se utilizan en estamentos de tipo if.

En Visualino los operadores booleanos están en el apartado de “Logic”

Curiosa forma de explicar las operaciones lógicas mediante un vídeo: http://es.gizmodo.com/las-funciones-de-los-circuitos-brillantemente-explicad-1570812992

Otras funciones disponibles en el core de Arduino

Conclusión

Un resumen de los operadores en C /C++ y más información:

Programación Visual con Visualino

Visualino es un entorno de programación visual que me permite hacer un programa con bloques tipo scratch y ver el código que se genera.

Al contrario que S4A y mBlock, Visualino está solo centrando en la programación de Arduino con un lenguaje de programación por bloques, como se de un traductor de bloques a código se tratara. Pero además, permite programar directamente la placa de Arduino y por tanto, hace innecesaria la conexión permanente al PC.

Los bloques generan el código de C/C++ en tiempo real en una ventana. El entorno es similar al del IDE de Arduino, con las mismas opciones principales: Verificar, Subir, Guardar, Cargar y Monitor.

Visualino ha sido creado por Víctor Ruiz: http://rvr.linotipo.es/

Visualino está basado en blockly de Google al igual que bitBloq http://bitbloq.bq.com/ de BQ: https://developers.google.com/blockly/

Web del proyecto: http://www.visualino.net/

Código fuente: https://github.com/vrruiz/visualino/

Descargar: http://www.visualino.net/downloads/

Tutorial de uso: http://procomun.educalab.es/es/ode/view/1453974406581

Foro: http://www.visualino.net/forum/

Tutoriales de uso:

Más información

Instalación Visualino

Como instalar Visualino: http://www.visualino.net/docs/windows.es.html

Visualino necesita el Arduino IDE para transferir los programas a la placas de Arduino, para ello es necesario configurar la ruta del IDE de Arduino en Visualino.

Una configuración importante es la ruta del IDE de Arduino. Esta es la ruta al fichero ejecutable (EXE) que Visualino llamará para compilar y transferir los programas a las placas de Arduino. Si este fichero ejecutable no se encuentra, no podrá programar las placas, así que tenga cuidado.

En windows la ruta por defecto es: C:\Program Files (x86)\Arduino\arduino.exe

Entorno de programación:

Bloques en Visualino

Visualino dispone de 12 bloques divididos de la siguiente forma:

  • Functions: para definir y llamar a funciones.
  • Control: estructuras de control if, switch, while, etc…
  • Logic: operaciones lógicas
  • Math: operaciones aritméticas y matemáticas
  • Variables: declaración, uso y asignación de variables
  • Text: uso y manipulación de Strings
  • Communication: uso del puerto serie y módulo bluetooth
  • Zum bloqs: manejo de los módulos de bq https://www.bq.com/es/zum-kit
  • Octopus bloqs: manejo de más módulos de bq
  • Pin functions: uso de las entradas y salidas analógicas y digitales
  • LCD bloqs: manejo de los módulos o pantallas LCD
  • Servo: para manejar servos tanto normales como de rotación continua

LCD bloqs

Communications:

Servo:

Ejercicios

Hacer el ejemplo de blink con Visualino y comparar el código con el de la práctica https://aprendiendoarduino.wordpress.com/2017/06/18/primer-proyecto-blink-3/

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio01-Visualino-Blink

Hacer la versión mejorada del blink enviando al puerto serie el estado del led.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio02-Visualino-Blink_Mejorado

Otros ejemplos con Visualino: