9 Programación con código (avanzado)


Ojo: Tres cosas

Te cargas el firmware

Si te pasas a la programación por código te cargas el firmware pues grabas tu programar en el Arduino del Echidna.

Ponlo en modo sensor

Nota: Acuérdate de poner la Echidna en modo Sensor, es decir Echidna no trabaja en modo MkyMky

Tienes que saber algo de código

Este curso no pretende ser una formación en código Arduino IDE, sino que tienes que saber ya los conceptos básicos. Sólo pretende que sepas como utilizar tus conocimientos de código en el Echidna

Entorno de programación de Arduino

Necesitarás el entorno de desarrollo Arduino IDE (IDE, Integrated development environment) (aquí https://www.arduino.cc/en/Main/Software para descargártelo)

OJO, existe la versión online del editor https://create.arduino.cc/editor.
Es una buena solución si trabajas en varios equipos y quieres que tus proyectos estén disponibles en cualquier equipo.
ATENCION para usar la versión online, tienes que instalar en tu ordenador el software AGENT
https://create.arduino.cc/getting-started/plugin/welcome


En Linux puede salir este mensaje "can't open device "/dev/ttyUSB0": Permission denied" donde 0 puede ser otro número, la solución aquí

Está constituido por un editor de texto para escribir el código, un área de mensajes, una barra de herramientas con botones para las funciones comunes, y una serie de menús.

Arduino utiliza para escribir el código fuente o programa de aplicación lo que denomina "sketch" (programa). Estos programas son escritos en el editor de texto. Existe la posibilidad de cortar/pegar y buscar/remplazar texto.

Permite la conexión, por USB, con el hardware de Arduino para cargar los programas y comunicarse con ellos.

Y permite varias placas, tenemos que elegir la nuestra, en el KIT de CATEDU es Arduino UNO pero si tienes otro modelo este curso seguro que puede ser válido:

En el área de mensajes se muestra información mientras se cargan los programas y también muestra errores.

Lo importante es cuando pinchemos en la flecha de subir nuestro programa, no salga ningún error, sino simplemente "Subido".

¿Cómo se programa Arduino?

Las partes principales de un programa hecho en Arduino son: Bloque de inclusión de módulos y declaración de variables, bloque de configuración void setup() donde se indica el modo de funcionamiento de los pines (entrada y salida), comunicación serie, etc... y bloque de ejecución continua void loop(), en este bloque se incluyen las acciones que queremos que realice el programa. Se ejecutará línea a línea de forma secuencial y continua. Cuando llegue a la última instrucción incluída en la función loop() volverá a ejecutar la primera y continuará en un bucle infinito.

¿Arduino tiene que estar continuamente conectada a un ordenador?

Sólo es necesario que esté conectado al ordenador mediante el USB para cargar los programas o para visualizar en tiempo de ejecución datos del programa mediante la consola serie. El ordenador proporciona la energía eléctrica suficiente para que funcionen los programas, pero una vez cargado el programa en la memoria del microcontrolador de Arduino se puede desconectar del USB y alimentar a la tarjeta mediante una fuente externa mediante el jack de alimentación con un margen de (5 a 20 Voltios). El programa cargado en Arduino queda grabado permanentemente aunque cese el suministro eléctrico.

Para una mayor información y manejo de la instalación del entorno de programación, lenguaje de programación y librerías se encuentra en la página web de la comunidad Arduino:

Semáforo

Tal y como hemos comentado, tienes dos formas de ejecutar el programa Arduino IDE, o descargándote el programa o online

La placa que tienes que seleccionar es Arduino UNO aunque si estas utilizando Echidna Black puedes seleccionar Arduino nano, no obstante no pasa nada si seleccionas Arduino Uno

Vamos a realizar un programa que sea un simple semáforo (secuencias de luces rojo-amarillo-verde en bucle cada 2seg) y además que muestre por el puerto serie (para practicar esta opción) el estado del semáforo.

El programa es sencillo, lo tienes desarrollado aquí

https://app.arduino.cc/sketches/6705568b-32f2-43ca-a7f8-25d0fcd72bf8?view-mode=preview

Y puedes ver que además de encender las luces, por el puerto serie salen los mensajes correspondientes

Semáforo sonido

Vamos a practicar con el semáforo y con la lectura de una variable analógica como es el micrófono conectado a A7 cuyos valores van de 0-1023.

Realizar un programa que :
- si el valor del sonido es menor de 2 ninguna luz esta encendida
- si es entre 2-200 solo el verde
- si es entre 200-400 entonces verde y amarillo
- si es más de 400 entonces todos

Solución aquí https://app.arduino.cc/sketches/8ceb4e52-0447-4968-b2bb-8720de847248?view-mode=preview

¿Te atreves a ...?
Realizar un programa que haga lo mismo pero con la temperatura (los valores límites de encendido y apagado de las luces dependen de la temperatura de trabajo)

Pulsador y leds

Vamos ahora a realizar un código que si pulso el botón D2 entonces las tres luces del semáforo se encienden

El código lo tienes aquí

https://app.arduino.cc/sketches/16b618d5-af1f-425c-8279-7be1b98d8a0f?view-mode=preview

Como puedes ver no es necesario tener el ordenador conectado puedes conectarlo a un PowerBank pues no hay comunicación con el puerto serie y el programa se carga en la placa

Señales PWM

Arduino, ESP32, Micro:bit, PicoW...  tienen entradas analógicas y digitales. Pero salidas sólo digitales.

Para simular una salida analógica entre 0V y 5V  se utilizan señales digitales PWM. En Arduino sólo tiene 6 salidas pseudo-analógicas. En los pines digitales 3, 5, 6, 8, 10 y 11 son PWM

¿Qué es eso de PWM? La señal PWM (Pulse Width Modulation, Modulación de Ancho de Pulso) es una señal que utiliza el microcontrolador para generar una señal continua sobre el proceso a controlar. Por ejemplo, la variación de la intensidad luminosa de un led, el control de velocidad de un motor de corriente continua,...

Para que un dispositivo digital, microcontrolador de la placa Arduino, genere una señal continua lo que hace es emitir una señal cuadrada con pulsos de frecuencia constante y tensión de 5V. A continuación, variando la duración activa del pulso (ciclo de trabajo) se obtiene a la salida una señal continua variable desde 0V a 5V.

Veamos gráficamente la señal PWM:

Los pines digitales de la placa Arduino que se utilizan como salida de señal PWM generan una señal cuadrada de frecuencia constante (490Hz), sobre esta señal periódica por programación podemos variar la duración del pulso como vemos en estos 3 casos:

Ejemplo en código ArduinoIDE y Arduino
Para ejecutar una señal PWM, es simplemente analogWrite(analogOutPin, outputValor); donde analogOutPin es el número del Pin PWM, acuérdate que sólo puede ser uno de estos 6 : 3, 5, 6, 8, 10 y 11 y outpuValor es el valor de la señal PWM pero ojo desde 0 a 255 es decir si quieres el valor de 0V tienes que poner 0, si quieres el valor de 5V tienes que poner 255 y si quieres poner un valor medio, haz una regla de tres, por ejemplo 2.5V tienes que poner 255/2=127 o 128 da igual
Otro ejemplo en Python con Micro:bit
pin16.write_analog(brillo) donde brillo puede ir de 0 a 255

Intensidad del led verde según joystick

Vamos a utilizar la salida D11 que es PWM (led verde) para modular una señal PWM, para ello vamos a utilizar la entrada analógica del eje x del Joystick, en A0 para modularlo

Mapear un valor

Como uno lee 0 a 1024 y el otro necesita valores de 0 a 255 necesitamos un traductor o mapeo con la instrucción map(value, fromLow, fromHigh, toLow, toHigh) esta instrucción la colocaremos, como suele estar los intérpretes en medio, o sea, entre la instrucción analogRead y la analogWrite

Solución con map

https://app.arduino.cc/sketches/491021f3-fbd8-498f-99a1-1a5ff02a441d?view-mode=preview

Como puedes ver, en el puerto serie, los valores del potenciómetro del Joystick ejeX van desde 0 a 1024 y gracias al mapeo la señal PWM va desde 0 a 255

¿Se puede hacer sin la instrucción map?

Sí. Para ello el valor que lee 0-1024 lo convertimos a 0-255 que necesita la señal PWM que enviamos al LED simplemente dividiéndolo entre 4. (1024/4 = 256 aproximadamente 255)

El bucle loop() quedaría :

void loop() {
  // lee el valor de la entrada analogica:
  potValor = analogRead(analogInPin);
  // mapea el rango para la señal de salida PWM:
  outputValor = potValor/4;
  // asigna el valor cambiado a pin 3 PWM:
  analogWrite(analogOutPin, outputValor);

  // escribe el resultado en el monitor serie:
  Serial.print("Potenciometro = " );
  Serial.print(potValor);
  Serial.print("\t PWM = ");
  Serial.println(outputValor);

  // espera 1 segundo cada bucle para una visualizacion aceptable
  // conviene tener un valor aunque sea pequeño (10ms)
  // por el proceso de conversion de A/D
  delay(10);
}

Intensidad del led verde según la luz en LDR

Ahora para practicar más los conceptos anteriores

Vamos a modificar la luz del led verde según la luz recibida en el LDR pero al revés cuanto más luz reciba el LDR más se apaga el led verde y al revés cuanto menos luz reciba el led LDR más brilla el led verde

Aquí vamos a tomar como valores mínimos y máximos del LDR los valores 250 de mínimo y 1.000 de máximo. Esto lo puedes comprobar en los valores del puerto serie que se visualizan en el siguiente programa. El por qué más adelante.

Como va al revés, la instrucción map será así  luz = map(analogRead(ldr), 250, 1024, 255, 0);

https://app.arduino.cc/sketches/adb0c4b8-c7b5-478f-b902-392674372159?view-mode=preview

Como puedes ver el brillo de la luz verde va al revés de la luz recibida en el LDR

¿Por qué el LDR va de 250 a 1.024 en vez de 0 a 1.024?

Esto es debido al que el LDR no está directamente conectado a masa, sino a través de un divisor de tensión con una resistencia de 4.7kOhm que se queda algo de tensión. Lo puedes comprobar en los planos aquí https://github.com/EchidnaShield/Recursos/blob/master/electronica/Black/EchidnaBlack_0_ESQ.pdf

2025-01-04 00_34_57-Recursos_electronica_Black_EchidnaBlack_0_ESQ.pdf at master · EchidnaShield_Recu.png

Pitido

Vamos a experimentar con el buzzer, con un simple enunciado

Realizar un programa que suene una "alarma" es decir, que haga un pitido intermitente de 1 segundo

La solución la tienes aquí: https://app.arduino.cc/sketches/4c7a18bb-5012-499e-a353-6916182e728d?view-mode=preview

Acuérdate de subir el volumen, en el potenciómetro !!

¿Te atreves,,,?
A acompañar el pitido con intermitencias de luces, por ejemplo el RGB que pase de luz máxima (255,255,255) a apagado al compás del pitido, para dar el efecto real de alarma
Pista: La tienes en ¿Y Makey Makey? Estoy harto que me roben las naranjas

Servomotores

Una de las aplicaciones más utilizadas de los sistemas de control por ordenador y en la robótica están asociados con los motores, que permiten accionar o mover otros componentes, como puertas, barreras, válvulas, ruedas, etc. Uno de los tipos que vamos a ver en este capítulo son lo servos, hay de dos tipos:

Por defecto cuando se dice servo, es un servomotor o servo convencional

Servos de rotación continua

Para controlar un servo de rotación continua, las instrucciones a realizar son :

Mira el vídeo, esta realizado con otra shield ECHIDNA y con bloques mBlock (curso Echidna  https://libros.catedu.es/books/echidna/ ) fíjate como:

Si quieres saber más sobre servomotores te recomendamos estas paginas del Zaragozano Luis LLamas: Servomotores convencionales y Servomotores de rotación continua

Servomotores o servos convencionales

Los servos son un tipo especial de motor en el que se añade una circuito lógico electrónico que permite un control mucho más preciso que a un motor normal de corriente continua. Esto les permite posicionar el eje en un ángulo determinado. 

El hardware interno se compone de un potenciómetro y un circuito integrado que controlan en todo momento los grados que gira el motor. De este modo, en nuestro caso, desde Arduino, usando las salidas digitales PWM podremos controlar fácilmente un servo. Lo ideal es conectarlo a 6V pero trabajan bien en los 5V del Arduino.

Hay muchos modelos, en robótica educativa cuestan entre 1-5€, el más común es el SG90, muy barato, pero tiene muy poca fuerza, el MG90S tiene algo más, si queremos algo más, ya tiene que ser el  MG996R pero ya este modelo NO se puede conectar directamente al Arduino o Raspberry, el pico de energía que necesita, provoca el reinicio de la placa. Incluso varios pequeños SG90.

Las instrucciones son las mismas que los servos de rotación continua, pero los valores que se proporcionan son los grados que se desean. 

La instrucción myservo.write(angulo) envía por el pin digital declarado en myservo.attach() pulsos cuadrados de 50Hz y de anchura el estado alto proporcional al ángulo que se desea.

Si quieres saber más, te recomendamos https://www.luisllamas.es/controlar-un-servo-con-arduino/

Arduino Servomotor by Marco De Simone on Sketchfab

Ángulo del servo según Joystick

Para practicar un poco los servos, vamos a realizar el siguiente enunciado

Mover el servomotor un ángulo entre 0º y 180º según los valores del Joystick en el ejeY, 0º abajo del todo, 180º arriba del todo

Aquí hay que tener claro que los valores de entrada es el Joystick eje Y por lo tanto es la señal analógica A1 y sus valores van de 0 a 1023, y al servo hay que indicarle los valores en grados de 0º a 180º luego la función de mapeo es:   val = map(val, 0, 1023, 0, 180); donde val va a ser una variable que ha guardado el valor del Joystick (0-1023) y que con la instrucción map lo ha traducido a 0-180.

El programa es https://app.arduino.cc/sketches/29ac0e0b-8da8-482b-bf62-6f90a58f2459?view-mode=preview

Si no tienes servo, puedes simularlo. En la siguiente simulación, puedes mover el potenciómetro y ver el resultado

¿Te atreves...?
A realizar un programa que mueva el servo según la inclinación de la placa

¿Y Makey Makey? Estoy harto que me roben las naranjas

¿Podemos hacer proyectos Makey Makey? Por supuesto, pero....

Ponlo en modo Makey Makey

Nota: Acuérdate de poner la Echidna en modo Makey Makey, y luego acuérdate de cambiarlo si vuelves a utilizar los sensores

Estoy harto que me roben las naranjas

Vamos a hacer un programa que suene una alarma (tanto sonora como luminosa en RGB) si tocamos una naranja, conectada en el terminal Makey Makey A0

La solución la tienes aquí : https://app.arduino.cc/sketches/b043d527-bf50-476a-ac61-c537d820f261?view-mode=preview

.

¿Por qué no va 100% bien?

Porque no estamos tocando la masa del Echidna. Si con la otra mano estuviésemos tocando con un cable la masa del Echidna, entonces iría perfecto:

2025-01-04 12_09_03-Echidna Black - Echidna Educacion.png

P: ¿Por qué funciona? Funciona en el primer toque y luego no ¿Por qué?
R: La primera vez que tocamos la naranja se descarga nuestra electricidad estática y lo lee el terminal A0 del Echina, por lo que sube su valor, luego ya baja.

Esto lo puedes comprobar leyendo los valores del puerto serie, si te fijas en el siguiente vídeo, al tocar con el dedo, sube a 195, 158 pero luego cuando se ha descargado la electricidad, ya baja él sólo.

Si con otra mano tocase la masa, no pasaría eso.

¿Te atreverías a hacer un piano con bananas ? https://libros.catedu.es/books/echidna/page/montaje-11-piano

Bluetooth I Un poco de teoría

ONDAS

Una onda es una señal que se propaga por un medio. Por ejemplo el sonido, que es una onda mecánica que viaja usando el aire o cualquier otro material. Pero en el caso de las señales eléctricas pueden ser enviadas por el cable o a través del vacío (no necesitan un medio para transmitirse).

Dependen de 3 parámetros principalmente:

La relación entre ellas es muy fácil pues las ondas electromagnéticas viajan a la velocidad de la luz c y si velocidad es espacio/tiempo luego c = λ/T luego c= λ*f

Dentro del espectro electromagnético encontramos diferentes tipos de señales dependiendo de las características de su onda.

TRANSMISIÓN INALÁMBRICA: BLUETOOTH.   

¿Sabias que?
Su curioso nombre viene de un antiguo rey Noruego y Danés, y su símbolo, de las antiguas ruinas que representan ese mismo nombre. 

Hay 3 clases de bluetooth que nos indican la máxima potencia a la que emiten y por tanto la distancia máxima que podrán alcanzar:

También es muy importante la velocidad a la que pueden enviarse los datos con este protocolo:

Mbps : Mega Bits por segundo.       MBps: Mega Bytes por segundo.
kb = 1.024 b     M = 1.024 k     G = 1.024 M

¿Te atreves a calcularlo . ?

¿Cuántos ciclos por segundo tendrán las ondas que están en la Banda ISM? ¿Cuál es el periodo de esas ondas?

Solución 
a)  f = 2.4G
b) λ=c/f= 12.5cm o sea, las antenas tendrían que ser de esta longitud. Hay muchos trucos para reducirla, una de ellas es la forma de serpiente que puedes ver en el HC-06

