home about me ⊹ projects projects
← volver al portafolio

// proyecto 01 — 2025

AND-Y

un pequeño robot de 11 cm que te invita a reflexionar de forma lúdica sobre nuestra relación con las máquinas.

Arduino IDE C++ 11 cm
scroll ↓
AND-Y robot
hecho por: TontoPerico
// contexto
UDP · Taller Máquinas Computacionales DIS8645
// hardware
Arduino R4 Minima · Sensor HC-SR04 · ServoMotor SG90 · DFPlayer Mini · Motor vibrador
// software
Arduino IDE · C++
// tamaño
11 cm
// evento
Festival Primavera Hacker 2025

Un robot que te saluda según qué tan cerca estás.

AND-Y nació del encargo de crear una máquina saludadora. Somos estudiantes del Taller de Diseño de Máquinas Computacionales de la Universidad Diego Portales, donde relacionamos el diseño con la programación y la interacción persona-máquina.

Mediante un sensor ultrasónico, AND-Y detecta la distancia de quien se acerca y responde con comportamientos distintos: tiembla de nervios, reproduce audios de voz y levanta su brazo para compartir datos curiosos.

⊹ aprendimos a programar hace solo 3 meses.

01
AND-Y
FASE 01
130–150 cm
lejana

AND-Y te detecta desde lejos y te grita que te acerques. El motor vibrador comienza a activarse levemente.

audio + vibración leve
FASE 02
80–100 cm
mediana

Te pide con humor que te acerques más. La vibración aumenta, como si estuviera nervioso por tu presencia.

audio + vibración fuerte
FASE 03
0–20 cm
cercana

El servomotor levanta su brazo de 0° a 180° y comparte datos curiosos del mundo de la tecnología.

audio + brazo + vibración
FASE 01
"Hola humano, ¿por qué estás tan lejos? Acércate."
FASE 02
"Hola, no seas tímido, ven más cerca. No tengo virus, creoo, jiji."
FASE 03
"¿Sabías qué? El 99% de los problemas se arreglan reiniciando."
FASE 03
"Los datos nunca se borran, sólo se esconden."
FASE 03
"El error 404 es mi manera de hacerme el leso."
COMPONENTE MODELO FUNCIÓN
Arduino UNOR4 MinimaControlador principal del robot
Sensor UltrasónicoHC-SR04Detecta distancia y presencia humana
ServoMotorSG90Levanta el brazo de 0° a 180°
Motor VibradorJoystickVibra según la cercanía del usuario
Reproductor MP3DFPlayer MiniReproduce los audios de voz
AltavozMini Parlante 3WSalida de audio
Tarjeta SD255gbAlmacena los archivos de audio
// detecta la distancia y define en qué zona está el humano
float EntradaUltrasonico::medirDistancia() {
  digitalWrite(patitaTrigger, LOW);
  delayMicroseconds(2);
  digitalWrite(patitaTrigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(patitaTrigger, LOW);

  duracion = pulseIn(patitaEcho, HIGH);
  // convierte a cm (velocidad del sonido = 343 m/s)
  distanciaCm = int(float(duracion) * 0.0343 / 2.0);
  return distanciaCm;
}

void EntradaUltrasonico::decidirCercania() {
  int nuevoEstado = -1;
  if (distanciaCm >= 0 && distanciaCm <= 20)     nuevoEstado = 0; // cercana
  else if (distanciaCm >= 50 && distanciaCm <= 90) nuevoEstado = 1; // mediana
  else if (distanciaCm >= 120 && distanciaCm <= 180) nuevoEstado = 2; // lejana

  // cambia estado solo si pasó tiempo suficiente (anti-loro)
  if (nuevoEstado != ultimoEstado &&
     (millis() - ultimoCambio > tiempoEstabilidad)) {
    ultimoCambio = millis();
    ultimoEstado = nuevoEstado;
    dondeEsta = nuevoEstado;
  }
}
// controla el brazo servomotor de AND-Y
void SalidaDedo::configurar() {
  servo.attach(patitaServo);
  servo.write(0); // posición inicial: abajo
}

void SalidaDedo::levantar() {
  servo.write(180); // sube el brazo a 180°
}

void SalidaDedo::bajar() {
  servo.write(0); // baja el brazo a 0°
}

int patitaServo = 13; // pin de conexión
// vibra según la distancia detectada
void SalidaMotorVibracion::vibrar(int cuantoVibrar) {
  if (cuantoVibrar == 0) {
    intensidad = 0;   // cercana: no vibra
  } else if (cuantoVibrar == 1) {
    intensidad = 80;  // mediana: vibra mucho
  } else if (cuantoVibrar == 2) {
    intensidad = 20;  // lejana: vibra poco
  } else {
    intensidad = 0;
  }
  analogWrite(MOTOR_PIN, intensidad);
  delay(300);
}
// archivo principal — orquesta todo
void loop() {
  ultrasonico.medirDistancia();
  ultrasonico.decidirCercania();

  // controla el brazo
  if (ultrasonico.dondeEsta == 0) dedo.levantar();
  else dedo.bajar();

  // vibra según distancia
  motor.vibrar(ultrasonico.dondeEsta);

  // reproduce audio solo si cambió de zona
  if (ultrasonico.dondeEsta != estadoAnterior) {
    estadoAnterior = ultrasonico.dondeEsta;
    if (ultrasonico.dondeEsta == 2) reproducirAudioDirecto(1);
    else if (ultrasonico.dondeEsta == 1) reproducirAudioDirecto(2);
    else if (ultrasonico.dondeEsta == 0) reproducirAudioDirecto(3);
  }
  delay(200);
}
01
definir el proyecto

La primera idea era un selector de idiomas con joystick. Redactamos muchas ideas pero no nos convencían. Partir desde cero fue el primer desafío real.

02
el sensor ultrasónico

La distancia medida no era exacta ni se redondeaba bien. Requirió muchas pruebas y ajuste de rangos para que detectara las tres zonas de forma estable.

03
el reproductor MP3

La tarjeta SD requería formato específico y los audios debían estar en orden preciso. Los primeros códigos fallaban hasta encontrar el repositorio correcto de DFPlayer.

04
integrar todo junto

Cada módulo funcionaba bien por separado. Al juntarlos, el audio iba en loop, el motor no vibraba y el servo no respondía. Aprendimos a coordinar tiempos y estados.

Y
Yamna Carrión
código · github
S
Sofía Cartes
código · github
M
Millaray Millar
modelado 3D
V
Vania Paredes
código · github
V
Valentina Ruz
código · github

todas complementamos en todos los roles ⊹