От ЧПУ к 3D принтеру. Он-лайн трансляция. Часть2.

Предыдущая часть — Часть 1.

20.04.2016
Admin: сегодня посчитал, затраты на электронику и заказал недостающее на Aliexpress:

Набор электроники (ArduinoMega, RAMPS 1.4, 5шт A4988, LCD Экран)
1780 руб
Стол с подогревом
450 руб
Блок питания 350W
1200 руб
Экструдер (с термопарой и тэном)
850 руб
Концевики
140 руб
Шаговые двигатели Nema-17 5шт
3800 руб
Мелочевка (провода, термистор)  200 руб
Итого — 8420 руб
Цены актуальны на момент подсчета, и могут изменяться в зависимости от курса $ или желания продавцов. Везде выбрана бесплатная доставка.

 

24.04.2016
Admin: Пока идут электронные комплектующие из Поднебесной, самое время заняться механикой. В качестве основы примем кинематическую схему h-bot. Стол двигается только вверх-вниз, а XY по такой схеме:

hbot_concept

Приступаем к разработке механики. Принтер будет размерами 500х500х500. Все комплектующие будут напечатаны на 3D принтере, поэтому придется разбираться с 3D моделированием. Средой разработки выбрана платформа российского производства КОМПАС-3D.

Благо есть полнофункциональная демо-версия со сроком действия 60 дней (надеюсь успею) и куча примеров на youtube  и сайте производителя.

Вот и первые детали:

Держатель валов оси Y

place_val_8mm

 

25.04.2016
Vlad:

Пока ждем поставки комплектующих, потихоньку экспериментируем с тем, что имеем. Например с тем, как защитить экструдер от лишней потери тепла. Подробно об этом описано здесь.

Но помимо того, что «одели шубу» на экструдер, надо его погонять в разных режимах прогрева. Посему пришлось собрать небольшую тестовою схему.

 

pcOd9QO

В нее не вошел экран, на котором отображается заданная температура и температура с двух датчиков, о его подключении подробно описано тут (один в составе экструдера (R), второй подключен отдельно и в перспективе будет снимать температуру со стола принтера ). А пока нет стола, второй термодатчик будет измерять температуру на «шубе». Резисторы на делители напряжения выбраны 4,7 кОм.

