Категория: ЧПУ станки и Роботы | Комментарии: 4
9 марта 2015

#Чпу станок для дома #2 - Схема своими руками.

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

схема чпу станка



Далее несколько фото и описание схемы с устройством станка.


obrabotka_signalov



Схема обработки команд

В основе управления чпу станком лежит микроконтроллер PIC16F877 с кварцем 4mhZ - чего вполне достаточно.
Подключена кнопка для сброса, светодиод для индикации.
К микросхеме присоединяется преобразователь USB-COM, ко входам RX, TX, и не стоит забывать что к преобразователю присоединяется и земля.
Так же подключен бузер, для звуковой индикации ошибок, и сигнализации старта программы.
Датчик температуры присоединен к АЦП микроконтроллера, для измерения температуры резисторов (Далее будет объяснение).
Датчик температуры аналоговый на базе LM313 - распространенная схема.

Сам микроконтроллер установлен совсем невзрачно на маленьком кусочке макетной платы.

6118_mikroshema_upravleniya_stankom.png



Принцип работы так же прост. В микроконтроллер через USB-COM преобразователь приходят команды, программа микроконтроллера разбирает команды и выполняет.
Станок умеет перемещаться по оси X,Y,Z только по прямым линиям. Диагонали - в эксперементальном варианте. Для полноценной работы необходима функция для просчета и построения команд из одной точки XY в другую точку XY.

Ниже находится программа для микроконтроллера.
Программа в микроконтроллер "программируется" с помощью устройства - программатора. Программатор был собран по схеме JDM программатора, как для PIC16f84a - 18 выводные, так и для pic16f877 - 40 выводные микроконтроллеры. Схему программатора можно найти у нас на сайте в разделе "Схемы и Датчики" или через поиск.

int speed; //Скорость перемещения, индивидуально для двигателя
int i,j,q[2];
int count_step; //Количество шагов двигателя
int time_step;
int vq;
char uart_rd; //Принятые данные из UART
char data_mes[7]; //Массив под команды приходящие с компьютера
char temp[3];
char temp2;

//Программа компьютера принимает символ для понимания что команды выполнились.
void mssg_end_step()
{
UART1_Write_Text("*");
}

//Остановка всех двигателей
void stop(){
PORTD=0b00000000;
PORTB=0b00000000;
}

//Ниже список функций для движения шагововых двигателей, на дискретных элементах. Просьба не критиковать.

void peredy(int speed)
{
PORTD=0b10000000; VDelay_ms(speed);
PORTD=0b00100000; VDelay_ms(speed);
PORTD=0b01000000; VDelay_ms(speed);
PORTD=0b00010000; VDelay_ms(speed);

}

void nazady(int speed)
{
PORTD=0b00010000; VDelay_ms(speed);
PORTD=0b01000000; VDelay_ms(speed);
PORTD=0b00100000; VDelay_ms(speed);
PORTD=0b10000000; VDelay_ms(speed);
}

void peredx(int speed)
{
PORTB=0b00000001; VDelay_ms(speed);
PORTB=0b00000100; VDelay_ms(speed);
PORTB=0b00000010; VDelay_ms(speed);
PORTB=0b00001000; VDelay_ms(speed);

}

void nazadx(int speed) {
PORTB=0b00001000; VDelay_ms(speed);
PORTB=0b00000010; VDelay_ms(speed);
PORTB=0b00000100; VDelay_ms(speed);
PORTB=0b00000001; VDelay_ms(speed);
}

void verx(int speed) { //4 5 6 7
PORTB=0b10000000; VDelay_ms(speed);
PORTB=0b00100000; VDelay_ms(speed);
PORTB=0b01000000; VDelay_ms(speed);
PORTB=0b00010000; VDelay_ms(speed);
}

void niz(int speed) {
PORTB=0b00010000; VDelay_ms(speed);
PORTB=0b01000000; VDelay_ms(speed);
PORTB=0b00100000; VDelay_ms(speed);
PORTB=0b10000000; VDelay_ms(speed);
}

//Эксперементальные 45 градусные диагонали, при условии что двигатели одинаковые.
void diagonal_1(int speed) {//6
PORTB=0b00000001; VDelay_ms(speed/2);
PORTD=0b10000000; VDelay_ms(speed/2);
PORTB=0b00000100; VDelay_ms(speed/2);
PORTD=0b00100000; VDelay_ms(speed/2);
PORTB=0b00000010; VDelay_ms(speed/2);
PORTD=0b01000000; VDelay_ms(speed/2);
PORTB=0b00001000; VDelay_ms(speed/2);
PORTD=0b00010000; VDelay_ms(speed/2);
}

void diagonal_2(int speed) {
PORTB=0b00001000; VDelay_ms(speed/2);
PORTD=0b00010000; VDelay_ms(speed/2);
PORTB=0b00000010; VDelay_ms(speed/2);
PORTD=0b01000000; VDelay_ms(speed/2);
PORTB=0b00000100; VDelay_ms(speed/2);
PORTD=0b00100000; VDelay_ms(speed/2);
PORTB=0b00000001; VDelay_ms(speed/2);
PORTD=0b10000000; VDelay_ms(speed/2);
}

void diagonal_3(int speed) {
PORTD=0b10000000; VDelay_ms(speed/2);
PORTB=0b00001000; VDelay_ms(speed/2);
PORTD=0b00100000; VDelay_ms(speed/2);
PORTB=0b00000010; VDelay_ms(speed/2);
PORTD=0b01000000; VDelay_ms(speed/2);
PORTB=0b00000100; VDelay_ms(speed/2);
PORTD=0b00010000; VDelay_ms(speed/2);
PORTB=0b00000001; VDelay_ms(speed/2);
}

