Arduino Time.h - Se reinicia en la conexión en serie para sincronización

0

Me doy cuenta y comprendo el problema con el reinicio de las placas arduino cada vez que abres una conexión serial como se indica y respondes here .

Sin embargo, debido a eso, estoy tratando de descubrir cómo varios relojes basados en arduino pueden manejar una sincronización de tiempo en serie sin solo reiniciar cada vez.

Por ejemplo, el BulbDial clock busca un sincroniza cada vez que el bucle llega. Pero intentar sincronizar a través del boceto de procesamiento simplemente restablecería el controlador y perdería la sincronización. Por supuesto, no tengo uno de estos relojes, pero me basé en el diseño para sincronizarlo y cada vez que abro la conexión serial para enviar la sincronización, la placa simplemente se reinicia.

¿Hay algo que me esté perdiendo?

Ahora, he conseguido que funcione al colocar un límite de 10 uF entre RESET y GND. Pero como otros pueden hacer esto sin ese límite, me encantaría poder hacerlo también.

También he escrito una secuencia de comandos de Python que establecerá la hora y he intentado todo tipo de configuraciones de DTR y RTS para intentar forzar esas líneas a permanecer altas y no reiniciar la placa durante la conexión, pero no he tenido suerte. Código abajo:

    com = serial.Serial()
    com.baudrate = baud
    com.port = port
    com.timeout = 1
    com.rtscts=True
    com.dsrdtr=True
    print com
    com.open()

¿Alguna idea sobre cómo se supone que se debe hacer esto?

    
pregunta Adam Haile

3 respuestas

1

En este caso, creo que tienes que desactivar la función de reinicio en conexión en serie modificando la placa. Buscando ' arduino disable auto-reset ' para saber cómo hacer esto en varios tableros de arduino. Será específico para la placa, pero la mayoría implica agregar una resistencia de purga a través del condensador de restablecimiento, quitar un capacitor o cortar un rastro en la placa.

    
respondido por el JRobert
1

Técnicamente no hay necesidad de modificar el tablero. Las respuestas a la pregunta vinculada no son del todo correctas en su suposición: en realidad esto ocurre debido al comportamiento de software (de la PC conectada) en lugar de algo forzado por el hardware.

Es posible configurar la API en serie del sistema operativo host para que no establezca / desactive automáticamente la señal DTR en la conexión / liberación, y así evite el reinicio por completo en el software. Por ejemplo, en linux / unix, desea deshabilitar la configuración HUPCL en termios; No estoy exactamente seguro de cómo hacerlo en Python, aunque ejecutar otra cosa (como la herramienta stty) podría ser una opción.

Sin embargo, sigue siendo susceptible de ser reiniciado por un software que no se preocupa por evitar esto, y quizás por el primer uso del puerto después del arranque (a menos que el cambio de configuración se haga más permanente). Por esas razones, es probable que un diseño para fines especiales no tenga el hardware para admitir el restablecimiento automático o un puente para habilitarlo / deshabilitarlo.

    
respondido por el Chris Stratton
0

Parece que hay 4 formas de configurar un reloj basado en Arduino:

  • Una vez que se haya cargado todo el firmware, desconecte el reloj de la PC y nunca vuelva a conectarlo. Use los botones del reloj para ajustar la hora correcta (y para volver a corregir la hora si alguna vez se desplaza).

  • Haga que un programa se ejecute en la PC host que abre una conexión al reloj y deja la conexión abierta. Ocasionalmente (¿quizás una vez al día?) El programa envía actualizaciones de tiempo (quizás derivadas de NTP ). El Arduino se reinicia una vez que el programa abre la conexión por primera vez, pero luego debe continuar ejecutándose indefinidamente (semanas, meses, años) mientras la conexión permanezca abierta. No hay necesidad de cerrar y volver a abrir la conexión, que restablece el Arduino, simplemente deje la conexión abierta. (Cuando el PC host se apaga, el Arduino seguirá funcionando mientras tenga energía. Cuando la PC host se vuelve a encender y ese programa abre el puerto nuevamente, reiniciará el Arduino, pero luego actualizará inmediatamente la hora, así que tal vez nadie lo estará mirando y nadie notará la falla temporal).

  • Como lo mencionó JRobert, deshabilite el hardware que realiza el reinicio automático, por lo que el Arduino nunca se reinicia automáticamente sin importar lo que suceda en las líneas seriales. Esto significa que debe recordar presionar manualmente el botón de reinicio cada vez que quiera cargar un nuevo firmware. Buscando 'arduino disable auto-reset' , Arduino reiniciando mientras se vuelve a conectar el terminal serial , etc.

  • Use algún otro puerto serial en el Arduino (uno de los otros UART de hardware en el Arduino Mega, o use el " Software Serial " en prácticamente cualquier otro Arduino) para enviar actualizaciones de tiempo al Arduino o recibir datos del Arduino o ambos. Solo use el "puerto de programación" para la programación real de las actualizaciones de firmware.

respondido por el davidcary

Lea otras preguntas en las etiquetas