La pin RX bloque l'execution du Sketch

Bonjour à tous et bon lundi :slight_smile:

J'ai reçu samedi mon module GPS, après quelques heures de galères, ça fonctionne et j'arrive à récupérer les trames GPS et les exploiter (récupérer lat. et long., altitude...), et je suis content :slight_smile:

Mon GPS est branché à l'arduino comme ça :

- Vcc sur +5
- GND sur GND
- TX du GPS sur RX de l'Arduino (Pin 0)

Mais il y a un hic que je n'arrive à expliquer et dont je n'ai pas trouvé la solution sur les autres forums...

Si je laisse brancher Rx de l'Arduino sur TX du GPS,
L'upload sur l'arduino depuis l'ide ne veut pas se faire, une erreur apparaît. Si alors je débranche la pin 0 donc, et que je relance l'upload du sketch, alors ça fonctionne. Une fois en marche je rebranche à nouveau ma pin 0 et là ça fonctionne.

avrdude: stk500_getsync(): not in sync: resp=0x30
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

Le cas s'applique aussi si j'alimente mon montage avec une source extérieure, je suis obligé de d'abord débrancher la pin 0 (rx), d'alimenter le montage et ensuite de rebrancher la pin 0 et là ça fonctionne.

Si je mets sous tension le tout monté et prêt, alors rien ne se passe... j'ai l'impression que le code ne se lance pas.

Donc pour résumer, si quelque chose est branché sur la pin digital 0, impossible de faire un upload du code et problème similaire lors du branchement au secteur, USB ou pile 9V, le code ne s'exécute pas si cette prise est branchée...

J'espère avoir été clair, c'est pas évident.

Merci pour votre aide :slight_smile:

Yep!

La réponse est toute simple. Le port usb partage ses connections avec Rx0 et Tx0. Ton programme ne veut pas s'uploader car la liaison série est perturbée par le module GPS.

Si tu possèdes une mega, la solution consisterait à utiliser rx1/tx1 ou 2 ou 3.
Dans le cas d'un duemilanove, la librairie softwareSerial pourrait palier ton problème en utilisant d'autres port.
Un interrupteur/brochage pour couper la liaison entre l'arduino et le GPS, solution peu pratique.

http://arduino.cc/en/Main/arduinoBoardDuemilanove

Serial: 0 (RX) and 1 (TX). Used to receive (RX) and transmit (TX) TTL serial data. These pins are connected to the corresponding pins of the FTDI USB-to-TTL Serial chip.

Toutes les arduino sont faites ainsi 8)

SoftwareSerial ici : http://arduino.cc/hu/Reference/SoftwareSerial

@+

Zoroastre.

Merci pour ta réponse, c'est bien ce qui me semblait.

Alors en fait, on ne peut jamais utiliser la pin D1 et D0 ?

Seulement je n'arrive plus à faire fonctionner le GPS en utilisant la librairie NewSoftSerial, le GPS ne veut pas communiquer avec, je retenterai à nouveau mais j'avais pas réussi. J'avais essayé le coupe TinyGPS et NewSoftSerial et pas moyen de recevoir le moindre du signal du GPS. Tandis qu'en le connectant à la Pin 0 ça fonctione (sans TinyGPS et NSS)...

J'ai pensé à l'interrupteur oui, mais c'est vrai que si je peux éviter, le but étant que je branche mon montage sur l'USB de la voiture et qu'il n'y ai aucune manipulation à faire...

Je retenterai à nouveau et je vous tiendrai au courant.

Bonjour

Après avoir déclaré ta librairie SoftSerial, et écris le sketch dans le loop, as tu bien configuré tes PIN dans le setup (in et out)?

Je m'étais fait avoir...

Franck

Bonjour,

arduimat:
Alors en fait, on ne peut jamais utiliser la pin D1 et D0 ?

Il n'est pas interdit d'utiliser D0/D1, mais c'est fortement déconseillé, en règle général il ne faut jamais utiliser D0/D1, sinon c'est courir après les ennuis.

arduimat:
J'ai pensé à l'interrupteur oui, mais c'est vrai que si je peux éviter, le but étant que je branche mon montage sur l'USB de la voiture et qu'il n'y ai aucune manipulation à faire...

Si tu ne veut absolument pas d'interrupteur tu peut utiliser un transistor BC547 + 2 résistances, afin de bloquer le signal du gps tant que tu n'as pas envoyer un HIGH dans la base du transistor.
GND -> résistance 10K -> base transistor
Dx -> résistance 1K -> base transistor
Tx gps -> collecteur transistor
Rx arduino -> émetteur transistor

