Arduino Uno Se congela con I2C

Hola a todos
Hace unos meses tenia prácticamente el mismo problema pero ya no sé si se puede seguir el hilo del post, mejor hago otro
Ya he buscado solución pero la verdad el hardware no es mi fuerte

Tengo un Arduino uno que controla a un pistón mecánico (motor de 12v 3a) para que gire a un lado o hacia el otro dependiendo cuando se necesite, que es constante. Controlado en dos modos, manual y automático. El manual con dos botones y el automático con dos sensores. Y monitoreado, en esta ocasión, con un LCD I2C, antes era con una OLED pero causó problemas y me mude al LCD pensando que sería más estable. Todo esta conectado a una fuente de12V 10a.

El problema es que funciona sin problema pero al cabo de un rato el arduino se congela y tengo que reiniciarlo. Lo intenté solucionarlo con un watchdog pero al final no ayuda mucho con el proceso que tiene que cumplir. Por las prisas conecte todo al arduino con cables dupont y leí que puede ocasionar falsos pero no sé si eso contribuya al congelamiento, como sea lo cambiaré con borneras. También leí que un cable largo puede causar este tipo de problemas. Lo conecté, el LCD a una distancia del arduino a no más de 2mt con cable calibre 22. Espero me puedan ayudar, les adjunto mi código y mi diagrama.

Saludos

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h>


LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C: 0x27, Pantalla de 16x2

int modo = 9;
int der = 10;
int izq = 11;
int sender = 12;
int senizq = 13;
int sentido1 = 7;
int sentido2 = 8;
int conta = 0;
int velocidad = 5;

void setup() {
  lcd.init();                      // Inicializar la pantalla LCD
  lcd.backlight();                 // Encender la retroiluminación
  
  pinMode(der, INPUT_PULLUP);
  pinMode(izq, INPUT_PULLUP);
  pinMode(modo, INPUT_PULLUP);
  pinMode(sender, INPUT_PULLUP);
  pinMode(senizq, INPUT_PULLUP);
  pinMode(sentido1, OUTPUT);
  pinMode(sentido2, OUTPUT);
  pinMode(velocidad, OUTPUT);

  lcd.setCursor(1, 0); // 
  lcd.print("Guia de banda"); 
  lcd.setCursor(0,1);
  lcd.print("Modo: ");
  wdt_enable(WDTO_2S);
}


void loop(){
 


if (digitalRead (modo) == LOW){
  lcd.setCursor(6,1);
  lcd.print("        ");
  conta++;
  delay(300);

}
//digitalWrite(10, LOW);

if (conta==0){
  lcd.setCursor(6,1);
  lcd.print("Manual");
  manual();
  }
if (conta==1){
  lcd.setCursor(6,1);
  lcd.print("Auto");
  autom();
}
if(conta>1){
  conta=0;
}
delay(10);
wdt_reset();

}


void manual(){


  while(digitalRead (der) == LOW){
   //lcd.setCursor(13,1);
   //lcd.print(">");
   digitalWrite(sentido1, HIGH);
   digitalWrite(sentido2, LOW);
   analogWrite(velocidad, 255);
 }
delay(10);
  
  while(digitalRead (izq) == LOW){
   //lcd.setCursor(13,1);
   //lcd.print("<");
   digitalWrite(sentido1, LOW);
   digitalWrite(sentido2, HIGH);
   analogWrite(velocidad, 255);
   
      }

   //lcd.setCursor(13,1);
   //lcd.print("            ");
   digitalWrite(sentido1, LOW);
   digitalWrite(sentido2, LOW);
   analogWrite(velocidad, 0);
 
 delay(10);
} 

void autom(){
  
    while(digitalRead (sender) == HIGH && digitalRead (modo)== HIGH){
    //lcd.setCursor(13,1);
    //lcd.print(">");
    digitalWrite(sentido1, HIGH);
    digitalWrite(sentido2, LOW);
    analogWrite(velocidad, 255);
  }

  delay(10);
      
  while(digitalRead (senizq) == HIGH && digitalRead(modo) == HIGH){ 
    //lcd.setCursor(13,1);
    //lcd.print("<");
    digitalWrite(sentido1, LOW);
    digitalWrite(sentido2, HIGH);
    analogWrite(velocidad, 255);
  }

   // lcd.setCursor(13,1);
   //lcd.print("            ");
   digitalWrite(sentido1, LOW);
   digitalWrite(sentido2, LOW);
   analogWrite(velocidad,0);
   delay(10);

    }

Hi,
Aqui yo veo un problema pero es posible que sea un error al hacer el dibujo. y es que tienes los 5 voltios conectados a la salida de los interuptores que van al arduino. Si no me0equivoca las resistencias seria para hacer un "PULLUP" a las salidas de los interuptores. Esta resistencia se conecta de los 5 voltios al pin de los interuptores y de aqui al pin del arduino. Esperamos tu contestacion. Otra cosa es de dejar saber que tipo de interuptores usaa y posible el link donde se pueda leer las especificaciones.

Hola!
No, es efecto asi es como tengo conectado, para que todo el tiempo que no manden señal el sensor o los pulsadores, le este llegando 5v al arduino, he intentado anteriormente con otros proyector dejarlo con el puro software pero me trae problemas hasta que lo hago con hardware. Por otro lado, los sensores que uso son de FOTEK modelo SU-07W

Esta mal mi conexión del pullup?

Al margen de que tu esquema ayuda poco y nada porque hay que adivinar a que pin está conectada cada cosa, si, está mal.

La salida de los sensores (que no debería ser necesario haber preguntado cuales son) están conectados a 5V y a los pines (?) del micro.
Conectados así nunca, jamás, un pin puede pasar a LOW.

En el código están todas las entradas definidas como INPUT_PULLUP, ¿para qué agregar R externas si ya se usan las del micro?

No pensé que fueran relevantes a que pines estaban conectados, de cualquier forma aqui esta el esquema de nuevo con los numeros y con lo que creo que es la corrección de como estan conectados (que realmente creo que no corregí nada)

Puse resistencias físicas porque, como ya había comentado, he tenido malas experiencias con las del micro

Lo que veo es que lees los pulsadores sin rutinas antirrebote, sería ideal que leyeras el flanco negativo no el estado porque ¿qué pasa si mantienes pulsado "modo" más de 300 ms, por ej.?

Tengo mis dudas en la conexión de los sensores porque no se ajusta a lo que indica la hoja de datos, la salida tendría que estar referida a masa (modo PNP) o a VDC, en tu caso 12V (modo NPN), no a 5V como los has conectado.
Según nos cuentas funciona pero no me termina de convencer.

Un pin del shield (no se cual) está conectado a A0 pero no usas A0 en el código, sin embargo usas el pin 5 que no figura en el esquema.

Hi,
Segun las expecificaciones del sensor no necesitas las resistencias de pullup. Para que funcione solamente tienes que conectar el cable Brown pin 1 a 5 voltios y el blanco al pin de entrada en el arduino. Esto te va dar un pulso de 5 voltios a zero voltios.El blue va a ground comun.

Adjunto esquematico.

¿Y cuál sería la carga ("load") entonces?

La tensión de alimentación es de 10 a 30V, no 5V.

H,
La resistencia de 4K7 va a estar a 5 voltios y cuando el transistor conduce el voltaje va zero voltios. La resistencia de 4K7 es el pullup. Tu puedes usar el transistor para energizar digamos un relay.
Esto es un circuito comun y puedes usar 5 voltios sin problemas.Todo depende de la corriente que los transistores del opt-coupler puedan suplir.

Es verdad, no tuve en cuenta la R de colector. Mala mía.

No coincido con alimentar el sensor con 5V cuando el fabricante indica 10 a 30 pero con probar...

Hi
Se vez el circuito es de un transistor sencillo que se usa en circuitos para enegizar un relay, led etc cuando el pin del arduino no puede suplir la corriente. De todas manera no pierde nada con probar. Si no trabaja pues le sube el voltaje 12 voltios pero entonces tiene que protejer la salida para que no vaya a danar el pin de entrada del arduino.

Si, claramente.

Ok, muchas gracias.

Entonces quito las resistencias físicas y alimento los sensores a 5v, aunque supongo que debe ser con una fuente externa, o crees que la del arduino alcance? En caso que con los 5v no funcione, como podría proteger la entrada del arduino? como dije, el hardware no es mi fuerte para nada.

Y otra duda, que es la principal, eso será la causa del congelamiento?

El cable es muy largo, a velocidad estándar (100KHz) no debería exceder de 1m.
Una solución es bajar la velocidad con setSpeed() setClock() a unos 10KHz pero tendrías que buscar en la hoja de datos del 328 si puede bajar tanto.

Te refieres a la velocidad del reloj o algo así? Disculpa desconozco totalmente lo que mencionaste pero suena interesante

A la velocidad del clock I2C.

Edité el post con la instrucción correcta.

Ah vale
Lo voy a probar y a ver si añadiendo eso más lo anterior, el arduino se deja de congelar

Prueba conectando resistencias de pull-up a SDA y a SCL, como se indica en las especificaciones originales del bus I2C:


https://www.nxp.com/docs/en/user-guide/UM10204.pdf

Los valores típicos son 4.7KΩ

Hi,
Si usa el I2c interface adapter no las necesita ya que estan incluidas en el adapter.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.