Go Down

Topic: [RESOLU] horloge et 2 arduino (Read 2388 times) previous topic - next topic

grosmatou2

Nov 07, 2014, 03:40 pm Last Edit: Nov 11, 2014, 09:44 am by grosmatou2
bonjour a tous
je pose mon probleme:
j'ai un arduino qui recoit et affiche l'heure la minute et la seconde en 3 variables
cet horaire provient d'un gps
j'envoi ces variables par serial.print(heure) serial.print(minut) serial.print(second) vers un port serie softserial jusque la cela marche et cela s'affiche sur un terminal serie avec les separateurs ":" que j'envoi egalement
j'ai un 2eme arduino avec son soft d'automate qui tourne et je voudrai lui permetre de recevoir mes 3 variables les afficher et pouvoir traiter heure, minute, secondes individuelement pour des actions d'automate. cela m'evite soit une deuxieme horloge soit un deuxieme gps
je butte help...
si vous avez un bout de prog merci

infobarquee

bonjour,
plusieurs solutions possibles.
via une connexion série entre les deux nonos=> créer un deuxième pont sérial
soit une connexion via radio. 234mhz par exemple

tout dépend de l'éloignement entre les deux nonos.
AUCUNE AIDE PAR MP

grosmatou2

#2
Nov 07, 2014, 04:00 pm Last Edit: Nov 07, 2014, 04:04 pm by grosmatou2
oui ok,
j'ai bien cree un second port serial avec softserial, j'utilise 12 et A0
car je pense faire une liaison entre les 2 arduino avec un HC-05 bluetooth sur chaque arduino (en commande)
mais c'est le bout de soft sur le module esclave, qui me bloque.
je n'arrive pas a recevoir correctement et a traiter la variable recue sur ce port serie
sur le maitre j'ai les 3 variables decomposée ex 01, 10 , 49  pour 01h10min59s que j'envoi en blue.print(heure) delay(200) blue.print(minut) delay(200) etc

distance max 10m et pas de possibilité de cable entre les 2
merci

guix

Bonjour,

Quels modèles d'arduino utilise-tu? Certains pins de certains arduinos ne sont pas compatible avec la librairie SoftwareSerial. Essaie de changer de pins: 10 pour RX et 11 pour TX.

Essaie d'abord sans les modules bluetooth, une chose à la fois.

Pourquoi mettre des delays entre chaque print?

grosmatou2

il s'agit de pro mini 5v/16Mo les test pour l'instant se font sans bluetooth evidemment mais par 2 fils croises et le gnd
les delay ? s'il ne servent pas je les ferait sauter
relativement novice, je pompe par ci par la d'ou peut etre les erreurs de syntaxe notées
concernant les ports il faudrai que je reconsidere, car c'est les 2 qui me restent.
ce que je cherche c'est sortir du flux qui arrive sur le port serie 12etA0(si je garde ceux la)les 3 variables pour les traiter
mes 3 variables traitée localement sur l'esclave, fonctionnent mais je veux les remplacer par celle qui arrivent sur le port. (toute les secondes)
d"ou ma demande d'un exemple de soft, pour extraire
merci

guix

#5
Nov 08, 2014, 10:23 am Last Edit: Nov 08, 2014, 07:11 pm by guix
La meileure solution selon moi est d'envoyer un "paquet" qui contient un caractère qui marque le début du paquet, puis les données, puis un autre caractère qui marque la fin du paquet. A la réception on extrait les données du paquet avec la fonction sscanf.


Un exemple juste pour démontrer le principe:
http://codepad.org/MslAa67a

Un exemple un peu plus complet pour l'arduino:

Envoi:
Code: [Select]

uint8_t hh = 10;
uint8_t mm = 19;
uint8_t ss = 38;

char output[6];
sprintf( output, "<%c%c%c>", hh, mm, ss );
Serial.print( output );


Réception:
Code: [Select]

uint8_t hh = 0;
uint8_t mm = 0;
uint8_t ss = 0;

