ATtiny13 Basics – Luidspreker
Het is mogelijk een speakertje aan te sluiten op de ATtiny13, en daaruit een toon te genereren, sluit het volgende aan via onderstaand schema (in dit schema is ook de bedrading voor het programmeren via de ISP meegenomen):
Simpele toon:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { pinMode(PB4, OUTPUT); } // Simple tone void loop() { while(1) { digitalWrite(PB4, HIGH); delayMicroseconds(50); digitalWrite(PB4, LOW); delayMicroseconds(50); } } |
“railgun” geluid:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void setup() { // PB3 and PB4 are unused during programming pinMode(PB4, OUTPUT); } // Raygun - like sounds const int scale[]={3200, 1600, 800, 400, 200, 100, 50}; void loop() { for( int i = 0; i < 7; i++) { digitalWrite(PB4, HIGH); delayMicroseconds(scale[i]); digitalWrite(PB4, LOW); delayMicroseconds(scale[i]); } } |
Theramin:
(Een theremin is een elektronisch muziekinstrument dat bespeeld wordt door de afstand tussen de handen en twee antennes te variëren)
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { pinMode(PB4, OUTPUT); } // Theremin void loop() { digitalWrite(PB4, HIGH); delayMicroseconds(analogRead(3)/10); digitalWrite(PB4, LOW); delayMicroseconds(analogRead(3)/10); } |
Bron: teachmetomake.wordpress.com
Gebruik van PWM:
Voor de PWM functie kun je “digitale pin 1” gebruiken, sluit het volgende aan via onderstaand schema (in dit schema is ook de bedrading voor het programmeren via de ISP meegenomen):
– Speaker GND naar ATtiny GND
– Speaker + naar ATtiny Pin 1 (Pin 6 op de chip) (eventueel met weerstand ertussen)
Met gebruik van PWM een toon genereren met analogWrite:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#define SPKR 1 // defineer de speaker pin. void setup() { pinMode(SPKR, OUTPUT); //zet de speaker pin als uitgang. } void loop() { // genereer een 1KHz toon voor 1/2 seconde. analogWrite(SPKR, 128); delay(500); analogWrite(SPKR, 0); delay(500); } |
Gebruik van PWM 2 (toongenerator)
Voor deze PWM functie kun je “digitale pin 2” gebruiken, sluit het volgende aan via onderstaand schema (in dit schema is ook de bedrading voor het programmeren via de ISP meegenomen):
In dit voorbeeld heb ik de code omgebouwd van de “Annoying Beeper by samirsky” die is hier te vinden, in deze code kun je eenvoudig tonen genereren, al het onnodige heb ik gestript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <avr/io.h> // this contains all the IO port definitions #include <avr/interrupt.h> // definitions for interrupts #include <util/delay.h> #include <avr/sleep.h> // definitions for power-down modes #include <avr/pgmspace.h> // definitions or keeping constants in program memory int main(void) { unsigned int frequentie = 4000; // Frequency of beep in Hz unsigned long int counts; DDRB = 0xFF; // set all PortB pins as outputs counts = 1.2e6/frequentie/2; for(;;){ /* main event loop */ TCCR0A = 0b01000010; // COM0A1:0=01 to toggle OC0A on Compare Match TCCR0B = 0b00000001; // FOC0A=0 (no force compare) OCR0A = counts; // speaker aan _delay_ms(40); TCCR0B &= 0b11111000; // speaker uit _delay_ms(2000); // wacht even } } |
Gebuik geen functies voor attiny(13)?
Bovenstaande code gebruikt 92 byte, ik dacht een mooie functie te maken (met behulp van dit stuk) om zo eenvoudig een toon te genereren (hieronder een voorbeeld van 3000 Hz met een duur van 10 ms), maar dat kost 962 byte?!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/sleep.h> #include <avr/pgmspace.h> void toon(long int freq, uint16_t tijd) { int hz = 1.2e6/freq/2; OCR0A = hz; // speaker aan while(tijd--) { _delay_ms(1); } TCCR0B &= 0b11111000; // speaker uit } int main(void) { DDRB = 0xFF; for(;;){ TCCR0A = 0b01000010; TCCR0B = 0b00000001; toon(3000, 10); _delay_ms(2000); } } |
De schets gebruikt 962 bytes (93%) programma-opslagruimte. Maximum is 1.024 bytes.
Dus aan te raden om zo min mogelijk functies te gebruiken , al is het voor het gemak!