Gradateur TimerOne

Bonjours à tous,

j' ai voulu tester le code de Gromain59, ça compile, ça téléverse mais ça ne veux pas prendre la trame: D/0/50/F ( avec l' espace avant le D ).

/*GRADATEUR 8 CANAUX v0.1
TRAME ATTENDUE: 'D'/'numero de sortie'/'consigne'/'F'
n, Canal0 sur la PIN 8
n, Canal1 sur la PIN 0
n, Canal2 sur la PIN 0
n, Canal3 sur la PIN 0
n, Canal4 sur la PIN 0
n, Canal5 sur la PIN 0
n, Canal6 sur la PIN 0
n, Canal7 sur la PIN 0
code inconnu
code inconnu
code inconnu
code inconnu
code inconnu
code inconnu
code inconnu
*/

J' ai essayé plusieurs façon d' écrire la trame, mais le moniteur série ne veut rien savoir...

Si vous avez des idées...

Merci d' avance.

Salut,

Je me rappelle bien des travaux de Gromain59, mais ça doit faire au bas mot 2 ans qu'il fréquente plus le forum. Imagine bien qu'on connait pas tous les topics par coeur et qu'un lien pour savoir de quoi tu parles ne serait pas de trop ....

Bonsoir B@tto,

en effet, où est-ce que j' ai rangé ma tête...?
Voici:
http://forum.arduino.cc/index.php?topic=33490.0

Merci.

Tu reçois une réponse quand tu envois une commande ?

Au niveau hardware tu as branché quelque chose ?

Bonjours B@tto,

Oui, quand j' envoie la trame, il me retourne "code inconnue".

Coté hardware, un opto coupleur pc817 pour le zero crossing, d' après le schéma de ce blog.

J' imagine que tu le connais déja... :wink:

pour le test parti commande ( où se trouve le triac) j' ai câblé comme suit:

D8--> moc3021 broche 1 ; moc3021 broche 2 --> R470 --> GND
moc3021 broche 4 --> r470 --> Bta08 g
moc3021 broche 6 --> bta08 A2.
bta08 A1 --> lampe.

En clair celà donne ça (sans le transistor de commande).

Au fait j' en profite pour te féliciter pour ta fraiseuse numérique 8) la grande classe.

Merci B@tto.

weetoz:
Au fait j' en profite pour te féliciter pour ta fraiseuse numérique 8) la grande classe.

Merci B@tto.

Elle marche pas vraiment donc bon xD Ca fonctionne en soit mais inutilisable car beaucoup trop de jeu ... Au moins j'aurais appris plein de trucs !

Pour ton problème : modifie la partie concernée :

else                                                       // si caractere de debut ou de fin de trame non reconnu
     {Serial.println("code inconnu");
Serial.println(buf);

}

on y verra plus clair comme ça

Oui mais tu vas l' améliorer coté méca avec tes nouveaux profilés alu hein :wink:

Voici le retour du nouveau code:

code inconnu
              
code inconnu
D             
code inconnu
/             
code inconnu
0/50/F

ça tombe bien, une des lignes que je ne comprenais pas:

char buf[15]="              ";

De ce que je peux en constater, on déclare la variable caractère "buf", et on l' initialise à 15 caratères, c' est bien ça?

J' en reviens à ta CNC, as-tu asservi la vitesse de rotation du moteur de la défonceuse à l' arduino? (si oui, comment?)

J' ai l' impression que la lib stdio.h n' est pas prise en compte...

Ok je pense savoir alors :

en début de la fonction lecture() ajoute un delay(5). En fait le traitement est plus rapide que l'arrivée de l'information, ce qui explique ce découpage de la trame et du coup sa non reconnaissance.

Sinon pour l’initialisation de chaine de caractère, perso je fais toujours un memset, une bonne habitude à prendre :

int lecture(){            

delay(5);

char buf[15];
memset(buf,NULL,15);

Résultats avec;

delay(5);
code inconnu
 D/0/
code inconnu
50/F

Augmentation du delay:

delay(15);
code inconnu
 D/0/50/F

Avec 30mS:

code inconnu
 D/0/50/F

Donc 15 mS suffit.
Essais avec trame "D/000/050/F":

code inconnu
 /D/000/050/F

test avec 10 mS:

code inconnu
 D/000/050
code inconnu
/F

15 mS parait bien...

Je regarde de ce coté aussi...

Et du coup, je me rends compte que la lib Mstimer2 apparait bien en orange sur le sketch, ce qui n' est pas le cas de la lib TimerOne et stdio.h...

weetoz:
Et du coup, je me rends compte que la lib Mstimer2 apparait bien en orange sur le sketch, ce qui n' est pas le cas de la lib TimerOne et stdio.h...

Ca ne veut rien dire : la couleur se met si un fichier KEYWORD a été crée ou pas par l'auteur de la lib mais c'est purement esthétique. Du moment que ça compile ça veut dire que c'est bien écrit :wink:

Par contre tu dis que tu envois "D/000/050/F", rassure moi, tu n'écris pas réellement ?

Bon j'ai corrigé la fonction lecture(). Essaye ça sans espace avant la trame :

int lecture(){         

     delay(20);

     char buf[15];
     int timeout=0;
     int i=0;
     int n1=0;
     int n2=0;
     char c1,c2;

     memset(buf,NULL,sizeof(buf))
     
     while(Serial.available()>0)  buf[i++] = Serial.read();
    
     sscanf(buf, "%c/%d/%d/%c", &c1, &n1, &n2, &c2); 
      
     if (c1=='D' && c2 == 'F'){       
           
           int nouv_cons=n2;             
           
           nouv_cons=constrain(nouv_cons, 0, 100); 
                 
           Serial.print("sortie ");
           Serial.print(n1);
           Serial.print(" , nouvelle consigne de: ");
           Serial.print(nouv_cons);
           Serial.print(" % soit index retard: ");
                 
           consigne[n1]= (50-(nouv_cons/2));       
                 
           Serial.println(consigne[n1]);      
    
 } else {

Serial.println("code inconnu");
Serial.println(buf);

}
     
     return i;
     
}

Voici le retour:

triactest.ino: In function 'void controle_canaux()':
triactest.ino:285: warning: operation on 'c2' may be undefined
triactest.ino: In function 'int lecture()':
triactest:351: error: 'consigne' was not declared in this scope
triactest.ino:328: warning: unused variable 'timeout'

Pourtant déclarer ici:

typedef struct Canal Canal;
struct Canal
{
   int consigne;                                     // consigne actuelle
   int consigne_cible;                              // consigne niveau de canal (0=100%, 50=0%)
     int compteur_transition;                  // temps de transition lors d'un changement niveau de canal (par pas de 10 ms) ex: 2 x 50 cycles de 10ms= 1s de transition
     int compteur_transition_courant;      // compte le nombre de transition
     int sortie;                                          // affecte une pin pour chaque canal.
     char mnemo[16];                                    // mnemonique de la variable
};

J' ai essayé sans le point virgule après l' accolade fermante, mais ça coince à la ligne suivante.

Et je n' écrit pas , je tape la barre d' espace! :smiley:

Ah oui mais la tu sors du code en plus.

Ici consigne est dans une structure, c'est Canal.consigne qu'il faut appeler.

dans le code de Gromain par contre il y a bien un tableau de int nommé consigne