void loop()
{
    // si il y a quelque chose dans le buffer du Serial
    if ( Serial.available() > 0 )
    {
        static char input[6];
        static uint8_t i;
 
        // lire un caractère
        input[i++] = Serial.read();

        // si on a lu 5 caractères
        if ( i == 5 )
        {
            input[i] = '\0';

            // on remet le compteur à zéro pour le prochain message
            i = 0;

            // si le message est conforme, on tente d'extraire les données
            if ( sscanf( input, "<%c%c%c>", &hh, &mm, &ss) == 3 )
            {
                // on affiche l'heure sur un autre port série par exemple...
                char horloge[20];
                sprintf( horloge, "Il est %hhu:%hhu:%hhu !", hh, mm, ss );
                Serial1.println( horloge );
            }
        }
    }
}


Attention ceci reste un exemple très basique, même pas testé.

Et si ça fonctionne, ce ne sera pas très fiable une fois que tu aura ajouté le bluetooth dans l'équation... car, avec le bluetooth, tu aura parfois des erreurs de transmission (j'avais calculé si je me souviens bien, moins de 0.1% d'erreurs à 57600 bauds), et il faudra pouvoir détecter ces erreurs. La méthode la plus simple pour les détecter (mais sans les corriger), c'est d'ajouter un "checksum" dans le message envoyé (par exemple la somme heures + minutes + secondes), et le vérifier à la réception. Si le checksum envoyé correspond à celui calculé à la réception, il y a de très fortes chances (sans en être vraiment certain) que le message reçu soit exactement le même que celui envoyé...

Bref c'est plus compliqué qu'il n'y paraît :(

grosmatou2

merci guix
je vais tester ce week end
si cela tourne je testerai la partie bluetooth des reception des modules HC-05
je croit que ceux ci tournent en 9600b
je verrai

je suis preneur de toutes autres solutions
merci a tous

fdufnews

#7
Nov 08, 2014, 02:51 pm Last Edit: Nov 08, 2014, 02:54 pm by fdufnews
Je ne suis pas d'accord sur le principe du code de réception.
Attendre brutalement d'avoir reçu le bon nombre de caractères ne permet pas de se retrouver en cas d'erreur de transmission.
L'intérêt d'avoir un caractère de début de transmission c'est justement de pouvoir détecter le début de la trame.

Il faut faire une machine à états:

Etat départ:
  Initialisation du tampon de réception
  passage à l'état attente

Etat attente:
  il faut lire tous les caractères qui arrivent.
  Si ce n'est pas le caractère de début, on l'ignore
  Si c'est le caractère de début, on passe au pas réception

Etat réception:
  On lit les caractères qui arrivent
  Si c'est le terminateur, on marque la fin dans le tampon et on passe au pas interprétation
  Si c'est le caractère de début, retour à l'état départ
  Sinon, les caractères reçus sont mis dans un tampon

Etat interprétation:
  On vérifie que l'on a le bon nombre de caractères
  Si oui, on exploite la valeur puis retour à l'état départ
  Si non, on rejette et retour à l'état départ

grosmatou2

yes, a lire l'explication c'est vrai, plus tantant, guix m'avais deja bien aiguillé sur le principe merci
fdufnews donne une approche plus cadrée
mais comme dit plus haut (novice) si je n'abuse pas, un bout de prog comme guix m'aiderai enormement.
merci
1 je vais tester deja le 1er prog en attendant
2 je vais tout de meme essayer de comprendre la version de fdufnews.
un premier remerciement a tout deux (je me repete mais que c'est bon)

guix

#9
Nov 08, 2014, 07:27 pm Last Edit: Nov 08, 2014, 07:28 pm by guix
Voilà un exemple de machine à états: http://www.gammon.com.au/forum/?id=11425&reply=1#reply1

Tu peux changer la vitesse de communication des HC-05, et d'autres paramètres ( 9600 bauds c'est vraiment très lent, et ça ne t'empêchera pas d'avoir des erreurs, au contraire tu en aura encore plus :) ), voir ce pdf.

grosmatou2

merci guix
j'ai teste ton bout de prog, le plus simple
pour mon usage il est parfait et cela a l'air de bien tourner, donc je garde
effectivement a 57600 c'est plus fluide
il va falloir maintenant et des reception des hc-05
que j'en modifie 1 en maitre et l'autre en esclave et que je parametre 57200
la ce sera une autre histoire car la aussi je suis novice
merci encore a tous

Go Up