De los bloques al código: el Python y el C++ detrás del IDE
Cómo cada tarjeta del IDE de bloques se convierte en código, la diferencia entre el setup y el loop de Arduino y el bucle de MicroPython, y un ejemplo lado a lado del mismo programa del brazo robótico en Python y en C++.

Cada tarjeta del IDE de bloques es una instrucción, y el IDE traduce la lista de tarjetas a código de verdad. El panel de código muestra esa traducción mientras usted arma el programa. Este artículo explica cómo se hace, para quien quiere entender lo que va a la placa y, algún día, escribir código directamente.
Dos formas de organizar un programa
En Arduino (C++), todo programa tiene dos funciones obligatorias:
- setup() se ejecuta una vez, cuando la placa se enciende. Es donde se indica que un pin es de salida y donde se asocia el servo a su pin.
- loop() se ejecuta una y otra vez, para siempre. Es el "repetir siempre" del robot.
En MicroPython (ESP32), el archivo main.py se ejecuta de arriba hacia abajo cuando la placa se enciende. Lo que está al principio es la preparación; el "repetir siempre" se convierte en un bucle while True.
El IDE hace esa separación por sí solo: las tarjetas de preparación van al principio, y lo que está dentro de "repetir siempre" va al bucle.
El mismo programa, en los dos lenguajes
El programa: repetir siempre; el servo de la base sigue al joystick; si la distancia es menor que 10 cm, pitar.
En C++, para el Arduino Nano:
#include <Servo.h>
Servo servoBase;
long distanciaCm(int trig, int echo) {
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long us = pulseIn(echo, HIGH, 30000);
return us == 0 ? 999 : us / 58;
}
void setup() {
servoBase.attach(3);
pinMode(7, OUTPUT);
pinMode(8, INPUT);
pinMode(10, OUTPUT);
}
void loop() {
servoBase.write(map(analogRead(A0), 0, 1023, 0, 180));
if (distanciaCm(7, 8) < 10) {
tone(10, 2000, 200);
delay(200);
}
delay(20);
}
En MicroPython, para el ESP32:
from machine import Pin, PWM, ADC, time_pulse_us
import time
servo_base = PWM(Pin(13), freq=50)
joy_x = ADC(Pin(32))
joy_x.atten(ADC.ATTN_11DB)
trig = Pin(18, Pin.OUT)
echo = Pin(19, Pin.IN)
buzzer = PWM(Pin(23), freq=2000, duty_u16=0)
def angulo(servo, graus):
servo.duty_ns(500_000 + int(graus * 1_900_000 / 180))
def distancia_cm():
trig.on(); time.sleep_us(10); trig.off()
us = time_pulse_us(echo, 1, 30000)
return 999 if us < 0 else us / 58
while True:
angulo(servo_base, joy_x.read_u16() * 180 / 65535)
if distancia_cm() < 10:
buzzer.duty_u16(32768); time.sleep_ms(200); buzzer.duty_u16(0)
time.sleep_ms(20)
El código que genera el IDE puede tener otros nombres y detalles, pero la estructura es esta.
Lo que la traducción resuelve por usted
- Funciones de apoyo. Medir la distancia requiere cinco líneas; la tarjeta es una sola. El IDE escribe la función una vez y la llama donde aparece la tarjeta.
- Preparación de los pines. Cada pin usado en una tarjeta recibe su preparación al principio, sin repetirse.
- Conversiones. El ángulo en grados se convierte en ancho de pulso; la lectura del joystick, en ángulo; los centímetros, en el límite de la comparación.
- Una pausa en el bucle. Los 20 ms al final del bucle le dan tiempo al servo y evitan medir con el ultrasónico más rápido de lo que este soporta.
Por qué mostrar el código
Ver el código al lado de las tarjetas tiende un puente entre el bloque y el texto. "Si" se convierte en if, "repetir siempre" en loop o while True, y el número que usted escribió aparece en el lugar correcto. Quien quiera ir más allá puede copiar el código, abrirlo en el Arduino IDE o en Thonny y seguir desde ahí.
Arme el ejemplo en el IDE de bloques y cambie la placa: el código de al lado cambia de lenguaje, y las tarjetas siguen siendo las mismas.