Comme ça de base le transistor est bloqué et le signal Tx du gps sera aussi bloqué, des que ton sketch démarre il passe Dx à HIGH ce qui fait conduire le transistor et laisse le signal du gps aller dans Rx de l'arduino.

skywodd:
Bonjour,

arduimat:
Alors en fait, on ne peut jamais utiliser la pin D1 et D0 ?

Il n'est pas interdit d'utiliser D0/D1, mais c'est fortement déconseillé, en règle général il ne faut jamais utiliser D0/D1, sinon c'est courir après les ennuis.

arduimat:
J'ai pensé à l'interrupteur oui, mais c'est vrai que si je peux éviter, le but étant que je branche mon montage sur l'USB de la voiture et qu'il n'y ai aucune manipulation à faire...

Si tu ne veut absolument pas d'interrupteur tu peut utiliser un transistor BC547 + 2 résistances, afin de bloquer le signal du gps tant que tu n'as pas envoyer un HIGH dans la base du transistor.
GND -> résistance 10K -> base transistor
Dx -> résistance 1K -> base transistor
Tx gps -> collecteur transistor
Rx arduino -> émetteur transistor

Comme ça de base le transistor est bloqué et le signal Tx du gps sera aussi bloqué, des que ton sketch démarre il passe Dx à HIGH ce qui fait conduire le transistor et laisse le signal du gps aller dans Rx de l'arduino.

D'accord pour les pins 0 et 1.

En fait, une sorte d’interrupteur à retardement, mais j'aimerai faire fonctionner tout ça en en évitant les solutions de fortune, sinon mon projet risque d'être difficile à faire progresser.

Je retenterai l'histoire de SoftwareSerial avec d'autres pins (si il m'en reste de dispo).

Bubule:
Bonjour

Après avoir déclaré ta librairie SoftSerial, et écris le sketch dans le loop, as tu bien configuré tes PIN dans le setup (in et out)?

Je m'étais fait avoir...

Franck

Bubule, j'ai plus mon code sous les yeux, mais c'est pas impossible que ce soit qqchose du genre, à voir donc.

Mais laquelle est IN et laquelle est OUT de Rx et Tx ?

La déclaration NewSoftSerial nss(2,3); ne prendrai pas en compte le In et Out de ces pins donc ?

Merci

Jettes un petit coup d’œil là : http://arduino.cc/en/Reference/SoftwareSerialBegin

Bubule:
Bonjour

Après avoir déclaré ta librairie SoftSerial, et écris le sketch dans le loop, as tu bien configuré tes PIN dans le setup (in et out)?

Je m'étais fait avoir...

Franck

Bubule, j'ai plus mon code sous les yeux, mais c'est pas impossible que ce soit qqchose du genre, à voir donc.

Mais laquelle est IN et laquelle est OUT de Rx et Tx ?

La déclaration NewSoftSerial nss(2,3); ne prendrai pas en compte le In et Out de ces pins donc ?

Merci

Avec NewSoftSerial le constructeur s'en charge. Donc lors de la déclaration de l'objet les broches sont automatiquement définies en entrée et en sortie. Tu n'as pas besoin de le faire.

Dans ton exemple:

NewSoftSerial nss(2,3);

la broche 2 c'est RX donc elle est en entrée
la broche 3 c'est TX donc elle est en sortie

mais j'aimerai faire fonctionner tout ça en en évitant les solutions de fortune

Je pense que ce que te propose Skywood est aux antipodes d'une solution de fortune.

  • Il y a eu analyse du problème.
  • Il y a eu conception et proposition d'une vraie solution sûre parce que expliquée, ce n'est pas une solution ou un code qui tombe en marche ...........................

fdufnews:
Avec NewSoftSerial le constructeur s'en charge. Donc lors de la déclaration de l'objet les broches sont automatiquement définies en entrée et en sortie. Tu n'as pas besoin de le faire.

Dans ton exemple:

NewSoftSerial nss(2,3);

la broche 2 c'est RX donc elle est en entrée
la broche 3 c'est TX donc elle est en sortie

Mmmh, du coup c'est mal barré (t'as tué mon espoir), car ça ne fonctionne pas, et pourtant j'ai essayé de bien différentes manières! :slight_smile: Mais je retenterai à nouveau ce soir.

