Mega SMD Diode tauschen noch zu machen??

Hallo Leute,

bin neu hier im Forum, 26 Jahre alt und habe seit Weihnachten ein Arduino Uno und ein Mega. Soweit macht es einen Riesenspaß, damit etwas zu programmieren, nur hab ich ein blödes Problem:

Bei dem Mega bin ich bei der Montage (Verschraubung auf Holzplatte mit Moosgummi als Zwischenlage) mit dem Schraubendreher abgerutscht =(.

Dabei ist die Diode (zumindest nach dem Symbol auf der Platine zu urteilen) abgegangen.
Das Board funktioniert zwar noch, nur denke ich, irgendeine sinnvolle Funktion wird die Diode ja erfüllen. Es ist die Diode direkt an der Stiftleiste über dem USB-Port (Habe ich mit rotem Pfeil und Kreis auf diesem Bild markiert:

http://s14.directupload.net/images/140107/xati9rko.jpg

Meine Frage: Könnt ihr mir den genauen Typ sagen und kann man das noch vernünftig ausbessern, wenn man eine neue Diode besorgt, oder ist das SMD-Löten für den Laien quasi nicht zu empfehlen? Brauch ich da noch extra SMD lötpaste oder reicht noch der Rest, der noch drauf ist.

Sorry für meine etwas dummen Fragen, aber komme ursprünglich nicht aus dem elektronik-Bereich.
Vielen Dank für eure Hilfe.
Viele Grüße

Hallo,
die Diode ist nur von Bedeutung, wenn der ATMega16U2 neu programmiert wird. Für die "normale" Funktion spielt die keine Rolle. Im Eagle Schaltplan ist die Diode mit CD1206-S01575 beschriftet. Hier ist ein Datenblatt Error. Kann auch durch eine ähnliche Diode ersetzt werden. Das Pad ist eigentlich Minimelf, muss also kein 1206 Typ sein.
Ich kann mir kaum vorstellen, dass der ATMega16U2 umprogrammiert werden muss, aber wenn es mal so sein sollte, kannst du dich ja erinnern. Schau dann am besten nach einem Fablab in deiner Nähe, da kann man dir beim SMD Löten helfen.
Gruß
Reinhard

Könnte auch ein kleiner (Tantal)elko sein. Ich habe kein Eagle installiert, sonst hätte ich mir mal das File der Leiterpatte aufgemacht und geguckt, was da genau ist. Wenn du kein Lötpad (das kleine Inselchen), wo das Bauteil aufgelötet ist, abgerissen hast, stehen für einen Geübten die Chancen recht gut.
Lötpaste ist nicht erforderlich. Die braucht man nur, wenn man das Board im Ofen mit IR-Strahlung lötet. Ein Lötkolben mit feiner Spitze, möglichst dünnes Lötzinn (1mm oder darunter) und ein Tropfen säurefreies Flussmittel (ich verwende in Spiritus oder Isopropanol gelöstes Kolophonium), gute Beleuchtung eine ruhige Hand und eine Pinzette und das ist in einer Minute vergessen.
Ich habe schon noch kleineres "Vogelfutter" gelötet :wink:

Gruß Gerald

Wenn Du den ATmega16U2 (also den USB2Serial-Konverter auf dem Board) nicht umprogrammieren willst (über den gleich daneben liegenden Programmer-Anschluss), brauchst Du die Diode nicht und auch dann sollte sie nicht ultra-kritisch sein, da sie einfach eine allfällige Überspannung auf dem Reset-Anschluss über 5V abführt. Du solltest Dein Board also auch ohne Löt-Ausflüge weiter benutzen können.

Danke Leute für die ultraschnellen und kompetenten Antworten. Hier im Forum fühlt man sich ja echt gut aufgehoben.
Na ich denke, werde dann alles mal bestellen aber vorerst nicht löten, nur für den Fall der Fälle mal alles da haben. Ein weiteres kleines problem hab ich, für das es sich vielleicht nicht lohnt, ein neues Thema aufzumachen. Hier der Code:

int test_value=700;
int max_value=1023;
int max_voltage=5;

void loop()  {
int zehntel_hilf=10*test_value*max_voltage/max_value;
}

für zehntel_hilf sollte bei den angegebenen Werten also 34 rauskommen (lass ich mir in serieller Kommunikation anzeigen). Aber sowohl das Mega als auch das Uno liefert mir immer -29 :fearful:
(Das ganze soll übrigens mal ein Programm werden, was einen Analog-wert ausliest und mir daraus die einer und Zehntel-Stelle (für 7-Segment-Anzeigen) berechnet.)

Sieht jemand den Fehler?

Vielen Dank nochmal und viele Grüße

HI, dir läuft die Variable über würde ich behaupten.
700 * 10 = 7000
7000*5= 35000 und die zahl ist größer als der Wertebereich einer int.
Auch wenn du danach wieder teilst sollte die variable übergelaufen sein und somit das vorzeichen wechseln.

Der Standard Datentyp von Literalen und Berechnungen ist int. Und das sind nur 16 Bit. Und beim normalen "signed int" hast du sogar nur 15, da das 16. Bit das Vorzeichen ist.
unsigned int: 0 bis 65535
int: -32768 bis 32767

Das heißt wenn du int * int machst und über den Wertebereich kommst, hast du genau so einen Überlauf, selbst wenn du als Ergebnis einen long hast. Deshalb muss mindestens eine der Variablen ein unsigned long sein.
Das geht mit einem Cast, z.B.: (unsigned long)test_value
Oder einem Literal: 10UL * ....

Das Ergebnis muss nicht unbedingt ein unsigned long sein. Aber du musst bei sowas erst mal rechts in long rechnen.

Es ist schwierig Dir eine Diode vorzuschlagen, wenn das Arduino Mega eine Fälschung ist.

Zum Vergleich hier ein Orginaler Arduino Mega R3: arduino.cc/en/uploads/Main/ArduinoMega2560_R3_Front.jpg bzw
http://arduino.cc/en/Main/ArduinoBoardMega2560

Bei Deinem fehlt das "Made in Italy" links oben und das Arduino LOGO in der unteren rechten Ecke. Wenn Du den Arduino als "Orginal Arduino" gekauft hast, reklamier, daß es kein Orginaler ist und bestehe auf einem Orginalen.

Beim orginalArduino MEGA 2560 R3 war das Teil die Diode D2 und im Schaltbild als CD1206-S01575 bezeichent. http://www.bourns.com/pdfs/CD1206_S01575.pdf . Müßte eine Allerweltskleinsignaldiode a la 1n4148 sein. Sie diehnt dazu, den Reset zuverlässiger zu machen (unempfindlicher gegenüber elektromagnetische Störungen).

auf Seite 5:

http://www.atmel.com/images/atmel-2521-avr-hardware-design-considerations_application-note_avr042.pdf:
If not using High Voltage Programming it is recommended to add an ESD protecting diode from RESET to Vcc, since this is not internally provided due to High Voltage Programming. Alternatively, or in addition, a Zener diode can be used to limit the RESET voltage relative to GND. The Zener diode is highly recommended in noisy environments. The components should be located physically close to the RESET pin of the AVR. Figure 2-2 shows the recommended circuit on the RESET line.

Grüße Uwe

Hallo,

dank euch für die schnelle Hilfe. Nein es ist kein orginal-Arduino, kann man glaub ich für 18,00 für ein Mega auch nicht erwarten, oder?

Wie kann ich denn das am geschicktesten Handeln mit dem Bereichsüberlauf? Habt ihr ne gute Idee. Bin wie gesagt noch absoluter Anfänger im Programmieren.

Vielen Dank und Viele Grüße

Habe ich gesagt. Du musst eine der Variablen auf long bringen.

Entweder du machst das mit dem Literal (d.h. Konstanten wie dein "mal 10"): 10UL
Mit dem "UL" hintendran macht der Compiler dann nicht mehr automatisch einen int draus.

Siehe hier (unten):
http://arduino.cc/de/Reference/IntegerConstants

Oder ein sogenannter Cast (von typecast, type conversion), zu Deutsch Typumwandlung:

(unsigned long)test_value

Dann rechnet er auch ingesamt in unsigned long. Da siehst man auch manchmal das (auch in der Arduino Referenz):
unsigned long(test_value)
Aber das mag ich nicht, da es wie in Funktions Aufruf aussieht, aber keiner ist.

Hallo Leute,

nochmal danke für eure schnelle und kompetente Hilfe!

Hab die Diode wieder angelötet (Kosten Diode Reichelt 0,02Euro). Sitzt zwar minimal schief aber denk ist egal.
Brauchen tu ich sie ja eh nicht aber ist schön zu wissen: Das Board ist wieder komplett.
Hier mal ein kleines Foto:

http://s14.directupload.net/images/140117/tzol33gg.jpg

Mein Opa, der mir halten helfen musste, kommentierte das ganze mit den Worten: "Das ist ja was für halb Blinde!" :grin:

Der Code, den ich geschrieben habe, weist noch ein paar kleine bugs auf, aber denke, dass ich das demnext in den Griff bekommen werde. Wenn er vollständig funktioniert, würd ich ihn auch hochladen, falls jemand mal das gleiche machen möchte, könnte er es ja vielleicht nutzen.

Soweit, melde mich wieder, wenn alles korrekt funzt.

Viele Grüße

Hallo Leute,

auch wenns nicht zum Thema passt, wollt ich dafür dann nicht extra einen neuen Fred starten.
Arbeite grade an einer ordentlichen Rundung, da ich nur eine Nachkommastelle anzeigen lassen möchte.
Hier der Code dazu:

void loop() {
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float a = sensorValue * (5.0 / 1023.0); // Volt-Zahl umrechnen
  int b = a*100; // Hilfszahl zur Stellenfindung
  int c = (b/10)*10;   // Hilfszahl für Rundung gewinnen
  int d = b-c;         // Stelle für Auf/Abrunden gewinnen
  if (d >= 5)
  {
  int e = (a*10)+1;
  }
  else
  {
  int e = (a*10);
  }
  Serial.println(a);
  Serial.println(b);
  Serial.println(c);
  Serial.println(d);
  Serial.println(e);
  delay(500); 
}

Das Problem: er sagt immer "e was not declared in this scope"
hab auch schon versucht, das e vorher zu initialisieren aber dann zeigt er immer nur den Initialwert an.
Es muss doch möglich sein, in einer If-Anweisung eine neue Variable zu definieren, oder?

Mal wieder herzlichen Dank für eure Hilfe und einen schönen Sonntag noch!!
Viele Grüße

Variablen sind immer nur in ihren Blöcken sichtbar. Stichwort: scope

Du kannst sie aber innerhalb der kompletten Funktion deklarieren. Dann ist sie auch überall sichtbar.

EDIT:
So:

void func()
{
     int e = 0;
      
     if(....)
     {
          e = ....;
     }
}

Danke Serenifly für die immer schnelle und kompetente Hilfe.

Nach ein bisschen Tüftelei funktioniert das Programm jetzt endlich so, wie es soll. Ein korrekte Rundung auf die richtige Zehntelstelle ist auch eingebaut. Ich weiß, man hätte das wahrscheinlich auch viel eleganter und platzsparender lösen können, aber bin wie gesagt noch blutigster Programmieranfänger. Hier zur Info mal der ganze Code:

/*
Liest einen Testwert ein, wandelt in einen Spannungswert zw. 0...5V um
und gibt die Einerstelle und die (gerundete) Zehntelstelle aus.
 */
int sensorValue=600;

void setup() {                            // the setup routine runs once when you press reset:
  Serial.begin(9600);                     // initialize serial communication at 9600 bits per second:
}

void loop() {                             // the loop routine runs over and over again forever:

  float a = sensorValue * (5.0 / 1023.0); // Volt-Zahl umrechnen
  int b = a*100;                          // Hilfszahl zur Stellenfindung
  int c = (b/10)*10;                      // Hilfszahl für Rundung gewinnen
  int d = b-c;                            // Stelle für Auf/Abrunden gewinnen
  if (d >= 5)                             // auf Zehntel aufrunden
  {
    int e = (a*10)+1;                     // auswertbare Zahl gewinnen
    int einer = e/10;                     // Einerstelle der Zahl auswerten
    int zehntel = e % 10;                 // Zehntelstelle der Zahl auswerten
    Serial.println(a);                    // Alle Zwischenwerte (zum Test) ausgeben
    Serial.println(b);
    Serial.println(c);
    Serial.println(d);
    Serial.println(e);
    Serial.println(einer);
    Serial.println(zehntel);
    delay(500);                           // 500ms Verzögerung
  }
  if (d<5)                                // auf Zehntel abrunden
  {      
    int e = (a*10);                       // auswertbare Zahl gewinnen
    int einer = e/10;                     // Einerstelle der Zahl auswerten
    int zehntel = e % 10;                 // Zehntelstelle der Zahl auswerten
    Serial.println(a);                    // Alle Zwischenwerte (zum Test) ausgeben
    Serial.println(b);
    Serial.println(c);
    Serial.println(d);
    Serial.println(e);
    Serial.println(einer);
    Serial.println(zehntel);
    delay(500);                           // 500ms Verzögerung
  }
}

Als nächstes wird dann der Analogwert direkt eingelesen und einer und zehntel via 7-Segment-Anzeige (erstmal mit direkter Ansteuerung also 14 Steuerausgänge) ausgegeben.

Brauch ich eigentlich bei Ansteurung der 7-Segment-Anzeige über beispielsweise ein 74HC4511 (BCD zu 7-Segment-Treiber) noch Vorwiderstände für die 7-Segment-Anzeige? Bestimmt, oder?

Vielen Dank nochmal und viele Grüße

Ja, die Vorwiderstände brauchst du immer. Ein BCD-Decoder oder Schieberegister ändert nur die Anzahl der Steuerleitungen.

Da bietet sich dann an das zu multiplexen. Dann braucht man die 7 (oder 8 mit Punkt) Widerstände nur einmal, auch wenn man 2 oder mehr Ziffern hat.

Guck dir mal den SAA1064 von NXP an. Den gibts im bastelfreudlichen DIL Gehäuse, der kann 4x 7-Segmentanzeigen multiplexen, kostet ca. 2€ und ist recht gut erhältlich. Bei dem brauchst du keine Segmentwiderstände :slight_smile:
Außerdem kommuziert der SAA1064 über I2C mit dem Arduino. 1-2 Meter Kabel, um die Anzeige von der Steuerung etwas abzusetzen, da hin, wo man sie auch gut ablesen kann, ist kein Problem. Eine fertige Lib. gibts für diesen Chip ebenfalls.

Gruß Gerald