Alimentazione Arduino UNO + Ethernet Shield USB o Esterna

Salve a tutti,

scrivo per il seguente problema di alimentazione della coppia Arduino UNO + Ethernet Shield...

Hardware:
Arduino UNO R3 (preso con il kit base da Arduino Store)
Ethernet Shield (presa su Amazon e venduta da SWEETY LIFE)
MacBook Pro
Alimentatori vari 9V-1Ah e/o 5V-1,5Ah

Prima nota:
l'Ethernet Shield non ha l'adesivo con il MAC address, finora ci ho fatto poco caso, sappiamo cosa esso comporta, il chip sarà lo stesso delle altre ma il produttore non ha ritenuto il caso comprare degli indirizzi da distribuire i propri prodotti (nel caso specifico forse non ha nemmeno tutti i torti visto che da programma bisogna comunque impostarlo e quindi è solo un risparmio che abbatte significativamente i costi dell'oggetto) a me però fa sospettare che forse ho preso una scheda un po' troppo economica...

Il problema:
fino ad oggi avevo sviluppato il mio sketch collegando l'Arduino direttamente al Mac e non avevo avuto alcun problema, oggi ho scoperto che usando un alimentatore esterno il sistema non parte.
Ho provato con due alimentatori come da specifiche hardware di cui sopra (9 e 5V).
Si accendono il led sulla ethernet shield di PWR, COLL, FULLD e 100M; per un istante l'RX ma immediatamente si resetta.
Se collego invece l'USB il sistema parte.
Se dopo partito collego l'alimentazione esterna e scollego l'USB il sistema funziona.

I due alimentatori 1A e 1,5A credo siano sufficienti a friggerlo, gli stessi mi tengono su un Arduino UNO con display lcd 16x2, ricevitore IR e 8 relè (di un altro progetto).

Il maggior indiziato mi pare sia sta benedetta scheda Ethernet shield, ma perché tutti questi problemi in fase di avvio? Se assorbe lo dovrebbe fare sempre, no? Una volta partito il sistema (con USB) e alimentato solo da esterno mi accende led, risponde alle richieste (c'è implementato un web server), legge da SD, c'è una ragione per cui la partenza sia così critica?

Ho caricato lo sketch "blink", dagli Esempi, senza quindi inizializzare la Ethernet, anche alimentando da esterno parte! :o

Con il mio sketch, che poi non è altro che un copia incolla e qualche modifica di esempi trovati in rete, senza cavo di rete non fa praticamente nulla, ma rimane acceso, come collego il cavo di rete partono i riavvii... :confused:

Sono sconfitto... :roll_eyes:

Per completezza mi sono accorto che magari manca il codice caricato...

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <dht11.h>

dht11 DHT;

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   50
#define DHT11_PIN 9
#define SD_PIN 4


// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//IPAddress ip(10, 0, 0, 232); // IP address, may need to change depending on network
IPAddress ip (10,0,0,232);
IPAddress subnet (255,255,255,0);
IPAddress gateway (10,0,0,254);
IPAddress dnServer (10,0,0,254);
EthernetServer server(80);  // create a server at port 80
File webFile;               // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer
unsigned long oldMillisLogger=0;

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);

    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
    
    Ethernet.begin (mac, ip, dnServer, gateway, subnet);
    server.begin();           // start to listen for clients
}

void loop()
{
  // Gestione pagine Web
  serverWeb();    
  
  dataLogger(millis());
}

void dataLogger(unsigned long currentMillis) {
  if (currentMillis>=oldMillisLogger+30000) {
    oldMillisLogger=currentMillis;
    // Salva dati su SD Card
    
    // make sure that the default chip select pin is set to
    // output, even if you don't use it:
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
    Serial.print("Initializing SD card...");
    
    // see if the card is present and can be initialized:
    if (!SD.exists("logger.txt")) {
      Serial.println();
      Serial.println("File failed, or not present");
      // don't do anything more:
      File dataFile = SD.open("logger.txt", FILE_WRITE);
      //return;
    }
    if (SD.exists("logger.txt")) {
      Serial.println("File present.");
    }
  }
}

void serverWeb (void) {
  server.begin();           // start to listen for clients
  EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    // remainder of header follows below, depending on if
                    // web page or XML page is requested
                    // Ajax request - send XML file
                    if (StrContains(HTTP_req, "ajax_inputs")) {
                        // send rest of HTTP header
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send XML file containing input states
                        XML_response(client);
                    }
                    else {  // web page request
                        // send rest of HTTP header
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send web page
                        webFile = SD.open("index.htm");        // open web page file
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // display received HTTP request on serial port
                    Serial.print(HTTP_req);
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// send the XML file containing analog value
void XML_response(EthernetClient cl)
{
    int chk;
    chk = DHT.read(DHT11_PIN);    // READ DATA
    switch (chk){
      
      case DHTLIB_OK:  
                  break;
      case DHTLIB_ERROR_CHECKSUM: 
                  Serial.println("Checksum error,\t"); 
                  break;
      case DHTLIB_ERROR_TIMEOUT: 
                  Serial.println("Time out error,\t"); 
                  break;
      default: 
                  Serial.println("Unknown error,\t"); 
                  break;
    }
    Serial.print("Temeprature: ");
    Serial.print(DHT.temperature);
    Serial.print(", Humidity: ");
    Serial.println(DHT.humidity);
    cl.print("<?xml version = \"1.0\" ?>");
    cl.print("<inputs>");
    // read analog pin A2
    cl.print("<analog>");
    cl.print(DHT.temperature);
    cl.print("</analog>");
    cl.print("<analog>");
    cl.print(DHT.humidity);
    cl.print("</analog>");
    cl.print("</inputs>");
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }
    return 0;
}

Saluti
Riccardo

hai provato di resttarlo manualment?
Ciao Uwe

Con alimentatore estremo e reset manuale non cambia niente...

Si accendono tutti i led ma prima di partire con TX e RX si resetta.

È pure difficile da debuggare... Visto che con la seriale funziona! :confused:

Ma nessuno ha mai avuto problemi con l'Ethernet shield?

Io alla fine non ho capito qual'è il problema ... non parte la ethernet? si resetta ? non va con l'alimentatore esterno?
link dei componenti che possiedi?

Micromani:
Salve a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Riepilogo cercando di essere più sintetico e dettagliato possibile.

Componenti
Arduino UNO
Ethernet Shield

Il problema ce l'ho quando alimento da fonte esterna, mentre da USB funziona tutto regolarmente.

Ho provato con due alimentatori esterni differenti, da 5V 1,5Ah e da 9V 1Ah. Entrambi gli alimentatori mi "tirano" un altro progetto molto più complesso e carico di roba che però non ha la Ethernet shield...

Nelle ultime prove fatte nel weekend, ho abbandonato il mio sketch e ho caricato il "ChatServer" di esempio dell'ambiente di Arduino.

Alimentando da USB funziona.
Alimentando da Esterno reboot continuamente.

Sono quasi certo che sia un problema legato alla Ethernet Shield non originale, ma non capendo molto di elettronica volevo il parere di qualche esperto o di qualcuno che ha più esperienza.

Di Ethernet Shield ne ho solo una, quindi non ho modo di fare altre prove, mentre ho potuto testare il problema con più di un Arduino Uno.

Gli alimentatori esterni collegati dove? Sul jack? Dalle specifiche dell'hardware potrai leggere che la tensione minima è di 7v.. Con 5v non ce la fai

::slight_smile: A quanto pare un bel errore da niubbo...

Effettivamente l'alimentatore collegato al jack della scheda non era sufficiente non rientrando nelle specifiche (7-12V)!!!

Avevo sentito che il chip della Ethernet scaldava parecchio e avevo pensato di utilizzare una tensione minore...
Peccato che il gruppo alimentazione è sull'Arduino e non sulla shield :smiley:

Grazie pablos.