Tengo un circuito en el que estoy intentando utilizar un microcontrolador para activar la bocina de un coche. He tenido muchos problemas al intentar aislar la bocina del resto del circuito. Tengo el microcontrolador encendiendo y apagando un LED una vez por segundo más o menos, sólo como un LED de estado de que todo va bien. Luego, cuando la bocina se enciende, el LED deja de parpadear y se queda encendido, y la bocina no se apaga. Es como si el microcontrolador se hubiera quedado encajado. Mientras escribo esto tal vez el reloj externo está recibiendo alguna retroalimentación de alguna manera? Incluso si desconecto la batería de 12v del coche del circuito el microcontrolador no se recupera hasta que lo encienda. He probado el circuito con resistencias de potencia y todo funciona como se espera. Lo difícil es que siento que he hecho todo lo posible para aislar el microcontrolador de la bocina.
También he tratado de añadir un diodo flyback (editar* añadido al esquema) sin mejores resultados (lo dejé fuera para esta ejecución porque uno de los chicos que ayudó a diseñar esta cosa dijo que una batería de coche puede manejar y un diodo flyback no es necesario). Incluso he intentado envolver la placa del microcontrolador en papel de aluminio. Eso tampoco pareció ayudar.
¿Alguna idea de lo que podría estar pasando, o qué probar a continuación?
EDITAR :
Gracias por todas las sugerencias. Terminé añadiendo el diodo flyback a través de la bobina del relé y también simplifiqué un montón de mi código de arduino. Entonces descubrí que si comentaba todo y sólo tenía un botón como entrada al microcontrolador y una única salida a los mosfets y la bocina, ¡las cosas funcionaban! El problema aparece cuando introduzco el código que lee del giroscopio/acelerómetro (MPU6050). Creo que es a través de SPI? De todos modos, si incluyo ese código en mi hilo de bucle, entonces todo se estropea.
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,6,true); // request a total of 6 registers
accX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
accY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
accZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
simular este circuito - Esquema creado con CircuitLab