Consumo anomalo libreria CAN

Ciao, stavo verificando i consumi della interfaccia domotica e ho verificato 110mA. Strano, consuma troppo ho pensato.
Fatte un pò di prove ho svuotato il loop() ma nulla… consumo sempre alto.
Ho cominciato a remmare il setup() ed il consumo è sceso a 40mA quando ho commentato l’inizializzazione del modulo CAN (modulo Niren mcp2515_can)

  if (CAN_OK == CAN0.begin(CAN_40KBPS)) {
    Serial.println("Init CAN Ok");
  } else {
    Serial.println("Init CAN Error");
  }

Ultima prova, de-remmato,tolto il modulo, riavviato (Init CAN error): consumo praticamente invariato (- 5mA).
Quindi il consumo anomalo è dovuto alla libreria (Seeed-Studio)
Mentre provo qualcuno ha idee?

Sgrunt…

E' la CAN bus shield a consumare, se non la inizializzi, o non c'è, il consumo cala. :) La CAN bus shield è realizzata con l'ottimo CAN Controller MCP2515 di Microchip, in più c'è il relativo transceiver MCP2551. L'MCP2515 è in realtà un processore della serie PIC verticalizzato, con firmware integrato, per la gestione del CAN bus e come tale consuma corrente, non meno di 40 mA quando è inizializzato, poi c'è il consumo del transceiver che sono altri 5-10 mA se non trasmetti, fino a 25-30 mA, con picchi fino a 60-65 mA, se trasmetti.

Purtroppo no, senza shield il consumo della mia schedina

astrobeed: E' la CAN bus shield a consumare, se non la inizializzi, o non c'è, il consumo cala. :)

Giuro: tolto il modulo il consumo è sceso di circa 5 mA. Remmata l'inizializzazione (con o senza modulo ) il consumo scende di 70mA. Sto cercando di darmi dello scemo.... ma nn ci riesco per ora :) Adesso provo la libreria watterott che mi sembra diversa dalle altre

L'ATmega328 al massimo consuma 40-50 mA quando lavora a pieno regime, mediamente attorno ai 20-25 mA con alimentazione a 5V e clock 16 MHz. Se la corrente cala di 70 mA quando non usi la libreria, senza shield montata, mi viene da pensare che hai uno, o più, pin con una bassa resistenza verso GND o VCC e la libreria li attiva come uscite, questo comporta una eccessiva corrente attraverso il pin, in particolare controlla i pin della SPI dato che la shield dialoga tramite questo bus.

Buona idea: stavo giusto verificando che l'altra schedina che riceve il telecomando ir ed invia sul can ha un consumo di circa 50mA.... domani verifico meglio a mente fresca.

Grazie ;)

Ciao… ho fatto un pò di prove testando i pin del nano uno per uno senza ottenere alcun risultato.
Ho quindi creato un programmino di test da caricare sulle due schede (quella funzionante e quella con consumi esagerati)

#include <SPI.h>
#include <mcp_can.h>
#define MCP2520int 10   // MCP2510 CS pin -> pin 10 arduino Nano

MCP_CAN CAN0(MCP2520int);

void setup() {
  Serial.begin(9600);
 if (CAN_OK == CAN0.begin(CAN_40KBPS))
  {
    Serial.println("CAN BUS Shield init OK!");
  }
  else
  { Serial.println("CAN BUS Shield init FAILURE!");
  }
}

rilevando sempre il difetto.
Alla fine, essendo l’unica differenza tra le due schede il pin CS dell’SPI ho provato a modificare la scheda non funzionante portando il CS dal pin 8 al 10: problema risolto!
… e non mi piace neppure un pò: devo correggere tutti i circuiti stampati.
Ho provato a vedere nella libreria ma non ho trovato nulla di “utile” (non è che sia praticissimo però).

Qualche idea? Vorrei evitare di modificarmi tutti i circuiti stampati…

Aggiornamento: l'extra consumo dipende dal fatto che pur settando il CS (SS per SPI) su un pin diverso, di fatto il 10 è settato come uscita Nel mio caso il 10 essendo utilizzato ingresso, l'SPI lo setta come uscita e va a cortocircuitarsi: ecco l'extra consumo!! Inizializzando il CAN con CS=8 e definendo successivamente il pin 10 come ingresso risolvo l'extraconsumo ma il programma si pianta.

Preso da crisi mistica sono andato ad aprire l'SPI.cpp:

  if (!initialized) {
    // Set SS to high so a connected chip will be "deselected" by default
    uint8_t port = digitalPinToPort(SS);
    uint8_t bit = digitalPinToBitMask(SS);
    volatile uint8_t *reg = portModeRegister(port);

    // if the SS pin is not already configured as an output
    // then set it high (to enable the internal pull-up resistor)
    if(!(*reg & bit)){
      digitalWrite(SS, HIGH);
    }

    // When the SS pin is set as OUTPUT, it can be used as
    // a general purpose output port (it doesn't influence
    // SPI operations).
    pinMode(SS, OUTPUT);

Dato che SS è const in pins_arduino.h mi sembra che qui sia il mio problema: SPI.h non vede l'SS già configurato. Purtroppo non so come il compilatore appende i vari files o come si possa fare un debug....

Idee? una traccia? Non vedo l'ora di scoprire dove ho fatto la cavolata !!

Se non sbaglio, il pin 10, essendo il pin SS dell'hardware SPI è fondamentale che resti in modalità OUTPUT per usare il 328 come master. Puoi usarne un altro come SS effettivo, ma non puoi mettere il 10 in INPUT, pena il passaggio alla modalità Slave.

Confermo… ho fatto anche quella prova. Mi fa strano che da nessuna parte ho trovato un riferimento al fatto che se cambi SS ti perdi l’ingresso sul pin 10.

Come no? Da https://www.arduino.cc/en/Reference/SPI:

All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative. It is, however, possible to use any pin as the Slave Select (SS) for the devices. For example, the Arduino Ethernet shield uses pin 4 to control the SPI connection to the on-board SD card, and pin 10 to control the connection to the Ethernet controller.

Ottimo: la conferma che mancava... non mi resta che modificare il circuito stampato (ma porc******)