Table des matières:

Clignotant, Chantant, Marioman : 5 Étapes
Clignotant, Chantant, Marioman : 5 Étapes

Vidéo: Clignotant, Chantant, Marioman : 5 Étapes

Vidéo: Clignotant, Chantant, Marioman : 5 Étapes
Vidéo: Centrale clignotante xp6 (sans le régulateur xp6 avec clignotant) 2024, Juin
Anonim
Clignotant, Chantant, Marioman
Clignotant, Chantant, Marioman

Utilisez un attiny13a, deux LED et un haut-parleur pour carte de vœux pour créer un Marioman clignotant qui joue la chanson thème de Super Mario Brothers. Cela peut être un projet facile et peu coûteux pour tous ceux qui recherchent un moyen amusant de se lancer dans la programmation AVR ! les notes des chansons sont générées par une onde carrée émise sur une seule broche du microcontrôleur AVR. Les LED qui alternent sur chaque note sont connectées à 2 broches chacune de la même puce.

Étape 1: Matériaux et construction

Matériaux et construction
Matériaux et construction

1 attiny13a

www.mouser.com/Search/ProductDetail.aspx?qs=sGAEpiMZZMvu0Nwh4cA1wRKJzS2Lmyk%252bEP0e%2f7dEeq0%3dCoût: 1,40 $

  • 2 LED - n'importe quelle LED fera l'affaire
  • 1 pile bouton au lithium

www.sparkfun.com/commerce/product_info.php?products_id=338Coût: 2,00 $

1 porte-pile bouton

www.sparkfun.com/commerce/product_info.php?products_id=8822Coût: 1,25 $

1 petit haut-parleur d'une carte de voeux musicale

Coût total des matériaux ~ 5 $ Les deux LED ont été fixées directement à deux broches chacune des attiny13A. Deux broches sont utilisées pour chaque LED, la deuxième broche est réglée bas pour être utilisée comme connexion à la terre. La limite de courant des broches d'E/S sur l'AVR empêchera les LED de trop tirer, il n'est donc pas nécessaire de connecter une résistance série. Le haut-parleur utilisé est typique de celui trouvé dans une carte de vœux musicale, n'importe quel petit haut-parleur fera l'affaire, étant donné qu'il émet une tonalité d'onde carrée, il n'est pas trop important de s'inquiéter de la conduite du haut-parleur ou de la qualité du son.

Étape 2: Souder l'AVR aux LED et au haut-parleur

Souder l'AVR aux LED et au haut-parleur
Souder l'AVR aux LED et au haut-parleur
Souder l'AVR aux LED et au haut-parleur
Souder l'AVR aux LED et au haut-parleur

Pour que les LED s'étendent comme des bras, une broche est pliée sur l'AVR de chaque côté. Orienter l'AVR de cette façon facilite la connexion au haut-parleur (deuxième image) puisque les connexions sont sur les deux broches du bas. il est attaché.

Étape 3: Programmation de l'Attiny13a

Programmation de l'Attiny13a
Programmation de l'Attiny13a

Il existe de nombreuses options différentes pour programmer les AVR. attachez des fils à la prise femelle et branchez-les sur une planche à pain ou, mieux encore, obtenez un adaptateur de programmation AVR bon marché comme celui-cihttps://www.sparkfun.com/commerce/product_info.php?products_id=8508avec 3x2 en-têtes mâles pour connecter la prise.

Étape 4: Création du micrologiciel pour Marioman

Création du firmware pour Marioman
Création du firmware pour Marioman

L'attiny13A a 1 Ko de mémoire flash programmable et 64 octets de SRAM. Le fichier tar joint contient le fichier source ainsi que le micrologiciel compilé à télécharger. Trois tableaux dans le code c ont été utilisés pour générer la musique

  • freq - fréquences de chaque note
  • length - longueur de chaque note
  • delay - pause entre chaque note

