Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Auto-HUD – Windschutzscheiben-Display für Geschwindigkeit und Kompass

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1

Über dieses Projekt

Beschreibung:

Ich wollte es! Ich war eifersüchtig auf das große Auto meines Freundes Taggi, das auf der Windschutzscheibe die Geschwindigkeit anzeigt. Ich musste es haben, ich musste es natürlich selbst machen!

Software-Sicht:

Der schwierigste und verwirrendste Teil bei der Projektierung der Schaltung war der Anschluss der 7-Segment-Anzeigen an die BCD-Decoder, da Zahlen "invertiert" sind (gespiegelt).

Es gibt 3 Schaltflächen :+ und - zum Erhöhen/Verringern der Helligkeit und S/H zum Umschalten zwischen Geschwindigkeit in km/h und Fahrtrichtung in Grad; bei Kurs ist auch die rote LED an, dies bedeutet "Grad" des Kompasses (1-360°) bei Bewegung. Es ist kein elektronischer Kompass, sondern ein GPS und Sie müssen sich bewegen, um die richtigen Informationen über die Richtung zu erhalten, in die Sie sich bewegen. Die Helligkeit wird im EEPROM gespeichert Erinnerung nach einer Minute. Die Helligkeit wird sowohl auf den Displays als auch auf der LED über PWM-Pins geändert.

Ein wichtiger Teil des Codes dient zum Sammeln von GPS-Daten, hauptsächlich Geschwindigkeit und Richtung, und nimmt sie aus jedem NMEA-Satz heraus. Selbst bei der Verwendung der String-Klasse, hauptsächlich für die Manipulation von seriellen NMEA-Sätzen, ist der gesamte Ausarbeitungsfluss stabil und solide; es verwendet "serialEvent()", um Daten von GPS einmal pro Sekunde zu empfangen , ruft dann "nmeaExtractData()" auf und überprüft schließlich das Datenpaket mit "nmea0183_checksum()", um die Datenintegrität sicherzustellen. Wenn Sie ein anderes GPS-Modell verwenden, stellen Sie sicher, dass die Sätze die gleiche Struktur haben oder müssen Sie hier einige Änderungen vornehmen . Zum Beispiel verwendet EM406A die Paket-ID "$GPRMC", BT220 verwendet "$GNRMC" stattdessen... nur eine kleine Namensänderung... Ein nützlicher Link kann Ihnen beim Prüfsummentest helfen:https://nmeachecksum.eqth.net - Hier ein Beispiel für einen vollständigen NMEA-Satz, er enthält:id, time, valid, Breitengrad, Längengrad, Geschwindigkeit, wahrer Kurs, Datum, Variation und Prüfsumme.

$GNRMC, 095836.000, A, 4551.9676, N, 01328.7118, E, 2.09, 341.84, 280519,, *08

Die Skizze sieht vor, den Latch für jeden einzelnen Display-BCD-Decoder einzeln zu aktivieren, die Codenummer auf dem binären 4-Bit-Bus einzustellen, den Latch zu deaktivieren und so weiter, wenn sich der Wert ändert. Nicht signifikante Nullen auf der linken Seite werden ausgeblendet (nicht angezeigt).

Vor dem Laden einer neuen Skizze zu die MCU Denken Sie daran, den Jumper herauszunehmen :Es ist mit dem Rx-Pin von Arduino verbunden und steht während des Ladens sicher in Konflikt mit GPS Tx. Setzen Sie nach dem Laden der Software den Jumper wieder ein, um die normale Funktionalität wiederherzustellen.

