- Descripción
- Requisitos
- Configuración
- Uso
- Diseño Detallado
- Componentes
- Estructura del Código
- Códigos Explicados
- Contribuciones
- Licencia
🌟 PipaPico es un módulo de detección visual basado en la placa RP2040-Zero que forma parte de un sistema dispensador de pipas. Su función principal es detectar si hay exactamente una pipa en la imagen capturada, permitiendo así el control preciso del dispensador. 🔍
- 🖥️ Placa RP2040-Zero
- 📷 Cámara OV7670 (sensor de imagen compatible)
- ⚙️ Motor Paso a Paso 28BYJ-48 + Driver ULN2003
- 🛠️ 2 Servos SG90 (para trampilla y dispensador)
- 🎛️ Motor de Vibración 1034
- 🔋 Fuente de Alimentación 5V, 2A
- 🧰 Guías de cajón
- 🛠️ Varilla roscada (M5 o M8)
- 🏗️ Perfiles de aluminio o madera
- 🪟 Bandeja de acrílico o metal
- 🔩 Tornillos y tuercas
- 💾 Pico SDK (Configuración en Pico SDK)
- 🖥️ Herramientas de desarrollo CMake y GNU Make
Nota: Desarrollo en construcción, no finalizado, implementado ni testeado.
-
Clonar el Repositorio:
git clone https://github.com/antoniobuen0/PipaPico.git cd PipaPico
-
Configurar el Entorno de Desarrollo: 🌐 Sigue las instrucciones oficiales del Pico SDK para configurar tu entorno. ⚙️
-
Compilar el Proyecto:
mkdir build cd build cmake .. make
-
Cargar el Firmware en la Placa: 🚀 Conecta la RP2040-Zero mediante USB y copia el archivo
.uf2
generado en la unidad que aparece.
-
Conectar los Componentes:
- ⚡ Conecta la cámara OV7670 y los motores siguiendo el esquema del repositorio.
- 🔋 Alimenta la placa con la fuente de 5V.
-
Abrir la Terminal Serial:
- 🖥️ Utiliza un programa como
minicom
oPuTTY
para acceder al puerto serial (por ejemplo,/dev/ttyACM0
) a 115200 baudios.
- 🖥️ Utiliza un programa como
-
Observar el Resultado:
- 📊 El sistema mostrará el conteo de pipas, tiempo de procesamiento y estado de los motores.
- Función: 🛠️ Almacenar las pipas y limitar el flujo hacia la bandeja. 📦
- Detalles:
- Salida ajustada para evitar que salgan más de las necesarias con la vibración.
- Forma inclinada para facilitar el flujo.
- Función: ⚖️ Chequear la cantidad de pipas y manejar excesos. ✂️
- Detalles:
- Aquí entra en juego la cámara para detectar la cantidad de pipas.
- Trampilla basculante para devolver el exceso al depósito.
- Niveles:
- Nivel Depósito: 🏗️ Llenado desde el depósito principal.
- Nivel Compuerta: 🎛️ Chequeo y manejo de exceso.
- Nivel Superior: 🎯 Entrega de pipas.
-
📸 Detección con la Cámara
- Captura de imagen mediante OV7670
- Procesamiento y filtrado
- Conteo de pipas mediante flood fill
-
🔄 Lógica de Control
- Si detecta 1 pipa → Activa servo para dispensar
- Si detecta 0 pipas → Activa vibración
- Si detecta >1 pipas → Abre trampilla de retorno
-
⚙️ Actuadores
- Servo principal (dispensador)
- Motor de vibración
- Servo de trampilla
[Captura] → [Procesado] → [Detección] → [Decisión]
│
┌────────────────┬────┴────────┐
↓ ↓ ↓
[0 pipas] [1 pipa] [>1 pipas]
↓ ↓ ↓
[Vibración] [Servo ON] [Trampilla]
Categoría | Componente | Cantidad |
---|---|---|
Control Principal | RP2040-Zero | 1 |
Sensores | Cámara OV7670 | 1 |
Actuadores | Servo SG90 (Dispensador) | 1 |
Servo SG90 (Trampilla) | 1 | |
Motor de Vibración | 1 | |
Estructura | Guías y Soportes | Varios |
- El núcleo de la lógica se encuentra en archivos
.c
, mientras que los headers (.h
) declaran prototipos y estructuras. - A continuación se describen los archivos
.c
principales y su responsabilidad:
- Flujo Principal del programa:
- Inicializa periféricos (cámara, UART, etc.).
- Captura una imagen desde la cámara (y genera XCLK si procede).
- Aplica filtrados / umbralizados básicos.
- Llama a la detección de pipas.
- Activa los actuadores (vibración, servos) según el número de pipas detectadas.
- Implementa el filtro de mediana 3×3, clave para reducir ruido (“salt-and-pepper noise”) y mejorar la nitidez antes de la detección.
- Usa un histograma deslizante para actualizar eficientemente la mediana en cada píxel.
- Detección de pipas:
- Realiza el etiquetado de componentes conectados (flood fill) para contar cuántos objetos blancos hay en la imagen binaria.
- Calcula área, bounding box, centro de masa, etc.
- Devuelve el conteo
numPipas
.
- Complementa la detección calculando simetría (por ejemplo, puntaje de cuán “simétrica” es la pipa).
- Puede descartar objetos ambiguos o filtrar regiones que no cumplan cierto nivel de simetría.
- Maneja la comunicación de depuración por UART.
- Envía estructuras con la imagen procesada o con el número de pipas detectadas.
- Útil para monitorear datos en una PC o sistema externo.
En esta sección destacamos la lógica de cada .c
:
- 🔌 Inicializa periféricos (p.ej.
initCamera()
, UART, etc.). - 📸 Captura la imagen desde la cámara (función
captureImage()
). - 🛠️ Procesa la imagen (opcional: llama a
optimizedMedianFilter()
, hace un umbralizado). - 📊 Detecta las pipas (llamando a
detectPipas()
). - ⚙️ Controla motores (servo, vibración) en función de
numPipas
.
- Función principal:
optimizedMedianFilter()
- Calcula la mediana en vecindarios 3×3 usando una estructura de histograma deslizante.
- Sobrescribe el
frameBuffer
(o un buffer temporal) con el resultado filtrado.
- Función clave:
detectPipas(int* numPipas)
- Recorre la imagen binaria (0/255).
- Usa un flood fill con stack para agrupar píxeles contiguos en blanco.
- Extrae área y bounding box de cada objeto.
- Incrementa
(*numPipas)
al encontrar regiones válidas.
- Función:
calculateSymmetry(...)
- Opcional, evalúa la mitad izquierda vs. derecha (o arriba vs. abajo) de la región para un “score” de simetría.
- Ayuda a descartar formas que no sean pipas reales.
- Envía un
DebugFrame
o datos de telemetría:- Estructura empaquetada (timestamp, número de pipas, etc.) por UART.
- Permite monitorear el comportamiento del sistema en una PC.
🌟 Las contribuciones son bienvenidas. Si deseas mejorar el proyecto o reportar errores, abre un issue o un pull request en el repositorio. 🛠️
📜 Este proyecto está licenciado bajo la Licencia GPL-3.0. Consulta el archivo LICENSE
para más detalles. 📜
-
Unit Tests:
- Ensure that all individual functions work as expected.
- Use a testing framework like Unity or CMock to automate unit tests.
-
Integration Tests:
- Verify that different modules work together correctly.
- Test the complete flow from image capture to pipa detection and actuator control.
-
Manual Testing:
- Perform manual tests to validate the system's behavior in real-world scenarios.
- Check for edge cases and unexpected inputs.
We expect all contributors to adhere to our Code of Conduct. Please read the Code of Conduct before contributing.
We welcome contributions from the community. To contribute, please follow these steps:
- Fork the repository.
- Create a new branch for your feature or bugfix.
- Make your changes and commit them with clear and concise messages.
- Push your changes to your forked repository.
- Create a pull request to the main repository.
For more details, please refer to the Contribution Guidelines.