MAX 7219 LED Matrix an TWI/I²C

Hallo,

ich habe mir folgendes LED Modul gekauft:
http://www.ebay.com/itm/251296685824

Ist es möglich, dieses Modul auch am TWI/I²C Bus zu betreiben? Falls ja, kann mir dann bitte jemand die "Verdrahtung" an einem Arduino Nano erklären? Zur Info, es läuft ohne Probleme wenn ich das Modul bspw. an Port 10,11,12 mit den im Internet zu findenen Samples teste. (Max72XX scrolling text code - LEDs and Multiplexing - Arduino Forum)

Ich würde es aber gerne in dieses Projekt einbinden ohne den ganzen Sketch umzubasteln.
http://wirmachenroboter.com/node/36035

Vielen lieben Dank für eure Hilfe!

Natürlich ist es möglich wenn Du einen weiteren Kontroller als I2C Adapter dazwischenschaltest. Der MAX7219 hat keine I2C Schnittstelle. Du kannst aber andere pins als Interface nehmen. Dazu wirst Du aber die Bibliothek oder das Beispielprogramm modifizieren müssen.

Ciao Uwe

Vielen Dank für deine Antwort.

  1. Wie meinst du das mit einem weiteren Kontroller als I2C Adapter dazwischen? Kannst du mir da etwas mehr zu sagen bzw. Hardware empfehlen?

  2. Macht es Sinn an der Bibliothek Modifikationen vorzunehmen? Wenn ich mir ein LCD 16x2 mit I2C Backpack hole, müsste ich ja dann die Veränderungen wieder rückgänig machen?!?
    Im Sketch Veränderungen vorzunehmen fällt mir noch ziemlich schwer. Ich habe zwar etwas Erfahrungen mit Arduino (MultiWii, Arducopter) aber gestern haben entweder die Servos gezuckt und die LED Matrix hat funktioniert oder aber anders rum.

Das hat mM nach nichts mit dem LCD 16x2 zu tun. Was hast du genau vor mit dem Modul? Es braucht gar keinen I2C. Kannst es doch am SPI Bus betreiben.

Ich möchte die LED Matrix in dem wirmachenroboter Sketch einbinden ohne großartig am Sketch "rumzufummeln"

Der Sketch beinhaltet:

#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h" 

Adafruit_8x8matrix matrix = Adafruit_8x8matrix(); 
int ledMtxMode = 0;
#ifdef USE_LED_MTX
  // initialize LED matrix
  matrix.begin(0x70);  // pass in the address 
  distance = 10;
  UpdateLEDMtx();
  delay(5000);
  distance = 5;
  UpdateLEDMtx();
  delay(5000);
  distance = 1;
  UpdateLEDMtx();
  delay(5000);
  distance=100;
#endif

Wenn ich das richtig verstehe, dann wird das LED in diesem Sketch via I2C angesprochen. I2C (weis ich jetzt) kann meine LED Matrix nicht. Ich suche also nach einer Möglichkeit ein I2C "Backpack" dazwischen zu koppeln oder ein weiteren Kontroller (ein weiteres NANO Board?!?) anzuklemmen.

SPI ist doch das, was ich "umgehen" möchte. Oder sehe ich das falsch?

//We always have to include the library
#include "MAX7219.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 ***** Please set the number of devices you have *****
 But the maximum default of 8 MAX72XX wil also work.
 */
MAX7219 lc=MAX7219(12,11,10,2);

Dafür muss ich doch den kompletten Sketch umbauen?!?

Um fundierte Programmierkenntnisse kommst Du nicht umher. Jetzt nicht und in jeder zukünftigen Änderung. Darum lern ein wenig C.

Ich suche also nach einer Möglichkeit ein I2C "Backpack" dazwischen zu koppeln oder ein weiteren Kontroller (ein weiteres NANO Board?!?) anzuklemmen.

Ja, zB ein weiteren Arduino NANO oder einen ATmega328 alleine. Du mußt auf alle Fälle die Umsetzung der beiden Schnitstellen selbst programmieren und die Bibliothek an die Ansteuerung des MAX7219 über den I2C Bus angleichen. Mit etwas Programmiearbeit. Es genüt auch ein I2C Port Expander mit dem Du auf denA usgängen die serielel ansteuerung des MAX7219 machst. Das mußt Du auch selbst programmieren.

Es müßte genügen wenn Du bei
MAX7219 lc=MAX7219(12,11,10,2);
die Pins änderst und den MAX7219 an die dementsprechenden Pins hängst.
Anderseits könnte das aber auch so funktionieren da SPI eine CS Signal (in diesem Fall Pin2) verwendet. Aber ohne den gesamten Sketch muß ich sagen, daß ich nur rate.
Grüße Uwe

Wenn ich darf und du mal drüber schauen willst haben ich hier den von mir angepassten Sketch:

Ich habe es jetzt hinbekommen das sich die Servos bewegen und die LED-Matrix angesteuert wird. Leider stehe ich wieder vor einem Problem. Die Servos laufen nur flüssig wenn ein statisches Bild auf der LED Matrix angezeigt wird. Sobald ich versuche eine kleine Animation drauf laufen zu lassen, bewegen sich die Servos nur noch sehr langsam. Warum das so ist habe ich auch verstanden. Ich habe den I2C Code nur auskommentiert und den neuen Code einfach hinzugefügt.

Im Loop Teil wird "writeAOnMatrix" (der Buchstabe A wird angezeigt) aufgerufen. Sobald ein delay > 0 eingestellt ist (um bswp. auf einen anderen Buchstaben zu wechslen oder die LED's zu faden) bewegen sich die Servos im Schneckentempo. Was ich jetzt machen müsste, wäre so etwas wie:

Sonar registriert Hindernis im Abstand von X cm -> LED Matrix zeigt "!"
Sonar registriert kein Hindernis -> LED Matrix zeigt irgendwas anderes.
Schön wäre noch Roboter wird eingeschaltet -> LED Matrix zeigt eine Art "Bootup-Sequence"

Navigation_2.ino (26.7 KB)

Mit delay() darfst du sowieso nicht arbeiten, wenn du verschiedene Sachen gleichzeitig machen will. Das geht gut wenn man eine Sache macht und man nicht noch andere Ausgaben oder Eingaben hat die abgearbeitet werden müssen. Aber ansonsten hält das einfach den Prozessor an und es läuft gar nichts mehr.

Dafür gibt es die millis() Methode, mit der man die abgelaufene Zeit erhält und vergleichen kann. Siehe das mitgelieferte BlinkWithoutDelay Beispiel.

Sobald ich versuche eine kleine Animation drauf laufen zu lassen, bewegen sich die Servos nur noch sehr langsam.

Bist Du sicher, daß Du kein Problem mit der Stromversorgung hast?

Grüße Uwe

Wenn ich diesen Sketch richtig interpretiere, dann macht der Roboter eine winzige Servobewegung scannt per Sonar ob ein Hindernis vorhanden ist und reagiert entsprechend (anhalten, ausweichen einleiten). Sobald ich aber meinen Codeschnipsel der LED-Matrix in den Loop Teil bringe, macht der Servo einen winzigen Schritt, das Sonar scannt, Reaktion (anhalten, ausweichen einleiten), LED-Code abspielen, von vorne beginnen.

Das bedeutet mM nach, dass ich den Bewegungsablauf der Servos zwischen jedem "Microschritt" mit meinem LED-Code unterbreche bzw. die Servos so verlangsame.

void loop()
{
  //this is the main update loop for the microcontroller
  
  //update the current action
  UpdateAction();
  
  //get the frame from the current action  
  int frame[numberOfServos];
  action->GetCurrentFrame(frame);
  
  //set the servo positions for this frame number
  SetServoPositions(frame);                    

writeAOnMatrix();
}

Richtig! Der Arduino ist ja kein Mehrkernprozessor, sondern muß alles schön nacheinander abarbeiten :slight_smile:
Entweder du nimmst beim Codeschnippsel für den MAX7219 die Pausen raus, indem du Schleifen und Counter ins Programm einfügst, die nach n Durchläufen dann einen Befehl für die Lib vom MAX auslösen, oder du investierst in Hardware. Also einen 2. Arduino, der seriell, oder durch mehrere Ports gesagt bekommt, was er an den MAX schicken soll. So wird der Robbi nicht gebremst, weil sich der 2. Controller ums Mäusekino kümmert XD

Gruß Gerald

Der MAX7219 steuert autonom die Matrix in multiplex an Du mußt ihm nur 8 Byte übermitteln die den einzelnen LED der Matrix entsprechen.
Grüße Uwe

Pronzipiell richtig, Uwe. Aber wenn er mit millis Pausen zum Anzeigen einfügt, dann wartet halt auch der Servo. In wieweit in der LEDcontrol lib Pausen drinstecken, oder wie stark sie den Code für die Servos verzögert, vermag ich nicht einzuschätzen.

nix_mehr_frei:
In wieweit in der LEDcontrol lib Pausen drinstecken, oder wie stark sie den Code für die Servos verzögert, vermag ich nicht einzuschätzen.

Das kann ich auch nicht sagen. Um Klarheit zu bekommen muß man die Bibliothek analysieren.
Grüße Uwe

So, ich habe es hinbekommen.

Alle 4 Servos bewegen sich.
Sobald das Sonar ein Hindernis zw. 10 und 5 cm erkennt wechselt die LED Matrix auf ein anderes Bild und unter 5cm auf ein drittes Bild und der Roboter dreht sich nach rechts weg bis kein Hindernis mehr vorhanden ist.

Das ganze ist zwar etwas vom Thema I2C abgeschweift...aber was soll's :slight_smile:

MfG

Sm0key:
So, ich habe es hinbekommen.
...
Das ganze ist zwar etwas vom Thema I2C abgeschweift...aber was soll's :slight_smile:

Ziel wars ja nicht die I2C Schnittstelle für die LED-Matrix zu benutzen sondern den Sketch zum funktionieren zu bringen und das hast Du ja erreicht.

Grüße Uwe