Le tableau de fréquences n'a pas les fréquences réelles mais plutôt la valeur à mettre dans le registre TTCROB pour générer l'onde carrée à partir de la broche PB0. Voici un bref résumé des calculs et de la configuration des broches pour la génération d'onde carrée:

  • L'attiny13A a un oscillateur interne réglé sur 9,6MHz
  • L'horloge interne pour IO est l'oscillateur divisé par 8 ou 1,2 MHz
  • Une minuterie interne est configurée dans un registre 8 bits pour compter chaque cycle d'horloge avec une pré-échelle de 8.
  • Cela donne un tick égal à 1 / (1,2 MHz / 8) = 0,006667 ms
  • L'attiny13A est configuré pour comparer ce qui se trouve dans le registre 8 bits TCCR0B avec la minuterie et basculer une broche lorsqu'ils correspondent.
  • Par exemple, afin de générer une onde carrée à 524 Hz (une octave au-dessus du do médian) qui a une période de 1,908 ms.

1.908ms = 286 ticks d'horloge (1.908/.0067) Divisez 286 par 2 pour basculer la broche à t/2 (286/2 = 143) Mettez 143 dans le registre TTCR0B pour générer cette note. C'est tout le code qui est nécessaire pour configurer la minuterie, effectuez la comparaison et produisez une onde carrée:

TCCR0A |= (1<<WGM01); // configurer le temporisateur 1 pour le mode CTC TCCR0A |= (1<<COM0A0); // basculer OC0A sur la comparaison de correspondance TCCR0B |= (1<<CS01); // clk/8 pré-échelle TTCR0B = 143; // générer une onde carrée à 524 HzPour retarder les tonalités et les pauses entre elles, une simple fonction de retard a été utilisée

void sleep(int ms) { int cnt; pour (cnt=0; cnt<(ms); cnt++) { int i = 150; while(i--) { _asm("NOP"); } }}Cela compte à rebours à partir de 150 où chaque cycle NOP est d'environ 0,006667 ms. La dernière chose que le code fait est de parcourir les tableaux, de générer la musique et de faire clignoter les deux LED. Cela se fait dans une boucle for continue avec le code suivant

const uint8_t freq PROGMEM = { … data };const uint8_t length PROGMEM = { … data };const uint8_t delay PROGMEM = { … data };…while (1) { for (cnt=0; cnt< 156; cnt++) { OCR0A=pgm_read_byte(&freq[cnt]); output_toggle(PORTB, PB3); output_toggle(PORTB, PB4); sleep(pgm_read_byte(&length[cnt])); output_toggle(PORTB, PB3); output_toggle(PORTB, PB4); // arrêt du temporisateur TCCR0B = 0; sommeil (pgm_read_word(&delay[cnt])); // démarrer le temporisateur TCCR0B |= (1<<CS01); // clk/8 pré-échelle }}Il y a 156 éléments dans les tableaux fréquences/longueurs/retard, cette boucle les parcourt. Les broches PB3 et PB4 sont chacune basculées afin qu'elles alternent avec chaque note. Le premier sommeil est la longueur de la note que nous jouons après avoir réglé le registre OCR0A sur la valeur appropriée. Le deuxième sommeil est la pause entre les notes que nous jouons. Dans le code ci-dessus, vous avez peut-être remarqué les deux fonctions pgm_read_byte() et pgm_read_word() ainsi que le mot-clé PROGMEM. Avec une puce embarquée comme l'attiny, la quantité de SRAM est très limitée, dans ce cas seulement 64 octets. Les tableaux que nous utilisons pour toutes les données de fréquence/délai/longueur sont bien supérieurs à 64 octets et ne peuvent donc pas être chargés en mémoire. En utilisant la directive spéciale PROGMEM avr-gcc, ces grands tableaux de données sont empêchés de se charger en mémoire, au lieu de cela, ils sont lus à partir de la mémoire flash.

Étape 5: Laisser le Marioman lâcher

La vidéo ci-dessus montre Marioman en action. La consommation électrique moyenne est d'environ 25 mA, il peut donc cligner des yeux et faire des bruits pendant environ 10 heures avant de vider la pile bouton au lithium. La seule façon de l'allumer et de l'éteindre est de retirer la pile bouton, la plus robuste répertoriée dans les matériaux bien adapté pour cela. Un interrupteur peut être ajouté, mais il y a quelque chose à dire pour que les choses restent simples.

Conseillé: