j'aimerai connecter 2 cartes arduino ensemble via la liaison série mais dès les liaisons électriques,
il ne se passe rien... alors que les cartes sont sensées s'envoyer en permanence des infos, les TX/RX ne clignotent pas...
Mais si je retire les RX/TX çà fonctionne correctement! J'ai bien croisé Rx/Tx et la masse est bien reliée entre elles.
Pour mes essais, je fais çà entre une uno et une méga, mais le projet final devrait se faire avec une Pro/Mini et une nano.
Mon projet est d'envoyer l'info provenant de 12 boutons poussoirs (carte du bas) à l'autre carte arduino (carte du haut), qui elle est reliée à des relais, et que celle-ci renvoie l'info vers les BP pour allumer les leds intégrées aux BP.
Il est à noter que le cablage est déjà existant mais pas pour autant de BP; d'ou mon passage via liaison série...
Question :
Les dels (Leds) Tx et Rx sont-elle commandées par le microcontrôleur qui gère la liaison série ou par le circuit qui fait l'interface entre l'USB et Tx et Rx.
Réponse :
Si tu regardes le fichier joint, tu verras que les dels sont commandées par l'atmega8U2 qui fait l'interface USB/Série arduino-uno-schematic.pdf (32,7 Ko)
Donc si tu n'utilises pas cette interface les dels ne peuvent pas être allumée.
Arduino, c'est nom de marque, ce n'est pas un modèle de carte.
Des cartes arduino il en existe plus de 20 modèles différents avec environ 5 à 10 microcontrôleurs différents.
Il faut être plus précis dans la description de son matériel parce que les solutions ne seront pas forcément les mêmes.
C'est qui est demandé dans le message épinglé en tête de forum.
Ah effectivement pour les leds tx/rx je n'avais jamais fait attention. Je pensais qu'elles étaient directement mises sur la liaison. Merci d'avoir attiré mon attention sur ce fait
Pour le matériel, j'ai précisé que je faisais mes essais avec une Uno et une Méga. Je n'avais rien d'autre en stock à part des Due
A priori le code ne semble pas complet, dans le premier programme Wire n'est pas défini et dans le deuxième buffer_rx ne l'est pas non plus.
Il manque aussi le schéma de branchement entre les deux Arduino.
Quand on a un problème, il est souvent bon de tester les éléments un par un avant de tout assembler. Si c'est la liaison série qui ne fonctionne pas, seuls ceux qui ont un MCP23017 peuvent t'aider. Si tu ne teste que la liaison série, même sans MCP23017, on peut faire les essais.
La liaison série Serial est en partie utilisée par la console. Pour faire des essais, il est plus facile de prendre une autre liaison, ce qui permet de garder la console. Sur la Uno, il faut en prendre une logicielle.
La réception des informations n'exploite pas le fait que la trame de données contient des séparateurs connus (D, R, A, B, CR).
Du coup rien ne garanti que le premier caractère dans buffer_rx sera bien l'un des caractères attendu.
Ceci dit étant donné que l'on sort sur la réception de CR et que l'émission du message est relativement courte par rapport à sa recurrence et au temps de traitement on peut espérer que le système se synchronise tout seul.
Il y a aussi des trucs comme ça qui traînent, ça doit pas aider
if(temp_serie = "R")
Dans le second code, temps semble être utilisé avant d'avoir été initialisé.
Bonsoir arnaud7380
C'est difficile de débugger un programme qui utilise le même port série que la console.
Le mieux pour développer est d'utiliser un autre port du Mega et SoftwareSerial sur le Uno.
Mais comme tes entrées sont sont sur bus I2c, pourquoi ne pas avoir qu'un Arduino qui fait tout, quelle est la distance entre les 2 machines?
Effectivement, je n'ai pas mis les variables...
Bas:
//########### Declaration librairies #############
#include <Wire.h> //Bibliothèque i2c
#include "Adafruit_MCP23017.h"
//########### Definition Variables E/S #############
//const byte NC = 0; //[ ] NC
//const byte NC = 1; //[ ] NC
//const byte BP_in[] = {8,9,10,11,12,13}; //[E] Bouton poussoir 1 à 6
//const byte LED_out[] = {2,3,4,5,6,7}; //[S] LED 1 à 6
//const byte BP_mcp_in[] = {2,3,4,5,6,7}; //[E] Bouton poussoir 1 à 6
//const byte LED_mcp_out[] = {13,12,11,10,9,8}; //[S] LED 1 à 6
//########## Variables ###################
boolean etat_serie; //Etat série entre les 2 cartes
boolean etat_mcp; //Etat du mcp
boolean BP[6]; //Etat BP
boolean BP_mcp[6]; //Etat BP du MCP
boolean old_BP[6]; //Etat BP
boolean old_BP_mcp[6]; //Etat BP du MCP
boolean change_bp;
boolean change_led;
boolean cli; //Temoin de clignotement en cas de défaut
byte erreur_serie; //Comptage du nombre de reception en x sec
unsigned long temps;//Stocke le temps
unsigned long temps_etat;//Stocke le temps
unsigned long temps_serie;//Stocke le temps
//** Autres **
//*** Nécessaire pour USB ***
String buffer_rx; //Tampon reception serie
//***** Setup Divers ******
//***** Initialisation Shields, sondes,... *****
Adafruit_MCP23017 mcp;
Haut:
//########### Declaration librairies #############
#include <Wire.h> //Bibliothèque i2c
//########### Definition Variables E/S #############
//const byte NC = 0; //[ ] NC
//const byte NC = 1; //[ ] NC
const byte relais[] = {2,3,4,5,6,7,8,9,10,11,12,13}; //[S] Relais sorties
const byte led_etat = 14; //[S] Etat série
const byte led_erreur = 15; //[S] Erreur série
const byte led_mcp = 16; //[S] Erreur mcp
//########## Variables ###################
boolean etat_relais[12];
boolean old_relais[12];
boolean lock[12];
byte etat_serie;
byte essai;
boolean etat_mcp;
boolean cli;
//** Autres **
unsigned long temps_serie; //Comptage temps série
unsigned long temps; //Comptage temps
//*** Nécessaire pour USB ***
String buffer_rx; //Tampon reception serie
Ben justement, c'est çà qui est bizarre. J'ai testé chaque carte avec le terminal série du soft arduino. Les données envoyées par la carte sont correctes, et lorsque je tape ma chaine dans le terminal et que je l'envoi à l'arduino, il réagit correctement...
En fait la carte du bas (celle avec le mcp) envoie 2 chaines successives à celle du haut:
A123456E
B123456E
La chaine A, représente l'état des boutons poussoirs directement connectés à l'arduino, où 1-6 (le bouton) est soit 0 soit 1; et la chaine B, les BP du MCP.
La carte du haut, répond aussi par 2 chaines:
RA123456E
RM123456E
Qui représente l'état des relais sur la carte haut, et qui allume les leds des bp sur la carte du bas. La chaine A, les leds reliées sur l'arduino et la B, celles sur le MCP.
Je me suis servi du serial1 de la mega pour connecter la uno, libérant ainsi le serial pour le PC et j'ai pu constater que les chaines séries sont bien reçues mais qu'elles commencaient par un carriage return. J'ai utilisé la fonction trim() pour nettoyer çà, et maintenant çà commence à fonctionner.
Il me reste à faire pareil sur la uno pour le retour d'info. Je pense que çà doit être le même problème.