Centipede shield adressieren

Hallo.

Ich bin neuling in der Arduino welt, und wie erwartet stehe ich vor problemen.

Ich arbeite gerade an einem Modell, welches 36 Eingänge und 36 Ausgänge benötigen wird, wenn gar nicht sogar mehr. Deshalb werde ich einen oder gar 2 Centipeden-shield für mein Mega2560 verwenden. Da ich schon parallel am code schreibe, brauche ich natürlich die info, wie ich die ports des Centipeden ansteuern kann. Mir reicht es vollkommen aus, das sie nur High - Low können. PWM kann ich mir vom Arduino holen. Ich habe in deren Dokumentation vermutlich in erfahrung gebracht, das ein vorzeichen nötig ist.

void loop()
{
for (int i = 0; i < 15; i++) {
CS.digitalWrite(i, HIGH);
delay(10);
}
}

Ich vermute mal, es geht um das CS. Das ich erstmal im setup pinmode input, oder output deklarieren muss, ist klar.
Allerdings muss ich wissen, wie ich die pins des Centipeden direkt ansprechen kann.

Welches Centipeden-shield willst Du benutzen. Einige die ich kenne können nicht als Ausgänge verwendet werden.

Grüße Uwe

Verwenden möchte ich den hier.

http://macetech.com/store/index.php?main_page=product_info&cPath=4&products_id=23

Von diesen Shield kannst Du 2 auf dem Arduino verwenden. Das Shield hat einen Jumper für die Ardesse 0 oder 1.

ADDRESS Jumper

The MCP23017 I2C interface can have up to 8 unique bus addresses. The Centipede Shield uses X00 to X11, where X is the value of the ADDRESS jumper. This allows the Centipede Shield address space to be shifted by four places, either to prevent interference on the I2C bus with another device, or to allow two Centipede Shields to coexist.

Das Shield funktioniert nur auf einem Arduino UNO aber nicht auf dem Leonardo oder MEGA weil die I2C Pins auf diesen an anderen Pins sind.

Grüße Uwe

Ishtmi:
Hallo.

Ich bin neuling in der Arduino welt, und wie erwartet stehe ich vor problemen.

Ich arbeite gerade an einem Modell, welches 36 Eingänge und 36 Ausgänge benötigen wird, wenn gar nicht sogar mehr. Deshalb werde ich einen oder gar 2 Centipeden-shield für mein Mega2560 verwenden. Da ich schon parallel am code schreibe, brauche ich natürlich die info, wie ich die ports des Centipeden ansteuern kann. Mir reicht es vollkommen aus, das sie nur High - Low können. PWM kann ich mir vom Arduino holen. Ich habe in deren Dokumentation vermutlich in erfahrung gebracht, das ein vorzeichen nötig ist.

void loop()
{
for (int i = 0; i < 15; i++) {
CS.digitalWrite(i, HIGH);
delay(10);
}
}

Ich vermute mal, es geht um das CS. Das ich erstmal im setup pinmode input, oder output deklarieren muss, ist klar.
Allerdings muss ich wissen, wie ich die pins des Centipeden direkt ansprechen kann.

Nochmal: Das Centipede Shield wird über I2C über die Pins A4 und A5 angesteuert. Der Arduino Mega 2560 hat die I2C Schnittstelle an den pin 20 und 21.

I2C Interface

The Centipede Shield uses the official Arduino designation of I2C pins, namely the alternate functions of Analog 4 and 5 on the original Arduino pin configuration. While the Centipede Shield is in use, the analog input functions of Analog 4 and 5 cannot be used. The Centipede Shield can be accessed directly using the Wire library, or using the custom functions in the Centipede Library.

Bibliothek mit Beispielen auf: macetech.com/Centipede.zip

Ich weiß nicht was Du mit dem Code bezweckst.

Grüße Uwe

Man könnte wahrscheinlich an Pins A4 und A5 die Stifte am unteren Shield abtrennen, so dass keine Verbindung zum Arduino besteht, und dann Pins 20 und 21 von Mega mit Kabeln verbinden.

Die pins zum I2C kann ich manuell umlöten, so das die verbindung zum mega2560 passt. Das ist kein problem.

Ich weiß nur nicht, wie ich die Ein und Ausgänge am Centipeden ansteuern kann.
Wenn ich im setupbereich pinmode (51, OUTPUT); eingebe, dann werde ich vermutlich trotz Centipeden den pin 51 auf dem Arduino selbst als Ausgang erhalten.
was muss ich z.b. eingeben, damit ich pin 51 auf dem Centipeden als Ausgang erhalte?

Den Code hab ich als beispiel aus der Dokumentation des vertreibers entnommen.

void loop()
{
for (int i = 0; i < 15; i++) {
CS.digitalWrite(i, HIGH);
delay(10);
 }
}

Wenn du es nicht über das I2C Interface per Hand machen willst, brauchst du die oben verlinkte Library. Die hat Funktionen die das für dich macht.

Deshalb steht in deinem Code auch ein CS. vor digitalWrite(). Das ruft eine Funktion namens digitalWrite() in der CS Klasse auf. Nicht die digitalWrite() Funktion der Arduino IDE.

#include <Wire.h>   //I2C Library
#include <Centipede.h>   // Shield Library

Centipede CS; // create Centipede object
 

void setup()
{
  Wire.begin(); // start I2C
 
  CS.initialize(); // set all registers to default
 
  CS.portMode(0, 0b0000000000000000); // set all pins on chip 0 to output
 
  //TWBR = 12; // uncomment for 400KHz I2C (on 16MHz Arduinos)
 
}
 
 
void loop()
{  
  for (int i = 0; i < 15; i++) {
    CS.digitalWrite(i, HIGH);
    delay(10);
  }
 
  for (int i = 0; i < 15; i++) {
    CS.digitalWrite(i, LOW);
    delay(10);
  } 
}

Centipede CS; erzeugt ein Objekt das dem Centipede Shield entspricht. CS ist der Name davon.
Wire.begin(); initialisiert die I2C schnittstelle
CS.initialize(); inizialisiert die MCP23017 auf dem Centipede Shield
CS.portMode(0, 0b0000000000000000); setzt die Pins des ersten MCP23017 (Nummer 0) als Ausgänge

CS.digitalWrite(i, HIGH); setzt das pin i High.

Die Erklährung der verschiedenen Funktionen:

The Centipede Library has been updated to work with Arduino 1.0

The following code example illustrates using the Centipede Shield with the Centipede Library (download here). The library attempts to encapsulate the Centipede I/O access functions in a way that is familiar to Arduino users. the library supports using two Centipede Shields automatically; pin 64 is equivalent to pin 0 on the Centipede Shield with the ADDRESS jumper set to 1.

.digitalWrite([0…127], [LOW…HIGH]) - Acts like normal digitalWrite.
.digitalRead([0…127]) - Acts like normal digitalRead.
.pinMode([0…127], [INPUT…OUTPUT]) - Acts like normal pinMode.
.pinPullup([0…127], [LOW…HIGH]) - Activates internal 100K pullups on inputs when HIGH.
.portWrite([0…7], [0…65535]) - Writes 16-bit value to one chip. Useful for writing 16 outputs at the same time.
.portRead([0…7]) - Reads 16-bit value from one chip. Useful for reading 16 inputs at the same time.
.portMode([0…7], [0…65535]) - Write I/O mask to one chip. In binary, a 0 means output and a 1 means input. Easier to use than a long list of pinMode() commands.
.portPullup([0…7], [0…65535]) - Set pullup mask on one chip. In binary, a 0 means no pullup and a 1 means pullup is active.
.init() - Sets all registers to initial values.

CS.digitalWrite([0…127], [LOW…HIGH]) die Pins 0 bis 63 sind auf dem Shield mit Adresse 0; die Pins 64 bis 127 sind auf dem Shield mit Adresse 1;

portRead([0…7]) Die Ports (alle 16 Pins eines MCP23017) 0 bis 3 sind auf dem Shield mit Adresse 0; die Ports 4 bis 7 sind auf dem Shield mit Adresse 1; Die Rückgabe ist eine 16Bit Zahl wobei jedes Bit der Zustand eines Pins ist.

Grüße Uwe

Okay, ich glaub ich hab alles soweit verstanden.

Für den Arduino nehme ich digitalWrite(51, HIGH); und für den Centipeden nehme ich CS.digitalWrite(51, HIGH);

Ishtmi: Okay, ich glaub ich hab alles soweit verstanden.

Für den Arduino nehme ich digitalWrite(51, HIGH); und für den Centipeden nehme ich CS.digitalWrite(51, HIGH);

Ishtmi: Okay, ich glaub ich hab alles soweit verstanden.

Für den Arduino nehme ich digitalWrite(51, HIGH); und für den Centipeden nehme ich CS.digitalWrite(51, HIGH);

Ja.

Ich habe vor ein paar Tagen mein bei macetech bestelltes Centipede Shield bekommen. Herzlichen Dank nochmal in die USA. Für die schnelle Lieferung, die Beratung per EMail und die extra Sachen im Paket (Ribbon Kabel, Stecker und Breakout)

Um es auf einen Leonardo zu setzen, musste ich es etwas umbauen, die Pins sind hier etwas anders als beim UNO z.B.. Hierbei stieß ich auf Probleme, die ich nach dem Lesen von gefühlten 295 Foren- und Wikipedia-Seiten (incl der Sackgassen) lösen konnte.

Anhand der Suchanfragen hier im Forum gehe ich davon aus, daß sehr viele hier keine echten Mikrocontroller-Geeks sind. Um diesen Einsteigern - wie ich selber einer bin - den Weg zu verkürzen, folgt hier meine kurze Anleitung, wie das Centipede auf den Leonardo zu stecken ist:

Alles auf dem Centipede: Erstmal habe ich den Header für A0 bis A5 mit einer kleinen Säge (VOR dem Einlöten!!!) durchgesägt. Dies ergab 2 Header mit 4 und 2 Stiften. Den 4er habe ich auf A0 bis A3 gelötet. An den 2er habe ich 2 kurze Drähte angelötet und die Stifte um 90 Grad umgebogen.

Die offenen Enden der Drähte habe ich auf A4 und A5 gelötet und den gebastelten Winkelstecker am anderen Ende in den Arduino Leonardo in die Pins SDA und SCL gesteckt.

Nun konnte ich das Centipede ohne Probleme auf den Leonardo stacken.

Achtung!!! Dies hat mich viel Zeit gekostet (und scheint auch nirgends erwähnt zu werden):

A4 (am CP) muß mit SDA (am Leo) A5 (am CP) muß mit SCL (am Leo)

verbunden werden.

Die restliche Header hab ich ganz normal auf den CP gelötet. Zusammenstecken, USB dran: Feuer frei. Funktioniert :)