Go Down

Topic: Arduino brickato dopo tot ore di funzionamento (Read 647 times) previous topic - next topic

Lzan74

Sep 17, 2018, 11:29 am Last Edit: Sep 17, 2018, 11:31 am by gpb01
Ciao a tutti, ho realizzato con arduino nano (clone) un sistema di termoregolazione che semplicemente legge la temperatura da un sensore DS18B20 e tramite un transistor Bjt usato come interruttore, modula la velocità di una ventola pc con un'onda quadra pwm il tutto con isteresi.
Il sistema ha alimentazione compresa tra 12.5 e 14 proveniente da una batteria auto. (14V quando è sotto carica da un alimentatore di ricarica batteria collegato alla 220V).

Il primo progetto ha funzionato regolarmente per circa un anno (non sempre acceso in maniera continuativa) dopodiché arduino si è fermato con led fisso e non è più stato possibile riprogrammarlo. Sostituito con uno nuovo questo è durato poco più che qualche giorno e poi led fisso.

Quello che volevo chiedere è dove ho sbagliato nel realizzare l'hw, se mancano delle protezioni e come intervenire per migliorarlo (es. mettere uno stadio di alimentazione bulk fisso a 12v  se servisse)

Lo sketch usato è questo:

Code: [Select]

#include <OneWire.h>
#include <DallasTemperature.h>

#define PIN_FAN 3
#define PIN_LED 13
#define PIN_ONE_WIRE_TEMP 8
#define MIN_TEMP_FAN_ON 43
#define MIN_TEMP_FAN_OFF 39
#define TEMP_FAN_CONST_LOW 30
#define MAX_TEMP_FAN_ON 50

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(PIN_ONE_WIRE_TEMP);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup() {
  // put your setup code here, to run once:
  pinMode(PIN_FAN, OUTPUT);
  pinMode(PIN_ONE_WIRE_TEMP, INPUT);
  pinMode(PIN_LED, OUTPUT);
  //Serial.begin(9600);

  // Start up the library
  sensors.begin();
  analogWrite(PIN_FAN, 0);
}

bool LedIsOn = false;
bool startFirst = true;

void temp2Led(int temp)
{
  int dec = temp / 10;
  int unit = temp % 10;

  digitalWrite(PIN_LED, LOW);
  for (int ii = 1; ii <= dec; ii++)
  {
    digitalWrite(PIN_LED, HIGH);
    delay(200);
    digitalWrite(PIN_LED, LOW);
    delay(200);
  }

  delay(1000);

  for (int ii = 1; ii <= unit; ii++)
  {
    digitalWrite(PIN_LED, HIGH);
    delay(200);
    digitalWrite(PIN_LED, LOW);
    delay(200);
  }
  delay(2500);
}

void loop() {
  // put your main code here, to run repeatly:
  float temp;

  //Serial.print(" Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  //Serial.println("DONE");

  //Serial.print("Temperature for Device 1 is: ");
  temp = sensors.getTempCByIndex(0);
  //Serial.print(temp);

  if (temp < 10 || temp > 70)
  {
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(750);              // wait for a second
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);              // wait for a second
  }
  else
  {
    temp2Led(int(temp));
  }

  if (temp > (MIN_TEMP_FAN_ON))
  {
    if (startFirst)
    {
      startFirst = false;
      analogWrite(PIN_FAN, 255);
      delay(2000);
    }

    if (temp >= MAX_TEMP_FAN_ON)
    {
      analogWrite(PIN_FAN, 255);
      //Serial.println("Il valore PWM è ");
      //Serial.println("255");
    }
    else
    {
      analogWrite(PIN_FAN, int(temp - TEMP_FAN_CONST_LOW) * 12 + 10);
      //Serial.println("Il valore PWM è ");
      //Serial.println((temp - MIN_TEMP_FAN_ON) * 12);
    }
  }
  else if (temp < (MIN_TEMP_FAN_OFF))
  {
    analogWrite(PIN_FAN, 0);
    startFirst = true;
    //Serial.println("Il valore PWM è ");
    //Serial.println("0");
  }
  delay(1000);
}



E lo schema è questo:
(https://ibb.co/ckwRnK)

Schema

gpb01

#1
Sep 17, 2018, 11:31 am Last Edit: Sep 17, 2018, 11:31 am by gpb01
... in conformità al regolamento, punto 7, il codice va racchiuso tra i tag CODE e non i tag quote che hai usato tu. Per questa volta correggo io, ma ricordatene per il futuro, grazie. ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Patrick_M

#2
Sep 17, 2018, 01:08 pm Last Edit: Sep 17, 2018, 01:13 pm by Patrick_M
Quote
Il sistema ha alimentazione compresa tra 12.5 e 14 proveniente da una batteria auto.
mi sembra tantino per l'arduino...
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

gpb01

#3
Sep 17, 2018, 01:26 pm Last Edit: Sep 17, 2018, 01:26 pm by gpb01
... Quello che volevo chiedere è dove ho sbagliato nel realizzare l'hw, se mancano delle protezioni e come intervenire per migliorarlo (es. mettere uno stadio di alimentazione bulk fisso a 12v  se servisse) ...
... ma è montato in "auto" ed è alimentato mentre il motore è acceso ? ? ?

Guglielmo
Search is Your friend ... or I am Your enemy !

Lzan74

... ma è montato in "auto" ed è alimentato mentre il motore è acceso ? ? ?

Guglielmo
No, si tratta della batteria servizi del camper. Normalmente ha solo carichi tranne quando in campeggio viene attaccata al caricabatterie 220v.

uwefed

#5
Sep 17, 2018, 03:02 pm Last Edit: Sep 17, 2018, 03:03 pm by uwefed
Sappiamo dire qualcosa su del Hardware originale ma con dei cloni che ne noi ne Tu sai chi li ha fabbricati e che componenti ha usato no.

14 V sono tantini. Non hai dato delle secifiche sul circuito percui non sappiamo se hai cotto la scheda perché lo stabilizzatre diventa troppo caldo.

Ciao Uwe

Lzan74

Sappiamo dire qualcosa su del Hardware originale ma con dei cloni che ne noi ne Tu sai chi li ha fabbricati e che componenti ha usato no.

14 V sono tantini. Non hai dato delle secifiche sul circuito percui non sappiamo se hai cotto la scheda perché lo stabilizzatre diventa troppo caldo.

Ciao Uwe
Non capisco di quali specifiche parli, ho allegato lo schema del circuito nel primo post con relativo Sketch...

Claudio_FF

#7
Sep 17, 2018, 05:30 pm Last Edit: Sep 17, 2018, 05:30 pm by Claudio_FF
Quote from: Lzan74
Non capisco di quali specifiche parli
Di quelle dichiarate dal costruttore della scheda.

In ogni caso su qualsiasi Arduino meglio non entrare su Vin con più di 9V.
Quindi metti uno zener da 3.3V 1W in serie  al pin Vin in modo da ridurre di 3.3V la tensione in ingresso alla scheda.

Oltre a questo non sappiamo da dove è presa la massa. Se si trova in un punto distante dalla batteria allora lungo quel percorso potrebbero formarsi ulteriori picchi di tensione che vanno a sommarsi a quella già presente. Potrebbe bastare un elettrolitico da un cento µF tra Vin e GND di Arduino.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

Lzan74

Di quelle dichiarate dal costruttore della scheda.

In ogni caso su qualsiasi Arduino meglio non entrare su Vin con più di 9V.
Quindi metti uno zener da 3.3V 1W in serie  al pin Vin in modo da ridurre di 3.3V la tensione in ingresso alla scheda.

Oltre a questo non sappiamo da dove è presa la massa. Se si trova in un punto distante dalla batteria allora lungo quel percorso potrebbero formarsi ulteriori picchi di tensione che vanno a sommarsi a quella già presente. Potrebbe bastare un elettrolitico da un cento µF tra Vin e GND di Arduino.
Sicuramente la massa è a qualche metro di distanza. Comunque vedo che tutte le risposte al problema sono orientate all'alimentazione.
Appena arriva una nuova schedina apporterò le modifiche suggeritemi.
Intanto grazie a tutti per le dritte

icio

Se il tuo nano compatibile monta un uA78M05 lo puoi alimentare fino a 30VDC, se monta un 1117 fino a 12VDC, in tal caso è auspicabile una preregolazione dell'alimentazione con filtro sull'alimentazione

paulus1969

Quello che volevo chiedere è dove ho sbagliato nel realizzare l'hw,

Secondo me a partire da questo punto:

Quote
... ho realizzato con arduino nano (clone) ...

Nello schema manca il collegamento a GND della scheda Nano (quasi sicuramente avrai dimenticato di segnare questo collegamento nello schema).

Esistono anche schede "clone" o meglio ancora "copie legali" di qualità, ma se hai messo una di quelle schede da un paio di euro, soprattutto se la alimenti con quelle tensioni così alte, è normale che si vada a rovinare (talvolta si rovinano anche da sole, o meglio sono già fatte in partenza con pezzi di scarto recuperati).

Lzan74

1) La massa di arduino non è disegnata ma c'è ed è in comune con tutte le altre;
2) Monta un 1117, che però non sembra essersi bruciato, in uscita ha 5V.

Giusto per curiosità: l'arduino originale monta anch'esso un 1117 e il sito riporta nella sezione Power: "[...]6-20V unregulated external power supply (pin 30)[...]", come da datasheet (max 15V raccomandato).

paulus1969

Molto meglio se vai con 9 volt.

Probabilmente si sarà rovinato qualche altro componente, succede su queste schede. A meno che ti sia entrata qualche altra tensione da qualche parte, in tal caso si sarebbe bruciato anche un originale.

zoomx

se monta un 1117 fino a 12VDC,
Pare che in alcuni cloni cinesi il 1117 è falso e oltre i 10V ha la tendenza a farli passare tutti. A me però fino adesso non è capitato.



icio

Se ne dicono tante di leggende

Probabilmente il MC non è guasto ma solo brikkato, senza programmatore parallelo è quasi impossibile disattivare il RSTDISBL

Inoltre se presente il bootloader bisogna proteggerlo impostando
MODE3 in ISP/parallel programming.
MODE1 in Application section
MODE3 in Boot section
Flag BOOTRST enabled

Un'altra cosa che sarebbe sempre meglio fare è resettare il MC se la tensione dei 5V scende sotto i 4.2V anche per un picco, ci sono dei chip apposta per fare questo, costano poco, oppure in mancanza attivare sempre il BOD LEVEL a 4.3V

Go Up