Крутим переменный резистор — выставляя нужную нам температуру. Включаем реле, если значение R ниже заданной температуры. И выключаем если выше. Все просто.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC   11
#define OLED_CS   12
#define OLED_RESET 13
#define pot A0
#define temp1 A1
#define temp2 A2
#define ten 7
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
int x = 0, y=0, z=0;
double Termo(int RawADC)
{
double temp;
temp = log(((10240000/RawADC) - 10000));
temp = 1 / (0.001129148 + (0.000234125+(0.0000000876741*temp*temp))*temp);
temp = temp - 273.15;
return temp;
}
void setup()
{
Serial.begin(115200);
pinMode(pot, INPUT);
pinMode(temp1, INPUT);
pinMode(temp2, INPUT);
pinMode(ten, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.setTextColor(WHITE);
}
void loop()
{
for (int i=0; i <=100 ; i++)
{
x=x+analogRead(pot);
}
x = x/100;
x = x/ 4;
for (int i=0; i <=100 ; i++)
{
y=y+Termo(analogRead(temp1));
}
y = y/100;
for (int i=0; i <=100 ; i++)
{
z=z+Termo(analogRead(temp2));
}
z = z/100;
if (z<x) {digitalWrite(ten,HIGH);delay (100);} else {digitalWrite(ten,LOW);delay (100);}
Serial.print("T= ");
Serial.print(x);
Serial.print(";   T1= ");
Serial.print(y);
Serial.print(";   T2= ");
Serial.print(z);
Serial.println(";");
display.setTextSize(2);
display.setCursor(10,20);
display.print(x);
display.setCursor(10,40);
display.print(y);
display.setCursor(70,40);
display.print(z);
display.display();
display.clearDisplay();
}

Подробно результаты замеров и тестирования будут тут. Если в двух словах — то очень даже успешная «шубка» вышла.

 

25.04.2016
Admin:
К сожалению предыдущий опыт оказался не совсем удачный, а именно — при нагревании до высоких температур показания с термодатчиков не соответствовали реальной температуре. Вопрос решился сменой метода интерпретации значения термисторов. А именно — значение температуры теперь рассчитывается по параметрической таблице.  Скетч для Arduino UNO:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC   11
#define OLED_CS   12
#define OLED_RESET 13
#define pot A0
#define temp1 A1
#define temp2 A2
#define temp3 A3
#define ten 7
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
double x = 0, y=0, z=0, q=0;
int Delta=5,G=300;
const short temptable_11[][2] PROGMEM = {
{1, 938},
{31, 314},
{41, 290},
{51, 272},
{61, 258},
{71, 247},
{81, 237},
{91, 229},
{101, 221},
{111, 215},
{121, 209},
{131, 204},
{141, 199},
{151, 195},
{161, 190},
{171, 187},
{181, 183},
{191, 179},
{201, 176},
{221, 170},
{241, 165},
{261, 160},
{281, 155},
{301, 150},
{331, 144},
{361, 139},
{391, 133},
{421, 128},
{451, 123},
{491, 117},
{531, 111},
{571, 105},
{611, 100},
{641, 95},
{681, 90},
{711, 85},
{751, 79},
{791, 72},
{811, 69},
{831, 65},
{871, 58},
{881, 56},
{883, 54},
{901, 51},
{904, 50},
{921, 45},
{924, 47},
{941, 39},
{940, 40},
{955, 35},
{968, 30},
{971, 28},
{977, 25},
{981, 23},
{987, 20},
{991, 17},
{994, 15},
{999, 10},
{1001, 9},
{1021, -27}
};
#define BEDTEMPTABLE_LEN (sizeof(temptable_11)/sizeof(*temptable_11))
#define PGM_RD_W(x)   (short)pgm_read_word(&x)
void setup()
{
  Serial.begin(115200);
  pinMode(pot, INPUT);
  pinMode(temp1, INPUT);
  pinMode(temp2, INPUT);
  pinMode(temp3, INPUT);
  pinMode(ten, OUTPUT);
  display.begin(SSD1306_SWITCHCAPVCC);
  display.setTextColor(WHITE);
  Serial.println("Start");
}
void loop()
{
for (int i=0; i <=100 ; i++)
  {
  x=x+analogRead(pot);
  y=y+Termo(analogRead(temp1));
  z=z+Termo(analogRead(temp2));
  q=q+Termo(analogRead(temp3));
  }
x = x/100;
x = x/ 4;
y = y/100;
z = z/100;
q = q/100;
if (z>=x-Delta) {digitalWrite(ten,LOW);delay (G);} 
if (z<=x) {digitalWrite(ten,HIGH);}
Serial.print("T_in=");
Serial.print(x);
Serial.print(";T_extr=");
Serial.print(z);
Serial.print(";T_oextr=");
Serial.print(y);
Serial.print(";T_rad=");
Serial.print(q);
Serial.println("");
display.setTextSize(2);  
display.setCursor(10,0);
display.print(x);
display.setCursor(10,16);
display.print(z);
display.setCursor(10,32);
display.print(y);
display.setCursor(10,48);
display.print(q);
display.display();
display.clearDisplay();
}
static float Termo(int raw) 
{
    float celsius = 0;
    byte i;
     for (i = 1; i < BEDTEMPTABLE_LEN; i++)
    {
        if (PGM_RD_W(temptable_11[i][0]) > raw)
        {
            celsius = PGM_RD_W(temptable_11[i - 1][1]) +
                (raw - PGM_RD_W(temptable_11[i - 1][0])) *
                (float)(PGM_RD_W(temptable_11[i][1]) - PGM_RD_W(temptable_11[i - 1][1])) /
                (float)(PGM_RD_W(temptable_11[i][0]) - PGM_RD_W(temptable_11[i - 1][0]));
            break;
        }
    }
    // Overflow: Set to last value in the table
    if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(temptable_11[i - 1][1]); 
    return celsius;
}

Так выглядит стенд для издевательства испытания изоляции экструдера:

extruder test

Продолжение следует…

Посмотрите так же...
2 комментария
  1. Martin:

    экранчик дорисовать не помешало бы.

  2. Holliday:

    А не проще было это реализовать на готовой прошивке Marlin ?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*