[SOLVED] Arduino Uno mit LED Matrix

Heyhey!
Ich versuche, meinen Nano mit einer 8x32 LED-Matrix zum Laufen zu bringen. Ich habe viele Versionen der Arduino IDE ausprobiert. Im Moment arbeite ich mit der Version 2.3.3. Ich verwende die Libraries Md_parola (3.7.3) und MD_Max72xx (3.5.1). Manchmal wird der Port, an dem mein Arduino angeschlossen ist nicht angezeigt, sobald ich ihn von der LED Matrix trenne, wird sie ab und an erkannt. Wenn ich den Code hochlade, leuchten nur zwei der 4 Matrixen und einige einzelne LED's
Hier ist der Code den ich benutze und die Hardware

Nano: https://www.digitec.ch/de/s1/product/arduino-nano-entwicklungsboard-kit-6864826?supplier=406802

LED Matrix: AptoFun 4 in 1 Dot Matrix MAX7219 MCU LED Display Module DIY Kit for Arduino: Amazon.de: Computer & Zubehör

// Use the Parola library to scroll text on the display
//
// Demonstrates the use of the scrolling function to display text received
// from the serial interface
//
// User can enter text on the serial monitor and this will display as a
// scrolling message on the display.
// Speed for the display is controlled by a pot on SPEED_IN analog in.
// Scrolling direction is controlled by a switch on DIRECTION_SET digital in.
// Invert ON/OFF is set by a switch on INVERT_SET digital in.
//
// UISwitch library can be found at https://github.com/MajicDesigns/MD_UISwitch
// MD_MAX72XX library can be found at https://github.com/MajicDesigns/MD_MAX72XX
//

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// set to 1 if we are implementing the user interface pot, switch, etc
#define USE_UI_CONTROL 0

#if USE_UI_CONTROL
#include <MD_UISwitch.h>
#endif

// Turn on debug statements to the serial output
#define DEBUG 0

#if DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#endif

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10

// HARDWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
//MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Scrolling parameters
#if USE_UI_CONTROL
const uint8_t SPEED_IN = A5;
const uint8_t DIRECTION_SET = 8; // change the effect
const uint8_t INVERT_SET = 9; // change the invert

const uint8_t SPEED_DEADBAND = 5;
#endif // USE_UI_CONTROL

uint8_t scrollSpeed = 200; // default frame delay value
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // in milliseconds

// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE 75
char curMessage[BUF_SIZE] = { "Hello bla" };
char newMessage[BUF_SIZE] = { "Hello! Enter new message?" };
bool newMessageAvailable = true;

#if USE_UI_CONTROL

MD_UISwitch_Digital uiDirection(DIRECTION_SET);
MD_UISwitch_Digital uiInvert(INVERT_SET);

void doUI(void)
{
// set the speed if it has changed
{
int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150);

if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
(speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
{
P.setSpeed(speed);
scrollSpeed = speed;
PRINT("\nChanged speed to ", P.getSpeed());
}
}

if (uiDirection.read() == MD_UISwitch::KEY_PRESS) // SCROLL DIRECTION
{
PRINTS("\nChanging scroll direction");
scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
P.setTextEffect(scrollEffect, scrollEffect);
P.displayClear();
P.displayReset();
}

if (uiInvert.read() == MD_UISwitch::KEY_PRESS) // INVERT MODE
{
PRINTS("\nChanging invert mode");
P.setInvert(!P.getInvert());
}
}
#endif // USE_UI_CONTROL

void readSerial(void)
{
static char *cp = newMessage;

while (Serial.available())
{
*cp = (char)Serial.read();
if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE-2)) // end of message character or full buffer
{
*cp = '\0'; // end the string
// restart the index for next filling spree and flag we have a message waiting
cp = newMessage;
newMessageAvailable = true;
}
else // move char pointer to next position
cp++;
}
}

void setup()
{
Serial.begin(57600);
Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline");

#if USE_UI_CONTROL
uiDirection.begin();
uiInvert.begin();
pinMode(SPEED_IN, INPUT);

doUI();
#endif // USE_UI_CONTROL

P.begin();
P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
}

void loop()
{
#if USE_UI_CONTROL
doUI();
#endif // USE_UI_CONTROL

if (P.displayAnimate())
{
if (newMessageAvailable)
{
strcpy(curMessage, newMessage);
newMessageAvailable = false;
}
P.displayReset();
}
readSerial();
}

IDE 1.8.19 mit o. a. Bibliotheksversionen und Deinem Programm:

Strange. Danke fürs probieren. Habe es mit 1.8.19 auch versucht. Benutzt du noch ein zusätzliches Kabel oder nur ein USB-Mini für die Stromversorgung + Datenübertragung? Könnte es an der LED Matrix liegen, habe zwei Stück, bei beiden funktioniert es nicht. :confused:

Ich nutze einen UNO, der hat denselben µC wie der Nano:


Bei mir sieht es wie folgt aus /zweite und dritte Matrix leuchten, Bild stellt es falsch dar). Wie hast du die Pins connected (Ground to ground usw.)?

Anschluß wie im Programm:

#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
VCC an 5V
GND an GND

Hm, bei mir genauso...an was könnte es sonst liegen? :confused:

Wenn ich das wüßte, hätte ich es Dir sofort geschrieben :face_with_monocle:

Vorsichtshalber mit Nano:

Könntest du mir den Link zu deinem Nano schicken? Ich habe mir noch einen Uno bestellt. Mal schauen wie es mit dem wird. Versuche es später nochmals :slight_smile:

Leider nein, den habe ich privat erworben.

Du könntest zur Fehlereingrenzung eine andere Bibliothek versuchen:

#include <Arduino.h>
#include <U8g2lib.h>  // Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
#include <SPI.h>

U8G2_MAX7219_32X8_F_4W_HW_SPI u8g2(U8G2_R0, /* clock= 13, data= 11, cs=*/ 10, /* dc=*/ U8X8_PIN_NONE, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  u8g2.begin();
  u8g2.setContrast(20);
  u8g2.enableUTF8Print();   // enable UTF8 support for the Arduino print() function
  u8g2.setFont(u8g2_font_pxplustandynewtv_t_all);
}

void loop(void) {
  u8g2.clearBuffer();
  u8g2.setCursor(0, 7);
  u8g2.print("äö↑↓");
  u8g2.sendBuffer();
  delay(1000);
}

Keine Animation, dafür aber UTF-8 mit Umlauten.

Es geht aber nur ums Testen :slightly_smiling_face:

Könntest du mir die Bibliotheken schreiben? Finde diese nicht :sweat_smile:

Hast du gesehen?

Jup, habe es gefunden. Hätte vielleicht nicht nach "U8g2lib" sondern"U8g2" suchen sollen. :sweat_smile:

Nope, auch nicht. Könnte es am Kabel liegen? Das Kabel ist für 30V ausgelegt. An sich sollte es reichen. ab und zu kann ich den port bei dem IDE nicht auswählen/wird nicht erkannt.

Das deutet auf ein grundsätzlicheres Problem hin, beispielsweise Stromversorgung. 8*32=256 LEDs brauchen schon einen guten Schluck aus der Leistungspulle.

Meine Arduinos hängen an einem USB3-Hub mit eigenem Netzteil, damit mein Läppi geschont wird. Auch USB-Kabel gibt es unterschiedliche. Wenn das Programm geladen ist, genügt auch ein Ladekabel mit eventuell mehr Kabelquerschnitt.

Da hilft nur probieren :crazy_face:

Hm, okay. Danke. Das Kabel würde 30V schaffen. eine 8x8 LED Matrix ist ebenfalls gerade auf dem Weg. Was würdest du meinen, was es noch bräuchte?

Ein Kabel ist doch keine Energiequelle!
Die Angaben 30V sagt etwas darüber aus mit welcher maximale Spannung das Kabel betrieben werden darf.

Hier geht es aber höchstwahrscheinlich um Strom.

Strom und Spannung sind beide "elektrisch" aber völlig verschieden.

Spannung könntest du dir als Elektronen-"Druck" vorstellen
Strom: als die Anzahl Elektronen

Vergleich mit Wasser

Du könntest an eine Hochdruckpumpe 4000 bar ein Röhrchen von 2mm Durchmesser anschließen. Dann kommt da ein dünner Wasserstrahl mit 2mm Durchmesser raus.
Aber wegen der 4000 bar würde der dir mal eben die Finger durchschneiden wie Butter

Kleiner Wasser-STROM hoher Wasser-Druck

oder du kannst an eine Riesen Mega-Kreiselpumpe die aber nur 5 bar Überdruck hinbekommt ein Riesenrohr mit 2m Durchmesser anschließen. Wenn die Pumpe selbst Megaausmaße hat (20 m Durchmesser) dann bekommt die 5 bar Druck hin auch bei einem extrem großen Wasser-STROM hin.
und aus dem 2m-Rohr würde ein riesiger Wasser-STROM herausfließen aber eben nur mit geringem Überdruck.

Wenn der USB-Port an deinem Computer nur ein paar Milliampere zustande bringt
dann könntest du da Hochspannungskabel für Millionen Volt dran hängen und es würde trotzdem nicht funktionieren.

Du könntest mal folgendes testen:

LED-Matrix vollständig abklemmen.
Arduino Nano mit dem Computer verbinden und Programm hochladen.
USB-Kabel am Computer abstöpseln und stattdessen mit einem USB 5V 2A Ladegerät verbinden.

Wenn es dann läuft liefert der USB-Port zu wenig Strom.

Danke für die Infos!
Habe es schon davor versucht, ohne LEDs hochzuladen. Habe es mit einem 5V 3A Ladegerät verbunden. Gleiches Ergebnis

und ? Was war das Ergebnis?
erfolgreich hoch geladen ja oder nein?

Was ist das für ein Ergebnis? Du solltest schon präzise beschreiben was zu sehen ist.

  • keine LED leuchtet?
  • alle LED leuchten?
  • gehen die LED wild durcheinander an aus?

LED-Matrix mit Arduino verbinden

Poste ein Foto auf dem man die Beschriftung der Anschlusspins der LED-Matrix lesen kann.

Und poste ein Foto von senkrecht oben wo zu sehen ist welches Kabel an welchen Pin des Arduino Nano dran geht.

Link posten wo du die LED Matrix gekauft hast

Link posten wo du den Arduino gekauft hast

Kabelbruch, kalte Lötstellen, Wackelkontakte, ... eine optische Kontrolle eventuell mit Lupe kann Hinweise liefern.

image

Beim Abziehen bohren sich gerne mal die Kontaktstifte in die Finger, tut weh und hilft nicht.

Siehe #1.