échanges fichiers via modules bluetooth arduino

Portrait de cyril.fire27

Bonjour,

Ayant un projet nécessitant l'envoie de fichier (vidéo photo texte etc) entre deux ordinateur ou entre un smartphone et un ordinateur avec l'emploie de modules Bluetooth HC05 et des arduinos UNO, je me suis lancé dans divers programmes et montages sur plaque test afin d'obtenir ce que je souhaite. Malheureusement jusqu'ici je suis dans l'échec.

Voici un schéma de ce que j'aimerai réaliser: screenshot_20180527212134.png

Comme vous pouvez le voir il n'y a aucun branchement car je ne sais pas trop ou brancher tous ca ni même si je sais comment brancher les HC05, de plus je ne sais pas si toute les pièces ici sont indispensable. De plus sur le schéma on voit que les fichiers envoyés sont des fichiers compressés mais si cela n'est pas possible des fichier vidéos photo et texte et des fichier .exe .iso me suffiront. Si c'est possible j'aimerai aussi que chaque arduino puisse émettre et recevoir (pas forcément simultanément).Si ce n'est pas possible je me contenterai d'un role par arduino. Je ne cherche pas la rapidité de transfert je sais que ce sera long.

Il y a peu j'ai travailler sur un projet de main robotique utilisant deux hC05 (un émetteur qui envoyait des valeur analogique grâce a des flex sensor et un récepteur qui lisait les données et faisait bouger des servomoteur) et ça ma beaucoup appris dans le domaine du bluetooth cependant ca ne suffit pas et jusqu'ici je n'ai toujours pas de résultat me faisant avancer.

Donc je me tourne vers vous en espérant que vous pourrez m'aider. je ne m'attend pas à un truc tout cuit mais la moindre piste m'intéresse.Bien entendu je vous tiendrai au courant de mes avancées.

Cordialement,

Cyril.

Portrait de gael

Bonjour Cyril, tout d'abord ou sont situés ses deux ordinateurs (réseau local? indépendant?). Je tiens à rappeler qu'une carte ARDUINO est avant tout un microcontrôleur. Ce que tu souhaites, c'est en résumé, effectuer de l'acquisition de données. Ce n'est pas le job d'un microcontrôleur.

Portrait de cyril.fire27

Bonjour merci de la réponse rapide,

Les deux ordinateurs sont indépendants.Je sais que l'on peux envoyer des fichiers TXT avec des modules bluetooth. Alors j'ai envisagé deux options : prendre les fichiers sur le pc et les envoyer OU mettre les fichiers sur la carte SD du shield ethernet car je sais que l'arduino peut envoyer,lire les fichiers qui sont dessus malheureusement je ne sais pas comment. Et derrière j'aimerai que soit les fichier reçu soit enregistré sur la carte sd du shield récepteur ou bien que ce soit enregistré sur l'ordinateur.

Pour la solution avec le shield ethernet je sais que c'est possible (grâce à des vidéo forum et qui en parle mais ne disent pas comment ils ont fait) mais je n'ai pas assez de connaissances pour savoir comment.

Portrait de gael

Mais quel est intérêt des arduinos? un ordinateur est lui même capable d'envoyer ce type de fichiers sans aucun modules. Peux tu m'expliquer s'il te plaît?

Portrait de cyril.fire27

1/ J'aimerai pouvoir créer des relais plus tard pour de longue distance et j'aimerai pouvoir les faires moi même.

2/Pour le défi.

3/Pour créer un réseau privé que j'ai conçu moi même.

4/ J'adore les arduino et c'est ce que j'ai décider d'utiliser dans mon projet mon but est de créer pas de prendre un truc déjà intégrer/fait dans mon pc.

5/ Et je sais que c'est possible et j'adore apprendre et je déteste ne pas apprendre des choses sur quelque chose qui a attiré mon attention.

J'espère que je répond à ta question ;)

Portrait de gael

1/ créer des relais plus tard pour de longue distance : ce n'est pas le rôle du bluetooth.

2/ Pourquoi pas

3/ Le bluetooth ne permet pas de créer de réseau, se sont des ondes radios a 2.5Ghz envoyés sur de très courtes distances. Tu ne pourras faire qu'un picoréseau.

