Je suis nouveau au domaine des cartes Arduino et je rencontre des difficultés quant à un projet scolaire sur une carte Arduino Mega 2560...
Le projet consiste en la récupération de données venant d'un compteur électrique, converties pour pouvoir les recevoir sur simple liaison série (USB TTL 5v).
Je dois écrire un code permettant de recevoir ces données, les mettre en forme et les renvoyer. Seulement, j'en suis encore à l'étape de recevoir ces données et je commence à prendre un sérieux retard, c'est pourquoi je viens demander votre avis.
Voici une image du montage :
Dans l'image le port tx est branché sur le pc mais ce n'est pas le souci, lorsque les données venant du compteur sont branchées sur le port, ca ne donne rien non plus
Et voici le code :
#include <SoftwareSerial.h>
SoftwareSerial mySerial(19, 18); // RX, TX
int incomingByte = 0; // for incoming serial data
void setup()
{
// Open serial communications and wait for port to open:
mySerial.begin(1200,SERIAL_7E1);
while (!mySerial)
{
mySerial.println("Pas de co!"); // wait for serial port to connect. Needed for native USB port only
}
mySerial.println("Goodnight moon!");
}
void loop() { // run over and over
if (mySerial.available()>0) {
// read the incoming byte:
incomingByte = mySerial.read();
// say what you got:
mySerial.print("I received: ");
mySerial.println(incomingByte, DEC);
}
else
mySerial.println("Ca ne marche pas");
}
Le code me renvoie en boucle "Ca ne marche pas", mais je ne comprends pas pourquoi il ne reçoit pas les données sur la liaison ?
Voyez-vous des erreurs (bêtes ou non) dans le code ?
Merci d'avance à ceux qui auront la gentillesse de me répondre !
1 : Pourquoi utiliser le SoftwareSerial ? et pas Serial2 par exemple ? (qui est un HardwarSerial)
2 : Pourquoi ne pas passer par l'usb de l'arduino pour effectuer la liaison serie avec le PC ?
3 :
if (mySerial.available()>0) {
///Code
}
else
mySerial.println("Ca ne marche pas");
Ce n'est pas la bonne utilisation de la fonction available(). available() est > 0 quand des données sont présente. L'arduino est tres rapide et il traitera les bits recu au plus vite, et il bouclera plein de fois entre deux reception. C'est pourquoi meme si tu recoi des bits, il affichera en boucle "Ca ne marche pas".
Il faut supprimer :
else
mySerial.println("Ca ne marche pas");
Pourquoi dans ton code tu n'utilise qu'une seul liaison serie, alors que si j'ai bien compris, tu souhaite utiliser l'arduino pour recevoir des données du compteur, pour les renvoyer (formaté j’imagine) sur le PC ?
3iSigma : J'en suis quasi sûr, j'ai branché les fils correspondant au rx de l'usb ttl sur le port rx de l'arduino et tx sur le port tx. J'ai déjà essayé l'inverse et cela me renvoyait une erreur au final.
T-chou : Tous les tutos que j'ai vus utilisent le softwareserial, devrais-je plutôt utliser le hardware serial ? Penses-tu que cela probleme d'utiliser Serial1 ?
Mon professeur m'a vivement recommandé de ne pas utiliser Serial, parce que cela ferait des conflits par rapport à l'utilisation de ce port par le logiciel Arduino
Et je compte effectivement utiliser un autre serial pour le renvoi, c'est juste que je n'ai pas encore réglé le problème de le recevoir
Pour la correction de la boucle, je vous dirais ce qu'il en résulte quand je pourrai tester ca en projet, donc je vous redis demain soir !
Owiii:
3iSigma : J'en suis quasi sûr, j'ai branché les fils correspondant au rx de l'usb ttl sur le port rx de l'arduino et tx sur le port tx. J'ai déjà essayé l'inverse et cela me renvoyait une erreur au final.
Merci à tous pour vos réponses !
Du coup voici le feedback : J'ai enfin réussi à faire marcher l'affichage de trames venant du compteur électrique, mais je ne sais pas tout à fait comment... Dans la séance de ce matin, j'ai décidé d'arrêter d'utiliser la carte Arduino Mega et d'utiliser directement la carte pour laquelle le produit était fait, et de façon assez surprenante, le code qui ne fonctionnait pas sur la Mega fonctionnait sur celle ci ! (c'est une Pretzelboard, arduino nano)
Donc je peux passer a la suite de mon projet qui est donc faire que la carte se comporte comme un serveur UDP pour que des clients UDP puissent se connecter dessus et lui demander les trames, ca risque d'être un peu compliqué ^^
je suis face aux même cas : j'ai un adruino MICRO, je connecte la PIN Rx a un convertisseur RS puis je vais sur le port COM de mon PC.
A l'aide de hyper terminal(j'utilise Putty), j'entre des caractères (que je tape au clavier).
J'essaye de les afficher via le moniteur série de Arduino (le port qui relie USB de l'Arduino au PC).
int inByte ;
void setup() {
// initialize both serial ports:
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
// read from port Tx, send to port USB:
if (Serial1.available()) {
inByte = Serial1.read();
Serial.print("MY SERIAL a bien Recu en RX");
Serial.print(inByte);
Serial.println(Serial1.read());
delay(300);
}
// read from port USB, send to port 1:
if (Serial.available()) {
int inByte = Serial.read();
Serial.write("j'ai saisi: ");
Serial.write(inByte);
Serial.println();
Serial.write("sur le serial1 il y a :");
Serial.println(Serial1.read());
Serial.println();
delay(300);
}
}
En faite l'Arduino ne detecte rien sur son Rx. Faut il déclarer la Pin Rx avec le serial1? si oui comment ?
Faudrait faire un petit effort de compréhension du matériel que vous utilisez.
Les Micro, Uno, Nano n'ont qu'un seul port série matériel qui s'appelle Serial et qui est utilisé par la liaison avec le PC à travers l'USB
Les Mega ont 4 ports série matériels nommés Serial, Serial1, Serial2, Serial3.
Après en utilisant la librairie SoftwareSerial ont peut utiliser les autres broches des cartes pour créer des port séries logiciels mais ceux-ci sont moins performants.
In addition, some pins have specialized functions:
Serial: 0 (RX) and 1 (TX). Used to receive (RX) and transmit (TX) TTL serial data using the ATmega32U4 hardware serial capability. Note that on the Micro, the Serial class refers to USB (CDC) communication; for TTL serial on pins 0 and 1, use the Serial1 class.
void setup() {
Serial.begin(9600); // usb
Serial1.begin(9600); // rs232 (TTL !)
// pinMode(13, OUTPUT);
}
void loop() {
// read from port 1, send to port 0 (rs232 -> usb)
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
// digitalWrite(13, HIGH); // LED ON
} else {
// digitalWrite(13, LOW); // LED OFF
}
// read from port 0, send to port 1 (usb -> rs232)
if (Serial.available()) {
int inByte = Serial.read();
Serial1.write(inByte);
}
}
le code est bon avec un cable RS232, comme en sortant de mon PC j'ai un port USB (donc j'utilise un converisseur USB-RS232, puis ensuite de dois entrer une une interface en RS485, j'ai un cable qui fait cette conversion, puis ensuite je termine avec un différenciel de BUS RS485 (http://www.ti.com/lit/ds/symlink/sn75lbc176.pdf), qui est connecté a Arduino.
je suis en train debuger a l'oscillo je pense que c'est un problème de variable d'entrer.
En utilisant la librairie SoftwareSerial, j'ai le même souci, donc je prefère debuger avec le port Rx.