¿Te atreves a calcularlo...?

¿A qué distancia y cuanto tiempo tardarían en enviarse los siguientes archivos por Bluetooth?

  1. Un vídeo de 7Mb usando versión 2 clase 2
  2. Una imagen de 2.5Mb usando versión 3 clase 1
  3. Un archivo de texto de 240KB usando versión 1.2 clase 1

Solución 
1) 7Mb / 3Mbs = 2.3 seg.
2) 2.5Mb / 24Mbs = 0.1 seg.
3) 240 kB 8b/B = 1.920 kb   1.920 kb  / 1.024 =   1.875 Mb     1.875Mb / 1Mbs  = 1.875 seg. 

¿Bluetooth clásico o Bluetooth Low Energy = BLE?

Es un protocolo similar al clásico Bluetooth pero diseñado a consumir menos potencia manteniendo funcionalidad. Su popularidad ha crecido en multitud de dispositivos  

En robótica, el clásico device que utiliza BLE es la Micro:bit. Aunque la Micro:bit no tiene Wifi integrada, posee una radiofrecuencia que podemos configurar para Bluetooth (hay que elegir, o utilizar sus comandos de Radio o utilizar comandos de Bluetooth)

Por eso a la hora de elegir la APP tienes que tener en cuenta:

Nosotros hemos elegido uno sencillo que cumple las dos condiciones (hay muchas APPs) Serial Bluetooth Terminal