4/ Que sais tu faire avec un module bluetooth ou une carte ethernet?

5/ La curiosité :) .

Pour l'enregistrement des données sur la carte sd du shield W5100, il existe des tas de tutos. Par ou veux tu commencer?

Portrait de cyril.fire27

Bonjour,

Alors le but est de juste transféré un fichier . Je ne vois pas où placer ce serveur.

De plus comme je l'ai dit précédemment je peux me passer des ordinateurs  d'où les carte ethernet qui possède une carte sd . Donc tous le développement sur plusieurs systèmes d'exploitation est inutile dans ce cas . Je ne cherche pas compliqué j'ai juste un cahier des charges à tenir avec certaines conditions à respecter et je sais que c'est possible avec les Arduino avec des facon plus simple qu'un serveur. Mais merci pour ton commentaire j'en prends note . Mais je cherche juste à créer un réseau bluetooth et avec des arduino et qu'il puissent envoyer des fichiers de tous types ou du moins le plus possible. 

Merci beaucoup je vous tiendrai au courant de mes avancées mais j'espère que l'un d'entre vous pourra m'aider .

Portrait de Walter

Bonjour,
J'ai du mal à saisir ce que tu veux vraiment faire.
Si je ne me trompe pas les shield HC-05 permettent de simuler une liaison séries sur le bluetooth.
Tu peux donc comme n'importe quelle liaison série faire passer des donner binaire entre tes deux arduinos.

Par contre comment tes arduinos savent ce qu'il doivent faire, quel fichier transférer pour "l'émetteur" et ou le mettre pour "le récepteur"?

Qui actionne tes arduinos?

Si le but finale est de transférer sur un ordi, il faut que celui-ci communique avec l'arduino(USB via liaison série).

Portrait de cyril.fire27

Non les HC05 permettent de communiquer.

Dans les détails :

plan 1 : J'aimerais mettre des fichiers sur une carte sd que l'arduino le convertisseur en ascii ou autre pour qu'il puisse être envoyé par le module hc05 puis reçu par un autre module hc05 puis que les données reçu soit de nouveau convertis en fichier originelle. Puis enregistrer sur la carte sd .

Plan 2: j'aimerais que je puisse mettre des fichiers sur la carte sd du shield ethernet qu'il soit convertis en ascii ou autre puis envoyé via le module hc05 puis reçu par un autre hc05 puis reconvertis en fichier originelle et enregistrer dans le dossier d'un ordinateur.

Plan 3: je place des fichiers dans un dossier précis d'un ordinateur . L'arduino le récupère le convertis en fichier ascii ou autre et l'envoie via un module hc05 puis un autre hc05 les reçois l'arduino le reçois le convertis en fichier originelle et l'enregistre sur un deuxième ordinateur.

Je maîtrise à peu près les envoies bluetooth mais pas vraiment le reste . 

Portrait de Walter

Pour le HC-05 pourquoi non, la liaison série est pour la communication ?
d'après le datasheet suivant https://www.gme.cz/data/attachments/dsh.772-148.1.pdf
on connecte bien le shield sur les connecteur de la liaison série de l'arduino.
Ou l'exemple d'utilisation suivant https://www.gotronic.fr/pj2-guide-de-mise-en-marche-du-module-bluetooth-...

Après peu importe si ti sais communiquer à travers le shield, il ne reste qu'a utiliser la bibliothèque SD, pour lire et écrire sur la carte SD de tes shields Ethernet et envoyer/recevoir les données au HC-05.

Je ne l'ai pas tester moi même, mais d'après les documentations que j'ai vu sur ce shield, cela est géré par cette bibliothèque fournis en standard.
Si tu n'a pas encore de shield ethernet, peut être que quelque chose comme le lien suivant serait plus rentable
https://www.amazon.fr/SODIAL-Lecteur-Memoire-memoire-Bouclier/dp/B00YMJV...

Pour l'utilisation avec un PC, je pense que cela sera un peu plus compliqué, car pour moi tu devrais passer par la liaison série connecteur TX/RX de l'arduino, qui sont déjà utilisée par le shield HC-05 si je ne me trompe pas ?
Le shield ethernet/SD lui étant piloté par SPI, cela ne devrait pas poser de problème.