Komponentenliste:

  • 1 x MCU Arduino Nano
  • 3 x 5161 als Sieben-Segment-Anzeige, gemeinsame Kathode, rot
  • 1 x Beitian BN-220 serielles TTL-GPS (1 Hz GNRMC-Sätze)
  • 1 x Jumper
  • 3 x Knöpfe (normalerweise geöffnet) + 3 x Kappen
  • 22 x 1/4W 220 Ohm Widerstände
  • 1 x 3 mm LED, rot
  • 2 x 100n Kondensatoren
  • 3 x 14511 BCD-Decoder + Latch
  • 1 x USB "B" Buchse
  • 1 x Streifenleitung 2x Stifte (für Jumper)
  • 1 x Streifenleitung 4x Stifte zum Biegen auf 90° (für GPS)
  • 1 x Pigtail-Kabel verbindet GPS mit 4 Pins an Bord
  • 22 x Stripline-Stiftstifte zum Verbinden von zwei PCBs in einem Stapel
  • 1 x doppelseitiges Klebeband zum Aufkleben des GPS auf die Leiterplatte
  • 6 x gedrehte Streifenleitung 5x weibliche Stifte (für Displays)
  • 50 x 0,6 mm Kupfernieten
  • 8 x M3-Schrauben
  • 4 x M3 weibliche Türme mit einer Höhe von 20 mm
  • 1 x Plastikbox + Deckel (siehe meine 3D-Dateien zum Drucken unten)

PCB (Leiterplatten):

Ich habe zwei doppelseitige Leiterplatten verwendet Aus diesem Grund werden rund 50 durchgehende Nieten oder Stifte verwendet, um Routen für ganze Schaltungen zu lösen. Außerdem gibt es 5 Ausrichtungslöcher zuerst zu machen. Ich habe auf jeder Platine diese 5 Ausrichtungspunkte entworfen. Im Downloadbereich haben Sie alle PCB-Dateien, Bauteile und Lötflächen, gespiegelt, zum Herunterladen und Ausdrucken mit einem Laserdrucker auf "gelbe" oder "blaue" Platten; Dieses Mal habe ich die blauen verwendet, aber auch die gelben sind gut und der Preis ist niedriger. Ich muss sagen, die blauen Blätter sind besser ... Denken Sie beim Drucken daran, die Tonerspareinstellungen zu deaktivieren, verwenden Sie stattdessen eine Auflösung von 1200 dpi, um ein tiefes echtes Schwarz zu erhalten. Der Tonerübertragungsprozess von Magic Sheets auf PCB wird durch die Verwendung eines heißen Bügeleisens durchgeführt... Im Netz gibt es einige Tutorials, die zeigen, wie man eine gute PCB produziert Aber denken Sie an diese wichtigen Punkte:Reinigen Sie das Kupfer perfekt und bürsten Sie es leicht mit einem Küchenschwamm, 5 Minuten Bügeln, Wassertemperaturschock, Ausrichtung der beiden Gesichter durch 5 Löcher (ich habe 5 Stifte auf einer großen weißen LED-Fläche verwendet, um zu sehen Löcher), schützen Sie die andere Seite während des Korrosionsprozesses. Auch das Drucken von Bauteilen macht das Projekt "professionell" :-)

HINWEISE: Die Bilder wurden vor der allerletzten Version aufgenommen, daher können einige Details anders sein:z. Sie sollten das GPS mit einer Geschwindigkeit von 9600 bps einrichten, nur 1 Hz GNRMC NMEA-Satz; dies kann mit einer eigenen Setup-Software erfolgen. Zum Schluss, bevor Sie die USB-Buchse verlöten, kleben Sie auf der Bestückungsseite, direkt darunter, ein kleines Stück Isolierband darunter, um einen ungewollten Kontakt mit einer Kupferleitung zu vermeiden.

Wenn Sie zum ersten Mal Strom geben, werden Sie feststellen, dass die Zahlen "unlesbar" sind, da sie auf der Windschutzscheibe (Spiegel) reflektiert werden. Installieren Sie es im Auto vor dem Fahrersitz , einen bequemen Platz finden und reparieren. Ich schlage vor, das USB-Stromkabel anzuschließen nach der Zündposition, so dass es beim Ein- / Ausschalten des Motors ein- / ausgeschaltet wird. Das ist alles, meine Damen und Herren!