2025-12-05 08_05_39-WhatsApp.png

Bluetooth II APP Serial Bluetooth Terminal

DESCARGA LA APP

Esta APP es muy sencilla y la puedes descargar aquí. Tiene las siguientes ventajas :

2025-11-02 21_50_49-Greenshot.png

EMPAREJAR DISPOSITIVOS

Si no esta emparejado con el móvil NO TE PUEDES CONECTAR, para ello entramos en Devices :

2026-01-19 10_15_17-WhatsApp.png

Aquí puedes ver dos capturas de dispositivos en Bluetooth clásico y Bluetooth BLE

LOS QUE ESTAN EN VERDE SON LOS QUE TIENES EMPAREJADOS Y PUEDES CONECTARTE

unnamed.webp  2026-01-19 10_08_05-WhatsApp.png

¿Y si no aparece o no esta emparejado? Entras en el diálogo de Android de Bluetooth y lo emparejas
2026-01-19 10_12_41-Greenshot image editor.png

CONECTARTE

Una vez seleccionado el dispositivo emparejado ya puedes conectarte :

  1. Menú
  2. Entras en Terminal
  3. Enchufe
  4. Sale conectado, ya estas preparado para enviar y recibir

2026-01-19 10_15_17-WhatsApp.png


Bluetooth III El HC06

ADVERTENCIA

ATENCIÓN: COMO PUEDES VER LOS PINES DE TRANSMISIÓN Y DE RECEPCIÓN SON D0 Y D1 QUE COINCIDEN CON LA TRANSMISIÓN Y RECEPCIÓN DEL PUERTO SERIE UCB POR LO TANTO NO SE PUEDE UTILIZAR A LA VEZ EL HC06 Y LOS DATOS POR EL USB EL HC06 BLOQUEA LA COMUNICACIÓN POR CABLE

ESTA ES LA RAZÓN POR LA CUAL NO SE PUEDE UTILIZAR EL PROGRAMA ECHIDNA ML PARA PROGRAMAR
PUES TRABAJA EN VIVO, puedes utilizar cualquier programa que trabaje en carga: mBlock, ArduinoIDE...

2025-12-05 09_34_26-Microsoft PowerPoint - [Presentación1].png
Fuente de las imágenes: www.echidna.es

COMO SE CONECTA

Echidna tiene un conector preparado para conectar un módulo de Bluetooth

Nosotros utilizaremos un JY-MCU o HC-06 muy común y barato :

Para conectar el HC-06 lo hacemos hacia abajo de modo que coincida los pines:

Pines del HC-06 Pines del Echidna Pines del Arduino
Vcc 5V 5V
GND GND GND
RX TX D1
TX RX D0


