échange fichier via modules bluetooth arduino

Bonjour,

ci dessous une version simpliste (aucun protocole de communication développé) de transfert de fichier entre 2 PC via 2 modules bluetooth. Elle fonctionne (testée sur une image JPEG de 30 Ko et un temps de transfert de 45s) mais elle n'est ni fiable ni performante pour les raisons suivantes :

  • pas de contrôle de flux possible via la connexion USB
  • utilisation de la bibliothèque SoftwareSerial au débit très limité 9600 (à 19200 elle commence à lire/écrire n'importe quoi).

Outre le programme arduino suivant (30 lignes) :

#include <SoftwareSerial.h>

SoftwareSerial softSerial(8,9);

void setup(void) {
	Serial.begin(9600);
	softSerial.begin(9600);
}

void loop() {

	int c;

	// si caractère reçu en provenance de l'USB
	if(Serial.available()) {
		c=Serial.read();
		// émission vers bluetooth
		softSerial.write(c);
	}

	// si caractère reçu en provenance du bluetooth
	if(softSerial.available()) {
		c=softSerial.read();
		// émission vers port USB
		Serial.write(c);
	}
}

il faut un émetteur temporisant pour éviter la saturation des différents buffers (pas de contrôle de flux). Un exemple en python (30 lignes aussi) :

import sys
import os
import time 

PKGSIZE=10
TEMPO=0.015  # temporisation en secondes entre 2 emission de paquets

filename=sys.argv[1]
sys.stderr.write("Send : "+filename +"...\n")
size=os.path.getsize(filename)
cpt=0;

file = open(filename, "rb")
try:
    bytes_read = file.read(PKGSIZE)
    while bytes_read:
        sys.stdout.write(bytes_read);
        sys.stdout.flush()
        cpt+=len(bytes_read)
        p="%3.1f" % (cpt*100.0/size)+" %"
        sys.stderr.write(p)
        sys.stderr.write('\r')
        time.sleep(TEMPO)
        bytes_read = file.read(PKGSIZE)
finally:
    file.close()

Pour tester (sous GNU/Linux) :

PC1 <---USB---> Arduino <---SoftWareSerial---> HC-05 <---   ..... ---> HC-06 <---SoftWareSerial---> Arduino <---USB---> PC2
  1. Prérequis :

a) avoir configuré (commandes AT) un HC-05 en maitre et l'autre (ou un HC-06) en esclave de telle façon qu'ils se connectent automatiquement (voir par exemple au hasard https://howtomechatronics.com/tutorials/arduino/how-to-configure-pair-two-hc-05-bluetooth-module-master-slave-commands/).

b) avoir configuré les modules bluetooth et les ports séries à la vitesse de 9600 bauds

  1. Commandes (GNU/Linux), sous Windows j'ai oublié :wink:
PC2 : cat /dev/ttyUSB0 >  /tmp/image.jpg # réception
PC1 : python sendfile.py image.jpg > /dev/ttyUSB0 # émission

C'était juste pour montrer une solution simple (mais sans contrôle d'erreurs).