[Aide] Projet de communication en lumière

Bonjour à tous, j’aurais besoin de votre aide pour un projet Arduino.
Déjà je vais commencer par vous avouer que je ne m’y connais pas super bien en code Arduino, je commence juste.

Voilà, je cherche à réaliser un système qui traduise du texte en lumière. Je vous explique : à partir d’un texte en ASCII, j’aimerais le convertir en hexadécimal puis le faire émettre par deux LEDs RVB.

Donc si on veut « Hello », ce sera converti en : 48 65 6C 6C 6F
Déjà, cette première étape, je ne sais pas comment m’y prendre. Enfin ce n’est de toutes façons pas la plus importante, puisque je peux toujours faire cette opération hors de mon code.

Maintenant, c’est là que ça se complique. Je voudrais que le code sépare chaque caractère du texte en hexadécimal pour n’avoir que des nombres à deux chiffres qui se suivent. (uniquement 48, puis 65, puis 6C, 6C, 6F)
Ensuite il faudrait que pour chaque nombre, le premier chiffre soit affiché par la première LED RVB, et le second par la deuxième. Ainsi, si on a défini que 4 = Bleu, 8 = Vert, les deux couleurs vont s’afficher sur les LEDs pour signifier 48.

Il faudrait donc que les LEDs clignotent à intervalle régulier (par exemple 1 seconde) afin d’afficher chaque caractère hexadécimal, l’un après l’autre.

Je n’ai aucune idée de si c’est possible. Il me faudrait trouver une manière de séparer les informations d’un texte en plein d’informations donc la quantité peut varier en fonction de la longueur de ce texte. De plus je ne sais pas trop comment assigner chaque couleur de la LED à l’un des 16 caractères possible du système hexadécimal.

Enfin, merci de m’avoir lu, et merci encore pour ceux qui vont essayer de me répondre :wink:

PS : Vous pensez peut-être que mon projet n’a aucune utilité, c’est normal, c’est un projet d’art !

Alors, dans les grandes lignes.
Pour la conversion en hexadécimal, bonne nouvelle, tu n'as rien à faire. Ou presque. Envoie des données via la liaison série, je suppose que c'est ce qui est prévu.
Les données reçues (et envoyées) sont des octets, donc des successions de 8 bits, soit 8 0 ou 1, soit encore 2 caractères hexa. Elles ne sont interpretées en texte QUE si tu le demande explicitement. Si tu les lis comme des octets, tu auras des données brutes, donc ce que tu recherches.

Fais l'essai: envoie une lettre, un mot, une phrase depuis le terminal de l'IDE, et fais-le renvoyer depuis l'arduino.

void setup(){
    Serial.begin(115200);
}

void loopt(){
    If(Serial.available()){
        //renvoit le charactère reçu. Peek permet de garder le même caractère pour la lecture suivante
        Serial.print(Serial.peek());
        //Renvoit la valeur de l'octet, en numérique. Le transtypage en (int) permet de forcer à afficher la valeur
        Serial.print((int)Serial.read());
    }
}

Pour séparer ton octet en deux, je t'invite à regarder dans la référence sur ce site comment fonctionnent les opérateurs de bit (bitwise operator). Tu devrais y trouver ce que tu cherches.

Pour le pilotage des leds tout dépend du type de led. Led adressables, led classiques...
Pour coupler une valeur et une couleur, il faudra probablement mettre en place une table, associant une valeur aux trois composantes lumineuses correspondantes. Mais on peut imaginer plein de solutions!

Dans la mesure où il s'agit d'un projet à vocation artistique, je ne sais pas si le terme de communication s'applique à faire une transmission d'informations entre deux éléments distincts, ou bien simplement illustrer un état par un simple signal visuel, à destination d'un observateur. AestheticRobot précisera le but exact.

Pour la question du PWM, est-ce qu'on ne peut pas mettre un filtre passe-bas RC? Ca marche plutôt bien pour rendre agréable une fréquence PWM en audio, je suppose que cela doit donc marcher aussi avec de la lumière.

Je dois avouer que là, pour moi, c'est du chinois. Je me suis arrêté à "le courant maximum appelé par le dispositif...", ce que je comprends fort bien, d'autant que j'ai eu l'occasion de m'en rendre compte, justement en essayant plusieurs valeurs de condensateurs sur une sortie audio. le niveau sonore baisse effectivement quand on augmente la capacité du condensateur.

