Je vous explique. Je suis en train d'écrire un script python afin de contrôler graphiquement (Tkinter, pmw) mon arduino. J'utilise la liaison série et la bibliothèque pyserial. Afin de faciliter le debuggage, à la fin du setup, entre autre, j'envoie sur le port série une confirmation de fin d'execution via un classique Serial.println().
J'avais remarqué qu'à chaque connection de mon programme python à l'arduino, celle ci était systématiquement reseté. Peu génant pour des essais, j'avais entrevu la solution de la resistance de 120 ohms entre Vcc et reset de ma mega pour une exploitation plus poussée.
Eh bien figurez-vous, que suite à des modifications dans les trames, mon programme, je ne sais pas trop en fait, mon arduino ne se reset plus !!! Genial !!!! me diriez-vous ?
Pourtant mon programme est loin d'être terminé et je ne suis donc pas à l'abri de retomber sur ce problème...
Alors voilà ma question : Quelles sont les conditions logicielles pour que l'arduino ne se reset pas lors d'une connection sériel ? Y a-t'il des caractères spéciaux à éviter ?? Des methodes de programmations "propre" ???
Si la cause du changement de comportement est bien 100% logicielle j'aurai tendance à dire qu'il faur tracer tour ce qui peut influer sur la gestion de DTR (interaction systeme d'exploitation/Python, parametres par défaut de pyserial, différences éventuelle de comportement de pyserial entre le mode interactif et le script, probleme de timing dans les commandes setDTR().....(trop tot, trop tard, trop court, trop long)
ce qui surprend c'est qu'une modification puisse survenir par la trame elle même et non par les circonstances de l'ouverture du port !
Pour information : la carte utilise-t-elle un FTDI232 ou un Mega8u2 ?
Afin de tenter de reproduire le phénomène, j'ai rebooté mon pc (Linux Debian), ce qui a eu pour conséquence le retour à un comportement normal : Le setup est donc reinitialisé à chaque connection.
En définitive, je ne peux dire si il y eu conjonction software/hardware tant, malgré de nombreux essais et flashback, il m'est impossible de retrouver les circonstances du phénomène.
Bienvenu dans la 4eme dimension
Ben il ne me reste qu'à étudier encore la libraire pyserial et appronfondir mon os préferé.
Ici je constate que par defaut, le hupcl est désactivé (le - devant). Pourtant, à chaque connection...reset.
Donc, je l'active, puis le désactive, sans résultat au début. Je remarque également que le crtscts est désactivé. Je constate également que lorsque je l'active au préalable et me connecte au port série, il se désactive automatiquement.
Je confirmerais l'ordre des opérations demain, ben tout à l'heure pff pff pff...
Plutôt que par appui physique sur le bouton Reset, le logiciel sur l'ordinateur connecté peut faire un Reset. En effet, la ligne DTR sur l' ATmega8U2 est connectée à la ligne Reset de l'ATmega328 à travers une capacité. Lorsque cette ligne est amenée à l'état logique 0, un signal de Reset peut être envoyé au contrôleur.
Lors d'une connection par le port serie à mon arduino, cette dernière était systématiquement réinitialisée.
Sous linux uniquement, j'ai experimenté la modification du port via le programme stty et ses différentes options.
Une seule commande suffit :
stty --file=/dev/ttyUSB0 crtscts -hupcl
En résumé, l'activation du crtscts permet l'écriture des paramètres de contrôle des données, et on désactive le hupcl afin de ne plus envoyer le bit d'initialisation du péripherique.
Si certain d'entre vous ont la capacité de tester et de confirmer mes experimentations, ce serait top
Par contre, pas moyen de modifier à la volée les paramètres sous python.
@+
Zoroastre.
PS : Heu! chabot380, faut pas lire les topics en diagonal, c'est pô bien. Un, c'est un arduino mega, 2, le coup de la resistance de 120 ohms marche bien, de 3, je ne veux pas de reset software, c'est tout le contraire. XD
Je n'ai pas trouvé les fonctions qui peuvent satisfaire mes desideratas dans la bibliothèque python-serial.
Du coup, comme j'utilisais déjà la librairie command pour la detection du péripherique, je lance la commande stty pour paramétrer mon port usb/série directement à partir de mon script.
Je développe pour l'instant un client graphique écrit en python communiquant directement avec le port série. L'affichage des valeurs sondes et le pilotage de ma carte relais sont ok.
La prochaine étape sera d'écrire un client et un serveur utilisant une liaison internet sécurisée. C'est pour ma part, je trouve, une alternative interessante au php, au même titre d'ailleurs que le java par exemple, hors solution à base d'ethernet shield bien entendu.
def openSerialPort():
global device
closeSerialPort()
device = usbdevice
if not device:
#devicelist = commands.getoutput("ls /dev/tty.usbserial*")
devicelist = commands.getoutput("ls /dev/ttyUSB*")
if devicelist[0] == '/':
device = devicelist
status,output = commands.getstatusoutput("stty --file=%s crtscts -hupcl" %device)
if not device:
print "Waiting for device..."
return False
print "Connecting to", device, baud, "..."
return True