помогите с подключением хотенда и термистора

Beginner_a
Offline
Зарегистрирован: 09.04.2019

Помогите с подключением хотенда и термистора к CNC Shield v3.0 (на базе Arduino UNO)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Маловато будет...

Информации, говорю, маловато будет. Марки оборудования, даташиты и т.д. давайте. Иначе никто Вам не поможет - хрустальные шары и кофейная гуща запрещены на этом форуме.

svm
Offline
Зарегистрирован: 06.11.2016

У меня стоят отдельно. Блок управления принтером  (4 драйвера), работают от LPT порта под МАТЧем. И отдельно блок управления хотэндом и столом (атмега 168 и два мосфета). Вывод данных и простенькой графики на  экран от  старой Нокии С115, Есть более старый вариант на 7 сегментнм индикаторе, но без ПИДа. Хотя около двух лет работает удовлетворительно и менять его влом.

Сам регулятор:

#include <Adafruit_GFX.h>
#include <ST7558.h>
#include <Wire.h>
#include <PID_v1.h>

//***********************Входа*********************************
#define T1 A6                //thermistor 1 подключен к A1
#define T2 A7                //thermistor 2 подключен к A0
#define Pot_Extruder_Pin  A2 // установка температуры экструдера
#define Pot_Bed_Pin       A1 // установка температуры стола
//***********************Выхода********************************
#define ExtruderOutput 10    //выход нагрева экструдера
#define BedOutput 9          //выход нагрева стола
#define RST A0               //сброс  С115
ST7558 lcd = ST7558(RST);

unsigned long StartTime;
long POT_previousMillis = 0; // will store last time LED was updated
long POT_interval = 300;     // Периодичность проверки установок температуры 
long Ustan_previousMillis =0;// 
long Ustan_interval = 2000;  // Длительность режима установки
long Display_previousMillis =0;
long Display_interval = 500;// Периодичность вывода на дисплей
double Current_Extruder_Temp = 0;
double Extruder_Temp = 185;
double Set_Extruder_Temp = 185;
double Current_Bed_Temp = 0;
double Bed_Temp = 75;
double Set_Bed_Temp = 75;
byte rev;
int Extruder_Pot_Value;
int Bed_Pot_Value;
float current_cels;

#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH  40
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x3, 
0xc7, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0xff, 0xf3, 0xcc, 0x0, 0x0, 0x33, 0xcf, 0xff, 0xff, 0xf3, 
0xcc, 0x0, 0x0, 0x33, 0xcf, 0xff, 0xff, 0xf3, 0xcc, 0x0, 0x0, 0x33, 0xcf, 0xff, 0xff, 0xf3, 
0xcc, 0x0, 0x0, 0x33, 0xcf, 0xff, 0xff, 0xf3, 0xc7, 0xff, 0xff, 0xe3, 0x0, 0x60, 0x6, 0x0, 
0x0, 0x78, 0x1c, 0x0, 0x0, 0x3c, 0x38, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x4, 0x0, 0x0, 
0x0, 0x0, 0x40, 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 
0x0, 0xf, 0xf0, 0x0, 0xc0, 0x0, 0xf8, 0x3, 0xc0, 0x0, 0x70, 0x3, 0xc0, 0x3, 0xe0, 0x3, 
0xc0, 0x7, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xfb, 
0xd8, 0xc1, 0x83, 0x1b, 0xdf, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xf3, 0xc7, 0x0, 0x0, 0xe3, 
0xc2, 0x0, 0x0, 0x43, 0xc0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe  };
void setup()   {
  Wire.begin();
  lcd.init();
  lcd.setContrast(65);
  rev=1;// показать реальную температуру экструдера
  pinMode(ExtruderOutput, OUTPUT);
  digitalWrite(ExtruderOutput, LOW);
  pinMode(BedOutput, OUTPUT);
  digitalWrite(BedOutput, LOW);
  initPID();
  }
