- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: Lautsprecher mit uC ansteuern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    25.02.2007
    Beiträge
    44

    Lautsprecher mit uC ansteuern

    Anzeige

    Praxistest und DIY Projekte
    Will einen Lautsprecher mit meinem AVR uC ansteuern! Doch wie funktioniert so was, geht das überhaupt? Muss der Lautsprecher nicht einen Wechselstrom bekommen oder so? Wie werden dann die Tonfrequenzen variiert? Wie stellt man Lautstärke ein? ach ja, bin übrigens noch auf der Suche nach einem geeigneten Lautsprecher! Muss nichts grosses sein, muss nur Pieps-Ton mit unterschiedlichen Frequenzen ausgeben können! Kennt da jemand gerade einen kleinen günstigen Lautsprecher?

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    Ne muss nicht unbedingt eine Wechselspannung sein. Am einfachsten kannst du denke ich Töne erzeugen wenn du einen Pin des AVR`s in einer bestimmten Frequenz (je nach gewünschter Tonhöhe) toggelst. Sollte relativ einfach sein mit einem Timer.
    Die Lautstärke lässt sich einfach mit einem Poti vor dem Lautsprecher einstellen.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270
    Bitte nicht vergessen:
    Den Lautsprecher keinesfalls direkt an den AVR hängen!
    Du solltest einen kleinen Transistor dazwischen schalten, damit dir der Pin nicht abraucht. (Kommt natürlich auf die Lautstärke an)

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Auf dem RN-Control Board ist doch ein Lautsprecher drauf, vielleicht hilft dir dessen Schaltplan weiter? In Bascom ist die Programmierung dann ganz einfach mit vorgefertigten Befehlen.
    Viele Grüße,
    William

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687

    Re: Lautsprecher mit uC ansteuern

    Zitat Zitat von taylor22
    ... Lautsprecher mit ... AVR uC ansteuern! ... muss nur Pieps-Ton mit unterschiedlichen Frequenzen ausgeben können...
    Na ja, mit AVR (und Transistor) gehts so so, la la. Es ist halt eine dämliche Rechteckspannung - das hört man der auch an.

    Zitat Zitat von Willa
    Auf dem RN-Control Board ist doch ein Lautsprecher drauf ...
    Stimmt, da steht auch "Speaker" - aber das ist dem Aussehen (und dem Schaltplan nach) ein Piezo. Und "Treiber" ist auch nicht auf meiner RNControl - und die ist von vorletzter Woche (noch mit Aufkleber "Remove after washing" ).

    Ich bin grad auch dabei, Töne auszugeben - es klingt schrecklich mit der Rechteckspannung. Als Vergleich habe ich meine Stimmgabel genommen - na ja, den "Ton" kriegt man schon frequenzgenau hin. Ich Suche ja nicht unbedingt die Oberwellen von einer Stradivari, ich würde eher gerne so einen Pfiff loslassen können - aber davon bin ich Jahrhunderte entfernt.

    Ach so, ja, taylor22 fragt ja, wie es geht:
    Code:
    ;===================================================================================
    
    #include "tn13def.inc"
    
    ; Interrupthandler-Tabelle (aus ATTiny13_doc2535.pdf, Seite 42)
    ;	Address Code	Labels		; Comments
    .org	0x0000	rjmp	reset		; Reset Handler
    ;.org	0x0003	rjmp	isr_x13		;TIMO_OVF = Timer0 Overflow Handler
    
    .org	0x0006	rjmp	isr_ctc		; IRS für Timer0 CompareA Handler
    ;
    ;===================================================================================
    ; Hauptprogramm
    ;===================================================================================
    ;
    reset:		;=== Generelle Initialisierung
    		; Zuerst Stack definieren;
    	ldi	a,RAMEND	;Ram Ende des tiny13
    	out	SPL,a		;Stack Pointer tiny13 setzen
    ;
    anfang:		;=== Hier beginnt das Hauptprogramm
    	rcall	mc_init
    	rcall	isr_ini		;Initialisiere die ISR
    ;
    ;
    hauptp:		;=== Löse Aufgabe: Teste Port PB1 auf Tastendruck. WENN
    		;    - Taste gedrückt: rLED an und piezo/PB4 an
    		;    - Taste gelöst  : rLED aus und piezo/PB4 aus
    ;
    	sbi	portb,rLED	;Rote LED/PB3 aus
    	sei			;Globel Interrupt an
    ;
    h2:		;=== Hier beginnt das Hauptprogramm
    	in	a,pinb
    	sbrc	a,taste0	;Wenn Pinb_0 (0..7) = 1, dann rLED/PB3 einschalten
    	rjmp	tonan		;  sonst schalte die piezo/PB4 ein
    	rjmp	tonaus
    ;
    tonan:
    	in	a,SREG
    	sbrc	a,7	;Ist global interrupt gesetzt?
    	rjmp	h2
    	sbi	portb,rLED	;Rote LED/PB3 an
    	sei			; ... und dazu einfach Interrupt einschalten
    	rjmp	h2
    ;
    tonaus:
    	in	a,SREG
    	sbrs	a,7	;Ist global interrupt gesetzt?
    	rjmp	h2	;   nein, dann gleich abschalten
    ;
    	cli			;Verbiete Interrupts
    	cbi	portb,rLED	;Rote LED/PB3 aus
    	cbi	portb,piezo	;    piezo/PB4 aus
    ;
    	rjmp	h2
    ;
    ;===================================================================================
    ; Prozeduren
    ;===================================================================================
    ;
    ;===================================================================================
    ; Initialisierungprozeduren, für µC, ADC und Timer-ISR
    ;===================================================================================
    ;
    mc_init:	;=== Initialisiere Mikrocontroller
    		;ALLE Register initialisieren hier := pull-ups einschalten
    ;
    	ldi	a,0b00111000	;
    				;Datenrichtung "Eingänge" für ports 0 - 2
    				;  und         "Ausgänge" für ports 3 - 5
    	out	ddrb,a	
    	ldi	a,0b00000000
    	out	portb,a		;  ports aus-(=) oder ein(1)schalten;  low = sink
    	ret		;=====----->>>>>
    ;
    ;
    isr_ini:	;=== Initialisierung der ISR (war mal isrinit_x15)
    ;
    ;;Timer Register werden belegt
    	ldi	a,(1<<wgm01)	;prescaler ist 1, waveform = CTC
    	out	tccr0a,a	;Register TCCR0 ist für den Prescaler zuständig
    	ldi	a,tmrprsc	;prescaler, siehe oben, Abstand zum nächsten
    	out	tccr0b,a	;  Interrupt bestimmt CTC-Preload tmrprsc
    	ldi	a,(1<<ocie0a)	;Hier Interrupts nach CTC eingeschaltet
    	out	timsk0,a	;Register TIMSK ist dafür zuständig 
    	ldi	a,tmrprld	;Hier wird der Timer vorgeladen. Er läuft dann
    	out 	TCNT0,a   	; .. tmrprld mal durch bevor ein Interrupt auftritt
    	out	ocr0a,a		;Prescaler tmrprs in OCR0A
    	ret		;=====----->>>>>
    ;
    ;
    ;===================================================================================
    ; Interrupt-Service-Routine
    ;#######>>>>> Muss real nicht zuerst der (letzte) PC gepusht werden ?
    ;===================================================================================
    ;
    ;
    isr_ctc:	;=== ISR läuft sowieso auf 880 Interrupts je Sekunde, also 440 Hz
    		;    zum Ansteuern des piezo einfach toggeln
    	in	ac,pinb
    	sbrs	ac,piezo	;Ist Rampe vom piezo an?
    	rjmp	pinan		;Piezo war aus, also anschalten
    ;
    pinaus:		;=== piezo ist an, also ausschalten, ebenso LED/PB3
    	cbi	portb,piezo
    	rjmp	iraus
    ;
    pinan:		;=== piezo ist aus, also den und LED/PB3 anschalten
    	sbi	portb,piezo
    ;
    iraus:
    	reti		;=====----->>>>>
    ;
    ;===================================================================================
    ; Ende des Quellcodes
    ;===================================================================================
    Ich schalte den Ausgang "piezo" mit einer Taste ein. Der Piezo jammert solange, wie die Taste gedrückt wird. Funktioniert - aber es ist eigentlich nix für menschliche Ohren

    Ja, und noch meinen "Schaltplan" aus dem Quellcode.
    Code:
    ;             +--------+          
    ; Vcc --------+ LP2950 +-------tiny13-Vcc---------------------------+ 
    ; (9VBlock)   |3      1|                          \  Taste          |
    ;             |   2    |       tiny13-PB0---+----+ |----------------+
    ;             +---+----+                    |                        
    ;                 |            +-----+      |                        
    ;                 +------------+ 10K +------+                        
    ;                 |            +-----+                               
    ;                 |                                   rLED|\ |       
    ;                 |            tiny13-PB3-----------------| >+------+
    ;                 |                                       |/ |      |
    ;                 |                                                 |
    ;                 |            tiny13-PB4-----Piezosummer-----------+
    ;                 |                                                 |
    ;                 |                           +------+              |
    ; GND-------------+------------tiny13-GND-----+ 100R +--------------+ 
    ;                                             +------+
    taylor22 - musst Dir halt für Deinen µC umpfriemeln.

    Übrigens gibts ein Demo auch in Hochsprache:
    https://www.roboternetz.de/wissen/in...oprogramm_in_C
    unter "/*### Sound durch den Speaker ausgeben ###*/"
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Naja, nen Sound kann man auch über PWM als DA-Wandler und
    dann Tabelle mit Sinuswerten erzeugen, klingt dann etwas
    runder, ist aber mehr Programmieraufwand.
    Auch eine Möglichkeit währe extern diskret nen Bandpass
    einzubauen, der die Flanken von dem Rechtecksignal etwas bricht.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    28.12.2004
    Beiträge
    77
    Kennt jemand bei Reichelt ein mini-Lautsprecher den man nehmen könnte?

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687
    Zitat Zitat von Vitis
    Naja, nen Sound kann man auch über PWM als DA-Wandler und dann Tabelle mit Sinuswerten erzeugen ...
    ??? Uuups - soweit bin ich (als Anfänger) ja nun leider noch nicht Wie mach ich das dann ? Hättest Du da bitte einen Tip? Wenigstens so ungefähr?

    Zitat Zitat von Vitis
    ... ist aber mehr Programmieraufwand...
    Als Anfänger muss ich ja programmieren, programmieren, programmieren . . .

    Zitat Zitat von Vitis
    ... Auch eine Möglichkeit währe extern diskret nen Bandpass
    einzubauen, der die Flanken von dem Rechtecksignal etwas bricht...
    Also Bandpass sagt mir IM PRINZIP schon was - aber noch nix vom Schaltungsaufbau her. Ich hatte lediglich mal Kondensatoren drangehalten. 47 µ Elko schluckt (hatte ich fast erwartet) das ganze Signal, 100n keramisch - da hört man sozusagen die abgerundeten Ecken - im Oskar hatte ich das noch nicht angeguckt.

    Hatte beim Versender mit dem grossen C nach irgendwelchen Tönern nachgesehen - da gibts nix, was ich brauchen könnte. Jetzt bin ich halt noch am Weitersuchen - sozusagen bis zum AB-Pfeifen. Aber ich will eben einen pfeifenden µC. Und bekanntllich hat der Herr nach dem "wollen" den Schweiss gesetzt
    Ciao sagt der JoeamBerg

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    25.02.2007
    Beiträge
    44
    ok besten dank für die vielen antworten! ich könnte mir das auch folgendermassen vorstellen zu machen: gebe rechteck signal aus (tönt eigentlich gar nich so schlecht wenn man eh nur einen piepston augeben will) und wenn mir das dann zu sehr auf den wecker geht, mache ich einen tiefpass mit grenzfrequenz sagen wir mal bei 1000Hz oder so und dann filtert man noch die oberschwingungen weg, was dann ein angenähertes sinus-signal ergben müsste oder?!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test