Arduino Ethernet SD Kartenleser + LCD. Doppelte PIN belegung.

Guten Morgen,

ich arbeite aktuell an einem Ethernet Tool. Es werden CDP Pakete empfangen, aufgelöst und auf einem LCD Display lesbar und kompakt dargestellt. Die empfangenen Informationen möchte ich zudem auf einer SD-Karte speichern. Der Arduino Ethernet trägt den Leser bereits mit sich. Dieser verwendet PIN 2, genau so wie das RGB 16x2 LCD Shield von Adafruit. Ich bin noch Amateure und weiß nicht ob das von der Hardwareseite bestimmt ist oder ob ich das bei der LCD oder SD Bibliothek anpassen kann. Ich bitte also um Rat, ist es möglich den SD Kartenleser und das LCD Display zu verwenden oder benötige ich andere Hardware?

Hier nochmal der Arduino und das Display.
http://www.exp-tech.de/shields-module/ethernet/arduino-ethernet-rev3-mit-poe
http://www.exp-tech.de/displays/lcd/adafruit-rgb-lcd-shield-kit-w-16x2-character-display-only-2-pins-used-negative-display

Mit freundlichen Grüßen

hi,

also falls das PoE nicht zusätzliche pins braucht (sehe ich nicht bei dem link), braucht der arduino für ethernet und SD die pins 10, 11, 12, 13 und als SS 4 (SD) und 10 (ethernet). keinen pin2. woher hast Du die info?

gruß stefan

Ups, Entschuldige ich meinte PIN 4, dieser wird vom SD Slot und dem LCD verwendet.

Wie ich die Verkaufsanziege verstehe:

Das LCD Shield verwendet nur 2 Pins !!!
Und weder D2 noch D4, Sondern A4 und A5
Denn es nutzt I2C.

Im Text steht:

This shield will not fit easily on top of an Arduino Ethernet because of the Ethernet jack height. You can use a set of stacking headers to give the shield more 'lift' above the jack.

Die Höhe ist das Problem, nicht die Pins.

Eisebaer:
hi,

also falls das PoE nicht zusätzliche pins braucht (sehe ich nicht bei dem link), braucht der arduino für ethernet und SD die pins 10, 11, 12, 13 und als SS 4 (SD) und 10 (ethernet). keinen pin2. woher hast Du die info?

gruß stefan

PoE braucht keinerlei Pins, ist auf dem Shield nur mit 5V und GND verbunden.

Gruß

Das Problem mit der Höhe habe ich mit weiteren Steckverbindungen gelöst. In der LIB von Adafruit für das RGB Display werden für die Taster PIN 0-4 belegt. Sofern ich das richtig verstanden habe. Vlt verstehe ich da auch etwas falsch?

Adafruit_RGBLCDShield::Adafruit_RGBLCDShield() {
  _i2cAddr = 0;

  _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
  
  // the I/O expander pinout
  _rs_pin = 15;
  _rw_pin = 14;
  _enable_pin = 13;
  _data_pins[0] = 12;  // really d4
  _data_pins[1] = 11;  // really d5
  _data_pins[2] = 10;  // really d6
  _data_pins[3] = 9;  // really d7
  
  _button_pins[0] = 0;
  _button_pins[1] = 1;
  _button_pins[2] = 2;
  _button_pins[3] = 3;
  _button_pins[4] = 4;
  // we can't begin() yet :(
}




void Adafruit_RGBLCDShield::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
			 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
			 uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
  _rs_pin = rs;
  _rw_pin = rw;
  _enable_pin = enable;
  
  _data_pins[0] = d0;
  _data_pins[1] = d1;
  _data_pins[2] = d2;
  _data_pins[3] = d3; 
  _data_pins[4] = d4;
  _data_pins[5] = d5;
  _data_pins[6] = d6;
  _data_pins[7] = d7; 

  _i2cAddr = 255;

ubuntuser:
Das Problem mit der Höhe habe ich mit weiteren Steckverbindungen gelöst. In der LIB von Adafruit für das RGB Display werden für die Taster PIN 0-4 belegt. Sofern ich das richtig verstanden habe. Vlt verstehe ich da auch etwas falsch?

Ja, da verstehst du was falsch!

  1. i2c Port Expander Chip
    There is one of these MCP23017 i2c (16 input/output) port expander chips in the kit. This is how we are able to only use 2 Arduino pins to run the entire LCD and buttons.

Dann liegt mein Problem woanders, ich bin von einer Doppelbelegung ausgegangen. Bisher habe ich ein Code welcher mir die CDP Informationen auf dem LCD anzeigt, sobald ich die SD.h hinzufüge blinkt das Display und ich bekomme auch keine Seriellen outputs mehr. Den Code für die CDP Operation habe ich von einer Website. Hier der GitHub Link. Ich habe lediglich ein paar Zeilen für mich geändert.

ubuntuser:
Dann liegt mein Problem woanders, ich bin von einer Doppelbelegung ausgegangen. Bisher habe ich ein Code welcher mir die CDP Informationen auf dem LCD anzeigt, sobald ich die SD.h hinzufüge blinkt das Display und ich bekomme auch keine Seriellen outputs mehr. Den Code für die CDP Operation habe ich von einer Website. Hier der GitHub Link. Ich habe lediglich ein paar Zeilen für mich geändert.

GitHub - pwariche/ArduinoCDP: CDP sniffer for the Arduino ethernet R3

Kann es sein das dein Arduino sich ständig resettet? Sind evtl irgendwelche Variabeln doppelt belegt? Reicht die Stromversorung für alle Komponenten aus?

Gruß

Es scheint wirklich das sich der Arduino einfach die ganze Zeit selbst resettet. Den Grund finde ich aber nicht. Die Stromversorgung reicht aus, es sind keine weiteren Elemente am Arduino angeschlossen außer das Display. Wen eine Variable doppelt wäre müsste mir das doch auch die IDE beim kompilieren melden oder nicht?

Systematisches Testen ist angesagt.
Kein wildes rum probieren, raten, Annahmen bauen und verwerfen.
Auch Dokuleseverweigerung ist nicht hilfreich.

sobald ich die SD.h hinzufüge blinkt das Display

Das heißt das einfache einbinden reicht...
Noch nicht mal ein sd.begin(4) ist für die Abschmierer nötig!
Oder, hast du was verheimlicht?

Tuts die SD Lib ohne Display?
Ohne das Ethernet Gedöns?
Testen!

Es scheint wirklich das sich der Arduino einfach die ganze Zeit selbst resettet.

Prüfe das!
Ist dem so?
Raten hilft nicht.

Nachtrag:
Der Code kompiliert nicht bei mir.
Da fehlt eine Datei.

Die Datei wird nicht verwendet einfach bei den Includes raus schreiben. Und in der Datei cdp_listener.cpp muss rbuf auf 600 erhöht werden sonst sind die Pakete zulange bzw der Puffer zu klein und die Pakete werde immer verworfen. Ich habe jetzt ein Anderen Code geschrieben und getestet. Dieser Funktioniert mit allen LIB's. Der Code ist einfach zusammen gewürfelt damit von allem etwas drin ist.

/*********************

Example code for the Adafruit RGB Character LCD Shield and Library

This code displays text on the shield, and also reads the buttons on the keypad.
When a button is pressed, the backlight changes color.

**********************/

// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include <SPI.h>
#include <Ethernet.h>

// The shield uses the I2C SCL and SDA pins. On classic Arduinos
// this is Analog 4 and 5 so you can't use those for analogRead() anymore
// However, you can connect other I2C sensors to the I2C bus and share
// the I2C bus.
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0F, 0x39, 0x42 };
  
  
// These #defines make it easy to set the backlight color
#define RED 0x1
#define YELLOW 0x3
#define GREEN 0x2
#define TEAL 0x6
#define BLUE 0x4
#define VIOLET 0x5
#define WHITE 0x7
EthernetClient client;

void setup() {
  // Debugging output
  Serial.begin(9600);
  
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);

  // Print a message to the LCD. We track how long it takes since
  // this library has been optimized a bit and we're proud of it :)
 
 
  if(Ethernet.begin(mac) ==0) {
    lcd.print("Failed to configure Ethernet using DHCP");
    for (;;)
    ;
  }
  
  lcd.print("My IP address: ");
  lcd.setCursor(0,1);
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
   lcd.print(Ethernet.localIP()[thisByte], DEC);
   lcd.print(".");
  }
}

uint8_t i=0;
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  // print the number of seconds since reset:

  uint8_t buttons = lcd.readButtons();

  if (buttons) {
    if (buttons & BUTTON_UP) {
      lcd.setBacklight(RED);
    }
    if (buttons & BUTTON_DOWN) {

      lcd.setBacklight(YELLOW);
    }
    if (buttons & BUTTON_LEFT) {
      lcd.setBacklight(GREEN);
    }
    if (buttons & BUTTON_RIGHT) {

      lcd.setBacklight(TEAL);
    }
    if (buttons & BUTTON_SELECT) {
      lcd.setBacklight(VIOLET);
    }
  }
}

Die Datei wird nicht verwendet einfach bei den Includes raus schreiben.

Kompiliert trotzdem nicht.
IDE 1.6.4 bleibt einfach mitten drin stehen.
ich gebe auf

rbuf auf 600 erhöht werden

Vermutung:
rbuf - viel Speicher
SD - viel Speicher

Es bleibt nicht mehr genug für den Returnstack.
Es kollidieren Stack und Variablenberech.
Überschreiben sich gegenseitig.
Fehlfunktion.

Vermutung:
rbuf - viel Speicher
SD - viel Speicher

Es bleibt nicht mehr genug für den Returnstack.
Es kollidieren Stack und Variablenberech.
Überschreiben sich gegenseitig.
Fehlfunktion.

Hier hören meine Kenntnise entwas auf.
Was ist ein Returnstack und was ist der Variablenbereich?
Wie kann man das kollidieren verhindern?

Weniger Speicher belegen oder einen größeren Controller verwenden?

Die IDE zeigt dir nach dem kompilieren den freien Speicher an.

Wie kann man das kollidieren verhindern?

Weniger Speicher verplempern.
Anderen Prozessor verwenden.

Was ist ein Returnstack und was ist der Variablenbereich?

Returnstack: Aufrufstapel – Wikipedia
Variablenbereich: Der Bereich der von deinen globalen Variablen belegt wird.

Der Variablenbereich wächst von unten nach oben.
Der Stack von oben nach unten.
Kollidieren die beiden, gibts Scherben.

Weniger Speicher belegen oder einen größeren Controller verwenden?

Der Sketch ist bisher 25KByte groß (mit SD Lib) da ist also noch Platz oder geht es um anderen Speicher?

Ich denke das könnte mir helfen oder?
Wenn ich euch bzw die Situation richtig verstanden habe geht es um den SRAM.
Aber ich verstehe nicht warum der dann überläuft sobald ich die SD Lib mit rein nehme.

Die SD Library hat eine 512 Byte Puffer zum Schreiben. Das ist 1/4 des RAMs auf dem UNO

Das F() Makro zu verwenden ist ein muss. Auch die anderen Tips sind gut. Sehr viele Leute verschwenden Speicher weil sie falsche Variablen-Typen verwenden, unnötige globale Variablen haben oder Konstanten nicht als const deklarieren.

OKey danke, ich kenne ja nun das Problem und versuche einfach den Code zu optimieren bzw weniger SRAM zu verbrauchen. Dafür gibt es genug Tut's in Google.

Vielen Dank! :slight_smile: