Enregistrement de données très rapides.

Bonjour,

Je réfléchis sur le fait de pouvoir enregistrer de nombreuses données en temps réel.

Par exemple, récupérer 44100 données dans un tableau en 1 seconde puis les verser sur une carte SD et ainsi de suite. Est-ce que les prochaines 44100 données peuvent également être stockées dans mon tableau (ou plutôt un second) tout en écrivant sur la carte SD les premières données.

Avez-vous une idée autre pour récupérer un grand nombres de données en continu.

Merci.

Bonjour,

Ca dépend de la carte Arduino que tu utilises. Par exemple, 44100 octets sur une Uno, ça va être compliqué vu que la mémoire vive disponible est inférieure... Dans tous les cas, tu dois stocker dans ton tableau une quantité compatible avec la mémoire disponible dans le micro-contrôleur.

Deuxième problème: tu parles ici d'une acquisition à 44,1 kHz... J'imagine que c'est de l'analogique ? Ca commence à être chaud. Idem, quel type de carte ? Sur une Uno, si tu réussis tu me diras comment tu as fait. Sur une Due c'est faisable.

Troisième problème: écrire sur la carte SD pendant que tu fais les acquisitions suivantes: je ne sais pas (car je ne sais pas à quelle vitesse on peut écrire sur une carte SD).

44000 données en une seconde, ça fait une toutes les 22 µs !

Le code proposé ici fait du data logging sur une carte SD. La période de mesure et d’écriture est de 5s, mais tu peux tester s'il est possible de descendre à 20 µs...

Il y a ça aussi : il faudrait éviter d'ouvrir et fermer le fichier à chaque écriture pour gagner du temps.

Il faudrait compter le temps avec la fonction micros() (j'ai jamais testé), il semble qu'elle ait une résolution de 4 à 8 µs selon la fréquence de l'Arduino utilisé. Pas facile de compter jusqu'à 20 par pas de 8...

Avec un seul CPU, pour ne pas rater d'acquisition pendant l'écriture sur SD, il faut travailler sous interruption.

C'est pas si simple, il y a plusieurs variables a prendre en compte :

  • Fréquence d'horloge
  • Taille d'une donnée
  • Temps d'acquisition

biggil: Avec un seul CPU, pour ne pas rater d'acquisition pendant l'écriture sur SD, il faut travailler sous interruption.

Bonne idée ça : tu crois qu'il serait possible de mettre plusieurs arduinos en parallèle qui seraient cadencés moins vite et décalés d'une fraction de période, avec un master qui recevrait et stockerait les données sur la carte ?

Tu veux enregistrer des données (je suppose 2 * 44100 octets par seconde) pendant combien de secondes ?

lesept: Bonne idée ça : tu crois qu'il serait possible de mettre plusieurs arduinos en parallèle qui seraient cadencés moins vite et décalés d'une fraction de période, avec un master qui recevrait et stockerait les données sur la carte ?

Ca devient beaucoup plus simple d'utiliser un RPI !

bonjour, en plus de toutes les remarques, il faut une SD style classe 10

Bonsoir,

Merci pour vos réponses. Tout ce dont vous me parlez est ce à quoi j'ai plus ou moins réfléchis, c'est compliqué. Pour ce qui est du Raspberry pi j'ai bien essayé mais ça ne fonctionne pas non plus car il semble qu'il ne soit pas temps réel. Je vais préciser ce que j'essaie de faire.

Sous Windows ou Linux (donc sur un PC) quand je branche une antenne 433MHz sur l'entrée micro et que j'enregistre le signal avec Audacity, j'ai un beau signal clair, net, de ma télécommande émettant en 433MHz (forcément).

Par contre j'ai essayé de recréer ce même dispositif d'enregistrement mais plus portatif, à partir d'un RPi3 avec la fonction "arecord" (laquelle remplace Audacity), en standalone sur batterie. Et là, le signal a vraiment une sale tête. En particulier il est complètement haché en signaux HIGH et LOW aléatoires, et ça à cause du fait je pense mais je peux me tromper que le RPi n'est pas temps réel et perd des moments de réceptions de données.

J'ai écrit tout un dossier (zip) sur l'avancement de ce travail si ça intéresse quelqu'un de voir si il peut avancer plus avant, je suis prêt à partager.

Merci.

Tu as un PC avec une entrée micro qui est capable d'échantillonner du 433MHz?

bilbo83: Tu as un PC avec une entrée micro qui est capable d'échantillonner du 433MHz?

;D

bilbo83: Tu as un PC avec une entrée micro qui est capable d'échantillonner du 433MHz?

Non, mais il a une entrée pourrie qui "redresse" le signal HF en enregistrant l'enveloppe.

L'entree de son module Raspi est peut être moins dégueulasse; c'est pourquoi il n'a pas un beau signal.

Le problème avec le temps d'écriture sur carte SD est qu'il n'est pas absolument fixe, même si le débit maximum en écriture peut être élevé (je crois avoir déjà lu 120 KBytes/s) car il dépend de plusieurs facteurs (algorithme de réduction de l'usure, suppression de blocks , etc...). Ce qui est garanti, c'est seulement un temps moyen d'écriture pour des fichiers de taille importante.

