Construí un robot usando el Arduino Due con todos los sensores funcionando a 5V sobre I2C. Hay un cambio de nivel en ambas líneas I2C. Los motores se controlan utilizando un portador de controlador de motor VNH5019 de Polulu (que toma entrada PWM). La velocidad y la dirección del motor cambian rápidamente en esta aplicación en particular.
Cuando los motores no están funcionando, todo está bien y las lecturas están bien. Al ejecutar todo el robot en el suelo, con los motores, funciona bien durante aproximadamente 30 segundos a un minuto antes de que el bus I2C deje de responder por completo. Todos los dispositivos comienzan a agotarse en el bus I2C y, como resultado, el robot comienza a comportarse de manera catastrófica y se comporta mal. El Arduino tiene que ser reiniciado. Después de un reinicio, suele tardar menos tiempo en volverse loco.
He hecho funcionar los motores con las ruedas fuera del suelo y tengo un tiempo de funcionamiento significativamente mejor, por lo que sospecho que tiene algo que ver con la corriente que consumen los motores. Los motores están separados del arduino y el PCB personalizado que utilizo para enrutar las señales I2C por dos capas de placas de metal (presumiblemente, esto proporciona cierto blindaje). He instalado condensadores de cerámica de 0,1 uF en los terminales del motor y un condensador de 220 uF en la fuente de alimentación del Arduino.
También puse pull-ups adicionales antes y después del cambio de nivel, pero nada de esto parece detener el problema.
Actualmente estoy completamente perdido respecto a qué otra cosa podría hacer para detener el ruido del motor.
Editar: Algunos esquemas (por lo que vale)
Estecircuitoenvíaseñalesalosmotoresyproporcionaalimentaciónaloscontroladoresdelmotor.VinyGNDnoestánrealmenteconectadosalArduino.HaycoladasdecobreparaGNDy12VenlasdoscapasdelaPCBparasoportarlacorriente.
Este circuito conecta el bus I2C de Arduino a los diversos componentes. Hay un cambio de nivel de voltaje de 3V3 a 5V (LS1 y LS2). Los transistores no están en uso.