Die Audioausgabe verfolgt zwei Ziele, zu einem ergänzt sie die Videoanzeige durch Ansagen über die gezeigten Messgrößen, zum anderem gibt sie eigenständige Auskunft über den Zustand des DERPs beim an- und ausschalten. Der genaue Informationsinhalt ist in der folgenden Tabelle schematisch dargestellt.
Zur Realisierung dieser Ausgabe wurden eine Platine und ein Frontpanel mit dem Software EAGLE entworfen.
Schaltung
Bestandteile der Schaltung sind: der Mikrocontroller ATmega32, ein MP3-Modul, eine Transistorschaltung, zwei Stecker und der Datenbus. Das MP3-Modul erscheint nicht in dem EAGLE-Schaltplan, weil es als fertige Platine über einen Flachbandkabel zu verbinden ist.
Der Frontpanel ist mit der Platine durch einen Flachbandkabel verbunden. Auf ihm sitzen ein ON-OFF-Schalter und der Lautsprecher-Stecker.
Funktionsweise
Der Audio-Mikrocontroller ist über den Datenbus mit dem Messdaten-Mikrocontroller verbunden, und bekommt dadurch Auskunft über die angezeigten Messgrößen und über den DERP-Zustand. Die Übertragung erfolgt in 8-Bit-Format mittels UART-Protokolls. Nach jeder Sendung wertet der Audio-Mikrocontroller das 8-Bit-Array aus und schaltet eine entsprechende Audio-Dateien-Kombination ein.
Die Audio-Tracks sind im MP3-Modul auf einer SD-Karte als MP3-Datei gespeichert und werden durch den Kurzschluss der entsprechenden Track-Pins aufgerufen. Insgesamt befinden sich 10 Track-Pins-Paare auf dem MP3-Modul, die das Ausspielen von 20 Audio-Dateien ermöglichen. Jedem Pin-Paar sind zwei Audio-Dateien zugewiesen, die in Abhängigkeit der Kurzschlussdauer aufgerufen werden.
Der Pin-Paar-Kurzschluss erfolgt durch Anschalten eines npn-Bipolar-Transistors, dessen Kollektor und dessen Emitter mit jeweils einem Track-Pin verbunden sind. Der Basis-Strom wird von dem Audio-Mikrocontroller über einen Basis-Vorwiderstand initiiert.
Das MP3-Modul sendet die auszuspielenden Audiosignalen zu dem Lautsprecher am Frontpanel durch einen Flachbandkabel. Am Frontpanel befindet sich übrigens einen Schalter, der das ein- ausschalten des MP3-Moduls, und damit der Audioausgabe, ermöglicht.
Platine
Der Platinen-Layout wurde ebenfalls mit dem Programm EAGLE entworfen. Das MP3-Modul wurde auf der Platine mittels Panik-Raster angebracht.
Board Audioplatine
Board Frontpanel
Programmierung
Im folgenden der Programmcode des Audio-Mikrocontrollers.
Im ersten Abschnitt werden Hilfsfunktionen für die Kommunikation definiert. Im zweiten Abschnitt gibt es zwei Hilfsfunktionen für das Abspielen der Audiodateien, so dass dies durch ein einfaches PlayShort gemacht werden kann. In der Mainmethode wird in Zeile 102 auf übertragene Daten gewartet. Diese werden Danach entsprechend der Tabelle ausgewertet und der entsprechende Track wird angesteuert.
/*
* ProLab_05_completeRecieve.c
* Created: 05.01.2016 16:19:27
*/#include <avr/io.h>
#define F_CPU 1000000UL // 1MHz
#include <util/delay.h>#define delay_short 500
#define delay_long 2500/***** USART *****/
void USART_Init(void){
/* set BaudRateRegister */
UBRRH = 0x00;
UBRRL = 0x0C; //=12
/* enable reciever and transmitter */
UCSRB = (1<<RXEN) | (1<<TXEN);
/* Set frame format: 8 Datenbits, 1 Stoppbit */
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
}
unsigned char USART_Recieve(void){
while( !(UCSRA & (1<<RXC)) ) {;}
return UDR;
}/***** PLAYBACK *****/
/* Methoden um Pins aus PortA oder PortC
* in ’schoener‘ Reihenfolge zu setzen */
/*
Schaltplan
Taster 1 – PC6
Taster 2 – PC7
Taster 3 – PA7
…
Taster 10 – PA0
*//* INPUT: Nummer zwischen 1 und 10
* OUTPUT: Tastendruck der Laenge ‚delay_short‘ */
void PlayShort(unsigned char number){
number -= 1;
if(number == 0){
PORTC = 0b01000000;
_delay_ms(delay_short);
PORTC = 0x00;
}
else if(number == 1){
PORTC = 0b10000000;
_delay_ms(delay_short);
PORTC = 0x00;
}
else if(number<=9){
number = 9 – number;
PORTA = (1<<number);
_delay_ms(delay_short);
PORTA = 0x00;
}
}/* INPUT: Nummer zwischen 1 und 10
* OUTPUT: Tastendruck der Laenge ‚delay_long‘ */
void PlayLong(unsigned char number){
number -= 1;
if(number == 0){
PORTC = 0b01000000;
_delay_ms(delay_long);
PORTC = 0x00;
}
else if(number == 1){
PORTC = 0b10000000;
_delay_ms(delay_long);
PORTC = 0x00;
}
else if(number<=9){
number = 9 – number;
PORTA = (1<<number);
_delay_ms(delay_long);
PORTA = 0x00;
}
}/***** MAIN *****/
int main(void)
{
// set register-directions and variables
DDRA = 0xFF;
DDRC = 0xFF;
unsigned char rxdata = 0x00;USART_Init();
//MP3-Modul braucht laenger zum starten
_delay_ms(1000);
//Begruessungs-Ansage
PlayLong(1);while (1){
/* RECIEVE DATA */
rxdata = USART_Recieve();/* PLAYBACK */
// do nothing
if (rxdata<=0){
}
// [INPUT 01 – 10] play normal short tracks
else if(rxdata <= 10){
PlayShort(rxdata);
}
// [INPUT 11 – 20] play normal long tracks
else if(rxdata <= 20){
rxdata -= 10;
PlayLong(rxdata);
}
// [INPUT 35 – 38] play track 3
// and afterwords the second number
else if(rxdata <= 40){
PlayShort(3);
_delay_ms(1500);
rxdata -= 30;
PlayShort(rxdata);
}
// [INPUT 45 – 48] play track 4
// and afterwords the second number
else if(rxdata <= 50){
PlayShort(4);
_delay_ms(1500);
rxdata -= 40;
PlayShort(rxdata);
}
}
}