alimentazione MKR 1400

buongiorno a tutti!!
provengo da una discussione aperta in inglese..... ignoravo esistesse una sezione in italiano :disappointed_relieved:
sto impazzendo con l'alimentatore di un mio progetto che utilizza una MKR1400, vi spiego:
fino a quando la scheda e collegata al pc tutto funziona bene, ma quando e arrivato il momento di collegarlo in autonomia con un alimentatore dedicato non va pi√Ļ, sto utilizzando degli alimentatori, quelli utilizati per le strisce Led (ne ho acquistati 4) con uscita 5V con correnti 3A-5A-10A collegati tra GND e VIN, la scheda si accende si connette, poi entro 20 secondi si sconnette.
potete dirmi quali utilizzate voi? grazie

rifly:
... provengo da una discussione aperta in inglese..... ignoravo esistesse una sezione in italiano ...

rifly si è scusato con i suoi interlocutori nella sezione Inglese ed ha concluso la sua discussione in tale sezione. E' quindi autorizzato ad aprire identica discussione qui nella sezione Italiana. :slight_smile:

Guglielmo

Ora le domande ...

  1. Hai misurato la tensione di uscita di quegli alimentatori? Perché potrebbero NON essere esattamente 5V ... ::slight_smile:

  2. Hai qualche cosa collegato alla MKR? Se SI, quale è l'assorbimento di questo qualche cosa ?

Guglielmo

la tensione e regolabile da 4,7V a 5,8V inoltre alla scheda non c'è collegato nulla, ovviamte ho caricato lo sketch.
in sostanza l'mkr1400 si dovrebbe collegare al server di Blynk ed io controllo i dati dal cellulare, il fatto e che fino a quando e collegato al PC tutto funziona, nel momento in cui passo ad altra alimentazione iniziano i problemi.

... beh, se sei sicuro (ma misura con un multimetro) che stai veramente dando 5V, allora sembrerebbe che l'altra alimentazione NON è così pulità ed esente da ripple da non infastidire la MCU ... ::slight_smile:

Hai un oscilloscopio per poter controllare?

Guglielmo

si ho controllato e i 5V ci sono, poi ho visto con l'oscilloscopio e l'uscita sembrerebbe piatta, pero dato che sono alimentatori switching sono arrivato anche io a questa conclusione, infatti stavo cercando un modello che funziona dato che ho speso un bel po per questi che ho (e non ne funziona nessuno) grazie gentissimo

rifly:
... poi ho visto con l'oscilloscopio e l'uscita sembrerebbe piatta ...

metti in AC (non in DC) e poi alza l'amplificazione per divisione verticale ... vedrai che potrai misurare l'andamento :wink:

Guglielmo

buongiorno effettivamente attorno lo zero è presente un segnale a dente di sega

rifly:
buongiorno effettivamente attorno lo zero è presente un segnale a dente di sega

… riesci a misurarne l’ampiezza in mV ?

Guglielmo

non ho la possibilità di misurarlo poiché e molto sporca, ho visto ad occhio saranno 1/2,5 mV.
ora ho ordinato un alimentatore switch di alta qualità, vediamo appena mi arriva

buon giorno ti aggiorno sulla situazione..... l'alimentatore a 5V e arrivato effettivamente e di qualità ho misurato con un Agilent e l'uscita e molto stabile, pero collegando l'MKR1400 il problema non cambia.
ho notato pero che il problema secondo me e dovuto al fatto che collegando un ADS1115 tramite porta I2C dopo pochi secondi l'MKR1400 si disconnette.
Allora ho provato lo stesso sistema con MKR1000 e ADS1115 e funziona ininterrottamente da giovedì.
non so pi√Ļ su cosa ragionare per risolvere.
grazie per il supporto.

rifly:
... ho notato pero che il problema secondo me e dovuto al fatto che collegando un ADS1115 tramite porta I2C dopo pochi secondi l'MKR1400 si disconnette. ...

Emmmm ... tanto per ricordatelo in futuro :), queste sono informazioni che vanno date dall'inizio ... per me tu avevi una semplice MKR1400 che, alimentata tramite alimentatore si disconnetteva, ora viene fuori che il problema appare SOLO (se ho ben capito) se c'è collegato un modulo con ADS1115 ... ::slight_smile:

Puoi mettere uno schema dei collegamenti (incluse le alimentazioni), un link alla scheda ADS1115 che stai utilizzando e magari anche il codice di prova (breve codice per evidenziare il problema) che stai usando?

Guglielmo

inserisco intanto lo schema, pero volevo dirti che lo stesso schema con MKR1000 funziona.

questo e invece il codice:

#define BLYNK_PRINT Serial
#include <SPI.h>
#include <MKRGSM.h>
#include <BlynkSimpleMKRGSM.h>
#include <Wire.h>
#include <Adafruit_ADS1015.h>

GSMClient client;
GPRS gprs;
GSM gsmAccess;

char auth[] = "******************************";

char pin[]  = "2**9";
char apn[]  = "TM";
char user[] = "";
char pass[] = "";

Adafruit_ADS1115 adsA; //adr collegato a massa Amperometro(0x48)
Adafruit_ADS1115 adsV;//adr collegato a +3,3 voltmetro(0x49)

int zeroCrossPin = 5;
int pinGate = 6;

unsigned long teta = 9800;
int16_t sensore_I;
int lunghezza_array;
int delta = 100;
float media = 0;
int start_pin = 0;
int variabile = 10;
int variabile_0 = 0;
int variabile_180 = 0;
int variabile_corrente = 0;
float v_disturbo = 0;
float v_0 = 0;
float v_180 = 0;
float corrente = 0;
int percentuale = 0;
int ciclo_media = 1;
int v_sent_1 = 1;
unsigned long tempo_start;
unsigned long tempo_end_0;
unsigned long tempo_stop;
unsigned long tempo_end_180;
int step_value = 0;
float  r_t;
float  v_out;
float tempo_iniziale;
float tempo_finale;
int i;
int16_t results_A [15];
int16_t results_V [15];
int varianza_diff_A [15];
int varianza_diff_V [15];
int varianza_quad_A [15];
int varianza_quad_V [15];
int varianza_A;
int varianza_V;
int vettore_A[15];
int vettore_V[15];
float disturbo[10];
float R;
int zero = 8;
int centoottanta = 9;




void setup()
{
 Serial.begin(9600);
 adsA.begin();
 adsV.begin();
 adsA.setGain(GAIN_EIGHT);    // 16x gain  +/- 0.512V  1 bit = 0.015625mV
 adsV.setGain(GAIN_ONE);       // 1x gain   +/- 4.096V  1 bit = 0.125mV
 Blynk.begin(auth, gsmAccess, gprs, client, pin, apn, user, pass);
 pinMode (zeroCrossPin, INPUT);
 pinMode(zero, OUTPUT);
 pinMode(centoottanta, OUTPUT);
 pinMode (pinGate, OUTPUT);
 attachInterrupt (digitalPinToInterrupt(zeroCrossPin), generaImpulso, FALLING);
 int lunghezza_array_0 = 5;

}

void loop(){
 Blynk.run();

 int lunghezza_array_0 = lunghezza_array;
 int  lunghezza_array_180 = lunghezza_array;
 int ln_array_corrente = 2 * lunghezza_array;
 float misura_0[lunghezza_array_0];
 float misura_180[lunghezza_array_180];
 float misura_corrente[ln_array_corrente];

 int somma_A = 0;
 int somma_V = 0;

 int media_A = 0;
 int media_V = 0;

 int somq_A = 0;
 int somq_V = 0;


 int limsup_A = 0;
 int limsup_V = 0;

 int liminf_A = 0;
 int liminf_V = 0;

 float valore_A = 0;
 float valore_V = 0;

 WidgetLED led0(V6);
 WidgetLED led1(V7);
 WidgetLED led2(V13);

 for (i = 0; i < 15; i++) {
   results_A[i] = adsA.readADC_Differential_0_1();
   somma_A = somma_A + results_A[i];
   results_V[i] = adsV.readADC_Differential_0_1();
   somma_V = somma_V + results_V[i];
 }

 media_A = somma_A / 15;
 media_V = somma_V / 15;

 for (i = 0; i < 15; i++) {
   varianza_quad_A[i] = (results_A[i] - media_A) ^ 2;
   somq_A = somq_A + varianza_quad_A[i];
   varianza_quad_V[i] = (results_V[i] - media_V) ^ 2;
   somq_V = somq_V + varianza_quad_V[i];
 }

 varianza_A = (somq_A / 15);
 varianza_V = (somq_V / 15);

 limsup_A = media_A + varianza_A;
 limsup_V = media_V + varianza_V;

 liminf_A = media_A - varianza_A;
 liminf_V = media_V - varianza_V;

 for (i = 0; i < 15; i++) {
   if (results_A[i] > liminf_A && results_A[i] < limsup_A) {
     vettore_A[i] = results_A[i];
   }
   else {
     vettore_A[i] = media_A;
   }
 }

 for (i = 0; i < 15; i++) {
   if (results_V[i] > liminf_V && results_V[i] < limsup_V) {
     vettore_V[i] = results_V[i];
   }
   else {
     vettore_V[i] = media_V;
   }
 }

 somma_A = 0;
 somma_V = 0;
 for (i = 0; i < 15; i++) {
   somma_A = somma_A + vettore_A[i];
 }
 for (i = 0; i < 15; i++) {
   somma_V = somma_V + vettore_V[i];
 }

 media_A = somma_A / 15;
 media_V = somma_V / 15;
 R = 99.993567 + (0.00012614 * media_V);
 valore_A = (media_A * 0.00147848);// valore rilevato con agilent 0,584A media = 395
 valore_A = floor(valore_A * 100);
 valore_A = valore_A / 100;
 valore_V = (media_V * 0.000125 * R); // 1x gain   +/- 4.096V  1 bit = 0.125mV  0.0128445
 valore_V = floor(valore_V * 100);
 valore_V = valore_V / 100;
 Blynk.virtualWrite(V0, valore_A);
 Blynk.virtualWrite(V1, valore_V);//(V1, valore_V);
 Serial.println(valore_A);
 if (start_pin == 1)
 {

  Blynk.virtualWrite(V12, lunghezza_array_0); 
   if (media_A <= 3280) delta = 400;
   if (media_A > 3280 and media_A <= 3314 ) delta = 200;
   if (media_A > 3314 and media_A <= 3375 ) delta = 50;
   if (media_A > 3375 and media_A <= 3389 ) delta = 0;
   if (media_A > 3389 and media_A <= 3449 ) delta = 50;
   if (media_A > 3449 and media_A <= 3483 ) delta = 200;
   if (media_A > 3483) delta = 400;

   if (variabile > 0)//lettura tensione di disturbo
   {
     disturbo[variabile - 1] = valore_V;
     variabile = variabile - 1;
   }
   if (variabile == 0)// bilancia teta per centrare la corrente a 5A
   {
     if (teta <= 9800 and teta >= 1000)
     {
       if (valore_A <= 5)
       {
         teta = teta - delta;
       }
       else
       {
         teta = teta + delta;
       }
     }
     percentuale = map (teta, 9800, 800, 0, 400);
     Blynk.virtualWrite(V2, percentuale);

   }


   if ((teta < 1000 or media_A > 3214) and (v_sent_1 == 1))
   {
     step_value = 1;
     v_sent_1 = 0;
   }

   if ( step_value == 1)
   {
     led0.on();
     digitalWrite (zero, HIGH);
     digitalWrite (centoottanta, LOW);
     if (variabile_0 <= (lunghezza_array_0 - 1) )
     {
       misura_0[variabile_0] = valore_V;
       misura_corrente[variabile_corrente] = valore_A;
       variabile_0 = variabile_0 + 1;
       variabile_corrente = variabile_corrente + 1;
     }
     else
     {
       step_value = 2;
       tempo_end_0 = millis();
     }
   }
   else if ( step_value == 2 and millis() < tempo_end_0 + 2000)
   {
     led0.off();
  digitalWrite (zero, LOW);
  digitalWrite(centoottanta, LOW);


   }
   else if ( step_value == 2 and millis() > tempo_end_0 + 2000)
   {

     step_value = 3;
   }
   else if ( (teta < 1000 or media_A > 3214) and (step_value == 3) )
   {

     led1.on();
     digitalWrite (zero, LOW);
     digitalWrite (centoottanta, HIGH);
     if (variabile_180 <= (lunghezza_array_180 - 1) )
     {
       misura_180[variabile_180] = valore_V;
       misura_corrente[variabile_corrente] = valore_A;
       variabile_180 = variabile_180 + 1;
       variabile_corrente = variabile_corrente + 1;

     }
     else
     {
       start_pin = 0;
       Blynk.virtualWrite(V3, LOW);
       step_value = 4;
       led1.off();
        digitalWrite (zero, LOW);
        digitalWrite (centoottanta, LOW);
     }
   }
 }
 if (start_pin == 0 and step_value == 4)
 {
   teta = 9800;
   for (i = 0; i < 10; i++)
   {
     v_disturbo = v_disturbo + disturbo[i];
   }
   for (i = 0; i < lunghezza_array_0; i++)
   {
     v_0 = v_0 + misura_0[i];
   }
   for (i = 0; i < lunghezza_array_180; i++)
   {
     v_180 = v_180 + misura_180[i];
   }
   for (i = 0; i < ln_array_corrente; i++)
   {
     corrente = corrente + misura_corrente[i];
   }
   v_disturbo = v_disturbo / 10;
   v_0 = v_0 / lunghezza_array_0;
   v_180 = v_180 / lunghezza_array_180;
   corrente = corrente / ln_array_corrente;
   step_value = 0;
   variabile = 10;
   variabile_0 = 0;
   variabile_180 = 0;
   variabile_corrente = 0;
   percentuale = 0;
   v_sent_1 = 1;
   v_out = sqrt (( ((v_0) * (v_0)) / 2) + ( ((v_180) * (v_180)) / 2) - v_disturbo );
   r_t = v_out / corrente;
   Blynk.virtualWrite(V4, v_disturbo);
   Blynk.virtualWrite(V8, v_180);
   Blynk.virtualWrite(V9, corrente);
   Blynk.virtualWrite(V10, v_0);
   Blynk.virtualWrite(V11, r_t);
   Blynk.virtualWrite(V2, percentuale);
 }

}


