Pages: 1 2 [3]   Go Down
Author Topic: Communication RS232 (programmation)  (Read 2025 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour vraiment être sûr d'avoir bien compris et un peu pour passer pour un idiot aussi...

Dans le code corrigé que tu m'as donné tu aurais très bien pu écrire

byte PWM_MOT[NB_OCTETS-1]

dans le sens ou tu ne remplis que 5 octets du tableau alors que tu définis un tableau de 6 octets (PWM_MOT[5]) ?
Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Oulala ! Tu as un problème avec les tableaux dites donc  smiley-mr-green

Lorsque tu définis un tableau, il faut bien distinguer la valeur entre crochet et la manière dont le µC va le gérer.

byte monTableau[6] = {1, 2, 3, 4, 5, 6};

La valeur entre crochet est telle que nous la comptons nous autre humain, il contient bien ici 6 élements (ou 6 cases mémoires).

Je ne rentrerais pas dans le détail du pourquoi, c'est comme çà un point c'est tout smiley-wink

Par contre, le microcontrolleur comme tout bon microcontroleur, commence à compter à partir de 0,

Reprenons :

byte monTableau[6] = {1, 2, 3, 4, 5, 6}; // comptage pseudo-humain
......................................0, 1, 2, 3, 4, 5     // comptage du microcontrolleur

Ainsi, lorsque tu créés une boucle ou un appel à ce tableau, tu utilises le langage du µC et commences à compter à partir de zero :

monTableau[0] = 1
monTableau[1] = 2
monTableau[2] = 3
monTableau[3] = 4
monTableau[4] = 5
monTableau[5] = 6

A savoir que lorsque tu fabriques un tableau, tu fais appel à la gestion de la mémoire du microcontrolleur et à un moment donné, il faut bien dire à la mémoire que le tableau est fini.
Si tu essayais d'appeler monTableau[12], le compilateur te retournerait une erreur car tu as créé un tableau de 6 cases et pas 13 smiley-wink

En esperant avoir clarifié un peu la situation  smiley-lol

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Parfaitement clair maintenant !

Merci à tous les deux !
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je reviens vous embêter smiley-wink

Voilà ce que j'ai fait :
Code:
const byte PIN_PWM_A = 10;
const byte PIN_PWM_B = 9;
const byte PIN_PWM_C = 6;
const byte PIN_PWM_D = 5;

const byte PIN_COM = 4; // Déclaration de la pin COM de l'arduino
const byte PIN_LED = 2; // Déclaration de la pin LED de l'arduino

const byte NB_OCTETS = 4;
byte PWM_MOT[NB_OCTETS]; // Tableau de NB_OCTETS octets

void setup()
{
  Serial.begin(9600); // Paramétrage de la vitesse de la liaison série
  while(Serial.available() > 0) Serial.read(); // On vide le buffer de lecture
  pinMode(PIN_COM, OUTPUT); // Paramétrage de la pin COM en sortie
  pinMode(PIN_LED, OUTPUT); // Paramétrage de la pin LED en sortie
}

/*********************** DEBUT DE LA BOUCLE PRINCIPALE ********************************************/
void loop()
{
  digitalWrite(PIN_COM, LOW); // Paramétrage communication filaire
  digitalWrite(PIN_LED, HIGH); // Paramétrage des LEDs à l'état haut
 
  if(Serial.available() > 0)
  {
    int premier_octet = Serial.read();
    switch (premier_octet)
    {
      case 'M':
        Serial.read(); // On vide le 2ème octet du buffer de lecture correspondant à la zone Nunchunk
        for(int n = 0; n < NB_OCTETS; ++n) // On rempli le tableau d'octets
        {
          while(Serial.available() < 1); // Attente des données entre chaque tour de boucle (programme plus rapide que la com)
          PWM_MOT[n] = Serial.read(); // Stockage des valeurs de PWM dans le tableau
        }

        analogWrite(PIN_PWM_A, PWM_MOT[0]);
        analogWrite(PIN_PWM_B, PWM_MOT[1]);
        analogWrite(PIN_PWM_C, PWM_MOT[2]);
        analogWrite(PIN_PWM_D, PWM_MOT[3]);
     
        Serial.print(PWM_MOT[0]);
        Serial.print(PWM_MOT[1]);
        Serial.print(PWM_MOT[2]);
        Serial.print(PWM_MOT[3]);
        Serial.println();
        break;
       
      default:
        delay(1);
    }
  }
  else
  {
    analogWrite(PIN_PWM_A, 0);
    analogWrite(PIN_PWM_B, 0);
    analogWrite(PIN_PWM_C, 0);
    analogWrite(PIN_PWM_D, 0);
  }
  delay(50);
}

Mon code fonctionne plutôt bien. Par contre, je me suis amusé à enlever le delay(50) à la fin et là ça ne fonctionne plus comme attendu : j'affiche la zone et les 3 premières PWM... Pourtant en faisant "dérouler le programme dans ma tête" ça ne devrait rien changer...
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je pense avoir compris mon problème de delay :

Je pense que ça vient du programme boitier qui dans ça boucle principale a aussi un delay de 50ms

Je pense qu'il faut que les delay soient identiques dans les deux programmes pour que tout roule correctement.
Logged

Pages: 1 2 [3]   Go Up
Jump to: