Problem mit "New Multi-Function Shield" am Uno

Hallo,
ich bin neu hier.
Ich bin 68Jahre alt, habe keine Erfahrungen mit Microcontrollern und kann leider kein Englisch.

Ich will mich etwas mit Arduino beschäftigen. Ich habe ein einfaches UNO-Starterkit. Um mir einige Steckorgien zu ersparen, habe ich mir ein "New Multi-Function Shield" von gearbest bestellt.

Vor der Inbetriebnahme habe ich die USB-Buchse sicher isoliert, um Kurzschlüsse zu vermeiden
Die eingebauten LED und der Buzzer funktionieren auch wie gewünscht.
Bei der 4stelligen 7-Segmentanzeige erscheinen aber wirre Zeichen.

Ich bin nach "c't-Make 2/2018 S.74" vorgegangen. (Multi-Function-Shield für Arduino | Make Magazin | Heise Magazine)
Das Shield sieht leider etwas andes aus, als dort angegeben, oder im Shop.
Es sieht aus wie auf dem angefügten Bild, aber die 4stellige Anzeige ist um 180° gedreht eingebaut, die Dezimalpunkte liegen außen. Ich kann mir aber nicht vostellen, das die Anzeige falsch eingelötet wurde, da nach meiner Meinung die beiden mittleren Digis dann gar nichts anzeigen dürften.

Vielleicht muß die Anzeige anders angesprochen werden. Ich habe aber nur Sketche gefunden, die die Anzeige ähnlich wie im Heise Sketch ansprechen gefunden.

Hat jemand einen Tipp für mich?

Viele Grüße und vielen Dank
Lothar

Leider gelingt es mir nicht, 2 Bilder anzuhängen,(This will save the text of your post, but it will not save attachments, poll or event information.) zusammen~260kB
Deshalb hier kurze Beschreibung:
1.Bild wie m erste Link, aber Jumper1 neben J2. Anzeige "3461BS" um 180° gedreht.
2.Bild Anzeide "3461BS" 12PIN, gemeinsame Anoden bei 6, 8, 9, 12.

Die Limitationen sind gewollt, da so Spammer nicht gleich 50 Posts abgeben können. Darum kann ein neuer User nicht schnell nacheinander Posts senden und auch die Bilder sind begrenzt.

Es ist möglich daß die Anzeige falsch herum (Kopfstehend) eingelötet wurde.

Gib uns bitte ein Foto Deines Shields und den Link zum Verkäufer.

Grüße Uwe

Meines sieht auch „fast“ so aus wie auf dem Foto. Nur J1 ist woanders.

Da gibt es eine Lib für.

Meines sieht auf den ersten Blick aus wie in deinem ersten Link

Hallo,

das erste Bild wurde ja doch angehängt, genauso sieht das Schield aus, nur das Display ist andersrum, die Punkte liegen außen.
Verkäufer und genaue Bezeichnung habe ich im ersten Beitrag angegeben. Ob der Artikel bei der bestellung vor ca. 4,5 Wochen exakt der gleiche bzw das gleiche Bild war, kann ich leider nicht mehr sagen.

Das Bild der Anzeige versuche ich anzuhängen. Das es vorhin nicht ging lag wahrscheinlich an der Erweiterung. Das Bild endete auf jpg, war aber in Wirklichkeit.jepg. Hab es mal abheschnitten und als .png gespeichert.
Ich kann mir nicht vorstellen, das bei dieser Anzeige, um 180° gedreht, die mittleren Anzeigen irgendwas anzeigen.

D9e LIB bringt auch nchts anderes. habe ich auch schon gestern probiert. Beinhaltet die selben Befahle für die Anzeige.

Liebe Grüße
Lothar

Ich denke auch: Display falsch rum eingelötet.

Aber ohne Foto, keine Garantie.

Danke.

Nach weiterer intensiver Suche im Internet und weiterem Nachdenken bin ich jetzt auch überzeugt, das das Display falsch herum eingelötet wurde.
Habe viele ähnliche Shields gefunden, aber bei allen war das Display anders herum.

Bei einem Preis von 3,11€ lohnt es kaum. aber ich werde mal versuchen zu reklamieren.

Viele liebe Grüße
Lothar

Das Falschherum eingelötete Display ist kein Weltuntergang. Um es Ansteuern zu können mußt Du es gar nicht mal auslöten. Wir sind schließlich alle hier Hacker die die uns zur Verfügung stehende Hardware einfach anders benutzen.

Hab mir mal den Beispielsketch mfs_display1.ino, der im Artikel von Make verlinkt ist, angeschaut und auch mal die Platine genauer betrachtet. Dazunoch das Datenblatt des KYX-3461AS7BS , das Du uns verlinkt hattest. Und noch das Bildchen im Make Artikel.
Beispielsketch:

/*
 * Make-Magazin, https://www.heise.de/make/
 * 
 * Demo fuer Multi Function Shield
 * 
 * 7-Segment-Display
 */

const uint8_t LATCH = 4;
const uint8_t CLK = 7;
const uint8_t DATA = 8;
 
const uint8_t SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};    // Segmente, die leuchten sollen pro Zahlwert (Low-Aktiv), & 0x7F Verknüpfen fuer Dezimalpunkt
const uint8_t SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};                               // Ziffernposition (gemeinsame Anode, LSB)

/*
 * @brief   Schiebt 8 Bits, MSB first raus. Als einfachere Ersatz fuer ShiftOut() von Arduino
 * @param   Datenpin
 *          Taktpin
 *          Wert
 * @return  none
 */
void MyShiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t val)
{
  uint8_t i;

  for (i = 0; i < 8; i++)  
  {
    digitalWrite(dataPin, !!(val & (1 << (7 - i))));

    digitalWrite(clockPin, HIGH);
    digitalWrite(clockPin, LOW);        
  }
}

/*
 * @brief   Ausgabe einer Zahl an einer Position auf dem Display
 * @param   welche Position (0= links, 3=rechts)
 *          Zahlwert (0..9)
 * @return  none
 */
void WriteNumberToSegment(uint8_t digit, uint8_t value)
{
  digitalWrite(LATCH,LOW);                        // Uebernahme-Takt: Ausgang Aus
  MyShiftOut(DATA, CLK, SEGMENT_MAP[value]);      // Segmente passend zum Zahlwert rausschieben. MSB zuerst
  MyShiftOut(DATA, CLK, SEGMENT_SELECT[digit]);   // Welche Stelle leuchten soll hinterher schieben
  digitalWrite(LATCH,HIGH);                       // Uebernahme-Takt: Ausgang Ein
}

/*
 * @brief   Ausgabe einer Zahl auf dem Display
 * @param   Zahl 0..9999
 * @return  none
 */
void DisplayNumber (uint16_t value)
{
  WriteNumberToSegment(0, value / 1000);          // Tausender
  WriteNumberToSegment(1, (value / 100) % 10);    // Hunderter (Modulo)
  WriteNumberToSegment(2, (value / 10) % 10);     // Zehner
  WriteNumberToSegment(3, value % 10);            // Einer
}
 
void setup ()
{
  pinMode(LATCH,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(DATA,OUTPUT);
}
 
void loop()
{
  DisplayNumber (3210);
}

Meine Annahmen / Erkenntnisse.

Um das Display und die 2 ICs (Bezeichnung "Schieberegister für 7-Segment-Display") sind keine Transistoren vorhanden. Daraus schließe ich das die 4 7-Segment-Anzeigen gemultiplext und alle Pins (die 4 Anoden (DIG1 bis DIG4) und die 8 Kathoden) direkt mit den Schieberegistern verbunden sind.

Darum kann man mit etwas Hacking die Pins herausfinden an denen die Kathoden und Anoden angeschlossen sind und diese durch die neuen Positionen ersetzen.

Im Beispielsketch steht:

const uint8_t SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};    // Segmente, die leuchten sollen pro Zahlwert (Low-Aktiv), & 0x7F Verknüpfen fuer Dezimalpunkt
const uint8_t SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};                               // Ziffernposition (gemeinsame Anode, LSB).

Hieraus kann man den Anschlußplan der Segmente zu den Ausgängen des Schiberegisters bzw Bits des übertragenen Werts herleiten.

Außerdem gibt diese Funktion Auskunft:

/*
 * @brief   Ausgabe einer Zahl an einer Position auf dem Display
 * @param   welche Position (0= links, 3=rechts)
 *          Zahlwert (0..9)
 * @return  none
 */
void WriteNumberToSegment(uint8_t digit, uint8_t value)
{
  digitalWrite(LATCH,LOW);                        // Uebernahme-Takt: Ausgang Aus
  MyShiftOut(DATA, CLK, SEGMENT_MAP[value]);      // Segmente passend zum Zahlwert rausschieben. MSB zuerst
  MyShiftOut(DATA, CLK, SEGMENT_SELECT[digit]);   // Welche Stelle leuchten soll hinterher schieben
  digitalWrite(LATCH,HIGH);                       // Uebernahme-Takt: Ausgang Ein
}

Daß das erste Schieberegister die Segmente zuständig ist und das zweite für die aktive Stelle

Der Dezimalpunkt ist eingeschaltet wenn Bit7 LOW ist (erkenne ich aus "& 0x7F Verknüpfen fuer Dezimalpunkt")
Die Null hat nur Segment - ausgeschaltet. Also ist Segment G bei Mappingwert 0XC0 oder B11000000 also Bit6
Die 6 hat nur Segment B ausgeschaltet Also 0x82 oder B10000010 also Bit1
Die 9 hat Segmente E ausgeschaltet. Also 0x90 oder B10010000 also bit4
Die 5 hat die Segmente B und E ausgeschaltet. Also 0x92 oder B10010010 B = Bit1 und E hatten wir schon.

Daraus sind einige Segmente ersichtlich und daß A = Bit0, B= bit1 ecc ergibt sich die Tabelle:

A = Bit0
B = Bit1
E = Bit4
G = Bit6
Dp = Bit7

Wobei ein LOW das jeweilige Segment Aufleuchten macht.

Da sich ein lineares Verhältnis von A B C D E F G zu 0 1 2 3 4 5 6 7 herauszustellen scheint, mache ich nicht weiter sondern nehme das mal für die restlichen Segmente an.

Des weiteren ist für die DIGITS:
1000-stelle ist Bit0 HIGH
100-stelle ist Bit1 HIGH
10-stelle ist Bit2 HIGH
1-stelle ist Bit3 HIGH

Die Bits4-Bit7 sind nicht beschaltet ( nehme ich mal so an).

Mal was zu lesen.

  1. Teil meiner Ausführung:

ich nehme mal an daß die Schieberegister die üblichen 595 sind. Auch wenn sie es nicht sind ist es für diese Ausführung egal.

  1. Schiberegister hat an den Ausgängen Q0 bis Q7 die Segmente A-G und Dp Segmente S
  2. Schiberegister hat an den Ausgängen Q0 bis Q3 die Anoden DIG1 bis DIG4 Digits D

Da bei einem umgekehrt eingelöteten Display sie Füßchen 1 bis 6 zu 7 bis 12 werden bzw die Füßchen 7 bis 12 zu 1 bis 6 ergibt sich: ( S ist Segment und D ist Digits um die 2 Schiberegister auseinanderzuhalten.)

Segment A = SBit0 = SQ0 = Pin11 wird Pin05 = DP = SBit7
Segment B = SBit1 = SQ1 = Pin07 wird Pin01 = E = SBit4
...
Segment D = SBit3 = SQ3 = Pin02 wird Pin08 = Dig3 = DBit2
...

Das lasse ich mal Dich machen. Die Segemnte und Digits werden durch das falsche Einlöten etwas herumgewürfelt aber mit etwas Dickköpfigkeit kommt man schon dahinter. Sobald man weiß wo ein DIGIT ist, kann man die Segmente auch ausprobieren indem man ein bit nach dem anderen LOW setzt (Achtung die Digits brauchen HIGH)

Ich hoffe ich habe keinen Fehler gemacht aber irgendwer wird mich schon korrigieren. Meine Theorie kann ich aus mangel an einen Multifunktions-Shield mit falsch eingelöteten Display nicht ausprobieren.

Grüße Uwe

Hallo.

Leider habe ich erst heute wieder hier reingeschaut und Uwe's Post damals nicht mehr gelesen.
Ich hatte mich damals mit ein paar anderen Anfänger-Beispielen beschäftigt. Ich hatte mich dann mit meinem Sohn über das Shield mit dem verdreht eingelöteten Display unterhalten. Er hatte die gleiche Meinung wie Uwe.
Die Annahmen von Uwe stimmen alle.
Das mit den Segmenten habe ich im Prinzip verstanden, aber durch die unsymmetrische Lage der gemeinsamen Anoden der Anzeige, wird die Reihenfolge der zu sendenden Bits für die Segmente und die Stellen durcheinandergewürtfelt. Das Ist mir als Anfänger (keinerlei Programmiererfahrung) zu hoch.
Mei Sohn hat mir dann einen Sketch geschrieben, mit dem ich Ganzzahlen von 0 bis 9999 darstellen kann. Damit war ich erstmal zufrieden und habe auf die Reklamation verzichtet, die voraussichtlich auch 4Wochen gedauert hätte.

Vielen Dank

Grüße
Lothar

Ich verstehe daß das für einen Anfänger schwieriges Unterfangen ist.
Aber wenn Du später mal Lust bekommst es selbst zu programmieren:

Setze alle 12 Bit auf H
Dann setzt Du ein Bit Deiner Wahl auf LOW

Wenn Du jetzt nicht 2 Anoden getroffen hast dann müßtedas gleiche Segment auf allen 4 Stellen leuchten.
dann so weiter und Du finest alle Segmente.

Dann alle LOW und eine Anode auf H eine Stelle müßte ein 8 anzeigen.

So bekommst Du alle Anschlüße heraus.

Dann machst Du 2 Konversionsarrays, eins für jeden 595. Du gehst einfach mit der Zahl rein und dann den Wert den Du übertragen mußt. Dann mußt Du aber noch die Bits für die Anoden setzen.

Grüße Uwe