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)
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.
Wie meinst du das mit einem weiteren Kontroller als I2C Adapter dazwischen? Kannst du mir da etwas mehr zu sagen bzw. Hardware empfehlen?
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.
#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"
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.
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
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
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
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