Pages: [1]   Go Down
Author Topic: liaison serie et auto reset arduino  (Read 1494 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Bon alors là je ne comprends plus rien  smiley-eek !!!

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" ???

Merci d'avance.

@+

Zoroastre.
« Last Edit: August 07, 2011, 02:53:15 pm by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

France
Offline Offline
God Member
*****
Karma: 4
Posts: 971
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

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 ?
Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Merci pour la réponse smiley-wink

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  smiley-eek-blue

Ben il ne me reste qu'à étudier encore la libraire pyserial et appronfondir mon os préferé.

Pour info, arduino mega 1280 (DFRduino) FT232RL.

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

J'ai fait joujou avec le port usb smiley-wink

Code:
~/arduino/program 7/python/client serial$ stty --file=/dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 0; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

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...

1- stty --file=/dev/ttyUSB0 hupcl
2- stty --file=/dev/ttyUSB0 crtscts
3- stty --file=/dev/ttyUSB0 -hupcl

rtscts :: Read or write current hardware flow control setting.
hupcl :: Set DTR line to specified logic level. (hupcl = linux, dtr = windaube)

Amis linuxien, @+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut Zoroastre !

Quote
Reset automatique par Software

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.
Faut enlever la capa "C5"

Va voir là : http://www.jlectronique.org/jlectronique/Uno.htm ici : http://www.jlectronique.org/jlectronique/Uno.htm
Et pour la domotique là : http://www.stantor.com/

A+
chabot380
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

It works !!!

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 :

Code:
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 smiley-wink

Quote
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.  smiley-lol
« Last Edit: August 08, 2011, 06:07:32 am by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

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.

Code:
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

Pas de reset arduino à la connection, impec  smiley-lol

@+

Zoroastre.
« Last Edit: August 10, 2011, 07:35:06 am by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Pages: [1]   Go Up
Jump to: