[Non réglé] Code binaire d'un fichier texte

Bonjour, je souhaite avoir de l'aide pour un projet de terminale s.
Nous souhaitons transmettre un fichier texte par Laser, donc uniquement en binaire.
Pour ce qui est transmission tout va bien, c'est la transformation en binaire qui nous pose des problèmes.
Nous n'avons trouvé que deux solutions :

  • Lire le fichier avec la bilbliothèque SD : Dans le but de transformer chaque caractère en binaire.
    PROBLEME : Je n'ai pas trouvé comment lire un caractère quelconque dans un fichier texte ( seulement un bit dans un fichier ).

  • Trouver le code binaire du fichier : Sur le disque dur, le fichier texte lui-même doit être stocké en binaire. Si on retrouve ce code, on peut transmettre non pas le contenu du fichier mais le fichier lui-même.
    PROBLEME : Je n'ai pas la moindre idée de comment faire ça.

Si vous pouviez nous aider pour une des deux solutions, ce serait très aimable, merci d'avance.

Bien... un fichier texte "standard" comme on peut en éditer avec Notepad ou Gedit, est composé de simples
codes ASCII.
un "A" est codé 65 donc 01000001b
du coup je ne vois pas vraiment ce que tu veux convertir...

Je ne comprends pas trop le problème, vu que tout est codé en binaire, encore plus une transmission série.

DrCrocs:
PROBLEME : Je n'ai pas trouvé comment lire un caractère quelconque dans un fichier texte ( seulement un bit dans un fichier ).

Et en plus je crois qu'il y a un petit mélange entre bit et byte

hello
j'imagine un émetteur laser qui pointe son rayon sur un récepteur laser situé à 100 mètres
nos amis veulent envoyer un message.
le code ascii des lettres sera envoyé sous forme de "1" et de "0" (style morse).
ces "1" et "0" étant en fait le code ascii de chacune des lettres du message convertit en binaire

la conversion est simple, il faut diviser le code par 2 et tester le reste
si le reste est = à 0 il faut envoyer 0
si le reste est "1" il faut envoyer 1

exemple:
65%2 = 1
(65/2=32)%2= 0
(32/2=16)%2= 0
(16/2=8)%2 = 0
(8/2=4)%2 = 0
(4/2=2)%2 = 0
(2/2=1)%2 = 1

il faut inverser ou pas les bits obtenus dans le tableau pour récupérer le code ascii
tout dépend du programme de récepteur

dfgh:
hello
j'imagine un émetteur laser qui pointe son rayon sur un récepteur laser situé à 100 mètres
nos amis veulent envoyer un message.
le code ascii des lettres sera envoyé sous forme de "1" et de "0" (style morse).
ces "1" et "0" étant en fait le code ascii de chacune des lettres du message convertit en binaire

bonsoir
Injecter du 0 ou 1 sur de la commande "laser" venant de l'injection de bit , venant d'un byte , venant d'un fichier ce n'est pas compliqué du tout ! :grin:
Par contre les problemes vont rapidement survenir en reception si "un pigeon" ou autres aleas :sunglasses: viennent occulter le faisceau sur le train de bits .

Déjà , initier la commande "laser" avec de la gestion asynchrone permettrait de s'affranchir de pas mal de problemes 8)

hello Artouste:
ce n'est que ce que j'ai compris du texte d'explication de nos jeunes amis
j'ai dit 100m, c'est peut etre 2m.la puissance du laser en décidera... :slight_smile: le sujet et sa réalisation sont pédagogiques. comprendre, réaliser, expliquer...

dfgh:
ce n'est que ce que j'ai compris du texte d'explication de nos jeunes amis
j'ai dit 100m, c'est peut etre 2m.la puissance du laser en décidera... :slight_smile:

2m ou moins , ce ne sera pas le "laser" qui serait "juge de paix" ;D
Déjà en filaire je ne donne pas cher de la peau de "l'integrité" d'une transmission "non verifiée/acquité" d'un volume conséquent "de bits"

Je ne vois pas non plus où est le pb mais pour des raisons différentes (peut-être).

Pour avoir pratiqué les liaisons optiques depuis 1977 (Oh put**n ça fait déjà presque 40 ans) je peux dire : le laser on s’en fout ce n’est pas lui le problème. Le problème c’est de trouver un protocole de transmission et là je pense que je rejoins Artouste.

