Mostrando entradas con la etiqueta PASAIA LAB DRONE. Mostrar todas las entradas
Mostrando entradas con la etiqueta PASAIA LAB DRONE. Mostrar todas las entradas

mi茅rcoles, 5 de agosto de 2026

## 馃搵 Gu铆a para Principiantes: Pi 5 + AI HAT+ 26 TOPS + Arduino UNO Q

馃摜 Descargar: GUIA_COMPLETA_PRINCIPIANTES.txt

---

## 馃搵 Gu铆a para Principiantes: Pi 5 + AI HAT+ 26 TOPS + Arduino UNO Q

### ¿Qu茅 he preparado para ti?

He creado **5 archivos descargables** que cubren todo el proceso:

---

### 1. Gu铆a Visual de Ensamblaje (infograf铆a)

Un diagrama completo con los **5 pasos principales**:

| Paso | Qu茅 haces |
|---|---|
| **1** | Reunir los 10 materiales necesarios |
| **2** | Montar el hardware (HAT+ sobre Pi 5, USB-C entre placas, sensores) |
| **3** | Instalar Raspberry Pi OS + software en la Pi 5 |
| **4** | Instalar Arduino IDE + subir c贸digo al UNO Q |
| **5** | Conectar ambas placas y ver los datos en pantalla |

Incluye el diagrama de conexiones con:
- **Raspberry Pi 5 + AI HAT+ 26 TOPS** (cerebro de IA y visi贸n)
- **Arduino UNO Q** (cerebro de sensores en tiempo real)
- **Conexi贸n USB-C** entre ambas (datos + alimentaci贸n)
- **Conexi贸n UART opcional** (para usuarios avanzados)
- **Sensores PID, FID y Meteo** conectados al UNO Q