BLYNK_WRITE(V3)
{
 start_pin = param.asInt();
}
BLYNK_WRITE(V5)
{
 lunghezza_array = param.asInt();
}
void generaImpulso()
{
 delayMicroseconds(teta + 50);
 digitalWrite(pinGate, HIGH);
 delayMicroseconds(100);
 digitalWrite(pinGate, LOW);
}
/[code]

>rifly: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potr√† rispondere, quindi ti consiglio di farlo al pi√Ļ presto. :wink:

fatto, scusami cercherò di fare meglio in futuro

Mmm .. vedo che stai usando Blynk (... che NON uso e NON conosco) ... ho idea che ti conviene rivolgerti al loro FORUM di supporto spiegando cosa stai facendo ... non vorrei che occorra rispettare delle tempistiche e tu con il tuo ADC NON lo stia facendo.

Guglielmo

Non conosco assolutamente quella scheda, ma è normale alimentarla con 5V da VIN?

Ciao,
P.

pgiagno:
Non conosco assolutamente quella scheda, ma è normale alimentarla con 5V da VIN?

Si, è scritto anche nel reference ...

Vin: This pin can be used to power the board with a regulated 5V source. If the power is fed through this pin, the USB power source is disconnected. This is the only way you can supply 5v (range is 5V to maximum 6V) to the board not using USB. This pin is an INPUT.

Guglielmo

Una cosa vedevo ...

Communication over cellular networks, requires current peaks above the maximum a USB port can provide. While the port reaches 500mA, a typical GSM handshake (when the board boots and registers on a network provider) could easily reach a 2A peak. Therefore it is recommended to either provide a source with a higher current limit over Vin, or having a LiPo battery of, at least, 2500 mAh.

... quindi è importante che l'alimentatore regga carichi da oltre 2A o che assieme all'alimentatore, per aiutare, venga usata anche una bella batteria Lipo.

Guglielmo