Laser ou bout de fil c’est pareil pour la transmission.
Le canal de transmission est neutre (enfin presque mais je suppose qu’on ne leur demande pas de faire une liaison à 10 Gigabits).
Tout ce qu’on demande au canal de transmission c’est de ne pas apporter d’erreur.

L’étude de nos charmant bambins doit se décomposer en deux :

  • le choix d’un protocole de transmission et là je vois bien simplement de l’UART (dit aussi RS232).
  • la réalisation d’un canal de transmission et s’il veulent de l’aide ils faudrait qu’ils nous en dise un peu plus.
    Canal physique : air ou fibre optique ?
    Nature du récepteur ?
    Sensibilité du récepteur ?
    Puissance du laser ?
    Longueur d’onde utilisée : visible, infrarouge ?
    Appareil de mesure optique à leur disposition : wattmètre optique, récepteur à photodiode, oscilloscope, etc …

Type de modulation du laser NRZ (probable) ou RZ
Très important fréquence d’émission → s’ils utilisent le protocole UART celà leur permettra de comprendre des notions comme débit en ligne, débit effectif des données (charge utile ou payload) etc…

Bonsoir, désolé du temps de réponse, nous avons de gros problemes internet ( Vive la campagne ! ).

Artouste:
Injecter du 0 ou 1 sur de la commande "laser" venant de l'injection de bit , venant d'un byte , venant d'un fichier ce n'est pas compliqué du tout !

Et bien tant mieux, car je crois que c'est parfaitement ce qu'on veut faire. J'ai juste besoin de savoir quelle commande j'utilise pour aller lire, mon caractère, puis savoir comment je le transforme en binaire et après c'est bon ( normalemlent ) on gère :slight_smile:

dfgh:
j'ai dit 100m, c'est peut etre 2m.la puissance du laser en décidera... :slight_smile: le sujet et sa réalisation sont pédagogiques. comprendre, réaliser, expliquer...

Effectivement, nous recherchons juste à créer quelques chose de pas courant, et à apprendre à utiliser des outils comme Arduino, nous ne cherchons pas un système révolutionnaire. Nous transmettrons sur environs un mètre, pas plus.

68tjs:
Je ne vois pas non plus où est le pb mais pour des raisons différentes (peut-être).
L'étude de nos charmant bambins doit se décomposer en deux :

  • le choix d'un protocole de transmission et là je vois bien simplement de l'UART (dit aussi RS232).
  • la réalisation d'un canal de transmission et s'il veulent de l'aide ils faudrait qu'ils nous en dise un peu plus.
    Canal physique : air ou fibre optique ?
    Nature du récepteur ?
    Sensibilité du récepteur ?
    Puissance du laser ?
    Longueur d'onde utilisée : visible, infrarouge ?
    Appareil de mesure optique à leur disposition : wattmètre optique, récepteur à photodiode, oscilloscope, etc ....

Waouh ... Alors je ne comprend pas tout ton message ( protocole de transmission ? ) Mais je peut répondre à tes questions.

  • Canal physique : Air
  • Nature du récepteur :Capteur photosensible ou mini panneau photovoltaïque ( Quand on les auras reçut on testeras les deux pour voir leur sensibilité à la pollution lumineuse. )
  • Sensibilité du récepteur : A tester, mais sa devrais fonctionner, le lux-mètre du prof capte très bien le laser, et le différencie bien de la lumière ambiante.
  • Puissance du laser : 5mw
    Longueur d'onde utilisée : visible
    Appareil de mesure optique à leur disposition : Hum ... oscilloscope, lux-mètre, tout le matos du lycée ( physique, atelier SI, matériel des STI2D ... ), etc.

Voila, encore merci de votre temps :slight_smile:

Alors je ne comprend pas tout ton message ( protocole de transmission ? )

Comment expliquer simplement la notion de protocole ?
Un caractère est codé dans un octet, vous allez envoyer une suite d'octet. Pour que le récepteur comprenne il faut lui donner des informations annexes qui lui permettront de savoir où commence un octet et où il fini.
Il y a un protocole ultra connu qui pourrait fonctionner : attention j'ai employé le conditionel c'est à vous de le vérifier.
Ce protocole est connu sous le nom historique de RS232.
Sans entrer dans les détails la norme RS232 mélangeait protocole et niveaux électriques (entre -30V et +30 V).
Maintenant on utilise le terme UART (Universal Asynchronous Receiver Transmitter) pour parler du protocole RS232. Il existe aussi l'USART (Universal Synchronous & Asynchronous Receiver Transmitter) qui exige de transmettre une horloge en plus des données --> oubliez le.
Vous trouverez toutes les explications sur google ou Wikipédia.

Canal physique : Air

Distance ? Le faisceau lumineux émis par le laser est un cône -> tout dépendra de l'optique de sortie.
La lumière ne sera pas atténuée dans l'air mais plus la distance augmentera plus la puissance lumineuse sera répartie sur une grande surface, autrement dit moins il y aura de photons au mm2.
Comme la surface du capteur restera constante il captera de moins en moins de photons.

Capteur photosensible ou mini panneau photovoltaïque

J'ai des doutes sur le panneau photo voltaïque : il risque d'être trop lent.
C'est certain que sa grande surface est intéressante. Un test s'impose pour vérifier la fréquence max "acceptable" de fonctionnement.
Un test avec un émetteur Laser commandé avec un générateur de signaux de fréquence variable et un oscillo pour mesurer les signaux en sortie du récepteur permettra de la connaître.

Longueur d'onde utilisée : visible

C'est vague, donne au minimum la couleur.
A puissance émise constante en watt, plus la couleur sera proche de l'infra rouge, plus il y aura de photons et donc plus il y aura d'électrons créés à la réception.

Laser :
Un laser à semi-conducteur c'est une diode. Conséquence il ne faut pas le commander en tension mais en courant.
Quelque part vous devrez réaliser une source de courant commandable.
La source de courant la plus simple c'est un transistor NPN avec dans le collecteur la diode Laser et une résistance pour limiter le courant. Conseil : évitez de trop saturer le transistor, c'est plus simple de le saturer franchement quand on veux allumer une Del(Led) mais pour faire de la transmission c'est à éviter.
Si vous utilisez ce schéma on pourra en re-parler.
Il y a des schémas plus "sioux" mais plus complexes et pas forcément utiles dans votre cas.

Si je peux me permettre de vous donner un conseil c'est de bien séparer la partie programmation de la partie transmission et de mener les deux simmultanément.

  • Il est possible de tester la partie transmission en utilisant un simple génénérateur de signaux carrés et un oscilloscope comme il doit en exister dans votre labo d'électrique.
  • Il est possible de tester la transmission des caractères en reliant deux arduinos avec un fil (plus le fil de masse évidement).
    Quand tout fonctionne séparément assemblez le tout, mais pas avant.

DrCrocs:
J’ai juste besoin de savoir quelle commande j’utilise pour aller lire, mon caractère, puis savoir comment je le transforme en binaire et après c’est bon ( normalemlent ) on gère :slight_smile:

Que tes caractères viennent du port série, d’une carte au autre, en gros, tu vas avoir tôt ou tard un truc de ce genre :

while(c'est pas fini) {
  int c = quelquechose.read();

  // convertir en binaire
  // pour chaque bit, appeler envoyerUn() ou envoyerZero()
}

Souvent, “c” va recevoir -1 pour signaler la fin, c’est pour ça qu’il faut le ranger dans un int et pas un byte ou un char, sinon on ne saurait pas différencier -1 de 255.
Le reste du temps, il va recevoir un octet correponsdant au code ascii du caractère :48 pour ‘0’, 32 pour ‘espace’, 65 pour ‘A’, 10 pour ‘retour à la ligne’… et 255 pour ‘ÿ’ d’où la remarque au dessus (j’entre pas dans les détails des encodages, en fait le ÿ c’est pas de l’ascii, c’est de l’ISO8859-15, mais c’est pas le sujet).

Prenons la lettre “C” par exemple, code ascii 67 = 0100 0011 en binaire.
Il faut donc balancer le premier bit, puis le second … en partant de celui de gauche, ou celui de droite, au choix (ça fait partie du protocole, c’est à dire de la convention avec laquelle les deux bouts communiquent)

Une solution consisite à faire un “ET” avec 1 qui retournera donc 0 ou 1 selon que le bit de droite est 0 ou 1 :

if (c & 1 == 1) envoyerUn(); else envoyerZero();

Ensuite, on décale tous les bits d’un cran à droite.
Pour ça, il y a l’opérateur “>>” qui permet de décaler une valeur à droite de “n” bits : c = c >> 1;
SI tu veux commencer par celui de droite, il suffit de faire un “ET” avec 128 = 1000 0000 en binaire et de décaler à gauche avec l’opérateur “<<”

Y’a plus qu’à faire ça 8 fois de suite par une boucle for

-> piif : Ça as été ardu mais j'ai compris. Du coup on va faire comme ça, merci.
Ma seule question : Là tu m'as expliquer comment je transforme mon caractère en binaire. C'est ce que je voulais. Mais -> comment je lis le caractère du fichier texte qui est sur la carte sd du shield ?

-> 68tjs :

68tjs:
Maintenant on utilise le terme UART (Universal Asynchronous Receiver Transmitter) pour parler du protocole RS232.

Je suis pas sur d'avoir parfaitement compris. A ce que j'ai compris, UART c'est ce qui est appelé sur la doc arduino " serial " . Je suis aller voir sérial, mon pote m'as conseillé d'utiliser ça. Du coup si j'ai bien compris on va mettre le laser sur Rx et Tx de l'arduino émettrice et le capteur sur Rx et Tx de l' arduino réceptrice. C'est ca ?
Faut que je me renseigne plus la dessus.

68tjs:
Distance ?

Ne t’inquiète pas, comme dis plus haut c'est juste pour expérimenter, on transmettras à un mètre max.

68tjs:
Un test avec un émetteur Laser commandé avec un générateur de signaux de fréquence variable et un oscillo pour mesurer les signaux en sortie du récepteur permettra de la connaître.

C'est justement une de nos expériences, réponse dans trois semaines à la réception des commandes.

68tjs:
Quelque part vous devrez réaliser une source de courant commandable

Alors c'est peut être une vulgaire erreur de notre part mais on avais juste prévu de brancher le laser sur une sortie, de l'allumer pendant un temps X pour faire un 1 et pendant un temps Y pour faire un 0. Sa peut pas fonctionner comme sa ?

68tjs:
Si je peux me permettre de vous donner un conseil c'est de bien séparer la partie programmation de la partie transmission et de mener les deux simultanément.

C'est noté, on va faire comme ça, ça nous permettras de savoir ce qui ne fonctionne pas si il y as un problème.

Je suis pas sur d'avoir parfaitement compris. A ce que j'ai compris, UART c'est ce qui est appelé sur la doc arduino " serial " . Je suis aller voir sérial, mon pote m'as conseillé d'utiliser ça. Du coup si j'ai bien compris on va mettre le laser sur Rx et Tx de l'arduino émettrice et le capteur sur Rx et Tx de l' arduino réceptrice. C'est ca ?
Faut que je me renseigne plus la dessus.

Le Rx et le TX dans chaque arduino c'est si vous voulez faire du bidectionnel, ce qui me semble infaisable avec le matériel dont vous disposez.

J'ai compris que vous faisiez de l'unidirectionel.
Dans ce cas le Tx de l'arduino emetteur est à entrer dans l'émetteur Laser.
La sortie du récepteur optique est à entrer sur le Rx de l'arduino récepteur.
Tx = transmetter
Rx = receiver

Pour la distance je n'ai aucune inquiétude c'était une mise en garde.

Alors c'est peut être une vulgaire erreur de notre part mais on avais juste prévu de brancher le laser sur une sortie, de l'allumer pendant un temps X pour faire un 1 et pendant un temps Y pour faire un 0. Sa peut pas fonctionner comme sa ?

Je reprend :
un laser à semi-conduteur c'est une DIODE.
Donc comme toutes les diodes un Laser à une tension de seuil d'environ 1,7V à 2,2V.
Il faut connaître ce paramètre. Vous avez tous les moyens nécessaires pour mesurer ce paramètre : il vous faut juste faire fonctionner votre cerveau.

Tu nous as dit que le laser faisait 5 mW max, avec la mesure précédente tu devrais être capable de trouver le courant max correspondant.
Question a te poser : est-ce qu'une sortie du micro-contrôleur peut délivrer cette valeur de courant ?
Si c'est oui vous pouvez faire comme tu dis, sinon il faudra faire différement. Je ne peux pas répondre car je n'ai pas les valeurs, et de toute façon je ne répondrai pas parce que c'est ton bac, moi le mien je l'ai eu il y a très longtemps.
Autre question à te poser : qu'est-ce qui va se passer si tu branche directement le Laser sur une sortie de l'arduino sans autre composant ? Ca va fonctionner ou ça va fumer ?