Portrait de Walter

Merci Brossden, content d'être parmi vous.

Ha oui, j'ai déjà vu l'utilisation de cette librairie dans des exemples de codes, mais jamais eut l'occasion de l'utiliser.
Si elle permet d'avoir plusieurs flux série sur la même carte arduino, je le note, ca me sera sûrement utile prochainement.
 

Oui comme toi j'ai beaucoup de mal à voir comment les événements sont censés s'enchaîner et par qui ils sont déclenchés? 

Portrait de Walter

Ha ok, merci pour l'information

Portrait de cyril.fire27

Bonjour merci pour toute ces informations . 

Je vais essayer d'être un peu plus clair du coup .

En gros pour l'instant j'essaie de me consacrer au côté fonctionnel . Le déclenchement de ferai dès que la carte serai alimenter et les module bluetooth appairer au départ. Puis j'intègrerai sûrement un bouton qui lancera l'envoie je suppose mais je ne pense pas que ce sera le plus compliqué. En gros j'aimerais qu'on me donne des pistes surtout pour la conversion de n'importe lequel des fichiers ou du moins le plus possible en un code que je peux envoyer par bluetooth (ascii par exemple mais je sais qu'il y en as d'autres ) et que derrière je puisse retransformer ce code en fichier .

Zip --> code --> envoie bluetooth --> code --> Zip 

Ici j'ai donne l'exemple pour le Zip mais j'aimerais que ça marche pour tout type d'extension ou du moins le plus possible.

Tout d'abord j'aimerais essayer sans pc et si ça marche pourquoi pas essayer avec . Une difficulté à la fois. 

Ensuite je peux brancher le hc05 sur n'importe quel pin du moment que je change les pin TX et rx dans le programme donc derrière ça ne posera pas de problème . Et j'ai une carte ethernet (pas encore deux) deux module hc05 et deux uno. J'ai même plus que deux carte Arduino si il le faut mais j'aimerais être économique. À vrai dire c'est plutôt sur la convertion que je bloqué et ensuite à la reconstitution du fichier . Il me faudrait aussi d'avantage de connaissances dans l'utilisation du lecteur sd de la carte ethernet et comment enregistrer ou prelever des donnees. Voilà hésitez pas si vous souhaitez d'autre précision. J'espère avoir été clair cette fois . 

Et encore merci pour votre aide .

Portrait de cyril.fire27

Après je ne me suis jamais posé la question si l'arduino ne convertissait pas automatiquement les fichiers et les envoyait sans besoin de rien . Mais cela me paraît trop simple . Je sais que par exemple dans le projet robotique que j'avais fait il fallait modifier la façon d'envoyer les données pour pouvoir envoyer des données analogique . 

Après si je me trompe dites le moi mais ça me paraît beaucoup trop simple au vue de ce que j'ai déjà connu

Portrait de Walter

d'après la documentation de ta carte ethernet/SD, tu la pilote en SPI via la librairie SD (https://www.arduino.cc/en/Reference/SD) , la fonction open pour ouvrir le fichier que tu veux et read pour charger une partie du fichier dans un buffer.

Tu peux alors envoyer ce buffer sur ton shield HC-05 avec la fonction print (le buffer doit faire moins de 64 byte)

Normalement tu devrait recevoir ce buffer tel quel de l'autre coté, tu n'a pas besoin de faire de conversion en soit.
Ce n'est pas simple d'expliqué en quelques phrases, les différents types de transfert possible, surtout ne connaissant pas ton niveau de compréhension/connaissance.

En gros le "problème" va être de faire la différence entre les données de ton fichier et ses attributs(nom, date, propriétaire, ...), il y a deux méthode binaire/texte:
En binaire tu passe une structure fixe ou modulaire:  avec un champs buffer de taille fixe ou définit dans un champ précédent.
En texte tu dois transformer le binaire en caractères visible (pas de caractères de contrôle comme le /n ou /t), le plus simple est alors de l'encoder en base64 le tout dans une structure XML.

