Welcome! Log In Create A New Profile

Advanced

Gestire la temperatura di 4 MK2B su MendelMax 400x400

Posted by beppexile 
Gestire la temperatura di 4 MK2B su MendelMax 400x400
January 08, 2015 02:33PM
Salve amici, dopo varie prove, credo di aver trovato un valido metodo per controllare la temperatura delle mie 4 MK2B sulla mia stampante per grandi formati.

Ecco la lista del materiale utilizzato:

n°1 Arduino UNO
n°1 Resistenza 220 ohm
n°4 Resistenze 100 kohm
n°4 NTC 100k
n°1 Interfaccia 4 relay
n°1 LCD 16x2

Ecco lo schema elettrico di collegamento:



Ecco il codice:
#include 
#include 

#define RELAY1  6
#define RELAY2  7
#define RELAY3  8
#define RELAY4  9

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 13;
const float baselineTemp = 100.0; // set temperatura da mantenere

void setup() {
  pinMode(backLight, OUTPUT);
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);

  digitalWrite(backLight, HIGH);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0,0);
}
double NTC1(int RawADC) {
  double T1;
  T1 = log(((10240000/RawADC) - 10000));
  T1 = 1 / (0.001129148 + (0.000234125 * T1) + (0.0000000876741 * T1 * T1 * T1));
  T1 = T1 - 273.15;
  return T1;
}
double NTC2(int RawADC) {
  double T2;
  T2 = log(((10240000/RawADC) - 10000));
  T2 = 1 / (0.001129148 + (0.000234125 * T2) + (0.0000000876741 * T2 * T2 * T2));
  T2 = T2 - 273.15;
  return T2;
}
double NTC3(int RawADC) {
  double T3;
  T3 = log(((10240000/RawADC) - 10000));
  T3 = 1 / (0.001129148 + (0.000234125 * T3) + (0.0000000876741 * T3 * T3 * T3));
  T3 = T3 - 273.15;
  return T3;
}
double NTC4(int RawADC) {
  double T4;
  T4 = log(((10240000/RawADC) - 10000));
  T4 = 1 / (0.001129148 + (0.000234125 * T4) + (0.0000000876741 * T4 * T4 * T4));
  T4 = T4 - 273.15;
  return T4;
}
void loop() {
  double t1 = NTC1(analogRead(0));
  double t2 = NTC2(analogRead(1));
  double t3 = NTC3(analogRead(2));
  double t4 = NTC4(analogRead(3));

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("T1:");
  lcd.print(t1);
  lcd.setCursor(7,0);
  lcd.print(" T2:");
  lcd.print(t2);
  lcd.setCursor(15,0);
  lcd.print(" ");
  lcd.setCursor(0,1);
  lcd.print("T3:");
  lcd.print(t3);
  lcd.setCursor(7,1);
  lcd.print(" T4:");
  lcd.print(t4);
  lcd.setCursor(15,1);
  lcd.print(" ");

  if(t1 > baselineTemp){
    digitalWrite(RELAY1,HIGH);
  }
  if(t1 < baselineTemp){
    digitalWrite(RELAY1,LOW);
  }
  if(t2 > baselineTemp){
    digitalWrite(RELAY2,HIGH);
  }
  if(t2 < baselineTemp){
    digitalWrite(RELAY2,LOW);
  }
  if(t3 > baselineTemp){
    digitalWrite(RELAY3,HIGH);
  }
  if(t3 < baselineTemp){
    digitalWrite(RELAY3,LOW);
  }
  if(t4 > baselineTemp){
    digitalWrite(RELAY4,HIGH);
  }
  if(t4 < baselineTemp){
    digitalWrite(RELAY4,LOW);
}
  delay(5000);
}

Come potete vedere ho utilizzato Arduino UNO per controllare le singole temperature delle 4 bed e mantenerle allo stesso stato.
Ogni relay comanderà una singola MK2B, alimentando non appena la temperatura scenderà sotto quella impostata.

Prossimamente, non appena completerò il montaggio della stampante, vorrei implementare il controllo della temperatura tramite Marlin, utilizzando uscita e ingresso dedicati su RAMPS.... ma questa è un'altra storia.
Re: Gestire la temperatura di 4 MK2B su MendelMax 400x400
January 16, 2015 03:34AM
Salve, mi sono accorto di aver omesso alcuni collegamenti nella zona delle NTC; ecco il disegno corretto.
Attachments:
open | download - Untitled Sketch_bb.png (366 KB)
Re: Gestire la temperatura di 4 MK2B su MendelMax 400x400
January 18, 2015 02:08PM
Bravo!
Re: Gestire la temperatura di 4 MK2B su MendelMax 400x400
January 18, 2015 02:36PM
Grande... Allora facciamo un bel giochino visto che hai delle ottime capacità di programmazione. Proviamo a fare un comando Tx-Rx in modo che la scheda master Arduino mega, dica alla scheda figlia arduino uno che hai, la temperatura che deve arrivare il bed. A questo punto la figlia si smazza la gestione dei 4 bed e restituisca alla madre la temperatura media dei 4. Aggiungendo questo comandino possiamo applicare a qualsiasi scheda la tua soluzione per pilotare 2 o più bed.....
Che ne dici??
Io ti posso aiutare a livello software su marlin, o meglio Marlinkimbra...


COMPRA ITALIANO - sostieni le nostre aziende - sostieni la nostra gente - sostieni il tuo popolo - sosterrai te stesso.
Alberto C. felice possessore di una Kossel K2
My Blog - My Thingiverse
Re: Gestire la temperatura di 4 MK2B su MendelMax 400x400
January 18, 2015 03:26PM
Quote
Pierinof3a
Bravo!
Grazie
Re: Gestire la temperatura di 4 MK2B su MendelMax 400x400
January 18, 2015 03:39PM
Quote
MagoKimbra
Grande... Allora facciamo un bel giochino visto che hai delle ottime capacità di programmazione. Proviamo a fare un comando Tx-Rx in modo che la scheda master Arduino mega, dica alla scheda figlia arduino uno che hai, la temperatura che deve arrivare il bed. A questo punto la figlia si smazza la gestione dei 4 bed e restituisca alla madre la temperatura media dei 4. Aggiungendo questo comandino possiamo applicare a qualsiasi scheda la tua soluzione per pilotare 2 o più bed.....
Che ne dici??
Io ti posso aiutare a livello software su marlin, o meglio Marlinkimbra...

Ciao Mago, grazie ma, non ho tutte queste grandi capacità di programmazione.... purtroppo ho qualche lacuna ma molta voglia di fare.... mi manca decisamente il tempo!
Quello che mi dici è proprio quello che vorrei fare ma, non ho ancora fatto prove perché non ho ancora finito di assemblare il piatto di stampa.
Comunque, se mi aiutate possiamo fare qualcosa di interessante.
Sicuramente userò il tuo firmware, ma ancora ho veramente molto da fare prima di completare la mia MendelMax.

Poco fa ho fatto un'altro piccolo accorgimento al codice e allo schema, mi sono accorto che le temperature rilevate dai 4 sensori variavano anche di 3 gradi di differenza una dall'altra anche in un solo secondo; non so se ho reso bene l'idea:
ho risolto inserendo qualche condensatore qua e la.
Cerco di postare al più presto i miei ultimi sviluppi.

Attualmente sto cercando di trovare un buon sistema per fissare le 4 bad in modo che si possano regolare con facilità, e che i 4 angoli di fissaggio che capitano al centro del piatto di stampa non mi diano noie con il vetro posto sopra.
Re: Gestire la temperatura di 4 MK2B su MendelMax 400x400
January 18, 2015 04:36PM
Come promesso ecco le migliorie seguite oggi:

#include 
#include 

#define RELAY1  6
#define RELAY2  7
#define RELAY3  8
#define RELAY4  9

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 13;    // pin 13 controllo retroilluminazione
const float baselineTemp = 25.0; //set temperatura

void setup() {
  pinMode(backLight, OUTPUT);
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);

  digitalWrite(backLight, HIGH); // accende retroilluminazione. Sostituire 'HIGH' con 'LOW' per spegnerla
  lcd.begin(16, 2);              // righe, colonne. utilizzare 20,4 per 20x4 LCD, etc.
  lcd.clear();                   // iniziare con uno schermo in bianco
  lcd.setCursor(0,0);            // set cursore colonna 0, riga 0
}
double NTC(int RawADC) {
  double T;
  T = log(((10240000/RawADC) - 10000));
  T = 1 / (0.001129148 + (0.000234125 * T) + (0.0000000876741 * T * T * T));
  T = T - 273.15;           // Conversione Gradi Kelvin in Celcius
  return T;
}
void loop() {
  double t1 = NTC(analogRead(0));  // ingresso sensore 1
  double t2 = NTC(analogRead(1));  // ingresso sensore 2
  double t3 = NTC(analogRead(2));  // ingresso sensore 3
  double t4 = NTC(analogRead(3));  // ingresso sensore 4

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("T1:");
  lcd.print(t1);
  lcd.setCursor(7,0);
  lcd.print(" T2:");
  lcd.print(t2);
  lcd.setCursor(15,0);
  lcd.print(" ");
  lcd.setCursor(0,1);
  lcd.print("T3:");
  lcd.print(t3);
  lcd.setCursor(7,1);
  lcd.print(" T4:");
  lcd.print(t4);
  lcd.setCursor(15,1);
  lcd.print(" ");

  if(t1 > baselineTemp){
    digitalWrite(RELAY1,HIGH);
  }
  if(t1 < baselineTemp){
    digitalWrite(RELAY1,LOW);
  }
  if(t2 > baselineTemp){
    digitalWrite(RELAY2,HIGH);
  }
  if(t2 < baselineTemp){
    digitalWrite(RELAY2,LOW);
  }
  if(t3 > baselineTemp){
    digitalWrite(RELAY3,HIGH);
  }
  if(t3 < baselineTemp){
    digitalWrite(RELAY3,LOW);
  }
  if(t4 > baselineTemp){
    digitalWrite(RELAY4,HIGH);
  }
  if(t4 < baselineTemp){
    digitalWrite(RELAY4,LOW);
}
  delay(1000);
}

Come potete notare ho sensibilmente ridotto il codice, togliendo un po di ripetizioni.

Ecco la nuova lista di materiale:

n°1 Arduino Nano V3
n°1 Resistenza 220 ohm
n°4 Resistenze 100 kohm
n°4 NTC 100k
n°1 Condensatore Elettrolitico da 100uF 25V
n°4 Condensatori Poliestere 10 nF
n°1 Interfaccia 4 relay
n°1 LCD 16x2

Ed ecco lo schema aggiornato:



E' per finire ho sostituito l'Arduino Uno con un Nano.

Edited 1 time(s). Last edit at 01/18/2015 04:37PM by beppexile.
Sorry, only registered users may post in this forum.

Click here to login