Distinguere le alimentazioni

Ciao a tutti, avrei bisogno di un'informazione: è possibile a livello di codice discriminare se l'alimentazione di Arduino arriva dalla USB o dal connettore Vin / 5v ?

Aggiungendo qualche circuito esterno è possibile sapere se la Vin o la 5V da USB sono presenti oppure no, mentre la 5V del connettore 5V è sempre presente, visto che è l'alimentazione del micro. Da codice soltanto non puoi vedere nulla.

Ah peccato :sweat_smile:
Un circuito esterno come dovrebbe esser composto?

La butto li: magari tra i due sistemi di alimentazione c'è una piccola differenza in tensione dovuta ai componenti attivi/disattivi?

Se così fosse, si potrebbe desumere andando a leggere direttamente il valore di Vcc sfruttando la Vref interna del micro.

Bisognerebbe fare qualche test

Secondo lo schema di Arduino Uno R3, puoi rilevare la presenza di Vin 7...12V dal pin 1 di IC5. Solo dal codice, no.

Se la tensione da leggere è superiore a 5.0V serve un partitore di tensione al minimo composto da 2 resistenze. Mentre se è 5.0V o meno basta collegare la tensione da misurare ad un pin analogico e leggere il valore con analogRead(pin).

Ciao.

In realtà funziona ed anche piuttosto bene.
Il principio è quello di misurare, invece che da un pin esterno, il valore della tensione di riferimento interna usando Vcc come tensione di riferimento del convertitore ADC, cosa possibile con alcuni microcontrollori AVR.

Sapendo che il valore letto corrisponde nella realtà ad 1.1V, con la formula inversa si calcola il valore reale di Vcc, a meno delle tolleranze del generatore interno di cui puoi eventualmente tenere conto.

Avevo già usato quel sistema per controllare la carica delle batterie di alimentazione... E niente non ci avevo pensato :sweat_smile:
Oggi o domani provo a fare qualche prova per vedere come funziona.

Oggi ho fatto qualche esperimento con diverse alimentazioni.
Per l'esperimento ho usato questa configurazione:

  • Arduino uno
  • Display lcd I2C collegato ai pin +5v e GND
  • Pulsante collegato sul pin 2

Molto semplicemente ad ogni pressione del pulsante viene aggiornato il valore sul display

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

void setup() 
{
  pinMode(2,INPUT_PULLUP);
  lcd.begin();
  lcd.clear();
}

void loop() 
{
  if(digitalRead(2) == LOW)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(readVcc());
  }
}

long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
     ADMUX = _BV(MUX5) | _BV(MUX0) ;
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  
 
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring
 
  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both
 
  long result = (high<<8) | low;
 
  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

E questi i risultati

image

Secondo i rilievi è possibile discriminare se sto alimentando la scheda tramite cavo usb o con alimentazione esterna

Se proprio ne sei convinto...

Applicando almeno 7V all'ingresso 7...12V, la tensione di alimentazione è 5V precisi, forniti dal regolatore a bordo; alimentando la scheda tramite USB, invece, la tensione è quella che arriva direttamente dal cavo USB meno la caduta di tensione sul cavo (che dipende dall'assorbimento della scheda), quindi 5V meno la cdt se il computer o l'alimentatore fornisce 5V, oppure 5,2V meno la cdt se fornisce 5,2V...

Quindi (se ho capito) più componenti ho collegato alla scheda e più il valore (nell'esempio 5185) tenderà a scendere?
Anche se non sono attivi?
Io pensavo di mettere la lettura della tensione ad inizio setup, dopo aver definito i pin e portato a zero le uscite...