Ma préférence va à la première méthode, car consomme moins de donnée de contrôle et aucun temps de transformation, ce qui est des denrée rare sur de l'embarqué.

Je pense que tu devrais appréhender étape par étape

- transfert de donnée en bluetooth, buffer texte, puis buffer binaire (mélanger par exemple donnée représentant des entiers, flottants et texte).

- lecture d'un fichier texte (.TXT), d'une image (PNG) bicolore (8x8, https://fr.wikipedia.org/wiki/Portable_Network_Graphics#Structure_d'un_fichier_PNG pour vérifier les headers) ou tu peux afficher le contenu en hexadécimal sur la sortie standard.

Une fois cela bien maîtrisé, tu pourra passer à l'étape comment passer un fichier quelconque sur ton bluetooth sans ordre particulier, puis avec des informations sur le fichier passé, puis avec des ordres si nécessaire.

Portrait de cyril.fire27

Merci pour les informations je vais essayer de faire un programme. Cependant une idée de comment vérifier sans avoir le deuxième shields ethernet si mon programme marche ? Mon shield arrive dans 3 semaines donc c'est embêtant d'attendre aussi longtemps. Sinon j'attendrais.

Portrait de Walter

Tu imprime ce que tu reçois sur la sortie standard en hexa.
si cela correspond à ce que tu as dans ton fichier, c'est tout bon.
Prends en un comme indiqué pour commencer un fichier texte et un fichier PNG très simple ou équivalent.

Portrait de cyril.fire27

bon voila le programme de l'émetteur et du récepteur:

émission:

1.png

réception:

2.png

Voila j'attend vos commentaires. Merci d'avance.

Portrait de cyril.fire27

ok merci Walter ;)

Portrait de Walter

Tu essaye de tout faire d'un coup ca me parait plus compliquer à appréhender du coup.

En émission, pourquoi "open"  tout seul? 
je te remet la doc https://www.arduino.cc/en/Reference/SDopen

c'est plutôt >> myFile = SD.open("test.txt", FILE_WRITE);
 

du coup une fois ton fichier ouvert et l'objet myFile récupéré, tu l'utilise pour lire le contenu du fichier.
Un exemple fournis avec la doc https://www.arduino.cc/en/Tutorial/ReadWrite.

Après tu mélange dans le même flux tes commandes et le contenu du fichier, tes commandes ce résumé à un seul caractère, ca ne posera pas de soucis directement, mais sinon commande avec un nombre de caractère variable, comment sais tu ou il faut s'arrêter ?
De même avec le contenu du fichier comment sait tu que tu es arrivé à la fin de l'envoi ?

Il faudra que tu structure tes messages, pour être capable de les interpréter correctement.

Portrait de cyril.fire27

Je retente alors mais malgré la doc sur le site d'arduino j'ai du mal a comprendre comment cela marche car je n'ai jamais utilisé de shield ethernet :

Cependant j'aimerai savoir si ce serai possible de faire ca avec des module hc06 au lieu d'hc05? c'est une simple question ?

Deuxième version de l'émission:

1.2.png

pour l'émission j'ai compris qu'il fallait faire ce genre de modification. Si ce n'est pas ce que vous vouliez expliquer pouvez vous écrire un exemple parce que sinon je ne vois vraiment pas.

Portrait de Walter

Pour le HC-06, je ne suis pas expert, mais a priori, c'est un module exclusivement esclave, donc tu peux remplacer l'un des deux modules, mais pas les deux, La liaison étant maître/esclave.

Non ce n'est toujours pas bon :)
Je réitère mon conseil/avis, il est très difficile de faire ce que tu veux faire, sans maîtriser aucun des éléments qui le constitue!
Il  serait beaucoup plus bénéfique pour toi d'étudier les éléments séparément pour comprendre ce que tu manipule.

lorsque l'on cherche à lire un fichier(ou une liaison série, TCP/IP, de la mémoire, ...), on utilise un flux(stream).
Le principe du flux c'est d'ouvrir une sorte de tuyau avec un WRITER et un READER de chaque coté.
Le READER ne connaissant pas d'avance la quantité d'information à récupérer, il va donc attraper les données par petite partie (un read dans une boucle).

Je t'ai déjà donné un exemple!
Il y a tout ce qu'il faut pour faire la lecture et l'écriture, que veux tu de plus?
https://www.arduino.cc/en/Tutorial/ReadWrite.
 

Donc tant que tu n'a pas un code se rapprochant de ça, ça ne peut pas être bon!!!

// re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

Portrait de cyril.fire27

ok merci je vais regarder tous ça je vous donnerai mes prochaine tentative bientôt.

Cependant j'ai eu une dernière réflexion et j'aimerai savoir si ça pourrait faciliter le transfert avec un pc avec le module usb2serial, voici le schéma:

2.3.png

j'attend vos réponses avec impatience.

Portrait de gael

Bonsoir, je réitère ma question aussi. Que sais-tu faire avec les modules HC06 et W5100?

Portrait de cyril.fire27

Bonsoir gael

Je sais envoyer des données analogique de 5 capteurs (potentiomètre ou flex sensor) pour faire bouger 5 doigt d'une main robotique entre deux hc05.

Pour les hc06 j'utilise souvent appinventor .

Quand au module W5100 je l'ai acquis récemment donc très peu de chose .

En réalité ce projet est une partie d'un plus gros projet et franchement j'en ai besoin pour une utilité très spécifique. Alors même si je comprend que ce serai plus bénéfique d'étudier chaque composant, je cherche la rapidité pour la création de ce système. Je veux certes apprendre mais étudier chaque fonction de tous les composants est tout simplement impossible niveau temps pour moi. Si j'avais un peu plus de temps pour finir ce projet ce serai avec plaisir mais j'ai un timing serré. Je ne demande pas de faire mon travail loin de là mais une ligne guide et des conseils pour ce développement sont les bienvenue évidemment. J'espère que vous comprendrez ma situation. Juste pour information je dois terminer l'intégralité de ce projet pour le 3 Août et il me reste le coté esthétique de ce système précis à faire et la fin du développement du logiciel qui est la dernière pierre a l'édifice.Et je dois finir tous ça en comptant la phase de test et de béta afin de supprimer les différents bug et enfin vérifier l'intégralité du projet en 3 mois. En gros je suis a 98% de mon projet en deux ans de développement. Donc il ne me reste pas grand chose mais ca reste beaucoup de travail a faire seul. Au moins vous savez tout ;)

Portrait de Walter

Je ne veux pas forcément en rajouter une couche, mais je n'ai pas l'impression que tu as compris ce que je voulais dire.

Etudier les composants séparément n'implique pas de connaître et avoir tester toutes les fonctionnalités.
Et au contraire passer un peu de temps pour comprendre de quoi tu parle et comment fonctionne en gros un composant, permet de gagner beaucoup de temps lors de la phase de mise au point / correction de bug.
Dans cette phase, tous les composants peuvent bugger en même temps, si tu n'a pas compris comment cela marche, il te faudra énormément de temps pour démêler tout ça.
Alors que passer 3/4 heure sur chaque composant, pour comprendre en gros de quoi on parle, ne me parait pas non plus une perte de temps incommensurable?

Sans vouloir être méchant, il me semble que je t'ai donné plus que des lignes guides, mais la documentation et des exemples fonctionnels directement copier/collable et tu n'a pas du tout compris comment l'appliquer à ton projet.
Mais ton avis sur la méthode à suivre semble forgé!

Pour finir je comprend très bien ta situation, c'est pourquoi j'aurais tendance à te redonner deux fois plus les mêmes conseils que précédemment :)

Portrait de cyril.fire27

Walter je comprend très bien. Quand je parlais des bugs à résoudre ce n'étais pas sur cette partie. celle la soit ca marche et je passe a la vérification totale soit ca ne marche pas et je ne passe pas à l'étape suivante.

Je suis en première année d'école d'ingénieur (ptsi) et franchement même si j'ai le temps de faire ce projet en plus de mes études passer 12h sur l'étude de 3 composants me semblent vraiment compliqué. Franchement cette partie n'est  pas celle qui m'intéresse le plus mais j'en ai besoin.