68tjs:

mais j'aimerai faire fonctionner tout ça en en évitant les solutions de fortune

Je pense que ce que te propose Skywood est aux antipodes d'une solution de fortune.

  • Il y a eu analyse du problème.
  • Il y a eu conception et proposition d'une vraie solution sûre parce que expliquée, ce n'est pas une solution ou un code qui tombe en marche ...........................

Pas de malentendu, je ne doute pas une seule seconde que la solution soit bonne, j'en suis sûr et d'ailleurs j'y avais songé (à l’interrupteur). Seulement j'aimerai faire au plus simple pour le moment. Si rajouter 50 lignes de codes me permettent de passer outre l'installation d'un transistor, je suis preneur. Sinon mon projet risque de se compliquer et je vais monter une usine à gaz que je ne serai maîtriser.

Apparemment il est réellement possible d'affecter Rx et Tx à d'autres PIN que la 1 et la 0, certains l'on fait, pourquoi pas moi ? :slight_smile:

Je prends compte de toutes vos remarques, et je vous tiens au courant de l'évolution.

Bonjour a tous
c'est absolument inutile d'esperer sortir le RX et TX hardware sur d'autres pins que D0 et D1. C'est une fonctionalite de l'Atmega328, impossible de le modifier, il est fabrique ainsi.
Si tu n'arrives pas a utiliser le port serie software, je te conseille de te diriger vers une carte compatible arduino avec le convertisseur USB > serial situe en dehors de la carte. On en parle ici :

C'est la solution que j'utilise pour les cartes que je fabrique et qui sont des copies de ceci :
KitTen (Arduino-compatible kit) | Freetronics.
Bon courage
Jacques.

Salut,

Je peux savoir quel type de module GPS utilises-tu (shield ou standalone)? Dans tous les cas:

  • tu souhaites certes éviter l'emploi d'un interrupteur, mais pourquoi ne pas en placer un sur l'alimentation du module GPS? C'est simple, pas cher...

Sinon, si ton module consomme moins de 40mA, tu peux toujours mettre l'alimentation sur une broche que tu ne bascules qu'au bout de 10 secondes par exemple (laissant largement le temps d'uploader ton sketch à la mise sous tension).
S'il consomme plus de 40mA, tu peux partir sur la même base, en passant par un transistor pour laisser passer le courant nécessaire.

Bubule:
Bonjour

Après avoir déclaré ta librairie SoftSerial, et écris le sketch dans le loop, as tu bien configuré tes PIN dans le setup (in et out)?

Je m'étais fait avoir...

Franck

Bubule Win ! :grin:

Ceci est le graal :

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

// set up a new serial port
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);

void setup() {
// define pin modes for tx, rx:
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
Serial.begin(9600);
}

void loop() {
char c = mySerial.read();
Serial.print(c);

}

Bon par contre ça capte plus, je reçois que des trames V, qui sont vides. Surement parceque je suis à l'intérieur (pourtant hier aprem ça marchait dedans).

fdufnews : A croire que c'est la nouvelle version de SoftwareSerial() qui est foireuse (NewSoftSerial()).

schizophrene : J'utilise un Skylab SKM53 suite aux conseils de Jean-François, ce n'est pas un shield non.

Yep!

Au fait, je ne sais pas si la question a été posé : Quelle version de l'IDE Arduino ?

La version 1.0 inclus la librairie softwareSerial.

@+

Zoroastre.

Pour ton pb de réception, pour un meme positionnement du récepteur, il se peut qu' hier tu etait en limite de reception, et qu'aujourd'hui, ça ne passe plus pour plusieurs raison :

  • temps fortement nuageux
  • neige,
  • forte pluie
  • différence dans l'alignement des satellites
  • plein d autre phénomènes physiques que je ne maitrisent pas ... :relaxed:

Essaies de le rapprocher d'une fenêtre .... :smiley:

fdufnews : A croire que c'est la nouvelle version de SoftwareSerial() qui est foireuse (NewSoftSerial()).

En fait si tu utilises l'IDE 1.0 alors le SoftwareSerial qui est intégré dans la librairie installé par défaut c'est NewSoftSerial (juste le nom qui change pour la compatibilité)
Par contre si tu as une ancienne version de l'IDE le SoftwareSerial qui est intégré dans la librairie installé par défaut est calamiteux c'est pourquoi on recommande d'utiliser NewSoftSerial