Bonsoir, merci pour vos réponses !
Il s'agit d'un projet artistique donc pas besoin d'une clarté spéciale de la part des LEDs. J'ai mis communication parce que le projet tourne autour du langage via la lumière, enfin je vous passe les détails.

Pour être honnête, je ne comprends pas tout à ce que vous m'avez dit, mais je pense avoir compris l'essentiel :slight_smile:

Je ne connais pas encore les fonctions Serial, mais je vais chercher plus en profondeur sur les sites spécialisés. Sinon pour les Bitwise Operator, je suis vachement largué.

Après pour le pilotage des LEDs, Est-ce qu'il est possible de définir toutes les couleurs des LEDs à l'avance et de diriger plus facilement les LEDs dessus ? Du coup je me demande même si dans une moindre mesure, cela vaudrait pas le coup à mon niveau de programmer chaque caractère un par un dans l'arduino, plutôt que de partir dans des conversions vers l'hexadécimal que je ne maîtrise absolument pas !

AestheticRobot:
enfin je vous passe les détails.

Justement non, si détails il y a, ça vaut le coup qu'on les connaisse! C'est justement les détails qui permettent de s'orienter facilement vers une solution.

AestheticRobot:
Je ne connais pas encore les fonctions Serial, mais je vais chercher plus en profondeur sur les sites spécialisés. Sinon pour les Bitwise Operator, je suis vachement largué.

Tu peux chercher aussi dans la référence pour Serial. Chaque fonction y est expliquée, l'essentiel y est, et devrait te suffire.
Pour les bitwise operator, l'idée est de manipuler les bits uns par uns. Si tu te sens largué, ça vaut le coup que tu lises aussi, toujours dans la référence, les types de variables (data types). les différents types y sont décrits, et leurs utilisations potentielles. Il faut bien comprendre que, quoi que chaque type de variable soit optimisé pour gérer un type de donnée, leur représentation en mémoire se fait toujours de la même manière, avec des octets composés de 0 et de 1. Ainsi, si le type "char" permet de manipuler des caractères, il n'en demeure pas moins physiquement un nombre, codé sur un octet, et donc compris entre 0 et 255 (ou plutôt entre -128 et 127, car il est signé). On peut donc faire des opérations dessus, notamment. C'est un concept qui peut être délicat à appréhender au début, mais c'est aussi probablement ce qui va te servir, puisqu'en lisant la valeur d'une variable char, plutôt que de d'associer cette valeur au caractère correspondant, tu obtiens directement un nombre. Et ce nombre a comme tout nombre, une correspondance en binaire et en hexadécimal.

AestheticRobot:
Après pour le pilotage des LEDs, Est-ce qu'il est possible de définir toutes les couleurs des LEDs à l'avance et de diriger plus facilement les LEDs dessus ? Du coup je me demande même si dans une moindre mesure, cela vaudrait pas le coup à mon niveau de programmer chaque caractère un par un dans l'arduino, plutôt que de partir dans des conversions vers l'hexadécimal que je ne maîtrise absolument pas !

Tu perdras du temps, et probablement beaucoup d'énergie, à vouloir coder chaque valeur une par une. C'est une solution, mais sous son apparente simplicité elle est complexe: tu vas en gros avoir une structure (genre, recevoir un caractère, le transformer en deux valeurs hexa, ecrire les valeurs vers les 6 broches des deux leds) multiplié par le nombre de cas que tu as. C'est lourd, et ça rend difficile le repérage d'éventuelles erreurs.

Au lieu de ça, tu peux effectivement préparer (hors programme, dans un tableur par exemple) les valeurs RGB que tu veux pour chacune de tes 16 couleurs. Et tu stockes ces valeurs dans trois tableaux, un pour chaque couleur élémentaire.

//on crée trois tableaux de 16 byte, pour les trois couleurs primaires.
byte red[16] = {255, 255, 0, ...};
byte green[16] = {255, 0, 255, ...};
byte blue[16] = {255, 0, 0, ...};

Ici, on peut voir que pour la valeur 0, la led sera blanche, pour la valeur 1, la led sera rouge, pour la valeur 2, la led sera verte, etc.

Ensuite, lorsque tu reçois ton caractère, et que tu l'as décomposé en deux valeurs hexadécimales comprises entre 0 et 15, tu as simplement à récupérer la valeur stockée.

//je mets ici une valeur arbitraire, dans la vraie vie elle viennent de ta liaison série.
byte chiffreHexa = 0xC;

analogWrite(pinRed, red[chiffreHexa]);
analogWrite(pinGreen, green[chiffreHexa]);
analogWrite(pinBlue, blue[chiffreHexa]);

En fait, dans la pratique tu ne vas probablement même pas manipuler des nombres hexadécimaux, ou plutôt tu n'auras de conversion explicite à faire.

Bref, mon conseil: prends le temps de lire la page de référence Arduino, en commençant par le début. Ca va prendre un peu de temps, mais ça te permettra de saisir la philosophie sous-jacente.

Bon courage! :wink:

Merci beaucoup, vous m'aidez énormément !
(Je mettrai vos noms/pseudos sur mon projet à la fin :wink: )

Il s'agit de LEDs CC basiques de 5mn, donc le schéma que tu m'as donné devrait correspondre.

De coup, je dois remplacer tes "CC ?" par des 0 ?

Merci énormément pour le code que tu m'as conçu, il m'aide vraiment à comprendre comment m'y prendre et correspond parfaitement à ce que je veux.

Edit : Pour les détails de l'approche conceptuelle du projet, en gros, ce serait pour parler d'un nouveau moyen de communication par la lumière. C'est inspiré d'une nouvelle d'Alain Damasio

AestheticRobot:
Edit : Pour les détails de l'approche conceptuelle du projet, en gros, ce serait pour parler d'un nouveau moyen de communication par la lumière. C'est inspiré d'une nouvelle d'Alain Damasio

C'est bien de savoir que tu trouves des réponses! Je me souviens la première fois que j'ai voulu savoir ce qu'était Arduino, et comment ça fonctionnait, j'ai galéré, mais vraiment! Et j'ai laissé de coté en me disant que ça n'était sûrement pas pour moi. Pourtant j'avais fait de la programmation au lycée, puis en DUT, mais je n'ai pas été foutu de trouver la bonne porte d'entrée.
Depuis j'ai avancé un peu.

Quelle est la nouvelle d'Alain Damasio? J'ai adoré les deux romans que j'ai lu de lui, qui m'ont laissé un souvenir durable, ce qui m'arrive assez rarement. Et l'envie de faire des clameurs, projet laissé de coté depuis un moment! :wink:

Bien, merci beaucoup, j'essaie le code demain, vu qu'il me manque une LED RVB que j'ai prêté à un ami.

C'est vraiment génial internet. J'ai besoin d'aide et le lendemain, mes problèmes sont réglés. Avant de poster mon topic, je doutais de l'efficacité de cette partie du forum (Français), j'avais bien tort !

La nouvelle d'Alain Damasio c'est "So phare away". Elle est dans le recueil Aucun souvenir n'est assez solide. Je te le conseille vivement si t'as apprécié ses deux romans. Clairement, il s'agit d'un des auteurs que j'admire le plus. Il a une imagination sans limite.

Ton idée de faire des clameurs m'intéresse beaucoup. Quand on y pense c'est hyper faisable avec Arduino. Si jamais t'as besoin d'aide pour quoi que ce soit, (bon, pour la partie programme ce sera pas trop mon fort, mais pour ce qui est d'en fabriquer, de parler dedans, de les déposer, etc.) n'hésite pas à me demander ! Sinon, t'as tout mon soutien pour ce projet. :wink:

AestheticRobot:
Quand on y pense c'est hyper faisable avec Arduino.

En fait pour ce que j'avais étudié de la question, c'est même hyper faisable sans Arduino! :slight_smile:
Je pensais interfacer un module PIR (détection de mouvements) avec un petit CI de reproduction vocale.
Genre ça et ça. En restreignant l'angle de captation du capteur de mouvement, ça pourrait être assimilable à un rayon, je pense. Je n'ai pas poussé les investigations plus loin, à l'époque j'étais sur plusieurs choses, et puis j'ai fini par avoir une indigestion de programmation/électronique. :slight_smile:

Mais je pense régulièrement à le remettre sur les rails!

J'aime l'idée. A mon avis c'est même pas très compliqué à faire. Faut juste à peu près savoir utiliser les modules. Ce serait un super projet de répandre un code open-source et des tutos permettant expliquant comment fabriquer un clameur. Il n'aurait peut-être aucun impact, mais qui sait. Quelques personnes pourraient se prendre au jeu et installer leur voix aux détours de rue.

Je peux t'aider dans la communication du projet si tu veux :wink: