[Shield Ethernet] Vitesse bus SPI

Bonjour,

Je dispose d'un serveur web réalisé avec une carte arduino Mega 2560 ainsi qu'un shield Ethernet. J'ai souhaité, afin de rendre le site plus sympa, y ajouter une image de 38ko.

Voici mon problème : l'image s'affiche correctement, mais trèèès lentement (plusieurs dizaines de secondes)..

J'ai donc longuement parcouru le forum afin de trouver mon bonheur :

  • SPI.setClockDivider(2) qui devait augmenter l'horloge du bus SPI à 1/2 de l'horloge système (16MHz), mais je n'ai pas ressenti d'amélioration notable :frowning:

  • SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0)) qui permet d'augmenter la vitesse de communication si je ne me trompe pas ?

Aucune des deux méthodes n'a amélioré le temps de chargement.

Pensez-vous que le problème ne vient pas de liaison SPI mais plutôt de la carte SD ou alors une méthode pourrait-elle résoudre mon problème ?

PS : je vous épargne du code qui est assez lourd niveau taille :slight_smile:

En vous remerciant par avance.

Bonjour

Le lecteur SD est aussi sur le bus SPI
Donc ton arduino doit sauter en permanence de l'un à l'autre (normal) : je lis d'un côté, j'écris de l'autre.

La première question à se poser est : quelle est la taille du paquet ?
Si tu fais ça octet par octet, avec envoi de chaque octet individuellement dans une trame ip, alors oui c'est une usine à gaz, et la solution n'est pas d'augmenter la cadence de pédalage dans la semoule.

Si tu lis 1 ou 2 ko d'un coup, chargé en RAM et envoyé dans une trame ip en réponse au GET file, cela va aller beaucoup plus vite.

Pour aller encore plus vite, tu peux aussi conserver ton image en mémoire flash de la mega2560, car elle est conséquente 256ko et en général assez peu utilisée par le code.

Pour aller encore plus vite : tu héberges ton image ailleurs sur ton intranet ou sur internet, et ton arduino retourne un html contenant l'url de ce lien externe.

Bonjour,

Oui effectivement c'est une usine à gaz car j'envoie un octet à la fois. J'avais entendu parler du fait de regrouper les octets avant de les envoyer mais sans jamais trouver d'exemple. En aurais-tu un ?

J'avais en effet choisi de stocker l'image sur la carte SD car le serveur web n'ayant pas accès à Internet ni à l'Intranet de l'entreprise (la carte Arduino doit pouvoir changer d'entreprise facilement)

Pour le stockage sur la mémoire flash, le seul moyen est de transformer mon image en données binaire non ?

Merci d'avance.

Ok donc pour résoudre ton pb, le plus simple est de passer par des traitements par paquets.

Sur la fonction de lecture SD, trouve le moyen de lire n octets d'un coup vers un buffer de ram.

Et sur la fonction d'envoi vers le client, remplace les client.print() par client.write(buf, len)