En la foto aparece un echidna red

Een la black es igual hacia abajo pero ponlo en medio del zócalo para que coincida bien, pues en el Echidna Black el zócalo hembra tiene 6 pines y el HC06 tiene 4:

EchidnaBlack_0_BT34-600x336.png
Imagen www.echidna.es

 

Bluetooth IV programa

ENUNCIADO 

Vamos a realizar un programa que envíe y reciba datos desde la APP del móvil al Echidna

SOLUCIÓN
/*
https://libros.catedu.es/books/echidna
*/
#include <SoftwareSerial.h>
#include <Arduino.h>

SoftwareSerial BT(0,1);
char letra = 0;

void setup() {
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(A5,INPUT);
  BT.begin(9600);
  digitalWrite(13,0);
  digitalWrite(12,0);
}

void loop() {
  if(BT.available() > 0){
        letra = BT.read();
        if(letra == 'R'){
          digitalWrite(13,1);
          digitalWrite(12,0);

        }
        if(letra == 'A'){
          digitalWrite(13,0);
          digitalWrite(12,1);

        }
        if(letra == 'L'){
          for(int count2=0;count2<10;count2++){
            BT.write(map(analogRead(A5), 1, 900, 48, 57));
            delay(1000);
          }

        }
  }

}

PRECAUCIONES
- En Arduino IDE pon placa ARDUINO UNO
- Quita el HC06 a la hora de subir el código
- Una vez subido ya puedes poner el HC06 y probar 

CUÁNTO HAY QUE MAPEARLO pues el LDR según www.echidna.es va desde 1 a 900 y Bluetooth solo lee un carácter en ASCII luego convertimos el valor de A5 (1-900) a un valor ASCII que si vemos la tabla, lo hacemos para los valores de los caracteres 48 (0) a 57 (9) y así nos da una lectura de la cantidad de luz entre 0 y 9

VALOR ASCII CARACTER
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8
57 9
Resultado