void loop() {
 if (millis() - POT_previousMillis > POT_interval) 
{
POT_previousMillis = millis(); 

//Extruder_Temp=Current_Extruder_Temp;
// Чтение резистора установки экструдера
Extruder_Pot_Value = analogRead(Pot_Extruder_Pin); // Установка температуры экструдера (150-350 С)
Extruder_Pot_Value = map(Extruder_Pot_Value, 0, 1023, 150, 350); 
Set_Extruder_Temp = Extruder_Pot_Value;
// изменения были? 
 if (abs(Set_Extruder_Temp-Extruder_Temp)> 2)  {rev=1; // если да-устанавливаем режим дисплея
 Extruder_Temp=Set_Extruder_Temp;
 Ustan_previousMillis = millis();}


// Чтение резистора установки стола
Bed_Pot_Value = analogRead(Pot_Bed_Pin); // Установка температуры стола (30-130 C)
Bed_Pot_Value = map(Bed_Pot_Value, 0, 1023, 30, 130); 
Set_Bed_Temp = Bed_Pot_Value;
// изменения были? 
if (abs(Set_Bed_Temp-Bed_Temp)> 2)            {rev=2;// если да-устанавливаем режим дисплея
  Bed_Temp=Set_Bed_Temp; Ustan_previousMillis = millis();} 
//если время установки вышло - перходим на отображение текущей температуры
if (millis() - Ustan_previousMillis > Ustan_interval) rev=0;
}
  //****************************************************************   
 if (millis() - Display_previousMillis > Display_interval) 
{
  Display_previousMillis = millis();   // Скорость обновления индикации
  Chow_disp();

//СВЕТОФОР
  
Manage_Temperatures ();}
}

//***********************************************************************************
void Chow_disp(){ 

  lcd.clearDisplay();
  lcd.drawBitmap(0, 0,  logo16_glcd_bmp, 32, 40, BLACK);
  lcd.setTextSize(2);
  lcd.setTextColor(BLACK);

 //Экструдер
  lcd.setCursor(36, 0);
  if (rev==1)  {lcd.print (int(Extruder_Temp));}
  else  {lcd.print (int(Current_Extruder_Temp));}
  lcd.setCursor(72, -4);
  lcd.print("o");
  lcd.setCursor(83, 0);
  lcd.print("C");

  //Стол
  lcd.setCursor(36, 24);
  if (rev==2)  {lcd.print (int(Bed_Temp));}
  else  {lcd.print (int(Current_Bed_Temp));}
  lcd.setCursor(72, 20);
  lcd.print("o");
  lcd.setCursor(83, 24);//+14+4
  lcd.println("C");
  lcd.setCursor(0, 48);
  if (rev==1)  {lcd.print ("SET Extr");}
  if (rev==2)  {lcd.print ("SET  Bed");}
  else
  {lcd.print (" WORK t  ");}
  //lcd.println (rev);
  //lcd.println (Current_Extruder_Temp);//(rev);
  lcd.display();
 }


А это ПИД (положить в папку скетча)

 

double OutputValueExtruder;
double OutputValueBed;
double KP_Extruder = 40;//27;//400;45        30   40
double KI_Extruder = 0.8 ;//.08;//0.08;08    0.8  0.8
double KD_Extruder = 25;//18;//00;//400;50   20   25
double KP_Bed = 400;
double KI_Bed = 0.08;
double KD_Bed = 400;

PID PIDExtruder(&Current_Extruder_Temp, &OutputValueExtruder, &Set_Extruder_Temp,KP_Extruder,KI_Extruder,KD_Extruder, DIRECT);
PID PIDBed(&Current_Bed_Temp, &OutputValueBed, &Set_Bed_Temp,KP_Bed,KI_Bed,KD_Bed, DIRECT);

//int WindowSizeExtruder = 5000;
//unsigned long windowStartTimeExtruder;

//int WindowSizeBed = 5000;
//unsigned long windowStartTimeBed;

void read_Temperatures(){

        Current_Extruder_Temp = read_termistor(T1);
        Current_Bed_Temp = read_termistor(T2);
 }
         // Включаем ПИД Экструдера
void initPIDExtruder(){
     PIDExtruder.SetMode(AUTOMATIC);
}
         // Включаем ПИД Стола
void initPIDBed(){
     PIDBed.SetMode(AUTOMATIC);
}

void Manage_Extruder_Temperature (){
  read_Temperatures();
  PIDExtruder.Compute();
  analogWrite(ExtruderOutput,OutputValueExtruder); 
}

void Manage_Bed_Temperature (){
  read_Temperatures();
  PIDBed.Compute();
  analogWrite(BedOutput,OutputValueBed); 
}

void initPID(){
initPIDExtruder();
initPIDBed();
}

void Manage_Temperatures (){
Manage_Extruder_Temperature ();
Manage_Bed_Temperature ();
}

float read_termistor(int THERMISTOR_PIN)
{
    // delay(10);
     float rawtemp = analogRead(THERMISTOR_PIN);
     float current_celsius = 0;
// преобразование сопротивления термистора в значение температуры
// теория http://arduino-diy.com/arduino-thermistor
rawtemp = 1023 / rawtemp - 1;        // конвертируем значение в сопротивление
rawtemp = 9820 / rawtemp;            // 9820 -реальное значение резистора делителя
rawtemp = rawtemp / 100000;          // (R/Ro)
rawtemp = log(rawtemp);              // ln(R/Ro)
rawtemp /= 3950;                     // 1/B * ln(R/Ro)
rawtemp += 1.0 / 298.15;             // + (1/To)//(25 + 273.15)
rawtemp = 1.0 / rawtemp;             // инвертируем
current_celsius=rawtemp - 273.15;    // конвертируем в градусы по Цельсию
current_cels=rawtemp - 273.15;
return current_celsius;
}

Вот нашел старый вариант индикация на TM 1650

 


// Версия для про мини
//входы установки   А2 - экструдер, А3 - стол
//входы термисторов А6 - экструдер, А7 - стол
//инверсные выходы нагрева D2 - экструдер, D3 - стол


#include <Wire.h>
float t_extr,t_stol,t_sr;
int rez,Ust_extr,Ust_stol;
unsigned long StartTime;
byte i,e,s,scan_code,rev;

byte simv[15]={63,6,91,79,102,109,125,7,127,111,64,129,65,8,72};//знакогенер ТМ 1650
byte simv_razr[4];//разряды индикатора
//---------------------------------------------------------------------------------------
void setup(void)
{Wire.begin();Wire.beginTransmission(36);Wire.write(17);Wire.endTransmission();//инит индикатора          
//Serial.begin(9600);
//analogReference(EXTERNAL);// лучше подключить AREF к 3.3 В,и питать ими цепь термистора
//так как он не так сильно "шумит"
 rev=1;// показать реальную температуру экструдера
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
}

void loop(void)
{
// выбор режима двумя кнопками кратковременное нажатие-реальная температура, длительное установка
Wire.beginTransmission(0x25);        // обращаемся к клавиатуре(к любому порту 0х24-0х27)
 Wire.requestFrom((0x25), 1);         //запрашиваем один байт
 scan_code = Wire.read();            // читаем скан код
 Wire.endTransmission();
if (scan_code == 68)rev=1;//режим экструдер
if (scan_code == 108)rev=3;//режим стол
if (scan_code <60) StartTime=millis();//если кнопки не нажаты
if(millis() - StartTime>1000)rev++;//если долго нажаты показываем установки

// Устновка температуры экструдера
t_sr = 0;
for (i=0; i< 10; i++) {
t_sr += analogRead(A2);
delay(10);
}
Ust_extr=(int(t_sr /= 10))>>4)+187;// измеряем 10 раз, сдвигаем в диапазон 187-250 град.


// Устновка температуры стола
t_sr = 0;
for (i=0; i< 10; i++) {
t_sr += analogRead(A3);
delay(10);
}
Ust_stol=(int(t_sr /= 10)>>4)+77;// измеряем 10 раз, сдвигаем в диапазон 77-150 град.

// измеряем температуру экструдера(10 раз для усреднения)
//int i;
t_sr = 0;
for (i=0; i< 10; i++) {
t_sr += analogRead(A6);
delay(10);


// теория http://arduino-diy.com/arduino-thermistor
}
t_sr /= 10;
t_sr = 1023 / t_sr - 1;            // конвертируем значение в сопротивление
t_sr = 9820 / t_sr;                // 9820 -реальное значение резистора делителя
t_extr = t_sr / 100000;            // (R/Ro)
t_extr = log(t_extr);              // ln(R/Ro)
t_extr /= 3950;                       // 1/B * ln(R/Ro)
t_extr += 1.0 / 298.15;               // + (1/To)//(25 + 273.15)
t_extr = 1.0 / t_extr;             // инвертируем
t_extr -= 273.15;                     // конвертируем в градусы по Цельсию

if (t_extr < Ust_extr) digitalWrite(2, LOW);//63+187=250
else digitalWrite(2,HIGH );

// измеряем температуру стола

//int i;
t_sr = 0;
for (i=0; i< 10; i++) {
t_sr += analogRead(A7);
delay(10);
}
t_sr /= 10;
t_sr = 1023 / t_sr - 1;            // конвертируем значение в сопротивление
t_sr = 9820 / t_sr;
t_stol = t_sr / 100000;            // (R/Ro)
t_stol = log(t_stol);              // ln(R/Ro)
t_stol /= 3950;                       // 1/B * ln(R/Ro)
t_stol += 1.0 / 298.15;               // + (1/To)//(25 + 273.15)
t_stol = 1.0 / t_stol;             // инвертируем
t_stol -= 273.15;                     // конвертируем в градусы по Цельсию



if (t_stol < Ust_stol) digitalWrite(3, LOW);// 63+77=150
else digitalWrite(3, HIGH);

Chow_disp(); 

        
//Serial.print("Temperature ");
//Serial.print(t_extr);
//Serial.print("  //  ");
//Serial.print(rez);
//Serial.print(" *C   Rev - ");        
//Serial.print(rev);
//Serial.print(" * Ust_extr - ");        
//Serial.print(Ust_extr);
//Serial.print(" * Ust_stol - ");        
//Serial.println(Ust_stol);
delay(150);
}

//***********************************************************************************
void Chow_disp(){ 

if (rev==1)rez= t_extr;
if (rev==2)rez= Ust_extr; 
if (rev==3)rez= t_stol;
if (rev==4)rez= Ust_stol;   
simv_razr[0]=(rez%10);
simv_razr[1]=(rez%100/10);
simv_razr[2]=(rez%1000/100);
simv_razr[3]=(rev+10);
Wire.beginTransmission(55);Wire.write(simv[simv_razr[0]]);Wire.endTransmission();
Wire.beginTransmission(54);Wire.write(simv[simv_razr[1]]);Wire.endTransmission(); 
Wire.beginTransmission(53);Wire.write(simv[simv_razr[2]]);Wire.endTransmission();
Wire.beginTransmission(52);Wire.write(simv[simv_razr[3]]);Wire.endTransmission();
}
      
Beginner_a
Offline
Зарегистрирован: 09.04.2019

Arduino UNO CH340 REv3, шилд CNC Shield V 3.0, хотэнд E3Dv6

Прдположительно нашел вот такую схему подключения Прошивка TeaCup. 

Хочу услышать ваше мнение!

svm
Offline
Зарегистрирован: 06.11.2016

TeaCup , я пробовал пару лет назад. Впечатления положительные. На слух движки работают гораздо ровнее, да и скорость выше. Но остался на МАТЧе, просто не хотелось переделывать рабочий агрегат. Принтер был собран из любопытства и работает от случая к случаю и мне пока хватает.

Beginner_a
Offline
Зарегистрирован: 09.04.2019

Подскажите пожалуйста  настройки прошивки под эту схему подключения )

svm
Offline
Зарегистрирован: 06.11.2016

Дело было пару лет назад, поэтому сейчас настройки уже утеряны, а снова разбираться не хочется.

Beginner_a
Offline
Зарегистрирован: 09.04.2019

Спасибо и на этом. Попробую разобраться. Хотелось бы все-таки услышать-с правильной настройкой данная схема будет работать?