Neuigkeiten und Verbesserungen:

  • 25.03.2021:Um das Projekt abzuschließen, habe ich zwei 3D-.STL-Modelle vorbereitet unter diesem Link:https://grabcad.com/library/car-hud-1 Hier können Sie Dateien zu einer geformten Box und seiner Abdeckplatte für dieses Projekt herunterladen, um sie mit einem 3D-Drucker zu drucken.
  • 20.07.2021:es ist eine V2 (Version zwei) verfügbar der Software, dass Sie zusammen mit zwei Drähten und einem Widerstand Höhenangaben in Tausend Metern (also 0,89 =890 m) auf dem Display haben, drücken Sie einfach ein anderes Mal die S/H-Taste! Anleitung:1) GPS so einrichten, dass es auch den $GNGGA nmea-Satz über seine eigene Software ausgibt; 2) Schneiden Sie die tatsächliche Verbindung zwischen dem d5 Arduino PWM-Pin und dem Rest der Schaltung ab, verbinden Sie sie mit einem 220-Ohm-Widerstand mit dem Dezimalpunkt-Pin der zentralen Anzeige; 3) Verbinden Sie den digitalen Pin von d13 Arduino mit dem Stromkreis, an dem d5 angeschlossen war; Sehen Sie sich hier unten einige Bilder an; 4) Installieren Sie die V2-Skizze auf Ihrem Arduino Nano.
  • 01.11.2021:Version V2.2 ist fertig für dich. Was neues? Über Höhe (bei V2 bereits vorhanden) zeigt das Hud den vollen Wert bis 999m an, ab 1000m zeigt es Werte in Tausend an, also 1,24 (1240m) oder 2,02 (2020m). Ich habe einen LDR-Fotowiderstand GL5539, einen 10kOhm-Widerstand und 2 Drähte hinzugefügt. Schauen Sie sich die Bilder unten für V2.2-Mods an und installieren Sie die V2.2-Skizze auf Ihrem Arduino. Der LDR-Sensor ändert die Helligkeit automatisch (3 Stufen) je nach Lichtstärke (Tag, Bewölkt oder Nacht). Die Tasten (+) und (-) funktionieren noch, um die Helligkeit manuell zu ändern, sie haben Priorität; Um zur Automatik zurückzukehren, drücken Sie einfach die Tasten (+) und (-) für eine Weile. Das interne EEPROM zum Speichern der Helligkeitsstufe wird nicht mehr verwendet. Lass zuerst V2-Mods machen!

Fahren Sie beim Autofahren einfach. Fahren Sie sicher!

Code

  • Auto-HUD Arduino-Skizze
