помогите с подключением хотенда и термистора
- Войдите на сайт для отправки комментариев
Пнд, 15/04/2019 - 15:27
Помогите с подключением хотенда и термистора к CNC Shield v3.0 (на базе Arduino UNO)
Помогите с подключением хотенда и термистора к CNC Shield v3.0 (на базе Arduino UNO)
Маловато будет...
Информации, говорю, маловато будет. Марки оборудования, даташиты и т.д. давайте. Иначе никто Вам не поможет - хрустальные шары и кофейная гуща запрещены на этом форуме.
У меня стоят отдельно. Блок управления принтером (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(); }Arduino UNO CH340 REv3, шилд CNC Shield V 3.0, хотэнд E3Dv6
Прдположительно нашел вот такую схему подключения
Прошивка TeaCup.
Хочу услышать ваше мнение!
TeaCup , я пробовал пару лет назад. Впечатления положительные. На слух движки работают гораздо ровнее, да и скорость выше. Но остался на МАТЧе, просто не хотелось переделывать рабочий агрегат. Принтер был собран из любопытства и работает от случая к случаю и мне пока хватает.
Подскажите пожалуйста настройки прошивки под эту схему подключения )
Дело было пару лет назад, поэтому сейчас настройки уже утеряны, а снова разбираться не хочется.
Спасибо и на этом. Попробую разобраться. Хотелось бы все-таки услышать-с правильной настройкой данная схема будет работать?