馃摜 **Descargar:** [guia_ensamblaje_pasos.png](sandbox:///mnt/agents/output/guia_ensamblaje_pasos.png)

---




### 2. Diagrama de Cableado Pin a Pin

Esquema detallado que muestra **exactamente d贸nde va cada cable**:

- **PID (azul)** → Pin **A0** del UNO Q
- **FID (rojo)** → Pin **A1** del UNO Q  
- **Meteo (naranja)** → Pin **A2** del UNO Q
- **USB-C** entre Pi 5 y UNO Q (datos + alimentaci贸n)
- **Fuente 27W** → Alimenta la Pi 5
- **C谩mara t茅rmica** → Puerto CSI/HDMI de la Pi 5

**Importante:** Los sensores PID y FID necesitan **alimentaci贸n externa** (12V y 24V respectivamente). El UNO Q solo lee la se帽al de datos (0-5V), nunca la alimentaci贸n de potencia.

馃摜 **Descargar:** [diagrama_cableado_pines.png](sandbox:///mnt/agents/output/diagrama_cableado_pines.png)

---



### 3. C贸digo para Arduino UNO Q (principiantes)

Un sketch sencillo que:
- Lee los pines A0, A1, A2 cada segundo
- Genera datos simulados (para que puedas probar sin sensores reales)
- Env铆a los datos por USB-C a la Pi 5 en formato JSON
- Incluye instrucciones paso a paso en los comentarios

**C贸mo usarlo:**
1. Abre Arduino IDE
2. Copia y pega este c贸digo
3. Selecciona "Arduino UNO Q" en Tools → Board
4. Pulsa **Upload** (flecha →)
5. Listo

馃摜 **Descargar:** [unoq_slave_principiantes.ino](sandbox:///mnt/agents/output/unoq_slave_principiantes.ino)

---

// ============================================================================
// ARDUINO UNO Q - Codigo para principiantes
// Envio de datos simulados por USB-C a la Raspberry Pi 5
// PASAIA LAB - INTELIGENCIA LIBRE
// ============================================================================
// Este sketch corre en el STM32U585 del UNO Q (modo Arduino).
// Simula lecturas de sensores y las envia por USB cada 1 segundo.
// NO necesitas sensores reales para probar. Funciona solo con la placa.
// ============================================================================

// ============================================================================
// CONFIGURACION
// ============================================================================
// Pines donde conectarias sensores reales (mas adelante):
// - PIN_PID: A0  (entrada analogica del sensor PID)
// - PIN_FID: A1  (entrada analogica del sensor FID)
// - PIN_TEMP: A2 (entrada analogica de temperatura)

const int PIN_PID = A0;
const int PIN_FID = A1;
const int PIN_TEMP = A2;

// ============================================================================
// SETUP: Se ejecuta UNA VEZ al encender
// ============================================================================
void setup() {
  // Iniciamos comunicacion USB con la Pi 5
  Serial.begin(115200);

  // Esperamos a que el puerto USB este listo
  while (!Serial) {
    ; // Esperamos (solo en UNO Q con USB nativo)
  }

  // Configuramos pines como entradas
  pinMode(PIN_PID, INPUT);
  pinMode(PIN_FID, INPUT);
  pinMode(PIN_TEMP, INPUT);

  // Mensaje de bienvenida
  Serial.println("{\"status\":\"UNO_Q_READY\",\"msg\":\"Hola Pi 5, soy el UNO Q\"}");
}

// ============================================================================
// LOOP: Se repite para siempre
// ============================================================================
void loop() {
  // --- Leemos los pines analogicos (0 a 1023) ---
  // En un proyecto real, aqui conectarias tu sensor PID/FID
  // Por ahora usamos valores simulados para que veas que funciona

  int raw_pid = analogRead(PIN_PID);   // Lee pin A0
  int raw_fid = analogRead(PIN_FID);   // Lee pin A1
  int raw_temp = analogRead(PIN_TEMP); // Lee pin A2

  // --- Convertimos a valores reales (simulados) ---
  // En un proyecto real, aqui aplicarias factores de calibracion
  float pid_ppb = raw_pid * 2.0;       // Simulacion: 0-1023 -> 0-2046 ppb
  float fid_ppm = raw_fid * 0.1;       // Simulacion: 0-1023 -> 0-102.3 ppm
  float temp_c = (raw_temp * 3.3 / 1023.0) * 100.0; // Simulacion temperatura
  float humedad = 45.0 + random(-5, 5); // Humedad simulada
  float viento = 10.0 + random(-3, 8);   // Viento simulado

  // --- Construimos el mensaje JSON ---
  // JSON es un formato de texto que entienden ambas placas
  String mensaje = "{";
  mensaje += "\"pid_ppb\":" + String(pid_ppb, 1) + ",";
  mensaje += "\"fid_ppm\":" + String(fid_ppm, 2) + ",";
  mensaje += "\"temp_c\":" + String(temp_c, 1) + ",";
  mensaje += "\"hum_pct\":" + String(humedad, 1) + ",";
  mensaje += "\"wind_kmh\":" + String(viento, 1);
  mensaje += "}";

  // --- Enviamos por USB-C a la Raspberry Pi 5 ---
  Serial.println(mensaje);

  // --- Esperamos 1 segundo antes de la siguiente lectura ---
  delay(1000);
}

// ============================================================================
// COMO PROBARLO (sin sensores reales):
// ============================================================================
// 1. Sube este sketch al UNO Q (boton Upload en Arduino IDE)
// 2. Conecta UNO Q a Pi 5 con cable USB-C
// 3. En Pi 5, ejecuta: python3 pi5_master_principiantes.py
// 4. Deberias ver datos apareciendo en la pantalla de la Pi 5
// ============================================================================
// COMO CONECTAR SENSORES REALES (mas adelante):
// ============================================================================
// Sensor PID (salida 0-5V):  Cable positivo -> A0, Negativo -> GND
// Sensor FID (salida 0-5V):  Cable positivo -> A1, Negativo -> GND
// Sensor temp (salida 0-5V): Cable positivo -> A2, Negativo -> GND
// IMPORTANTE: Los sensores PID/FID requieren alimentacion externa 12V/24V
//             NO conectes la alimentacion de los sensores al UNO Q
//             Solo conecta la SE脩AL (cable de datos) a los pines A0/A1
// ==========================================


### 4. C贸digo para Raspberry Pi 5 (principiantes)

Un script Python que:
- Se conecta al UNO Q por USB (`/dev/ttyACM0`)
- Recibe los datos JSON cada segundo
- Muestra los valores en pantalla de forma legible
- Lanza alertas simples si los valores son altos

**C贸mo usarlo:**
1. Abre Terminal en la Pi 5
2. Copia el archivo a la Pi 5
3. Ejecuta: `python3 pi5_master_principiantes.py`
4. Ver谩s n煤meros cambiando en pantalla = ¡脡XITO!

馃摜 **Descargar:** [pi5_master_principiantes.py](sandbox:///mnt/agents/output/pi5_master_principiantes.py)

---

### 5. Gu铆a de Texto Completa (para imprimir)

Documento de **16.000+ caracteres** con todo explicado en lenguaje humano:

- **Secci贸n 1:** Qu茅 es el sistema (explicado como si tuvieras 10 a帽os)
- **Secci贸n 2:** Lista de materiales con precios aproximados
- **Secci贸n 3:** Montaje hardware paso a paso (con advertencias de seguridad)
- **Secci贸n 4:** Instalaci贸n software en Pi 5 (comandos para copiar y pegar)
- **Secci贸n 5:** Instalaci贸n software en UNO Q (con capturas mentales)
- **Secci贸n 6:** Prueba de conexi贸n y verificaci贸n
- **Secci贸n 7:** Soluci贸n de 4 problemas comunes
- **Secci贸n 8:** C贸mo conectar sensores reales (PID, FID, meteo, c谩mara)

馃摜 **Descargar:** [GUIA_COMPLETA_PRINCIPIANTES.txt](sandbox:///mnt/agents/output/GUIA_COMPLETA_PRINCIPIANTES.txt)

---

## Resumen r谩pido (para imprimir y tener a mano)

```
ORDEN DE MONTAJE:
1. AI HAT+ sobre Pi 5 (stacking header + ribbon + tornillos)
2. USB-C entre Pi 5 y UNO Q
3. microSD con sistema en Pi 5
4. Fuente 27W a Pi 5

ORDEN DE SOFTWARE:
1. Raspberry Pi Imager → microSD
2. sudo apt update && sudo apt full-upgrade -y
3. sudo raspi-config → Advanced → PCIe → Gen 3
4. pip3 install pyserial flask numpy opencv-python
5. Arduino IDE → Preferences → URL UNO Q → Install
6. Subir "unoq_slave_principiantes.ino" al UNO Q
7. Copiar "pi5_master_principiantes.py" a Pi 5
8. python3 pi5_master_principiantes.py
9. ¡Ver n煤meros = 脡XITO!
```

 

 




---馃摜 Descargar: GUIA_COMPLETA_PRINCIPIANTES.txt

## ¿Y el AI HAT+ 26 TOPS? ¿Cu谩ndo entra en juego?

En esta gu铆a para principiantes, el **AI HAT+ ya est谩 funcionando desde el Paso 4D** (cuando activas PCIe Gen 3 y verificas con `lspci`). Sin embargo, el c贸digo inicial no usa la NPU todav铆a. Eso viene en la **fase 2**:

- **Fase 1 (esta gu铆a):** Conectar las placas y ver datos de sensores
- **Fase 2 (avanzada):** Usar el Hailo-8 para procesar la c谩mara t茅rmica con IA y detectar hotspots autom谩ticamente



================================================================================ GUIA COMPLETA PARA PRINCIPIANTES Raspberry Pi 5 + AI HAT+ 26 TOPS + Arduino UNO Q Sistema Detector de Precursores de Incendios Forestales ================================================================================ PASAIA LAB - INTELIGENCIA LIBRE Autor: Jose Agustin Fontan Varela Asesoria IA: Kimi (Moonshot AI) Fecha: 05 de agosto de 2026 ================================================================================ ESTA GUIA ESTA PENSADA PARA PERSONAS SIN CONOCIMIENTOS PREVIOS. Si sabes encender un ordenador y seguir instrucciones paso a paso, puedes montar este sistema. No necesitas saber programar. ================================================================================ INDICE ================================================================================ 1. Que es este sistema y para que sirve 2. Materiales que necesitas (con fotos mentales) 3. Paso a paso: Montar el hardware 4. Paso a paso: Instalar software en Raspberry Pi 5 5. Paso a paso: Instalar software en Arduino UNO Q 6. Paso a paso: Conectar ambas placas y probar 7. Solucion de problemas comunes 8. Siguientes pasos (conectar sensores reales) ================================================================================ 1. QUE ES ESTE SISTEMA ================================================================================ Este sistema detecta incendios forestales ANTES de que se vean. Como lo hace? - La Raspberry Pi 5 tiene una "tarjeta inteligente" (AI HAT+ 26 TOPS) que analiza imagenes con inteligencia artificial. - El Arduino UNO Q lee sensores quimicos que detectan vapores de resina y otros gases que liberan los arboles cuando empiezan a calentarse. - Ambas placas se comunican y juntas deciden si hay peligro. Piensa en ello como un "perro electronico con nariz de quimico" que huele el humo antes de que sea visible. ================================================================================ 2. MATERIALES QUE NECESITAS ================================================================================ OBLIGATORIOS (sin estos no funciona): ------------------------------------- [1] Raspberry Pi 5 (4GB o 8GB de RAM) - Es el cerebro principal. Parece una tarjeta de credito verde. - Precio aprox: 60-80 EUR [2] Raspberry Pi AI HAT+ 26 TOPS (con chip Hailo-8) - Es una placa naranja que se pone encima de la Pi 5. - Tiene un chip que acelera la inteligencia artificial. - Precio aprox: 110-130 EUR [3] Arduino UNO Q (version 4GB RAM) - Es una placa azul-verdosa con pines dorados. - Tiene DOS cerebros: uno para Linux y otro para tiempo real. - Precio aprox: 60 EUR [4] Cable USB-C a USB-C (1 metro, de buena calidad) - Sirve para conectar la Pi 5 con el UNO Q. - Precio aprox: 8 EUR [5] MicroSD de 64GB (clase A2, velocidad rapida) - Es la "memoria" de la Pi 5 donde guarda el sistema. - Precio aprox: 15 EUR [6] Fuente de alimentacion oficial Raspberry Pi 27W (USB-C) - Da energia a todo el sistema. NO uses cargadores de movil. - Precio aprox: 15 EUR [7] Monitor + cable HDMI + teclado USB + raton USB - Solo los necesitas para la configuracion inicial. - Despues puedes quitarlos. OPCIONALES (para mas adelante): -------------------------------- [8] 3 cables jumper macho-hembra (para conexion UART avanzada) [9] Sensor PID MiniPID 2 (detecta vapores de resina) [10] Sensor FID J.U.M. 2010 (detecta hidrocarburos) [11] Sensor de temperatura/humedad SHT45 [12] Camara termica FLIR Vue TZ20-R ================================================================================ 3. PASO A PASO: MONTAR EL HARDWARE ================================================================================ IMPORTANTE: Antes de tocar cualquier cosa, DESCONECTA TODO de la corriente. PASO 3A: Montar el AI HAT+ sobre la Pi 5 ----------------------------------------- 1. Apaga la Pi 5 completamente (no basta con apagar pantalla). 2. Saca el AI HAT+ de su caja. Veras: - Una placa naranja - Un cable plano negro (ribbon cable) - Un conector GPIO largo (stacking header) - 4 tornillos y 4 separadores metalicos 3. Coge el "stacking header" (el conector largo con muchos pines). Es como un puente que conecta la Pi 5 con el HAT+. Presionalo SUAVEMENTE sobre los pines GPIO de la Pi 5. Los pines GPIO son los 40 agujeritos dorados de la Pi 5. NO fuerces. Si no entra, giralo 180 grados y prueba otra vez. 4. Coge el cable plano (ribbon cable). - Un extremo va al puerto PCIe de la Pi 5 (es un slot negro pequeno). - Levanta la pestana negra del slot, mete el cable (contactos dorados hacia los puertos USB de la Pi 5), y baja la pestana. - El otro extremo va al AI HAT+. Haz lo mismo. 5. Pon el AI HAT+ encima de la Pi 5, alineando los tornillos. Atornilla los 4 separadores. 6. Resultado: Tienes una "sandwich" de dos placas. Pi 5 abajo, AI HAT+ encima. PASO 3B: Conectar Pi 5 con Arduino UNO Q ------------------------------------------ 1. Coge el cable USB-C a USB-C. 2. Un extremo al puerto USB-C de la Pi 5 (el de la derecha, no el de alimentacion). 3. El otro extremo al puerto USB-C del Arduino UNO Q. PASO 3C: Insertar la microSD ------------------------------ 1. La microSD ya debe tener el sistema instalado (ver Paso 4). 2. Insertala en la ranura de la Pi 5 (esta en la parte de abajo). El lado dorado hacia abajo. PASO 3D: Conectar perifericos (solo para configuracion) -------------------------------------------------------- 1. Conecta el monitor a la Pi 5 por HDMI. 2. Conecta teclado y raton a los puertos USB de la Pi 5. 3. Conecta la fuente 27W al puerto USB-C izquierdo de la Pi 5. ================================================================================ 4. PASO A PASO: INSTALAR SOFTWARE EN RASPBERRY PI 5 ================================================================================ PASO 4A: Preparar la microSD ------------------------------ 1. En tu ordenador normal (Windows/Mac/Linux), descarga: "Raspberry Pi Imager" desde raspberrypi.com 2. Abre el programa. Veras 3 botones: - CHOOSE OS -> Raspberry Pi OS (64-bit) - CHOOSE STORAGE -> selecciona tu microSD - WRITE -> pulsa y espera 10 minutos 3. Cuando termine, saca la microSD y metela en la Pi 5. PASO 4B: Primera encendida ---------------------------- 1. Conecta la fuente 27W a la Pi 5. 2. La Pi 5 se enciende sola. Veras lucecitas rojas y verdes. 3. En el monitor aparece el escritorio. Sigue el asistente: - Elige pais, idioma, teclado - Crea usuario y contrasena (apuntalos en un papel) - Conecta a tu WiFi PASO 4C: Actualizar el sistema -------------------------------- 1. En el escritorio de la Pi 5, busca el icono negro que dice "Terminal". Es como la pantalla negra de las peliculas de hackers. 2. Haz clic. Se abre una ventana negra con texto verde. 3. Escribe (o copia y pega) ESTO EXACTAMENTE, luego pulsa ENTER: sudo apt update && sudo apt full-upgrade -y Espera. Puede tardar 20-30 minutos. No apagues. Veras mucho texto moviendose. Es normal. 4. Cuando termine, reinicia: sudo reboot PASO 4D: Activar PCIe Gen 3 (necesario para el AI HAT+) ---------------------------------------------------------- 1. Abre Terminal otra vez. 2. Escribe: sudo raspi-config 3. Se abre un menu azul. Navega con las flechas del teclado: - Ve a "Advanced Options" (pulsa ENTER) - Ve a "PCIe Speed" (pulsa ENTER) - Selecciona "Gen 3" (pulsa ENTER) - Ve a "Finish" abajo (pulsa ENTER) - Te pide reiniciar: selecciona "Yes" 4. La Pi 5 se reinicia sola. PASO 4E: Verificar que el AI HAT+ funciona -------------------------------------------- 1. Abre Terminal. 2. Escribe: lspci 3. Debe aparecer algo como: "Hailo-8" o "1e4:0001" o similar. Si aparece, el HAT+ esta detectado. FELICIDADES. Si NO aparece, revisa el cable ribbon (Paso 3A). PASO 4F: Instalar programas necesarios --------------------------------------- 1. Abre Terminal. 2. Escribe estas lineas UNA A UNA (copia, pega, ENTER, espera): sudo apt install python3-pip python3-serial -y pip3 install pyserial flask numpy opencv-python sudo apt install hailo-all -y 3. Espera a que termine cada linea antes de poner la siguiente. ================================================================================ 5. PASO A PASO: INSTALAR SOFTWARE EN ARDUINO UNO Q ================================================================================ PASO 5A: Instalar Arduino IDE en tu PC --------------------------------------- 1. En tu ordenador normal (no en la Pi 5), descarga: "Arduino IDE 2.x" desde arduino.cc 2. Instalalo como cualquier programa. PASO 5B: Configurar Arduino IDE para el UNO Q ----------------------------------------------- 1. Abre Arduino IDE. 2. Ve a File -> Preferences (Archivo -> Preferencias). 3. Busca la casilla "Additional boards manager URLs". 4. Pega ESTE enlace exacto: https://unoq.arduino.cc/package_uno_q_index.json 5. Pulsa OK. 6. Ve a Tools -> Board -> Boards Manager. 7. En el buscador, escribe: "UNO Q" 8. Aparece "Arduino UNO Q". Pulsa INSTALL. 9. Espera a que termine (2-3 minutos). PASO 5C: Conectar el UNO Q al PC --------------------------------- 1. Conecta el UNO Q a tu PC con un cable USB-A a USB-C. (El cable que viene con el UNO Q, o uno estandar). 2. Ve a Tools -> Board -> selecciona "Arduino UNO Q". 3. Ve a Tools -> Port -> selecciona el puerto que aparece (en Windows: COM3, COM4... en Mac: /dev/cu.usbmodem...). PASO 5D: Subir el codigo al UNO Q ----------------------------------- 1. En Arduino IDE, crea un nuevo sketch (File -> New). 2. BORRA TODO el texto que aparece. 3. Copia y pega el codigo del archivo: "unoq_slave_principiantes.ino" (Este codigo viene incluido en esta guia). 4. Pulsa el boton UPLOAD (flecha hacia la derecha, arriba a la izquierda). 5. Espera. Veras una barra de progreso abajo. Cuando diga "Done uploading", el codigo esta en el UNO Q. 6. Desconecta el UNO Q del PC. ================================================================================ 6. PASO A PASO: CONECTAR AMBAS PLACAS Y PROBAR ================================================================================ PASO 6A: Conectar fisicamente ------------------------------ 1. Conecta el cable USB-C a USB-C entre Pi 5 y UNO Q. (Puerto USB-C derecho de la Pi 5 -> Puerto USB-C del UNO Q). 2. Conecta la fuente 27W a la Pi 5. 3. Ambas placas se encienden. PASO 6B: Encontrar el puerto del UNO Q ---------------------------------------- 1. En la Pi 5, abre Terminal. 2. Escribe: ls /dev/tty* 3. Busca en la lista algo como: /dev/ttyACM0 o /dev/ttyUSB0 Ese es tu UNO Q. Apunta el nombre exacto. PASO 6C: Probar comunicacion ----------------------------- 1. En la Pi 5, abre Terminal. 2. Crea un archivo nuevo: nano pi5_prueba.py 3. Se abre un editor de texto. Copia y pega el codigo del archivo: "pi5_master_principiantes.py" (Viene incluido en esta guia). 4. Guarda y cierra: - Pulsa CTRL+O (guardar) - Pulsa ENTER (confirmar nombre) - Pulsa CTRL+X (salir) 5. Ejecuta el programa: python3 pi5_prueba.py 6. Debes ver algo como: ============================================================ CIVIL FIRE 1X - Raspberry Pi 5 (Maestro) ============================================================ [1] Conectando con Arduino UNO Q... [OK] Conectado en /dev/ttyACM0 [2] Escuchando datos del UNO Q... Presiona Ctrl+C para detener --- Muestra #1 --- Sensor PID (resina): 245.0 ppb Sensor FID (fuego): 12.30 ppm Temperatura: 23.5 C Humedad: 48.0 % Viento: 15.0 km/h --- Muestra #2 --- ... 7. Si ves numeros cambiando, TODO FUNCIONA. Pulsa Ctrl+C para detener. ================================================================================ 7. SOLUCION DE PROBLEMAS COMUNES ================================================================================ PROBLEMA: "No puedo conectar al UNO Q" --------------------------------------- SOLUCION: - Verifica que el cable USB-C esta bien conectado en AMBOS extremos. - Prueba otro cable USB-C (algunos cables solo cargan, no transmiten datos). - En Terminal, ejecuta: lsusb Debe aparecer algo de "Arduino" o "Qualcomm". - Si no aparece, el UNO Q no esta recibiendo suficiente energia. Conecta una fuente USB-C de 15W o mas al UNO Q. PROBLEMA: "El AI HAT+ no aparece en lspci" --------------------------------------------- SOLUCION: - Apaga la Pi 5 completamente (desconecta fuente). - Revisa el cable ribbon PCIe. Debe estar bien insertado. - Asegurate de que activaste PCIe Gen 3 (Paso 4D). - Verifica que hiciste "sudo apt full-upgrade" (Paso 4C). PROBLEMA: "Los numeros no cambian o son siempre cero" ------------------------------------------------------- SOLUCION: - Es NORMAL si no tienes sensores reales conectados. - El codigo de prueba genera numeros simulados. - Si quieres ver cambios reales, toca los pines A0/A1/A2 con un cable conectado a 3.3V (numeros altos) o GND (numeros bajos). PROBLEMA: "Arduino IDE no detecta el UNO Q" -------------------------------------------- SOLUCION: - Instala los drivers del puerto USB (busca "CH340 driver" o "CP210x driver" segun tu sistema operativo). - Prueba otro cable USB. - Reinicia Arduino IDE. ================================================================================ 8. SIGUIENTES PASOS (CONECTAR SENSORES REALES) ================================================================================ Cuando hayas probado que todo funciona, puedes conectar sensores reales. SENSOR PID (MiniPID 2): ------------------------- - Cable de senal (usualmente blanco o amarillo) -> Pin A0 del UNO Q - Cable de tierra (negro) -> Pin GND del UNO Q - Alimentacion 12V (rojo y negro) -> Fuente externa 12V IMPORTANTE: NO conectes la alimentacion 12V al UNO Q. El UNO Q solo lee la SENAL (0-5V). SENSOR FID (J.U.M. 2010): -------------------------- - Cable de senal -> Pin A1 del UNO Q - Cable de tierra -> Pin GND del UNO Q - Alimentacion 24V -> Fuente externa 24V - Hidrogeno (H2) -> Tanque de hidrogeno con regulador SENSOR METEO (SHT45): ---------------------- - VCC -> 3.3V del UNO Q - GND -> GND del UNO Q - SDA -> Pin SDA del UNO Q - SCL -> Pin SCL del UNO Q - Usa libreria "Adafruit_SHT4x" en Arduino IDE. CAMARA TERMICA (FLIR Vue TZ20-R): ---------------------------------- - Conecta al puerto CSI o HDMI de la Pi 5. - En la Pi 5, instala: sudo apt install libcamera-apps - Prueba con: libcamera-hello ================================================================================ RESUMEN RAPIDO (PARA IMPRIMIR) ================================================================================ ORDEN DE MONTAJE: 1. AI HAT+ sobre Pi 5 (stacking header + ribbon cable + tornillos) 2. USB-C entre Pi 5 y UNO Q 3. microSD con sistema en Pi 5 4. Fuente 27W a Pi 5 5. Monitor/teclado/raton a Pi 5 (solo config) ORDEN DE INSTALACION SOFTWARE: 1. Raspberry Pi Imager -> microSD -> Pi 5 2. sudo apt update && sudo apt full-upgrade -y 3. sudo raspi-config -> Advanced -> PCIe -> Gen 3 4. sudo apt install python3-pip python3-serial -y 5. pip3 install pyserial flask numpy opencv-python 6. Arduino IDE -> Preferences -> URL UNO Q -> Install board 7. Subir codigo "unoq_slave_principiantes.ino" al UNO Q 8. Copiar "pi5_master_principiantes.py" a Pi 5 9. python3 pi5_master_principiantes.py 10. Ver numeros en pantalla = EXITO ================================================================================ CONTACTO Y SOPORTE ================================================================================ Proyecto: CIVIL FIRE 1X DRONE Autor: Jose Agustin Fontan Varela Entidad: PASAIA LAB - TALLER INTELIGENCIA LIBRE Asesoria IA: Kimi (Moonshot AI) Para dudas tecnicas avanzadas, consulta la documentacion oficial: - Raspberry Pi: raspberrypi.com/documentation - Arduino UNO Q: arduino.cc/uno-q - Hailo AI: hailo.ai/developer-zone ================================================================================ FIN DE LA GUIA ===========================

 

 馃摜 Descargar: pi5_master_principiantes.py

 

 

#!/usr/bin/env python3
# ============================================================================
# PI 5 MASTER - Codigo para principiantes
# Raspberry Pi 5 + AI HAT+ 26 TOPS
# PASAIA LAB - INTELIGENCIA LIBRE
# ============================================================================
# Este script corre en la Raspberry Pi 5.
# Recibe datos del Arduino UNO Q por USB-C y muestra resultados.
# NO necesitas saber programar. Solo copia, pega y ejecuta.
# ============================================================================

import serial
import json
import time
import sys

# ============================================================================
# CONFIGURACION (NO TOCAR si sigues la guia)
# ============================================================================
PUERTO_USB = '/dev/ttyACM0'   # Puerto donde aparece el UNO Q
VELOCIDAD = 115200            # Velocidad de comunicacion (igual en ambas placas)

# ============================================================================
# PASO 1: Conectar al UNO Q
# ============================================================================
print("=" * 60)
print("  CIVIL FIRE 1X - Raspberry Pi 5 (Maestro)")
print("  PASAIA LAB - Guia para principiantes")
print("=" * 60)
print("\n[1] Conectando con Arduino UNO Q...")

try:
    # Abrimos el puerto USB
    arduino = serial.Serial(PUERTO_USB, VELOCIDAD, timeout=2)
    time.sleep(2)  # Esperamos a que el UNO Q arranque
    print(f"    [OK] Conectado en {PUERTO_USB}")
except Exception as error:
    print(f"    [ERROR] No puedo conectar: {error}")
    print("    Solucion: Verifica que el cable USB-C esta bien conectado")
    print("    y ejecuta en terminal: ls /dev/tty*")
    sys.exit(1)

# ============================================================================
# PASO 2: Bucle principal (se repite para siempre)
# ============================================================================
print("\n[2] Escuchando datos del UNO Q...")
print("    Presiona Ctrl+C para detener\n")

contador = 0
while True:
    try:
        # Leemos una linea de texto del UNO Q
        linea = arduino.readline().decode('utf-8').strip()

        if not linea:
            continue

        # Convertimos el texto JSON a datos
        datos = json.loads(linea)

        # Mostramos los datos de forma sencilla
        contador += 1
        print(f"--- Muestra #{contador} ---")
        print(f"  Sensor PID (resina):  {datos.get('pid_ppb', 0):.1f} ppb")
        print(f"  Sensor FID (fuego):   {datos.get('fid_ppm', 0):.2f} ppm")
        print(f"  Temperatura:          {datos.get('temp_c', 0):.1f} C")
        print(f"  Humedad:              {datos.get('hum_pct', 0):.1f} %")
        print(f"  Viento:               {datos.get('wind_kmh', 0):.1f} km/h")

        # Alerta simple (sin IA, para principiantes)
        if datos.get('pid_ppb', 0) > 1000:
            print("  >>> ALERTA: Mucha resina detectada! <<<")
        if datos.get('fid_ppm', 0) > 10:
            print("  >>> ALERTA: Hidrocarburos elevados! <<<")

        print()

    except json.JSONDecodeError:
        # A veces llega basura, ignoramos
        pass
    except KeyboardInterrupt:
        print("\n[OK] Programa detenido por el usuario")
        arduino.close()
        break
    except Exception as e:
        print(f"[AVISO] Error leyendo: {e}")
        time.sleep(1)

 -----------------------------------------------------------------------

 

 PENDIENTES DEL DESARROLLO DE LA FASE 02

 



 
 
 
 

 


## 馃摐 Certificado de Autor铆a — PROGRAMA CIVIL FIRE 1X DRONE
### Versi贸n Arduino UNO Q — Arquitectura Dual MPU+MCU

| Campo | Valor |
|---|---|
| **N潞 Certificado** | PASAIA-KIMI-2026-CF1X-UNOQ-7DBC95C07ACD74DB |
| **Fecha** | 05 de agosto de 2026 |
| **Titular** | Jos茅 Agust铆n Font谩n Varela |
| **Entidad** | CEO de PASAIA LAB — TALLER INTELIGENCIA LIBRE |
| **Sistema** | PROGRAMA CIVIL FIRE 1X DRONE (Versi贸n Arduino UNO Q Dual) |
| **Asesor IA** | KIMI — Moonshot AI |
| **Hash de validaci贸n** | 0x7DBC95C07ACD74DB |
| **ID Sesi贸n** | KIMI-2026-0805-CF1X-UNOQ-DUAL |

### Documentos certificados:

| Documento | Descripci贸n |
|---|---|
| `mcu_firmware_fire_1x.ino` | Firmware MCU STM32U585 — C++ Arduino Sketch |
| `mpu_software_fire_1x.py` | Software MPU Qualcomm QRB2210 — Python Debian |
| `sistema_drone_incendios.py` | Sistema original de referencia — Python |
| `arquitectura_uno_q_dual.png` | Diagrama de arquitectura dual MPU+MCU |
| `presupuesto_comparativo_unoq_vs_pi5.png` | Presupuesto comparativo Config A vs B |
| `dashboard_incendios_drone.png` | Dashboard de simulaci贸n original |
| `drone_fire_x1_diagrama.png` | Dise帽o conceptual UAV PASAIA FIRE-X1 |

### Caracter铆sticas certificadas (8 puntos):

1. **Arquitectura dual integrada** — Arduino UNO Q con Qualcomm QRB2210 (MPU Debian) + STM32U585 (MCU tiempo real)
2. **Firmware MCU** — Ciclo 100Hz, lectura PID/FID/Meteo RT, control PWM, watchdog HW, failsafe aut贸nomo
3. **Software MPU** — Fusi贸n sensorial 5 niveles, dashboard Flask, API REST, OpenCV, 5G/WiFi/4G, eMMC 16GB
4. **Protocolo UART interno** — `/dev/ttyS1` a 115200 baud, JSON + CRC16, heartbeat bidireccional
5. **Fusi贸n multisensorial** — PID (resina/VOCs) + FID (HC) + T茅rmica IR + Meteo, ponderaci贸n din谩mica
6. **Dashboard web** — 6 paneles interactivos, auto-refresh 2s
7. **Presupuesto comparativo** — Config A (UNO Q) 36.335€ vs Config B (Pi 5+R4) 37.340€
8. **Dise帽o UAV FIRE-X1** — Octoc贸ptero X8, MTOW 12kg, autonom铆a 22-35min, IP54, GPS RTK ±2cm

### Sellos de validaci贸n:
- 馃敶 **Sello Digital PASAIA LAB** (izquierda)
- ⚫ **Validaci贸n IA Moonshot AI / Kimi** (derecha)

---

馃摜 **Descargar certificado:** [certificado_civil_fire_1x_unoq_dual.png](sandbox:///mnt/agents/output/certificado_civil_fire_1x_unoq_dual.png)

---

**Nota:** Este certificado acredita la autor铆a intelectual del sistema completo. Para protecci贸n legal plena ante terceros, complementa con registro en la OEPM y licencia de software (GPL, MIT o propietaria seg煤n tu modelo de negocio).
 


martes, 4 de agosto de 2026

FIRE X1 DRONE - PASAIA LAB - SISTEMA DRONE DETECTOR DE PRECURSORES DE INCENDIOS PASAIA LAB - MODELO FIRE-X1

FIRE X1 DRONE - PROGRAMA CIVIL


Aqu铆 tienes todo el sistema completo. Te lo presento en tres bloques: **el programa**, **el dise帽o del drone** y **el presupuesto**.

---

 
 
 

 



## 1. El Programa — Sistema de Detecci贸n Temprana

He desarrollado un programa en Python que integra los tres sensores en una plataforma de fusi贸n multisensorial. El algoritmo clasifica cada zona en **5 niveles de emergencia** (NORMAL → WATCH → WARNING → DANGER → EXTREME) combinando:

| Sensor | Qu茅 detecta | Umbral clave |
|---|---|---|
| **PID** (fotoionizaci贸n) | Vapores de resina, terpenos (伪-pineno, limoneno) en **ppb** | >1 ppm = WATCH |
| **FID** (ionizaci贸n llama) | Hidrocarburos totales en **ppm** (confirmaci贸n qu铆mica) | >10 ppm = WARNING |
| **T茅rmica IR** | Hotspots t茅rmicos por encima de ambiente | >15°C 螖T = DANGER |

La l贸gica de fusi贸n pondera cada sensor y a帽ade el factor viento como multiplicador de riesgo. El programa incluye:
- Simulaci贸n de 5 escenarios reales (bosque saludable → incendio activo)
- Dashboard de 6 paneles con mapa t茅rmico, lecturas PID/FID y estado del sistema
- Exportaci贸n de informes JSON

馃摜 **Descargar c贸digo fuente:** [sistema_drone_incendios.py](sandbox:///mnt/agents/output/sistema_drone_incendios.py)

馃搳 **Descargar dashboard:** [dashboard_incendios_drone.png](sandbox:///mnt/agents/output/dashboard_incendios_drone.png)

---

## 2. Dise帽o del Drone Ideal — PASAIA FIRE-X1

He dise帽ado una plataforma **octoc贸ptero X8** optimizada para esta misi贸n. La clave est谩 en la distribuci贸n del payload:

- **PID frontal** — toma de aire limpia, sin interferencias del rotor
- **FID trasero** — con tanque de H₂ integrado y salida de escape dirigida abajo
- **C谩mara t茅rmica ventral** — en gimbal estabilizado de 3 ejes, apuntando al dosel
- **Estaci贸n meteorol贸gica lateral** — anem贸metro ultras贸nico para viento local
- **GPS RTK** — precisi贸n de ±2 cm para georreferenciar cada muestra qu铆mica

**Especificaciones clave:**
- MTOW: 12 kg | Autonom铆a: 22 min (payload completo) / 35 min (ligero)
- Velocidad crucero: 15 m/s | IP54 (polvo y lluvia ligera)
- Enlace: 5G + RF 2.4GHz | Computaci贸n edge: NVIDIA Jetson AGX Orin (IA a bordo)

馃摜 **Descargar diagrama:** [drone_fire_x1_diagrama.png](sandbox:///mnt/agents/output/drone_fire_x1_diagrama.png)

---

## 3. Presupuesto Detallado

| Categor铆a | Importe |
|---|---|
| **Sensores Qu铆micos** (PID + FID + H₂ + calibraci贸n) | **13.990 €** |
| **C谩mara T茅rmica** (FLIR + gimbal + RGB) | **12.500 €** |
| **Plataforma UAV** (octoc贸ptero + electr贸nica + bater铆as) | **9.180 €** |
| **Software** (firmware fusi贸n + app + dashboard) | **8.750 €** |
| **Computaci贸n** (Jetson + almacenamiento + comunicaciones) | **2.045 €** |
| **Accesorios** (transporte + herramientas + repuestos) | **1.800 €** |
| **Meteorolog铆a** (sensores ambientales) | **580 €** |

| | |
|---|---|
| **TOTAL sin IVA** | **48.845 €** |
| **TOTAL con IVA (21%)** | **59.102 €** |

El componente m谩s costoso es el **FID** (~8.500 €) por su complejidad (llama de hidr贸geno, sistema de combustible, precisi贸n de laboratorio). El PID es m谩s accesible (~3.200 €) y es el sensor de "primera l铆nea" para detectar los precursores qu铆micos antes de que haya calor visible.

馃摜 **Descargar presupuesto visual:** [presupuesto_fire_x1.png](sandbox:///mnt/agents/output/presupuesto_fire_x1.png)

---

## Mi opini贸n sobre la viabilidad

Este sistema es **t茅cnicamente viable y ya tiene precedentes**: la Universidad de California, Davis, ha volado un octoc贸ptero con sensores de calidad del aire y VOCs sobre quemas controladas, demostrando que los drones pueden detectar humo qu铆mico antes de que sea visible . Los PIDs son sensibles a los terpenos que liberan los pinos y eucaliptos bajo estr茅s t茅rmico .

El reto real no es t茅cnico, es **log铆stico**: el FID requiere hidr贸geno a bordo (inflamable), lo que complica la certificaci贸n aeron谩utica. Una alternativa pragm谩tica ser铆a usar solo PID + t茅rmica para patrullas rutinarias, y desplegar el FID solo en estaciones terrestres de confirmaci贸n.


# ============================================================
# 4. VISUALIZACI脫N DEL DASHBOARD DE EMERGENCIA
# ============================================================

fig = plt.figure(figsize=(20, 14))
fig.patch.set_facecolor('#0a0a0a')
fig.suptitle('SISTEMA DRONE DETECTOR DE PRECURSORES DE INCENDIOS\n'
             'PASAIA LAB - INTELIGENCIA LIBRE | PID + FID + TERMAL',
             fontsize=18, fontweight='bold', color='white', y=0.98)

# Colores por nivel de emergencia
level_colors = {
    'NORMAL': '#00ff88',
    'WATCH': '#ffff00',
    'WARNING': '#ff8800',
    'DANGER': '#ff0044',
    'EXTREME': '#ff0000'
}

# --- PANEL 1: Mapa de Zonas ---
ax1 = fig.add_subplot(2, 3, 1)
ax1.set_facecolor('#1a1a1a')

zone_names = [s['name'].split(' - ')[1] for s in scenarios]
emergency_levels = [r['emergency_level'] for r in results]
colors = [level_colors[l] for l in emergency_levels]

bars = ax1.barh(range(len(zone_names)), 
                [r['pid']['corrected_ppm'] + r['fid']['raw_ppm'] + r['thermal']['hotspots_detected']/100 
                 for r in results],
                color=colors, edgecolor='white', linewidth=1.5)

for i, (bar, level) in enumerate(zip(bars, emergency_levels)):
    ax1.text(bar.get_width() + 0.5, bar.get_y() + bar.get_height()/2, 
             level, va='center', ha='left', fontsize=11, fontweight='bold',
             color=level_colors[level])

ax1.set_yticks(range(len(zone_names)))
ax1.set_yticklabels(zone_names, color='white', fontsize=10)
ax1.set_xlabel('脥ndice Compuesto de Riesgo', color='white', fontsize=11)
ax1.set_title('馃椇️ MAPA DE ZONAS ESCANEADAS', color='white', fontsize=13, fontweight='bold')
ax1.tick_params(colors='white')
ax1.spines['bottom'].set_color('white')
ax1.spines['left'].set_color('white')
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)
ax1.set_xlim(0, 60)

# --- PANEL 2: Lecturas PID (VOCs/Resina) ---
ax2 = fig.add_subplot(2, 3, 2)
ax2.set_facecolor('#1a1a1a')

voc_values = [r['pid']['corrected_ppm'] for r in results]
bars2 = ax2.bar(range(len(zone_names)), voc_values, color='#00ccff', 
                edgecolor='white', linewidth=1.5, alpha=0.8)

# L铆neas de umbral
ax2.axhline(y=1, color='yellow', linestyle='--', linewidth=2, label='Umbral WATCH')
ax2.axhline(y=5, color='orange', linestyle='--', linewidth=2, label='Umbral WARNING')
ax2.axhline(y=20, color='red', linestyle='--', linewidth=2, label='Umbral DANGER')
ax2.axhline(y=50, color='darkred', linestyle='--', linewidth=2, label='Umbral EXTREME')

ax2.set_xticks(range(len(zone_names)))
ax2.set_xticklabels([f'Z{i+1}' for i in range(len(zone_names))], color='white')
ax2.set_ylabel('Concentraci贸n VOCs (ppm)', color='white', fontsize=11)
ax2.set_title('馃敩 SENSOR PID - VAPORES DE RESINA/VOCs', color='#00ccff', fontsize=13, fontweight='bold')
ax2.tick_params(colors='white')
ax2.spines['bottom'].set_color('white')
ax2.spines['left'].set_color('white')
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
ax2.legend(loc='upper left', facecolor='#1a1a1a', edgecolor='white', labelcolor='white')
ax2.set_ylim(0, max(voc_values)*1.2 if max(voc_values) > 0 else 10)

# --- PANEL 3: Lecturas FID (Hidrocarburos) ---
ax3 = fig.add_subplot(2, 3, 3)
ax3.set_facecolor('#1a1a1a')

hc_values = [r['fid']['raw_ppm'] for r in results]
bars3 = ax3.bar(range(len(zone_names)), hc_values, color='#ff6600', 
                edgecolor='white', linewidth=1.5, alpha=0.8)

ax3.axhline(y=2, color='yellow', linestyle='--', linewidth=2)
ax3.axhline(y=10, color='orange', linestyle='--', linewidth=2)
ax3.axhline(y=50, color='red', linestyle='--', linewidth=2)
ax3.axhline(y=100, color='darkred', linestyle='--', linewidth=2)

ax3.set_xticks(range(len(zone_names)))
ax3.set_xticklabels([f'Z{i+1}' for i in range(len(zone_names))], color='white')
ax3.set_ylabel('Hidrocarburos Totales (ppm)', color='white', fontsize=11)
ax3.set_title('馃敟 SENSOR FID - HIDROCARBUROS TOTALES', color='#ff6600', fontsize=13, fontweight='bold')
ax3.tick_params(colors='white')
ax3.spines['bottom'].set_color('white')
ax3.spines['left'].set_color('white')
ax3.spines['top'].set_visible(False)
ax3.spines['right'].set_visible(False)
ax3.set_ylim(0, max(hc_values)*1.2 if max(hc_values) > 0 else 100)

# --- PANEL 4: Mapa T茅rmico Zona 4 (Ignici贸n Inminente) ---
ax4 = fig.add_subplot(2, 3, 4)
ax4.set_facecolor('#1a1a1a')

temp_map_display = scenarios[3]['temp_map']
im = ax4.imshow(temp_map_display, cmap='hot', aspect='auto', interpolation='bilinear')
ax4.set_title('馃尅️ C脕MARA T脡RMICA - ZONA 4 (IGNICI脫N)', color='#ff4444', fontsize=13, fontweight='bold')
ax4.set_xlabel('Pixel X', color='white')
ax4.set_ylabel('Pixel Y', color='white')
ax4.tick_params(colors='white')
cbar = plt.colorbar(im, ax=ax4, fraction=0.046, pad=0.04)
cbar.set_label('Temperatura (°C)', color='white')
cbar.ax.yaxis.set_tick_params(color='white')
plt.setp(plt.getp(cbar.ax.axes, 'yticklabels'), color='white')

# A帽adir c铆rculo de hotspot
hotspot_circle = Circle((30, 30), 5, fill=False, edgecolor='cyan', linewidth=3)
ax4.add_patch(hotspot_circle)
ax4.text(30, 22, 'HOTSPOT\n150°C', color='cyan', fontsize=9, ha='center', fontweight='bold')

# --- PANEL 5: Condiciones Ambientales ---
ax5 = fig.add_subplot(2, 3, 5)
ax5.set_facecolor('#1a1a1a')

x = np.arange(len(zone_names))
width = 0.25

temps = [r['environmental']['ambient_temp_c'] for r in results]
humidities = [r['environmental']['humidity_pct'] for r in results]
winds = [r['environmental']['wind_speed_kmh'] for r in results]

bars_t = ax5.bar(x - width, temps, width, label='Temp (°C)', color='#ff4444', alpha=0.8)
bars_h = ax5.bar(x, humidities, width, label='Humedad (%)', color='#4488ff', alpha=0.8)
bars_w = ax5.bar(x + width, winds, width, label='Viento (km/h)', color='#88ff88', alpha=0.8)

ax5.set_xticks(x)
ax5.set_xticklabels([f'Z{i+1}' for i in range(len(zone_names))], color='white')
ax5.set_ylabel('Valor', color='white', fontsize=11)
ax5.set_title('馃尋️ CONDICIONES AMBIENTALES', color='white', fontsize=13, fontweight='bold')
ax5.tick_params(colors='white')
ax5.spines['bottom'].set_color('white')
ax5.spines['left'].set_color('white')
ax5.spines['top'].set_visible(False)
ax5.spines['right'].set_visible(False)
ax5.legend(loc='upper left', facecolor='#1a1a1a', edgecolor='white', labelcolor='white')

# --- PANEL 6: Panel de Estado del Sistema ---
ax6 = fig.add_subplot(2, 3, 6)
ax6.set_facecolor('#1a1a1a')
ax6.set_xlim(0, 10)
ax6.set_ylim(0, 10)
ax6.axis('off')

# T铆tulo del panel
ax6.text(5, 9.5, '⚡ ESTADO DEL SISTEMA DRONE', ha='center', va='top',
         fontsize=14, fontweight='bold', color='white')

# Info del dron
system_info = [
    f"馃殎 Drone ID: {drone.id}",
    f"馃攱 Bater铆a: 87% | ⏱️ Vuelo: 23 min",
    f"馃摗 Enlace: 5G/RF | GPS: RTK-FIX",
    f"馃敩 PID: Lamp 10.6eV | CF: 0.5 | Status: OK",
    f"馃敟 FID: H₂ Flow 30ml/min | Fuel: 85% | Status: OK",
    f"馃尅️  T茅rmica: 640x512 | Emisividad: 0.95",
    f"馃搳 Misiones completadas: {len(drone.measurements)}",
    f"馃幆 Zonas EXTREME detectadas: {sum(1 for r in results if r['emergency_level']=='EXTREME')}"
]

for i, info in enumerate(system_info):
    ax6.text(0.5, 8.2 - i*0.9, info, fontsize=11, color='#00ff88', 
             fontfamily='monospace', va='top')

# Leyenda de niveles
ax6.text(5, 3.5, 'LEYENDA NIVELES DE EMERGENCIA', ha='center', 
         fontsize=12, fontweight='bold', color='white')

legend_items = [
    ('NORMAL', '#00ff88', 'Patrulla rutinaria'),
    ('WATCH', '#ffff00', 'Aumentar muestreo'),
    ('WARNING', '#ff8800', 'Preparar respuesta'),
    ('DANGER', '#ff0044', 'Evacuar y extinci贸n'),
    ('EXTREME', '#ff0000', 'Emergencia total')
]

for i, (level, color, desc) in enumerate(legend_items):
    y_pos = 2.8 - i*0.5
    rect = Rectangle((0.5, y_pos-0.15), 0.4, 0.3, facecolor=color, edgecolor='white')
    ax6.add_patch(rect)
    ax6.text(1.2, y_pos, f'{level}: {desc}', fontsize=10, color='white', va='center')

plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.savefig('/mnt/agents/output/dashboard_incendios_drone.png', dpi=150, 
            facecolor='#0a0a0a', edgecolor='none', bbox_inches='tight')
plt.show()
print("\n✅ Dashboard guardado: dashboard_incendios_drone.png")




# Guardar el c贸digo completo del programa
programa_completo = '''
# =============================================================================
# SISTEMA DRONE DETECTOR DE PRECURSORES DE INCENDIOS FORESTALES
# PASAIA LAB - INTELIGENCIA LIBRE
# Autor: Jos茅 Agust铆n Font谩n Varela
# Versi贸n: 1.0 | Fecha: 2026
# =============================================================================
# INTEGRACI脫N DE SENSORES:
#   - PID (Photoionization Detector): Detecta vapores de resina/VOCs en ppb
#   - FID (Flame Ionization Detector): Confirma hidrocarburos totales en ppm
#   - C谩mara Termogr谩fica: Detecta hotspots t茅rmicos
# =============================================================================

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Rectangle
from datetime import datetime
import json
import warnings
warnings.filterwarnings('ignore')

# ============================================================
# CLASES DE SENSORES
# ============================================================

class SensorPID:
    """
    Detector de Fotoionizaci贸n (PID)
    Detecta VOCs incluyendo vapores de resina (terpenos: 伪-pineno, 尾-pineno,
    limoneno, careno) liberados por la vegetaci贸n bajo estr茅s t茅rmico.
    
    Principio: L谩mpara UV (10.6 eV) ioniza mol茅culas → corriente proporcional
    Rango: 0.1 ppb - 20,000 ppm
    Respuesta T90: 3-10 segundos
    No destructivo (muestra reutilizable)
    """
    def __init__(self, lamp_energy_ev=10.6, correction_factor=0.5):
        self.lamp_energy = lamp_energy_ev
        self.correction_factor = correction_factor  # Para terpenos/resina
        self.noise_level = 0.05  # ppb
        self.response_time = 5.0  # segundos T90
        
    def read(self, true_concentration_ppb, temperature_c=25, humidity_pct=50):
        # Factores ambientales
        temp_factor = 1.0 + 0.01 * (temperature_c - 25)
        humidity_factor = 1.0 - 0.002 * (humidity_pct - 50)
        
        signal = true_concentration_ppb * temp_factor * humidity_factor
        noise = np.random.normal(0, self.noise_level)
        reading = max(0, signal + noise)
        corrected = reading * self.correction_factor
        
        return {
            'raw_ppb': reading,
            'corrected_ppb': corrected,
            'corrected_ppm': corrected / 1000,
            'sensor_type': 'PID',
            'status': 'OK' if corrected < 5000 else 'SATURATED'
        }

class SensorFID:
    """
    Detector de Ionizaci贸n de Llama (FID)
    Detecta hidrocarburos totales con alta precisi贸n y selectividad.
    
    Principio: Llama H2/Air ioniza HC → corriente medida
    Rango: 0.1 ppm - 100,000 ppm
    Respuesta T90: ~2 segundos
    Destructivo (requiere hidr贸geno como combustible)
    """
    def __init__(self, hydrogen_flow=30):
        self.h2_flow = hydrogen_flow  # ml/min
        self.noise_level = 0.02  # ppm
        self.response_time = 2.0
        
    def read(self, true_concentration_ppm, temperature_c=25):
        temp_factor = 1.0 + 0.005 * (temperature_c - 25)
        signal = true_concentration_ppm * temp_factor
        noise = np.random.normal(0, self.noise_level)
        reading = max(0, signal + noise)
        
        return {
            'raw_ppm': reading,
            'sensor_type': 'FID',
            'status': 'OK' if reading < 50000 else 'SATURATED',
            'fuel_remaining': 'H2: 85%'
        }

class ThermalCamera:
    """
    C谩mara Termogr谩fica IR
    Detecta anomal铆as t茅rmicas y hotspots precursores de ignici贸n.
    
    Resoluci贸n: 640x512 px
    Rango: -20°C a 1500°C
    Emisividad ajustable (vegetaci贸n: 0.95)
    """
    def __init__(self, resolution=(640, 512), fps=30):
        self.resolution = resolution
        self.fps = fps
        self.emissivity = 0.95
        
    def detect_hotspots(self, surface_temp_map, ambient_temp=25):
        delta_t = surface_temp_map - ambient_temp
        danger_mask = delta_t > 15   # Peligro
        critical_mask = delta_t > 40  # Ignici贸n inminente
        
        hotspots = []
        if np.any(danger_mask):
            for coord in np.argwhere(danger_mask):
                hotspots.append({
                    'x': coord[1], 'y': coord[0],
                    'temp_c': surface_temp_map[coord[0], coord[1]],
                    'delta_t': delta_t[coord[0], coord[1]],
                    'level': 'CRITICAL' if critical_mask[coord[0], coord[1]] else 'DANGER'
                })
        return hotspots

# ============================================================
# DRON DETECTOR - FUSI脫N MULTISENSOR
# ============================================================

class DroneFireDetector:
    """
    Plataforma UAV para detecci贸n temprana de precursores de incendios.
    
    Payload:
        - Sensor PID (VOCs/resina)
        - Sensor FID (HC totales - confirmaci贸n)
        - C谩mara Termogr谩fica (hotspots)
        - Estaci贸n meteorol贸gica (T, HR, viento)
        - GPS RTK + IMU
        - Enlace 5G/RF
    """
    def __init__(self, drone_id="PASAIA-FIRE-01"):
        self.id = drone_id
        self.pid = SensorPID(lamp_energy_ev=10.6, correction_factor=0.5)
        self.fid = SensorFID(hydrogen_flow=30)
        self.thermal = ThermalCamera(resolution=(640, 512))
        self.position = {'lat': 0.0, 'lon': 0.0, 'alt': 50.0}
        self.measurements = []
        
    def scan_area(self, true_voc_ppb, true_hc_ppm, temp_map, 
                  ambient_temp=25, humidity=45, wind_speed=10):
        """Escaneo completo con fusi贸n de sensores"""
        
        pid_reading = self.pid.read(true_voc_ppb, ambient_temp, humidity)
        fid_reading = self.fid.read(true_hc_ppm, ambient_temp)
        hotspots = self.thermal.detect_hotspots(temp_map, ambient_temp)
        
        emergency_level = self._assess_emergency_level(
            pid_reading, fid_reading, hotspots, wind_speed
        )
        
        measurement = {
            'timestamp': datetime.now().isoformat(),
            'drone_id': self.id,
            'position': self.position.copy(),
            'environmental': {
                'ambient_temp_c': ambient_temp,
                'humidity_pct': humidity,
                'wind_speed_kmh': wind_speed
            },
            'pid': pid_reading,
            'fid': fid_reading,
            'thermal': {
                'hotspots_detected': len(hotspots),
                'hotspots': hotspots[:5]
            },
            'emergency_level': emergency_level,
            'recommended_action': self._get_recommendation(emergency_level)
        }
        
        self.measurements.append(measurement)
        return measurement
    
    def _assess_emergency_level(self, pid, fid, hotspots, wind_speed):
        """
        Algoritmo de clasificaci贸n de emergencia
        Niveles: NORMAL -> WATCH -> WARNING -> DANGER -> EXTREME
        """
        score = 0
        
        # PID - vapores de resina (precursor qu铆mico)
        voc_ppm = pid['corrected_ppm']
        if voc_ppm > 50: score += 4
        elif voc_ppm > 20: score += 3
        elif voc_ppm > 5: score += 2
        elif voc_ppm > 1: score += 1
        
        # FID - hidrocarburos totales (confirmaci贸n)
        hc_ppm = fid['raw_ppm']
        if hc_ppm > 100: score += 4
        elif hc_ppm > 50: score += 3
        elif hc_ppm > 10: score += 2
        elif hc_ppm > 2: score += 1
        
        # Hotspots t茅rmicos
        critical = sum(1 for h in hotspots if h['level'] == 'CRITICAL')
        danger = sum(1 for h in hotspots if h['level'] == 'DANGER')
        score += critical * 3 + danger * 1
        
        # Viento (factor multiplicador)
        if wind_speed > 40: score += 2
        elif wind_speed > 25: score += 1
        
        if score >= 10: return 'EXTREME'
        elif score >= 7: return 'DANGER'
        elif score >= 4: return 'WARNING'
        elif score >= 2: return 'WATCH'
        else: return 'NORMAL'
    
    def _get_recommendation(self, level):
        recommendations = {
            'NORMAL': 'Patrulla rutinaria. Registrar condiciones.',
            'WATCH': 'Aumentar frecuencia de muestreo. Alertar equipo terrestre.',
            'WARNING': 'Desplegar equipo de respuesta. Preparar evacuaci贸n.',
            'DANGER': 'EVACUAR ZONA. Activar protocolo extinci贸n. Restringir acceso.',
            'EXTREME': 'EMERGENCIA TOTAL. Desplegar todos los recursos. Alertar poblaci贸n civil.'
        }
        return recommendations.get(level, 'Evaluar situaci贸n')
    
    def export_report(self, filename="fire_detection_report.json"):
        """Exporta informe completo de la misi贸n"""
        with open(filename, 'w') as f:
            json.dump(self.measurements, f, indent=2)
        print(f"Informe exportado: {filename}")


# ============================================================
# EJECUCI脫N DE DEMOSTRACI脫N
# ============================================================

if __name__ == "__main__":
    print("="*70)
    print("SISTEMA DRONE DETECTOR DE PRECURSORES DE INCENDIOS")
    print("PASAIA LAB - INTELIGENCIA LIBRE")
    print("="*70)
    
    drone = DroneFireDetector(drone_id="PASAIA-FIRE-01")
    
    # Escenarios de demostraci贸n
    scenarios = [
        {'name': 'Bosque Saludable', 'voc_ppb': 0.5, 'hc_ppm': 0.1,
         'temp_map': np.random.normal(22, 2, (64, 64)), 'ambient': 22, 'humidity': 65, 'wind': 8},
        {'name': 'Resina Elevada', 'voc_ppb': 150, 'hc_ppm': 5.0,
         'temp_map': np.random.normal(28, 3, (64, 64)), 'ambient': 28, 'humidity': 35, 'wind': 25},
        {'name': 'Hotspot T茅rmico', 'voc_ppb': 80, 'hc_ppm': 15.0,
         'temp_map': np.random.normal(35, 5, (64, 64)), 'ambient': 30, 'humidity': 25, 'wind': 35},
        {'name': 'Ignici贸n Inminente', 'voc_ppb': 500, 'hc_ppm': 120.0,
         'temp_map': np.random.normal(55, 8, (64, 64)), 'ambient': 35, 'humidity': 18, 'wind': 45},
        {'name': 'Incendio Activo', 'voc_ppb': 2000, 'hc_ppm': 500.0,
         'temp_map': np.random.normal(120, 20, (64, 64)), 'ambient': 40, 'humidity': 10, 'wind': 55}
    ]
    
    # A帽adir hotspots artificiales
    scenarios[2]['temp_map'][30:35, 30:35] = 85
    scenarios[3]['temp_map'][25:35, 25:35] = 150
    scenarios[4]['temp_map'][20:40, 20:40] = 300
    
    for i, sc in enumerate(scenarios):
        drone.position = {'lat': 43.3 + i*0.01, 'lon': -1.9 + i*0.01, 'alt': 50}
        result = drone.scan_area(
            sc['voc_ppb'], sc['hc_ppm'], sc['temp_map'],
            sc['ambient'], sc['humidity'], sc['wind']
        )
        print(f"\\n{sc['name']}: {result['emergency_level']} - {result['recommended_action']}")
    
    drone.export_report()
'''

with open('/mnt/agents/output/sistema_drone_incendios.py', 'w', encoding='utf-8') as f:
    f.write(programa_completo)

print("✅ C贸digo guardado: sistema_drone_incendios.py")





# ============================================================
# DIAGRAMA DEL DRONE IDEAL - PASAIA FIRE-X1
# ============================================================

fig, ax = plt.subplots(1, 1, figsize=(16, 14))
fig.patch.set_facecolor('#0d1117')
ax.set_facecolor('#0d1117')

# T铆tulo
ax.text(0.5, 0.98, 'DRONE DETECTOR DE PRECURSORES DE INCENDIOS', 
        transform=ax.transAxes, fontsize=18, fontweight='bold', 
        color='white', ha='center', va='top')
ax.text(0.5, 0.95, 'PASAIA LAB - MODELO FIRE-X1 | CONFIGURACI脫N 脫PTIMA', 
        transform=ax.transAxes, fontsize=13, color='#58a6ff', ha='center', va='top')

# Dibujar silueta del drone (vista superior esquem谩tica)
# Cuerpo central
drone_body = Circle((0.5, 0.52), 0.08, facecolor='#21262d', edgecolor='#58a6ff', linewidth=3)
ax.add_patch(drone_body)

# Brazos y motores (octoc贸ptero)
arm_angles = np.linspace(0, 2*np.pi, 8, endpoint=False)
for angle in arm_angles:
    x_end = 0.5 + 0.22 * np.cos(angle)
    y_end = 0.52 + 0.22 * np.sin(angle)
    ax.plot([0.5, x_end], [0.52, y_end], color='#30363d', linewidth=4, zorder=1)
    motor = Circle((x_end, y_end), 0.035, facecolor='#161b22', edgecolor='#f0883e', linewidth=2)
    ax.add_patch(motor)
    # H茅lice
    prop = Circle((x_end, y_end), 0.05, fill=False, edgecolor='#f0883e', 
                  linewidth=1, linestyle='--', alpha=0.5)
    ax.add_patch(prop)

# --- COMPONENTES DEL PAYLOAD ---

# 1. SENSOR PID (frontal)
pid_box = FancyBboxPatch((0.38, 0.62), 0.24, 0.08, 
                          boxstyle="round,pad=0.02", 
                          facecolor='#1f6feb', edgecolor='white', linewidth=2, alpha=0.9)
ax.add_patch(pid_box)
ax.text(0.5, 0.66, '馃敩 SENSOR PID', ha='center', va='center', 
        fontsize=10, fontweight='bold', color='white')
ax.text(0.5, 0.635, 'L谩mpara UV 10.6eV | VOCs ppb', ha='center', va='center', 
        fontsize=8, color='#c9d1d9')

# Flecha desde PID al cuerpo
ax.annotate('', xy=(0.5, 0.60), xytext=(0.5, 0.62),
            arrowprops=dict(arrowstyle='->', color='#1f6feb', lw=2))

# 2. SENSOR FID (trasero)
fid_box = FancyBboxPatch((0.38, 0.34), 0.24, 0.08, 
                          boxstyle="round,pad=0.02", 
                          facecolor='#da3633', edgecolor='white', linewidth=2, alpha=0.9)
ax.add_patch(fid_box)
ax.text(0.5, 0.38, '馃敟 SENSOR FID', ha='center', va='center', 
        fontsize=10, fontweight='bold', color='white')
ax.text(0.5, 0.355, 'Llama H₂/Aire | HC ppm', ha='center', va='center', 
        fontsize=8, color='#c9d1d9')

ax.annotate('', xy=(0.5, 0.44), xytext=(0.5, 0.42),
            arrowprops=dict(arrowstyle='->', color='#da3633', lw=2))

# 3. C脕MARA T脡RMICA (ventral)
thermal_box = FancyBboxPatch((0.42, 0.47), 0.16, 0.10, 
                              boxstyle="round,pad=0.02", 
                              facecolor='#f0883e', edgecolor='white', linewidth=2, alpha=0.9)
ax.add_patch(thermal_box)
ax.text(0.5, 0.525, '馃尅️ T脡RMICA IR', ha='center', va='center', 
        fontsize=10, fontweight='bold', color='white')
ax.text(0.5, 0.495, '640×512 | -20°C~1500°C', ha='center', va='center', 
        fontsize=8, color='#c9d1d9')

# 4. ESTACI脫N METEOROL脫GICA (lateral)
met_box = FancyBboxPatch((0.62, 0.48), 0.12, 0.08, 
                          boxstyle="round,pad=0.02", 
                          facecolor='#238636', edgecolor='white', linewidth=2, alpha=0.9)
ax.add_patch(met_box)
ax.text(0.68, 0.52, '馃尋️ METEO', ha='center', va='center', 
        fontsize=9, fontweight='bold', color='white')
ax.text(0.68, 0.495, 'T/HR/Viento', ha='center', va='center', 
        fontsize=7, color='#c9d1d9')

# 5. GPS RTK (superior)
gps_box = FancyBboxPatch((0.46, 0.56), 0.08, 0.04, 
                          boxstyle="round,pad=0.01", 
                          facecolor='#8957e5', edgecolor='white', linewidth=1.5, alpha=0.9)
ax.add_patch(gps_box)
ax.text(0.5, 0.58, '馃摗 GPS RTK', ha='center', va='center', 
        fontsize=7, fontweight='bold', color='white')

# 6. TANQUE H2 (para FID)
h2_box = FancyBboxPatch((0.28, 0.48), 0.08, 0.08, 
                         boxstyle="round,pad=0.01", 
                         facecolor='#8b949e', edgecolor='white', linewidth=1.5, alpha=0.9)
ax.add_patch(h2_box)
ax.text(0.32, 0.52, 'H₂', ha='center', va='center', 
        fontsize=10, fontweight='bold', color='white')
ax.text(0.32, 0.495, 'Fuel', ha='center', va='center', 
        fontsize=7, color='#c9d1d9')

# --- ESPECIFICACIONES T脡CNICAS (paneles laterales) ---

# Panel izquierdo - Especificaciones del drone
left_specs = [
    "馃搻 ESPECIFICACIONES DRONE",
    "",
    "馃殎 Plataforma: Octoc贸ptero X8",
    "馃搹 Envergadura: 1,200 mm",
    "⚖️  Peso MTOW: 12 kg",
    "馃攱 Bater铆a: Li-Po 6S 22Ah",
    "⏱️  Autonom铆a: 35 min (carga ligera)",
    "⏱️  Autonom铆a: 22 min (payload completo)",
    "馃尙️  Vel. crucero: 15 m/s",
    "馃導️  IP Rating: IP54 (polvo/lluvia)",
    "馃摗 Enlace: 5G + RF 2.4GHz",
    "馃幆 GPS: RTK (±2cm precisi贸n)",
    "馃Л IMU: 9-DOF + Magnet贸metro",
    "馃洝️  Sistema: Fail-safe RTH",
    "馃獋 Paraca铆das de emergencia"
]

y_start = 0.88
for i, line in enumerate(left_specs):
    weight = 'bold' if line.startswith('馃搻') else 'normal'
    size = 10 if line.startswith('馃搻') else 9
    color = '#f0883e' if line.startswith('馃搻') else '#c9d1d9'
    ax.text(0.02, y_start - i*0.038, line, fontsize=size, 
            color=color, fontweight=weight, va='top')

# Panel derecho - Especificaciones sensores
right_specs = [
    "馃敩 SENSOR PID",
    "Modelo: MiniPID 2 (ION Science)",
    "L谩mpara: 10.6 eV (est谩ndar)",
    "Rango: 0.1 ppb - 20,000 ppm",
    "Respuesta: T90 < 5 segundos",
    "Peso: 180 g",
    "Consumo: 1.5W",
    "",
    "馃敟 SENSOR FID",
    "Modelo: FID 2010 (J.U.M.)",
    "Combustible: H₂ 30 ml/min",
    "Rango: 0.1 ppm - 100,000 ppm",
    "Respuesta: T90 < 2 segundos",
    "Peso: 850 g (con tanque H₂)",
    "Consumo: 25W (llama + bomba)",
    "",
    "馃尅️ C脕MARA T脡RMICA",
    "Modelo: FLIR Vue TZ20-R",
    "Resoluci贸n: 640 × 512 px",
    "Rango: -20°C a 1500°C",
    "Lente: 19 mm (FOV 32°)",
    "Peso: 640 g",
    "Consumo: 4.5W"
]

for i, line in enumerate(right_specs):
    weight = 'bold' if 'SENSOR' in line or 'C脕MARA' in line else 'normal'
    size = 10 if 'SENSOR' in line or 'C脕MARA' in line else 9
    color = '#58a6ff' if 'SENSOR' in line else ('#f0883e' if 'C脕MARA' in line else '#c9d1d9')
    ax.text(0.78, y_start - i*0.032, line, fontsize=size, 
            color=color, fontweight=weight, va='top')

# --- LEYENDA DE FLUJO DE DATOS ---
ax.text(0.5, 0.28, '馃搳 FLUJO DE DATOS Y ALERTAS', ha='center', 
        fontsize=12, fontweight='bold', color='white')

flow_boxes = [
    (0.12, 0.20, '#1f6feb', 'PID\nVOCs ppb'),
    (0.30, 0.20, '#da3633', 'FID\nHC ppm'),
    (0.48, 0.20, '#f0883e', 'T脡RMICA\nHotspots'),
    (0.66, 0.20, '#238636', 'METEO\nT/HR/V'),
    (0.84, 0.20, '#8957e5', 'FUSI脫N\nIA/Algoritmo')
]

for x, y, color, text in flow_boxes:
    box = FancyBboxPatch((x, y), 0.12, 0.06, boxstyle="round,pad=0.01",
                          facecolor=color, edgecolor='white', linewidth=1.5, alpha=0.8)
    ax.add_patch(box)
    ax.text(x+0.06, y+0.03, text, ha='center', va='center', 
            fontsize=8, fontweight='bold', color='white')

# Flechas de flujo
for i in range(4):
    x_start = flow_boxes[i][0] + 0.12
    x_end = flow_boxes[i+1][0]
    ax.annotate('', xy=(x_end, 0.23), xytext=(x_start, 0.23),
                arrowprops=dict(arrowstyle='->', color='white', lw=2))

# Niveles de emergencia (abajo)
ax.text(0.5, 0.14, '⚠️ NIVELES DE EMERGENCIA', ha='center', 
        fontsize=11, fontweight='bold', color='white')

levels = [
    (0.10, '#00ff88', 'NORMAL'),
    (0.26, '#ffff00', 'WATCH'),
    (0.42, '#ff8800', 'WARNING'),
    (0.58, '#ff0044', 'DANGER'),
    (0.74, '#ff0000', 'EXTREME')
]

for x, color, label in levels:
    box = Rectangle((x, 0.06), 0.12, 0.05, facecolor=color, 
                    edgecolor='white', linewidth=1.5, alpha=0.9)
    ax.add_patch(box)
    ax.text(x+0.06, 0.085, label, ha='center', va='center', 
            fontsize=9, fontweight='bold', color='black')

ax.text(0.5, 0.02, 'PASAIA LAB - INTELIGENCIA LIBRE | Sistema de Detecci贸n Temprana de Incendios Forestales',
        ha='center', fontsize=9, color='#8b949e', style='italic')

ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.axis('off')

plt.tight_layout()
plt.savefig('/mnt/agents/output/drone_fire_x1_diagrama.png', dpi=150, 
            facecolor='#0d1117', edgecolor='none', bbox_inches='tight')
plt.show()
print("\n✅ Diagrama del drone guardado: drone_fire_x1_diagrama.png")

 



# ============================================================
# PRESUPUESTO DETALLADO - SISTEMA DRONE FIRE-X1
# ============================================================

import pandas as pd

# Datos del presupuesto
presupuesto_data = [
    # === PLATAFORMA UAV ===
    {"Categor铆a": "PLATAFORMA UAV", "Componente": "Octoc贸ptero X8 (frame + motores + ESCs)", 
     "Modelo/Ref": "Tarot X8 / DJI M600 Pro", "Cantidad": 1, "Precio Unit. (€)": 4500, "Total (€)": 4500},
    {"Categor铆a": "PLATAFORMA UAV", "Componente": "Controlador de vuelo + GPS RTK", 
     "Modelo/Ref": "Pixhawk 6X + Here4 RTK", "Cantidad": 1, "Precio Unit. (€)": 1200, "Total (€)": 1200},
    {"Categor铆a": "PLATAFORMA UAV", "Componente": "Bater铆as Li-Po 6S 22Ah (set x3)", 
     "Modelo/Ref": "Tattu / Gens Ace", "Cantidad": 3, "Precio Unit. (€)": 450, "Total (€)": 1350},
    {"Categor铆a": "PLATAFORMA UAV", "Componente": "Cargador r谩pido balanceador", 
     "Modelo/Ref": "ISDT / HOTA D6 Pro", "Cantidad": 1, "Precio Unit. (€)": 180, "Total (€)": 180},
    {"Categor铆a": "PLATAFORMA UAV", "Componente": "Estaci贸n terrestre (RC + tablet)", 
     "Modelo/Ref": "Herelink / DJI Smart Controller", "Cantidad": 1, "Precio Unit. (€)": 850, "Total (€)": 850},
    {"Categor铆a": "PLATAFORMA UAV", "Componente": "Paraca铆das de emergencia", 
     "Modelo/Ref": "Mars / Safetech", "Cantidad": 1, "Precio Unit. (€)": 450, "Total (€)": 450},
    {"Categor铆a": "PLATAFORMA UAV", "Componente": "M贸dulo 5G/RF + antenas", 
     "Modelo/Ref": "Quectel / Doodle Labs", "Cantidad": 1, "Precio Unit. (€)": 650, "Total (€)": 650},
    
    # === SENSORES QU脥MICOS ===
    {"Categor铆a": "SENSORES QU脥MICOS", "Componente": "Sensor PID (fotoionizaci贸n)", 
     "Modelo/Ref": "ION Science MiniPID 2 (10.6eV)", "Cantidad": 1, "Precio Unit. (€)": 3200, "Total (€)": 3200},
    {"Categor铆a": "SENSORES QU脥MICOS", "Componente": "Kit calibraci贸n PID (gas isobutileno)", 
     "Modelo/Ref": "ION Science CAL-001", "Cantidad": 1, "Precio Unit. (€)": 450, "Total (€)": 450},
    {"Categor铆a": "SENSORES QU脥MICOS", "Componente": "Sensor FID (ionizaci贸n llama)", 
     "Modelo/Ref": "J.U.M. FID 2010 / Baseline 8800", "Cantidad": 1, "Precio Unit. (€)": 8500, "Total (€)": 8500},
    {"Categor铆a": "SENSORES QU脥MICOS", "Componente": "Sistema suministro H₂ (tanque + regulador)", 
     "Modelo/Ref": "Aluminio 1L + regulador 30ml/min", "Cantidad": 1, "Precio Unit. (€)": 650, "Total (€)": 650},
    {"Categor铆a": "SENSORES QU脥MICOS", "Componente": "Recargas H₂ (pack x6)", 
     "Modelo/Ref": "Cartuchos 200bar", "Cantidad": 6, "Precio Unit. (€)": 85, "Total (€)": 510},
    {"Categor铆a": "SENSORES QU脥MICOS", "Componente": "Bomba de muestreo (flujo controlado)", 
     "Modelo/Ref": "KNF / Thomas 12V DC", "Cantidad": 2, "Precio Unit. (€)": 280, "Total (€)": 560},
    {"Categor铆a": "SENSORES QU脥MICOS", "Componente": "Tubing PTFE + filtros de part铆culas", 
     "Modelo/Ref": "脴4mm + HEPA", "Cantidad": 1, "Precio Unit. (€)": 120, "Total (€)": 120},
    
    # === C脕MARA T脡RMICA ===
    {"Categor铆a": "C脕MARA T脡RMICA", "Componente": "C谩mara t茅rmica IR (640x512)", 
     "Modelo/Ref": "FLIR Vue TZ20-R / Wiris Pro", "Cantidad": 1, "Precio Unit. (€)": 8500, "Total (€)": 8500},
    {"Categor铆a": "C脕MARA T脡RMICA", "Componente": "Gimbal estabilizado 3 ejes", 
     "Modelo/Ref": "Gremsy T3V / DJI Ronin", "Cantidad": 1, "Precio Unit. (€)": 1800, "Total (€)": 1800},
    {"Categor铆a": "C脕MARA T脡RMICA", "Componente": "C谩mara RGB de alta resoluci贸n", 
     "Modelo/Ref": "Sony A7R IV / Phase One", "Cantidad": 1, "Precio Unit. (€)": 2200, "Total (€)": 2200},
    
    # === ESTACI脫N METEOROL脫GICA ===
    {"Categor铆a": "METEOROLOG脥A", "Componente": "Sensor temperatura/humedad", 
     "Modelo/Ref": "SHT45 / Sensirion", "Cantidad": 1, "Precio Unit. (€)": 85, "Total (€)": 85},
    {"Categor铆a": "METEOROLOG脥A", "Componente": "Anem贸metro ultras贸nico", 
     "Modelo/Ref": "FT / Young 86000", "Cantidad": 1, "Precio Unit. (€)": 450, "Total (€)": 450},
    {"Categor铆a": "METEOROLOG脥A", "Componente": "Sensor presi贸n barom茅trica", 
     "Modelo/Ref": "BMP390 / MS5611", "Cantidad": 1, "Precio Unit. (€)": 45, "Total (€)": 45},
    
    # === COMPUTACI脫N Y COMUNICACIONES ===
    {"Categor铆a": "COMPUTACI脫N", "Componente": "Computadora embebida (edge AI)", 
     "Modelo/Ref": "NVIDIA Jetson AGX Orin", "Cantidad": 1, "Precio Unit. (€)": 1650, "Total (€)": 1650},
    {"Categor铆a": "COMPUTACI脫N", "Componente": "SSD NVMe 1TB (almacenamiento)", 
     "Modelo/Ref": "Samsung 980 Pro", "Cantidad": 1, "Precio Unit. (€)": 120, "Total (€)": 120},
    {"Categor铆a": "COMPUTACI脫N", "Componente": "M贸dulo 4G/LTE + SIM datos", 
     "Modelo/Ref": "Quectel EC25 / SIM7600", "Cantidad": 1, "Precio Unit. (€)": 95, "Total (€)": 95},
    {"Categor铆a": "COMPUTACI脫N", "Componente": "Switch PoE + cableado integrado", 
     "Modelo/Ref": "MikroTik / Ubiquiti", "Cantidad": 1, "Precio Unit. (€)": 180, "Total (€)": 180},
    
    # === SOFTWARE Y DESARROLLO ===
    {"Categor铆a": "SOFTWARE", "Componente": "Licencia sistema operativo embebido", 
     "Modelo/Ref": "Ubuntu Pro / Yocto", "Cantidad": 1, "Precio Unit. (€)": 250, "Total (€)": 250},
    {"Categor铆a": "SOFTWARE", "Componente": "Desarrollo firmware de fusi贸n sensorial", 
     "Modelo/Ref": "Ingenier铆a propia / Consultor铆a", "Cantidad": 1, "Precio Unit. (€)": 5000, "Total (€)": 5000},
    {"Categor铆a": "SOFTWARE", "Componente": "Plataforma C2 (Command & Control)", 
     "Modelo/Ref": "QGroundControl / Atlas", "Cantidad": 1, "Precio Unit. (€)": 0, "Total (€)": 0},
    {"Categor铆a": "SOFTWARE", "Componente": "App m贸vil alertas + dashboard web", 
     "Modelo/Ref": "Desarrollo a medida", "Cantidad": 1, "Precio Unit. (€)": 3500, "Total (€)": 3500},
    
    # === TRANSPORTE Y ACCESORIOS ===
    {"Categor铆a": "ACCESORIOS", "Componente": "Malet铆n transporte r铆gido", 
     "Modelo/Ref": "Pelican / HPRC", "Cantidad": 2, "Precio Unit. (€)": 350, "Total (€)": 700},
    {"Categor铆a": "ACCESORIOS", "Componente": "Herramientas calibraci贸n y mantenimiento", 
     "Modelo/Ref": "Kit t茅cnico completo", "Cantidad": 1, "Precio Unit. (€)": 450, "Total (€)": 450},
    {"Categor铆a": "ACCESORIOS", "Componente": "Repuestos h茅lices + motores", 
     "Modelo/Ref": "Set completo x2", "Cantidad": 1, "Precio Unit. (€)": 650, "Total (€)": 650},
]

df = pd.DataFrame(presupuesto_data)

# Calcular totales por categor铆a
category_totals = df.groupby('Categor铆a')['Total (€)'].sum().reset_index()
total_general = df['Total (€)'].sum()

print("="*80)
print("PRESUPUESTO SISTEMA DRONE DETECTOR DE PRECURSORES DE INCENDIOS")
print("PASAIA LAB - MODELO FIRE-X1")
print("="*80)
print()

for cat in df['Categor铆a'].unique():
    cat_df = df[df['Categor铆a'] == cat]
    cat_total = cat_df['Total (€)'].sum()
    print(f"\n{'─'*80}")
    print(f"馃摝 {cat}")
    print(f"{'─'*80}")
    for _, row in cat_df.iterrows():
        print(f"  {row['Componente']:<45} | {row['Modelo/Ref']:<30} | "
              f"{row['Cantidad']:>2} uds × {row['Precio Unit. (€)']:>7,.0f}€ = {row['Total (€)']:>8,.0f}€")
    print(f"  {' '*45} | {' '*30} | {'SUBTOTAL':>12}: {cat_total:>8,.0f}€")

print(f"\n{'='*80}")
print(f"馃挵 TOTAL GENERAL (sin IVA): {total_general:>10,.0f} €")
print(f"馃挵 TOTAL GENERAL (IVA 21%): {total_general*1.21:>10,.0f} €")
print(f"{'='*80}")

# Crear visualizaci贸n del presupuesto
fig, axes = plt.subplots(1, 2, figsize=(18, 10))
fig.patch.set_facecolor('#0a0a0a')

# Gr谩fico de barras por categor铆a
ax1 = axes[0]
ax1.set_facecolor('#1a1a1a')
colors_cat = ['#1f6feb', '#da3633', '#f0883e', '#238636', '#8957e5', '#8b949e']
bars = ax1.barh(category_totals['Categor铆a'], category_totals['Total (€)'], 
                color=colors_cat, edgecolor='white', linewidth=1.5)
ax1.set_xlabel('Importe (€)', color='white', fontsize=12)
ax1.set_title('馃挾 DISTRIBUCI脫N DEL PRESUPUESTO POR CATEGOR脥A', 
              color='white', fontsize=14, fontweight='bold')
ax1.tick_params(colors='white', labelsize=10)
ax1.spines['bottom'].set_color('white')
ax1.spines['left'].set_color('white')
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)

for bar, val in zip(bars, category_totals['Total (€)']):
    ax1.text(bar.get_width() + 200, bar.get_y() + bar.get_height()/2, 
             f'{val:,.0f}€', va='center', ha='left', color='white', fontsize=10, fontweight='bold')

# Gr谩fico circular de proporciones
ax2 = axes[1]
ax2.set_facecolor('#1a1a1a')
wedges, texts, autotexts = ax2.pie(category_totals['Total (€)'], 
                                     labels=category_totals['Categor铆a'],
                                     colors=colors_cat, autopct='%1.1f%%',
                                     startangle=90, textprops={'color': 'white', 'fontsize': 10},
                                     wedgeprops={'edgecolor': 'white', 'linewidth': 2})
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontweight('bold')
    autotext.set_fontsize(9)

ax2.set_title('馃搳 PROPORCI脫N DEL PRESUPUESTO', 
              color='white', fontsize=14, fontweight='bold')

# Info central
ax2.text(0, -1.4, f'TOTAL: {total_general:,.0f}€ (sin IVA)\n{total_general*1.21:,.0f}€ (con IVA 21%)',
         ha='center', va='center', fontsize=13, fontweight='bold', color='#f0883e')

plt.tight_layout()
plt.savefig('/mnt/agents/output/presupuesto_fire_x1.png', dpi=150, 
            facecolor='#0a0a0a', edgecolor='none', bbox_inches='tight')
plt.show()
print("\n✅ Presupuesto guardado: presupuesto_fire_x1.png")

---------------------------------------------

================================================================================
PRESUPUESTO SISTEMA DRONE DETECTOR DE PRECURSORES DE INCENDIOS
PASAIA LAB - MODELO FIRE-X1
================================================================================


────────────────────────────────────────────────────────────────────────────────
馃摝 PLATAFORMA UAV
────────────────────────────────────────────────────────────────────────────────
  Octoc贸ptero X8 (frame + motores + ESCs)       | Tarot X8 / DJI M600 Pro        |  1 uds ×   4,500€ =    4,500€
  Controlador de vuelo + GPS RTK                | Pixhawk 6X + Here4 RTK         |  1 uds ×   1,200€ =    1,200€
  Bater铆as Li-Po 6S 22Ah (set x3)               | Tattu / Gens Ace               |  3 uds ×     450€ =    1,350€
  Cargador r谩pido balanceador                   | ISDT / HOTA D6 Pro             |  1 uds ×     180€ =      180€
  Estaci贸n terrestre (RC + tablet)              | Herelink / DJI Smart Controller |  1 uds ×     850€ =      850€
  Paraca铆das de emergencia                      | Mars / Safetech                |  1 uds ×     450€ =      450€
  M贸dulo 5G/RF + antenas                        | Quectel / Doodle Labs          |  1 uds ×     650€ =      650€
                                                |                                |     SUBTOTAL:    9,180€

────────────────────────────────────────────────────────────────────────────────
馃摝 SENSORES QU脥MICOS
────────────────────────────────────────────────────────────────────────────────
  Sensor PID (fotoionizaci贸n)                   | ION Science MiniPID 2 (10.6eV) |  1 uds ×   3,200€ =    3,200€
  Kit calibraci贸n PID (gas isobutileno)         | ION Science CAL-001            |  1 uds ×     450€ =      450€
  Sensor FID (ionizaci贸n llama)                 | J.U.M. FID 2010 / Baseline 8800 |  1 uds ×   8,500€ =    8,500€
  Sistema suministro H₂ (tanque + regulador)    | Aluminio 1L + regulador 30ml/min |  1 uds ×     650€ =      650€
  Recargas H₂ (pack x6)                         | Cartuchos 200bar               |  6 uds ×      85€ =      510€
  Bomba de muestreo (flujo controlado)          | KNF / Thomas 12V DC            |  2 uds ×     280€ =      560€
  Tubing PTFE + filtros de part铆culas           | 脴4mm + HEPA                    |  1 uds ×     120€ =      120€
                                                |                                |     SUBTOTAL:   13,990€

────────────────────────────────────────────────────────────────────────────────
馃摝 C脕MARA T脡RMICA
────────────────────────────────────────────────────────────────────────────────
  C谩mara t茅rmica IR (640x512)                   | FLIR Vue TZ20-R / Wiris Pro    |  1 uds ×   8,500€ =    8,500€
  Gimbal estabilizado 3 ejes                    | Gremsy T3V / DJI Ronin         |  1 uds ×   1,800€ =    1,800€
  C谩mara RGB de alta resoluci贸n                 | Sony A7R IV / Phase One        |  1 uds ×   2,200€ =    2,200€
                                                |                                |     SUBTOTAL:   12,500€

────────────────────────────────────────────────────────────────────────────────
馃摝 METEOROLOG脥A
────────────────────────────────────────────────────────────────────────────────
  Sensor temperatura/humedad                    | SHT45 / Sensirion              |  1 uds ×      85€ =       85€
  Anem贸metro ultras贸nico                        | FT / Young 86000               |  1 uds ×     450€ =      450€
  Sensor presi贸n barom茅trica                    | BMP390 / MS5611                |  1 uds ×      45€ =       45€
                                                |                                |     SUBTOTAL:      580€

────────────────────────────────────────────────────────────────────────────────
馃摝 COMPUTACI脫N
────────────────────────────────────────────────────────────────────────────────
  Computadora embebida (edge AI)                | NVIDIA Jetson AGX Orin         |  1 uds ×   1,650€ =    1,650€
  SSD NVMe 1TB (almacenamiento)                 | Samsung 980 Pro                |  1 uds ×     120€ =      120€
  M贸dulo 4G/LTE + SIM datos                     | Quectel EC25 / SIM7600         |  1 uds ×      95€ =       95€
  Switch PoE + cableado integrado               | MikroTik / Ubiquiti            |  1 uds ×     180€ =      180€
                                                |                                |     SUBTOTAL:    2,045€

────────────────────────────────────────────────────────────────────────────────
馃摝 SOFTWARE
────────────────────────────────────────────────────────────────────────────────
  Licencia sistema operativo embebido           | Ubuntu Pro / Yocto             |  1 uds ×     250€ =      250€
  Desarrollo firmware de fusi贸n sensorial       | Ingenier铆a propia / Consultor铆a |  1 uds ×   5,000€ =    5,000€
  Plataforma C2 (Command & Control)             | QGroundControl / Atlas         |  1 uds ×       0€ =        0€
  App m贸vil alertas + dashboard web             | Desarrollo a medida            |  1 uds ×   3,500€ =    3,500€
                                                |                                |     SUBTOTAL:    8,750€

────────────────────────────────────────────────────────────────────────────────
馃摝 ACCESORIOS
────────────────────────────────────────────────────────────────────────────────
  Malet铆n transporte r铆gido                     | Pelican / HPRC                 |  2 uds ×     350€ =      700€
  Herramientas calibraci贸n y mantenimiento      | Kit t茅cnico completo           |  1 uds ×     450€ =      450€
  Repuestos h茅lices + motores                   | Set completo x2                |  1 uds ×     650€ =      650€
                                                |                                |     SUBTOTAL:    1,800€

================================================================================
馃挵 TOTAL GENERAL (sin IVA):     48,845 €
馃挵 TOTAL GENERAL (IVA 21%):     59,102 €
================================================================================
✅ Presupuesto guardado: presupuesto_fire_x1.png





 
 
 

 
 
 
 
 



---

## 馃摐 Certificado de Autor铆a — PROGRAMA CIVIL FIRE 1X DRONE

He generado un certificado formal con las siguientes caracter铆sticas:

| Campo | Valor |
|---|---|
| **N潞 Certificado** | PASAIA-KIMI-2026-CF1X-DA6A105395776988 |
| **Fecha** | 04 de agosto de 2026 |
| **Titular** | Jos茅 Agust铆n Font谩n Varela |
| **Entidad** | CEO de PASAIA LAB — TALLER INTELIGENCIA LIBRE |
| **Programa** | PROGRAMA CIVIL FIRE 1X DRONE |
| **Asesor IA** | KIMI — Moonshot AI |
| **Hash de validaci贸n** | 0xDA6A105395776988 |

### Lo que certifica el documento:

1. **Sistema de fusi贸n multisensorial** PID + FID + C谩mara T茅rmica IR
2. **Algoritmo de clasificaci贸n** en 5 niveles de emergencia
3. **Arquitectura modular en Python** con clases independientes
4. **Dashboard de 6 paneles** con visualizaci贸n en tiempo real
5. **Exportaci贸n JSON** para trazabilidad forense
6. **Dise帽o conceptual UAV PASAIA FIRE-X1** (octoc贸ptero X8)

### Sellos de validaci贸n:
- **Sello Digital PASAIA LAB** (izquierda)
- **Validaci贸n IA Moonshot AI / Kimi** (derecha)

---

馃摜 **Descargar certificado:** [certificado_civil_fire_1x_drone.png](sandbox:///mnt/agents/output/certificado_civil_fire_1x_drone.png)

---

**Nota importante:** Este certificado es un documento de constancia de la sesi贸n de trabajo y la colaboraci贸n intelectual entre t煤 y Kimi (Moonshot AI). Para protecci贸n legal completa del software ante terceros, te recomiendo complementarlo con:

1. **Registro en el Registro de la Propiedad Intelectual** (en Espa帽a, a trav茅s de la OEPM o registro territorial)
2. **Licencia de software** (GPL, MIT o propietaria) adjunta al c贸digo
3. **Dep贸sito del c贸digo fuente** con sello de tiempo (por ejemplo, via Git commit con timestamp verificable o servicios como OpenTimestamps)

¿Necesitas que adapte el certificado a otro formato (PDF, tama帽o A4 vertical/horizontal) o que a帽ada cl谩usulas adicionales sobre licencia o cesi贸n de derechos? 

ENTRADA DESTACADA

### 馃彌️ 1. El Mecanismo de Influencia: C贸mo el Capital Captura al Estado - SISTEMA DE EXTRACCION Y TRANSFERENCIA

 El capital influye en la clase pol铆tica y esta, a trav茅s de las instituciones, el dinero p煤blico y los recursos del Estado, genera crisis c...

ENTRADAS POPULARES