Auto-HUD Arduino-SkizzeArduino
/* Diese Skizze fungiert als Auto-Windschutzscheiben-HUD (Head-Up-Display), von Marco Zonca, 10/2020 Arduino Nano als CPU, GPS BT-220 nmea alle 1 Sek., 3 x Tasten, 3 x Sieben-Segment-Anzeigen gemeinsame Kathode , 3 x 14511 BCD-Latch-Decoder, MPU-EEPROM-Speicher (1 Byte) und viele Widerstände; WARNUNG:=======Vor dem Aktualisieren der Software lassen Sie den RX-Pin auf Arduino (TX vom GPS) über den JUMPER*/#include #include String inputString ="" trennen;String nm_time ="00:00:00";String nm_validity ="V";String nm_latitude ="dd°mm.mmmm'N";String nm_longitude ="ddd°mm.mmmm'E";String nm_knots ="0.0 kn";float nmf_knots =0.0;float nmf_kmh =0.0;int nmi_kmh =0;String nm_truecourse ="360";float nmf_truecourse =360;String nm_date ="dd/mm/yyyy";int nmi_truecourse =0;byte kCent =0;Byte kDeci =0;Byte kUnit =0;Byte tCent =0;Byte tDeci =0;Byte tUnit =0;Byte Helligkeit =120;Byte Latch_off =HIGH;Byte Latch_on =LOW;int n=0;unsigned long lastmemcheck =0;unsigned long memcheck =60000; // prüfen, ob der "Helligkeits"-Wert alle 60 Sekunden im EEPROM gespeichert wirdbool stringComplete =false;bool isKMH=true;bool ret =false;const int disp001 =2; // Einheiten zeigen Latchconst an int disp010 =8; // Zehneranzeige Latchconst Int disp100 =12; // Undreds-Anzeige Latchconst Int disp001dim =9; // Einheiten Display Dimmer/Aus Pinconst Int disp010dim =10; // Zehneranzeige Dimmer/Aus Pinconst Int disp100dim =11; // Undreds Display Dimmer/Aus Pinconst Int button_kt =14; // kmh/truecourse buttonconst int button_more =15; // Helligkeit + buttonconst int button_less =16; // Helligkeit - buttonconst int degreeLED =3; // Grad LEDconst int bit_3 =7; // bit 3const int bit_2 =6; // Bit 2const int Bit_1 =5; // Bit 1const int Bit_0 =4; // Bit 0const int dly =10; // Latch verzögern m/secconst byte off =0; // das gleiche wie Helligkeit =0const int addr =0; // EEPROM-Adresse für Helligkeitswertconst-Byte-Zahlen[10] [4] ={{0,0,0,0},{1,0,0,0},{0,1,0,0},{1, 1,0,0},{0,0,1,0}, {1,0,1,0},{0,1,1,0},{1,1,1,0},{0, 0,0,1},{1,0,0,1}}; // Bits 0,1,2,3void setup () { Serial.begin (9600); Wire.begin(); inputString.reserve(200); Helligkeit =EEPROM.read(adr); if (Helligkeit> 250 || Helligkeit <10) { Helligkeit =120; } // verrückte Werte aus dem 1. EEPROM-Lesevorgang vermeiden PinMode (disp001, OUTPUT); pinMode (disp010, AUSGANG); pinMode (disp100, AUSGANG); pinMode (Grad LED, AUSGANG); pinMode(button_kt, INPUT_PULLUP); pinMode (button_less, INPUT_PULLUP); pinMode(button_more, INPUT_PULLUP); pinMode (bit_3, AUSGANG); pinMode (bit_2, AUSGANG); pinMode (bit_1, AUSGANG); pinMode (bit_0, AUSGANG); analogWrite (disp001dim, aus); // aus und null zeigt analogWrite (disp010dim, off); analogWrite (disp100dim, aus); analogWrite (GradLED, aus); setBusNr(0); digitalWrite (disp001, Latch_on); digitalWrite (disp010, Latch_on); digitalWrite (disp100, Latch_on); Verzögerung (dly); digitalWrite (disp001, Latch_off); digitalWrite (disp010, Latch_off); digitalWrite (disp100, Latch_off); analogWrite (disp001dim, Helligkeit); // auf dem Display AnalogWrite (disp010dim, Helligkeit); analogWrite (disp100dim, Helligkeit);} // setup ()void loop () { // GPS NMEA ------------------ if (stringComplete ==true) { // empfangener nmea-Satz über serielle Schnittstelle RX ret =nmeaExtractData(); Eingabezeichenfolge =""; stringComplete =false; if (ret ==true) {kCent=nmi_kmh/100; n=nmi_kmh-(kCent*100); kDezi=n/10; n=nmi_kmh-(kCent*100)-(kDeci*10); kEinheit=n; tCent=nmi_truecourse/100; n=nmi_truecourse-(tCent*100); tDeci=n/10; n=nmi_truecourse-(tCent*100)-(tDeci*10); tEinheit=n; Anzeige(); aufrechtzuerhalten. aufrechtzuerhalten. lastmemcheck=millis(); } checkButtons();}void display() { if (isKMH ==true) {// Geschwindigkeit in km/h (isKMH=true) analogWrite (degreesLED, off); setBusNr(kEinheit); digitalWrite (disp001, Latch_on); Verzögerung (dly); digitalWrite (disp001, Latch_off); if (kDeci> 0 || kCent> 0) { // Zehner aussetzen if Zehner=0 (und auch Undreden=0) setBusNr(kDeci); digitalWrite (disp010, Latch_on); Verzögerung (dly); digitalWrite (disp010, Latch_off); analogWrite (disp010dim, Helligkeit); aufrechtzuerhalten. Sonst { AnalogWrite (disp010dim, off); aufrechtzuerhalten. Wenn (kCent> 0) { // Undreds aus setzen if=0 setBusNr(kCent); digitalWrite (disp100, Latch_on); Verzögerung (dly); digitalWrite (disp100, Latch_off); analogWrite (disp100dim, Helligkeit); aufrechtzuerhalten. Else { AnalogWrite (disp100dim, off); } } else {// wahre Peilung in Grad (isKMH=false) analogWrite (degreesLED, Helligkeit); setBusNr(tEinheit); digitalWrite (disp001, Latch_on); Verzögerung (dly); digitalWrite (disp001, Latch_off); if (tDeci> 0 || tCent> 0) { // Zehner aussetzen if Zehner=0 (und auch Undreden=0) setBusNr(tDeci); digitalWrite (disp010, Latch_on); Verzögerung (dly); digitalWrite (disp010, Latch_off); analogWrite (disp010dim, Helligkeit); aufrechtzuerhalten. Sonst { AnalogWrite (disp010dim, off); aufrechtzuerhalten. Wenn (tCent> 0) { // Undreds aus setzen if=0 setBusNr (tCent); digitalWrite (disp100, Latch_on); Verzögerung (dly); digitalWrite (disp100, Latch_off); analogWrite (disp100dim, Helligkeit); aufrechtzuerhalten. Else { AnalogWrite (disp100dim, off); } }} // display ()void checkButtons () { if (digitalRead (button_kt) ==LOW) { if (isKMH ==true) { isKMH =false; } else { isKMH=true; } Verzögerung (250); aufrechtzuerhalten. Wenn (digitalRead (button_more) ==LOW) { if (Helligkeit <=240) { Helligkeit =Helligkeit + 10; } analogWrite (disp001dim, Helligkeit); analogWrite (disp010dim, Helligkeit); analogWrite (disp100dim, Helligkeit); Verzögerung (100); aufrechtzuerhalten. Wenn (digitalRead (button_less) ==LOW) { if (Helligkeit>=20) { Helligkeit =Helligkeit-10; } analogWrite (disp001dim, Helligkeit); analogWrite (disp010dim, Helligkeit); analogWrite (disp100dim, Helligkeit); Verzögerung (100); }} // checkButtons()void setBusNr(int number) { // setzt den 4-Bit-Bus für (byte b=0; b<=3; b++) { if (numbers[number][b]==0) { if (b==0) {digitalWrite(bit_0, LOW);} if (b==1) {digitalWrite(bit_1, LOW);} if (b==2) {digitalWrite(bit_2, LOW);} if (b ==3) {digitalWrite(bit_3, LOW);}} else { if (b==0) {digitalWrite(bit_0, HIGH);} if (b==1) {digitalWrite(bit_1, HIGH);} if ( b==2) {digitalWrite(bit_2, HIGH);} if (b==3) {digitalWrite(bit_3, HIGH);} } }} // setBusNr() // Daten aus nmea extrahieren inputStringbool nmeaExtractData() { int d =0; int s =0; int y =0; intz=0; Schwimmer t=0; bool ret =false; //true if nmea Satz =$GNRMC und gültiges CHKSUM if ((inputString.substring(0,6) =="$GNRMC") &&(inputString.substring(inputString.length()-4,inputString.length()- 2) ==nmea0183_checksum(inputString))) { y=0; for (s =1; s <11; s ++) { y=inputString.indexOf(",",y); switch (s) { case 1://-----------------------time z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_time=inputString.substring(y+1,y+2+1)+":"+inputString.substring(y+1+2,y+4+1)+" :"+inputString.substring(y+1+4,y+6+1); } y=z; brechen; Fall 2://-----------------------Gültigkeit z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_validity=inputString.substring(y+1,y+1+1); } y=z; brechen; Fall 3://-----------------------Breitengrad z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_latitude=inputString.substring(y+1,y+2+1)+"°"+inputString.substring(y+1+2,y+10+1)+" '"; } y=z; brechen; Fall 4://-----------------------Nord/Süd z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_latitude=nm_latitude + inputString.substring(y+1,y+1+1); } y=z; brechen; Fall 5://-----------------------Längengrad z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_longitude=inputString.substring(y+1,y+3+1)+"°"+inputString.substring(y+1+3,y+11+1)+" '"; } y=z; brechen; Fall 6://-----------------------Ost/West z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_longitude =nm_longitude + inputString.substring(y+1,y+1+1); } y=z; brechen; Fall 7://----------------------- Geschwindigkeitsknoten z=inputString.indexOf(",",y+1); if (z>(y+1)) { nmf_knots=inputString.substring(y+1,z).toFloat(); t=roundOneDec(nmf_knots); nm_knots=String(t,1)+"kn"; nmf_kmh=roundTwoDec(nmf_knots * 1,852); nmi_kmh=roundZeroDec(nmf_knots * 1,852); } y=z; brechen; Fall 8://-----------------------wahrer Kurs z=inputString.indexOf(",",y+1); if (z>(y+1)) { nmf_truecourse=inputString.substring(y+1,z).toFloat(); t=roundZeroDec(nmf_truecourse); nmi_truecourse=t; d =t; nm_truecourse=d; } y=z; brechen; Fall 9://----------------------- Datum z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_date=inputString.substring(y+1,y+2+1)+"/"+inputString.substring(y+1+2,y+4+1)+" /20"+inputString.substring(y+1+4,y+6+1); } y=z; brechen; Fall 10:// Anweisungen n.u. brechen; Standardwert:// Anweisungen n.u. brechen; } } ret=wahr; } return ret;} // nmeaExtractData()/* SerialEvent tritt immer dann auf, wenn neue Daten im seriellen Hardware-RX eingehen. Diese Routine wird zwischen jedem Durchlauf von loop() ausgeführt, so dass die Verwendung der Verzögerung in der Schleife die Reaktion verzögern kann. Es können mehrere Datenbytes verfügbar sein.*/void serialEvent() { while (Serial.available()) { char inChar =(char)Serial.read(); inputString +=inChar; // Wenn das eingehende Zeichen ein Zeilenumbruch ist, setze ein Flag, damit die Hauptschleife // etwas dagegen tun kann if (inChar =='\n') { stringComplete =true; } }} // serialEvent () // Prüfsumme von nmea berechnen SatzString nmea0183_checksum (String nmea_data) { int crc =0; String chSumString =""; int ich; // Ignoriere das erste $-Zeichen, die Prüfsumme im Satz für (i =1; i <(nmea_data.length()-5); i ++) { // entferne die - 5, wenn kein "*" + cksum + cr + Falls vorhanden crc ^=nmea_data[i]; } chSumString =String(crc,HEX); if (chSumString.length()==1) { chSumString="0"+chSumString.substring(0,1); } chSumString.toUpperCase(); return chSumString;} // nmea0183_checksum(String nmea_data) // round zero decimalsfloat roundZeroDec(float f) { float y, d; y =f*1; d =y - (int)y; y =(float)(int)(f*1)/1; wenn (d>=0,5) {y +=1; aufrechtzuerhalten. Sonst { if (d <-0,5) { y -=1; } } return y;} // Runde eins Dezimalfloat roundOneDec(float f) { float y, d; y =f*10; d =y - (int)y; y =(float)(int)(f*10)/10; wenn (d>=0,5) {y +=0,1; aufrechtzuerhalten. Sonst { wenn (d <-0,5) {y -=0,1; } } return y;} // Runde zwei Dezimalzahlenfloat roundTwoDec(float f) { float y, d; y =f*100; d =y - (int)y; y =(float)(int)(f*100)/100; wenn (d>=0,5) {y +=0,01; aufrechtzuerhalten. Sonst { wenn (d <-0,5) {y -=0,01; } } return y;}

Schaltpläne

car-hud_m5RwPQqpxH.fzz ard-carhud-v2_3N5756haNI.ino ard-carhud-v2-2_XhXHFJu0T8.ino

Herstellungsprozess

  1. Abriss eines halbautonomen Autos für behinderte Fahrer
  2. KI für autonomes Fahren für Donkey Car Garbage Collector
  3. Echtzeit-Bewegungsplanung für autonome Autos in mehreren Situationen, Unter simulierter städtischer Umgebung
  4. Was kann 5G für das vernetzte Auto leisten?
  5. Sicherheit:Oberste Priorität für Autos der Zukunft
  6. Motorkabel für Antriebe mit variabler Drehzahl
  7. Verbesserte Drehmaschinen zum Polieren und Entgraten
  8. Drehmaschine für Präzision und Geschwindigkeit
  9. Produktdatenaustausch:ein Schmerzpunkt für Autohersteller
  10. Wie wählt man einen Turbolader für sein Auto aus?