Après je te remercie pour ton aide mais j'ai plus l'habitude de programmer des pic que des arduino mais c'est dans mon cahier des charge et l'utilisation des arduino est justifié par de nombreux aspects. Alors j'ai plutôt du mal a comprendre comment fonctionne la création d'un programme (topographie). J'ai utilisé des arduino une fois et ca m'a prit un bout de temps (6mois) avant d'avoir ce que je voulais. et je n'ai pas 6 mois :) En fait je n'arrive a voir comment écrire le programme pour que tous fonctionne correctement ensemble et lier les différent module entre eux. Après je vais voir pour étudier les modules indépendamment mais je ne suis pas certain de réussir a tous lier par la suite mais je vais suivre ton conseil en espérant que tu as raison car je n'ai vraiment pas de marge de manoeuvre.

En tout cas merci de ton aide et comme dirai mon prof de math yapluska ;)

Portrait de cyril.fire27

Au fait est ce que c'est possible de définir deux sytème de communication tx rx dans un programme : un pour recevoir les données du module usb2serial (donc tx=1 rx=0) et un autre pour l'envoie dans le module bluetooth (rx=11 et tx=10). je sais qu'on peut modifier les pin rx et tx d'emplacement mais je ne sais pas si on peux en mettre deux de chaque sur une même carte arduino?

Portrait de gael

Oui c'est possible : 

SoftwareSerial Serial1(10,11); SoftwareSerial Serial2(12,13);

Je pense que tu seras obligé de découper ton programme et ton hardware au fur et à mesure. Tout te paraît flou et cela se sent. Une fois que tu sais utiliser (pour ce que tu souhaites faire) indépendamment les différents modules, assemble le tout. Si tu as besoin d'aide pour commencer, n'hésite pas. Mais construis toi une méthode. Il y a des étapes que tu ne pourras pas sauter. Pour caricaturer la chose, c'est comme-ci tu avais quelques notions d'alpinisme et que tu te lancerais à gravir l'everest. C'est clairemement pas possible.

Portrait de cyril.fire27

Bonjour, j'ai fait quelques avancés.

Cependant une question un fichier zip est composé de quoi ? binaire héxadécimal décimal autre chose?

Il me manque cette partie et je devrait pouvoir finir.

Portrait de cyril.fire27

merci, j'ai réussi. je dois encore apporté quelques retouches mais sinon ca devrait fonctionner.

De toute façon je reviens vers vous soit parce qu'il y a un bug que je ne comprend pas ou soit pour vous donner les programmes .

Je sais que certain n'en vois pas l'utilité mais personnellement j'en ai besoin d'en un cadre très spécifique. Si ca peut servir a quelqu'un d'autre tant mieux mais bon je me doute que ce ne sera pas forcément le cas. Mais voyez ça comme un défi de repousser les limites de l'arduino sinon :D Juste apprendre c'est cool. Moi il est vrai que ca ne me captivait pas tant que ca mais finalement c'est cool de créer ce genre de système. Donc je comprend que tu n'y vois pas la moindre utilité mais si tu connaissait l'intégralité du projet tu changerai sûrement d'avis :D

En tout cas je vous remercie et je vous transmet le résultat dès que j'ai finis.

Portrait de Walter

Cool que ça avance bien, impatient de voir le résultat :)

Pour essayer de développer un peu ce qu'il y a derrière ta question sur le zip.
Comme le dis Brossden, un fichier n'est qu'une constitution de bit(0 ou 1, du binaire), mais pour que cela ait du sens pour les humains, on prend des représentation ou systéme de numération (hexa, octal, decimal, binaire) de la donnée.
donc la valeur 10 en décimal, peut s'écrire en Hexa 0A, en binaire 1010.
Après suivant le type de fichier (distingué par convention de nommage par son extension, .txt, .avi, .exe) il y a une représentions spécifique des données texte/binaire, mais cela ne veut pas dire grand chose.
Tout les fichiers respecte un certain format et peuvent manipuler différente représentions de donnée, texte, entier 32 bits, nombre à virgule flotant 64 bits, ...

C'est un vaste sujet, difficile de décrire simplement en quelques lignes.
Un petit tour chez wikipédia pourrait aider à éclaircir la chose, https://fr.wikipedia.org/wiki/Fichier_binaire