TIPE Transmission de données

Bonjour, je suis actuellement en classe prépa scientifique, c'est bientôt les oraux dont l'épreuve de TIPE mais je bute toujours sur mon expérience qui consiste à transmettre des données par émission lumineuse. J'utilise pour ça deux cartes Arduino, l'une pour l'émission qui code le signal (une chaine de caractère) et le réparti sur 8 bits représentés par 8 LEDs, l'autre pour la réception reliée aux 8 photodiodes qui me servent de récepteurs et qui doit donc me retransformer cette suite de 0 ou 1 en ma chaine de caractère.

J'ai surtout un problème au niveau de la conversion de mon texte en base 2 en passant par la table ASCII, j'ai essayé de créer une liste, de passer par un String... mais en fouillant un peu je suis tombé sur quelque chose d'intéressant en utilisant la fonction bitRead.

Je met ici mon code et les 2-3 problèmes (en gras) que j'ai, je précise que je débute en programmation et encore plus en Arduino, et même si j'ai pas mal appris ces derniers temps je ne suis pas du tout familier avec le langage Arduino :

/*Ce programmme permet de transmettre un message */

char Texte[151] = "Hello world"; // Le message à transmettre.
int led[9] = {2,3,4,5,6,7,8,9,10}; //  Les différentes LED.


void setup() {
  Serial.begin(9600);
  pinMode(led[0], OUTPUT); // On met les différentes LED en sortie de la carte Arduino
  pinMode(led[1], OUTPUT);
  pinMode(led[2], OUTPUT);
  pinMode(led[3], OUTPUT);
  pinMode(led[4], OUTPUT);
  pinMode(led[5], OUTPUT);
  pinMode(led[6], OUTPUT);
  pinMode(led[7], OUTPUT);
  pinMode(led[8], OUTPUT); // Led de contrôle ---> signale le début d'émission
  delay(3000);}

  
void loop() {
digitalWrite(10, HIGH); // LED de contrôle allumée, début de la transmission

 for (int l=0; l <= 151; l++)
   {[b]int lettrel = Texte[l]+0;
    byte let = byte(lettrel);[/b]
  for (int k=0; k <= 7; k++) 
  {if (bitRead(let,k)== 1) // bitRead lit la valeur du bit de rang k pour la valeur décimale de lettrei
   {digitalWrite(2+k, HIGH);} // Bit à 1, LED allumée.
    else
   {digitalWrite(2+k, LOW);}} // Bit à 0, LED éteinte.
  } 
   
[b]delay(10);}[/b]// Temps d'émission d'une lettre, pour 150, 1,5secondes.

Voilà le code, mon premier problème c'est la conversion d'un char (ici c'est Texte[l]) en un int, j'ai trouvé cette astuce de mettre int nombre = texte[7]+0 pour obtenir un int, mais donc que va faire concrètement cette commande ? Par exemple pour Texte[4], lettrel sera-t-il le code ASCII décimal de o soit 111 ?

Si c'est le cas, et si byte let = byte(lettrel) permet bien de créer un byte qui pourra se lire par la suite avec bitRead, que va lire bitRead si il n'y a pas de 0 ou 1 pour le rang k ? Concrétement, si j'ai la valeur 63 en décimal, elle sera codée en binaire par 111111 et non pas 0111111, faussant ainsi mon code qui consiste à tout répartir sur 8 LEDs.

Enfin le delay représente-t-il bien ici la répartition d'une lettre de la chaine de caractère sur les 8 LEDs, confirmant ainsi le fait qu'il me faille 151*delay pour émettre tout mon texte ?

Voilà pour mes problèmes, en espérant que quelqu'un puisse m'éclairer. Veuillez m'excuser pour la présentation un peu foireuse du code, je ne sais pas encore comment attacher un bout de code à un texte de manière propre.

EDIT : Désolé, c'est corrigé :slight_smile:

ça commence à me gonfler.... edite ton message et mets le code entre les balises "code"

http://forum.arduino.cc/index.php?topic=315372.0

hello
oups, la patrouille est passée. édites ton 1er post et vire ton code pour le mettre entre les balises </>
regardes le lien qui t'a été donné, c'est bien expliqué (en descendant un peu dans la page)

voici pour la partie émission, pour le cadencement de l'émission de chaque lettre, il faudra voir avec le code de la partie réception.
peut etre la led témoin de début d'émission pourra t'elle servir de synchro entre les deux arduinos.
à creuser...
ouvres le moniteur en 9600

char Texte[151] = "Hello world"; // Le message à transmettre.
int led[9] = {2, 3, 4, 5, 6, 7, 8, 9, 10}; //  Les différentes LED.
int lettrel;

void setup() {
  Serial.begin(9600);
  pinMode(led[0], OUTPUT);  // bit 0 du code de la lettre
  pinMode(led[1], OUTPUT);  // bit 1 du code de la lettre
  pinMode(led[2], OUTPUT);  // bit 2 du code de la lettre
  pinMode(led[3], OUTPUT);  // bit 3 du code de la lettre
  pinMode(led[4], OUTPUT);  // bit 4 du code de la lettre
  pinMode(led[5], OUTPUT);  // bit 5 du code de la lettre
  pinMode(led[6], OUTPUT);  // bit 6 du code de la lettre
  pinMode(led[7], OUTPUT);  // bit 7 du code de la lettre
  pinMode(led[8], OUTPUT);  // Led de contrôle ---> signale le début d'émission
  delay(3000);
}


void loop()
{
  digitalWrite(10, HIGH); // LED de contrôle allumée, début de la transmission
  for (int l = 0; l <= 15; l++)
  {
    lettrel = Texte[l] + 0;
    Serial.print("lettrel = "); Serial.print(lettrel); Serial.print(" => ");
    if (lettrel > 0)
    {
      for (int b = 7; b >= 0; b--)
      {
        if (bitRead(lettrel, b) == 1) // bitRead lit la valeur du bit de rang k pour la valeur décimale de lettrei
        {
          Serial.print(bitRead(lettrel, b));
          digitalWrite(led[b], HIGH);/// Bit à 1, LED allumée.
        }
        else
        {
          Serial.print(bitRead(lettrel, b));
          digitalWrite(led[b], LOW);// Bit à 0, LED éteinte.
        }

      }
      // fin de la lettre
      Serial.println("");
      Serial.println(" fin de transmission d'une lettre");
      delay(1500);// Temps d'émission d'une lettre, pour 1500ms, 1,5secondes
      
    }
    
    // fin du message
    //while(1);
  }
  digitalWrite(10, LOW); // LED de contrôle éteinte, fin de la transmission
  Serial.println("");
  Serial.println(" fin de transmission du message");
  while (1);
}

Merci pour l'aide. En revanche je ne comprends pas exactement ce que fait le "while(1)" ? (et pourquoi avoir mis le premier "while(1)" en commentaire ?)

Oui je n'ai pas mis la partie réception. Ma LED témoin me sert de signal de début de transmission. J'ai en réception une photodiode qui lui est associée et qui me sert de début de boucle dans mon programme de réception, que je mettrais sûrement plus tard si j'ai des soucis dessus. Je ne peux pas tester mes programmes pour le moment je n'ai pas accès au matos de chez moi.

le "while" était pour mes tests, j'ai oublié de le virer
sans lui, le prog boucle et je n'avais pas le temps de lire les infos à l'écran

D'accord merci, je ferais mes expériences vendredi je te tiens au courant :slight_smile: