Arduino 13arduino_goodfields_64.jpgCRASH !...
 
Sommaire

CRASH  !... CRASH !...
La page principale ... La page principale ...
   
Vers le début Vers Page 2 Vers sommaire CRASH !...
Qui a dit que le chiffre 13 portait malheur ? A ce stade, j'ai donc fait un générateur Morse avec la fonction tone/noTone de base de l'ARDUINO. Je tente d'intégrer la bibliothèque qui va permettre de construire le fréquencemètre, fonction indispensable dans mon projet :
/*
  Martin Nawrath KHM LAB3
  Kunsthochschule f¸r Medien Kˆln
  Academy of Media Arts
  http://www.khm.de
  http://interface.khm.de/index.php/labor/experimente/	
  http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/
  NB : l'entrée de comptage est le D5
*/
#include <FreqCounter.h>
Et là, le compilateur me dit :
core.a(Tone.cpp.o): In function `__vector_7':
C:\arduino-1.0.3\hardware\arduino\cores\arduino/Tone.cpp:535: multiple definition of `__vector_7'
FreqCounter\FreqCounter.cpp.o:C:\arduino-1.0.3\libraries\FreqCounter/FreqCounter.cpp:104: first defined here
Ah Ah Ah ! Mais c'est pas drôle ! (chez les OM, on dit Hi 3 fois; moi je rajoute : matin, midi et soir !)
En décortiquant plus précisément les fonctions 'tone' et 'frequency', on constate (et ce n'est pas étonnant) que 'tone' utilise des un compteur/timer hardware de l'ARDUINO, et que 'frequency' aussi ! Et apparemment, l'ARDUINO UNO n'en compte que 3, et frequency en utilise 3. Bien que 'TONE' soit assez intelligent pour essayer de trouver des compteurs inutilisés (la version trouvée sur Internet permet d'ailleurs de faire plusieurs sons simultanés), quand il n'y en a plus, il n'y en plus.
Par ailleurs il est signalé que les fonctions delay() et autres millis() risquent de pâtir de 'frequency' !!!

Donc, là que faire ?
- se passer de Morse, ou l'externaliser : un simple NE555 monté en couineur peut faire l'affaire ... Mais probablement non plus de fonction GBF, ni Servo ni PWM ...
- utiliser un second ARDUINO qui ferait l'acquisition de fréquence, et passerait les infos au 1er avec un bus I2C ou 1fil ... Eventuellement monté sur l'interface L+C+F (selfmètre capacimètre fréquencemètre) comme un simple circuit életronique
- voir si le Due ou le Mega pourrait supporter plus de compteurs/timers : facile, y'a qu'à choisir le modèle dans le compilateur et de voir si cela compile ... (ATmega1280/2560) mais je pense qu'il va falloir travailler le tone.h ou le frequency.h ...

Ugly Details
The library uses the hardware timers on the microcontroller to generate square-wave tones in the audible range.
You can output the tones on any pin (arbitrary). The number of tones that can be played simultaneously depends on the number of hardware timers (with CTC capability) available on the microcontroller.
* ATmega8: 2 (timers 2, and 1)
* ATmega168/328: 3 (timers 2, 1, and 0)
* ATmega1280: 6 (timers 2, 3, 4, 5, 1, 0)

Détails moches:
La bibliothèque utilise les compteurs matériels du microcontrôleur pour générer rectangulaires tons dans la gamme audible. (Google translate !).
Vous pouvez afficher les sons sur n'importe quelle broche (arbitraire). Le nombre de tons qui peuvent être joués simultanément dépend du nombre de minuteurs matériel (avec capacité CTC) disponibles sur le microcontrôleur.

La doc du Tone.h de base
Tutoriel TONE de base
Tone plus général (multi-tone)
En synthèse :
library fonctions No timer(s) utilisé(s) Notes
TIME
time intégré millis() delay() 0 ??? signalé perturbé par FreqCounter
TONE
tone intégré tone/noTone de base(core) 2 1 seul tone à la fois
Tone.h tone noTone 2,1,0 / 2, 3, 4, 5, 1, 0 (N1) plusieurs tones simultanés
toneAC2 toneAC2 noToneAC2 2,1,0 / 2, 3, 4, 5, 1, 0 (N1) 2 sorties opposées
FREQUENCEMETRE
FreqCounter.h FreqCounter::start/f_ready 0,1,2
PWM
pwm intégré analogWrite(Pin,Val) 0,1,2,3,4,5 (le 1er disponible)
SERVOS
'servo' de base servo.attach/write... 1,3,4,5 voir servo.cpp

N0 : les library 'intégrées' (core) sont ici : C:\arduino-1.0.3\hardware\arduino\cores\arduino
les library 'de base' sont ici : C:\arduino-1.0.3\libraries, les autres aussi (celles que l'on ajoute)
Pour savoir les ressources utilisées, voir dans les .cpp
N1 : selon ATmega168-328 / ATmega1280 et nombre de tones simultanés

Si je veux continuer dans mon idée, il va falloir faire sa propre librairie ... et partir sur un Arduino Mega (avec 6 timers)
Par exemple choisir :
time millis()s OK = 0
tone toneAC2 OK = 2
pwm intégré OK = 1 si ces 3 là marchent dans l'ordre ...
servo = 1 ? (attach/detach permettent-ils de réutiliser le timert ?)
freqcounter = 3,4,5 c'est la seule à modifier ... et si ces 3 timers/counters ont les mêmes capacités ...

La doc des AT1280/2560 sera utile ... (plus de 400 pages)
la suite ... la suite ... La page principale ... La page principale ...

Photos de la page :

Dernière mise à jour : 11:40:00 18/09/2020