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.
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...
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 ?
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 !
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.
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:
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.
il a une amplitude
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.