void diagonal_4(int speed) {
PORTB=0b00000001; VDelay_ms(speed/2);
PORTD=0b00010000; VDelay_ms(speed/2);
PORTB=0b00000100; VDelay_ms(speed/2);
PORTD=0b01000000; VDelay_ms(speed/2);
PORTB=0b00000010; VDelay_ms(speed/2);
PORTD=0b00100000; VDelay_ms(speed/2);
PORTB=0b00001000; VDelay_ms(speed/2);
PORTD=0b10000000; VDelay_ms(speed/2);
}

//Тело программы и настройка входов и выходов
void main() {
TRISA=0x00;
PORTA=0x00;
TRISB=0x00;
PORTB=0x00;
TRISD=0x00;
PORTD=0x00;
TRISC.F1=0xFF;
TRISC.F2=0xFF;
TRISC.F3=0xFF;
PORTC.F1=0x00;
PORTC.F2=0x00;
PORTC.F3=0x00;

//Инициализация UART
UART1_Init(9600);
Delay_ms(100);

PORTA.F1=1;
Delay_ms(100);
PORTA.F1=0;
Delay_ms(100);

PORTD.f1=1;
Delay_ms(100);
PORTD.f1=0;
Delay_ms(100);

while(1)
{

//Считывание данных с UART
if (UART1_Data_Ready()) {
uart_rd = UART1_Read();

//Символ "v" используется в качестве разделителя между командами.
if(uart_rd=='v')
{
//Символ готовности контроллера принимать команды
UART1_Write_Text("=");
i=0;
while(1)
{
if(i==7) { break; }
if (UART1_Data_Ready()) {
uart_rd = UART1_Read();
data_mes[i]=uart_rd;
i++;
}
}
}

// data_mes[i] это сама команда вида 1541061

/* for(j=0; j<=7; j++)
{
UART1_Write(data_mes[j]);
}
UART1_Write(10);
UART1_Write(13);
*/

//В 2х переменных ниже формируется количество шагов и скорость. Вычитанием из char нуля - конца строки.

count_step=((data_mes[1]-'0')*100)+((data_mes[2]-'0')*10)+(data_mes[3]-'0');
time_step=((data_mes[4]-'0')*10)+(data_mes[5]-'0');

// UART1_Write_Text(count_step);

if(data_mes[0]=='1'){
for(vq=0; vq<=count_step; vq++)
{ peredx(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='9'){
for(vq=0; vq<=count_step; vq++)
{ nazadx(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='3'){
for(vq=0; vq<=count_step; vq++)
{ peredy(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='4'){
for(vq=0; vq<=count_step; vq++)
{ nazady(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='q'){
for(vq=0; vq<=count_step; vq++)
{ diagonal_1(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='w'){
for(vq=0; vq<=count_step; vq++)
{ diagonal_2(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='7'){
for(vq=0; vq<=count_step; vq++)
{ diagonal_3(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='8'){
for(vq=0; vq<=count_step; vq++)
{ diagonal_4(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='5'){
for(vq=0; vq<=count_step; vq++)
{ niz(time_step); }
stop(); mssg_end_step(); }

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

if(data_mes[0]=='6'){
for(vq=0; vq<=count_step; vq++)
{ verx(time_step); }
stop(); mssg_end_step(); }
}
}
}


На пример: С компьютера отправляется команда 1541061.
Слово 1541061 делится на 1 _ 541 _ 06 _ 1 т.е на 1 символ, 3 символа, 2 и последняя единица - не используется.
По первому символу определяется ось и направление движения.
По следующим 3м символам - определяется количество шагов для двигателя.
Следующие 2 символа используются для скорости двигателя.
Последняя 1 - не используется, резерв.
И того с компьютера передаем команды по 7 байт.
Далее - Все просто!

Определяем двигатель, запускаем цикл, и тут очень важная поправка. Используется не количество ШАГОВ, а количество ОБОРОТОВ.

Функции выше говорят о том что при одном запуске функции, вал двигателя делает 1 оборот в ПОЛНОШАГОВОМ РЕЖИМЕ.

Когда выполнение команды завершено, на компьютер отправляется символ "=" и программа компьютера далее отправляет новую команду.

Далее разберемся куда же идут сигналы с главного микроконтроллера который обрабатывает команды.

Другие статьи по разделу:

anchore Квадрокоптер - Умеет летать и плавать!


anchore Рисующий ЧПУ станок WaterColorBot для акварельной живописи



#1   Марат 1.11.2015 в 12:26
Здравствуйте, кто ни будь делал это устройство? сможете скинуть hex файл, а то в C++ borland не очень хорошо разбираюсь
#2   Инженер 4.11.2015 в 22:18
Я делал. Какой именно файл необходим?
#3   Марат 7.11.2015 в 15:51
Инженер, мне прошивки нужны для этого устройства
#4   Марат 9.12.2015 в 20:14
Кто ни будь сможет помощь мне с этой прошивкой) напишите если не трудно) мне нужна обе эти прошивкИ,

Новые изобретения инженеров и техников, дизайнеров и обычных людей, все то что может изменить наш мир к лучшему. Новая техника и оружие, спасателей и спецназа. Гаджеты и девайсы, устройства для отдыха и работы. Советы для экономии семейного состояния. Все гениальные изобретения в простом формате! Ведь "Все - Просто!"
Copyright © 2013–2017
Автоматизация и проектирование - 1injener.ru