De ce fait, il est sans doute plus judicieux de passer d'abord par une EEPROM (ou plutôt FRAM ? car supporte un trillion d'écritures), puis de verser le contenu sur une carte SD si nécessaire.

Pour ce qui est de la capacité à lire un signal analogique ET réellement en même temps faire autre chose, il y a la solution DUE, comme déjà évoquée plus haut, avec la lecture d'un signal analogique par PDC DMA pour remplir un buffer en SRAM, ET en même temps le transfert du précédent buffer déjà rempli sur la FRAM.

Il y a ici un exemple de cette mécanique avec une écriture sur PC qu'il faudrait remplacer par une écriture sur l'EEPROM, et bien sur ajuster le cadencement:

https://gist.github.com/pklaus/5921022

Morgatte: le RPi n'est pas temps réel et perd des moments de réceptions de données.

Le RPI n'est ni plus ni moins "temps réel" que Linux sur le PC. Et probablement plus temps réel que Windows...

bilbo83: Tu as un PC avec une entrée micro qui est capable d'échantillonner du 433MHz?

Relis ce que j'ai écrit. J'ai pas une entrée micro qui...... J'ai une antenne qui capte une fréquence de 433Mhz, après ça pourrait être n'importe quelle autre fréquence ça ne change rien, en sortie j'ai un banal signal analogique qui ne dépend en rien de cette fréquence. L'entrée micro enregistre quant à elle ce signal analogique issu de l'antenne. .

Merci ard_newbie, je vais voir ce que je peux faire avec un Arduino DUE.

J'ai une antenne qui capte une fréquence de 433Mhz, après ça pourrait être n'importe quelle autre fréquence ça ne change rien,

Tout à fait d'accord, le 433 MHz c'est une porteuse et une porteuse ne transporte aucune information. C'est ce qui module la porteuse qui transporte de l'information.

en sortie j'ai un banal signal analogique

Et non il n'est pas banal. 1) il a une amplitude 2) il a une fréquence max.

Et ces deux paramètres sont essentiels pour le convertisseur analogique/digital. Regarde dans la datasheet du micro les performances de l'ADC en fonction de ses différents réglages.

Quelque soit le micro utilisé il faut consulter sa datasheet. Quelque soit le micro utilisé la compréhension du fonctionnement de l'ADC est essentiel si tu veux l'optimiser. Info : Le micro configuré à "la mode arduino" n'est jamais optimisé performance mais simplicité d'utilisation.

Au fil des discutions je pense qu’un Arduino n’est peut-être pas la bonne solution.

Je pense qu’il faut que je revienne au Raspberry Pi, mais je ne dois pas utiliser la fonction “arecord” qui elle enregistre en continu sur ma clef USB.
Je vais tester un script Python en réceptionnant les données dans un buffer, puis ensuite seulement je ferai un enregistrement sur Clef.

Merci.