
codigo fonte
main.cpp
- Committer:
- doradalberto
- Date:
- 2021-06-04
- Revision:
- 5:452d20780aac
- Parent:
- 4:4b994227bca2
File content as of revision 5:452d20780aac:
#include "mbed.h" #include "TextLCD.h" TextLCD lcd(D8, D9, D4, D5, D6, D7); //Comunicação com LCD BusOut motor_x(PC_8, PC_6, PC_5, PA_12); //Pinos para acionamento do motor do eixo X BusOut motor_y(PA_11, PB_12, PB_11, PB_2); //Pinos para acionamento do motor do eixo Y BusOut motor_z(PB_1, PB_15, PB_14, PB_13); //Pinos para acionamento do motor do eixo Z DigitalOut sinal(PC_10); // Pino para o acionamento da pipeta //DigitalIn botao_seleciona(PC_3); //botao de SELECT geral Serial pc (D1, D0); //Comunicação com USB AnalogIn joystick(PC_2); //Joystick potenciometro //AnalogIn botao_SELECT(A0); //Botão SELECT da IHM //Teste InterruptIn botao_seleciona(PA_3); //Botão de salva posição Joystick InterruptIn botao_emergencia_in(PC_4); //Botão de emergência para detectar acionamento InterruptIn botao_fim_curso_rise(PC_12); //Chave de fim de curso Timer debounce1; //Correção para botão de posição de salva Timer debounce2; //Correção para botão de emergência Timer debounce3; //Correção para chave de fim de curso int pulsos = 0; //Contagem dos pulsos para o motor int i; //Variável para contar o incremento no motor int cont_fim_curso = 0; //Variável para contar o incremento do fim de curso int J_XYZ; //Variável para ler o potenciometro do Joystick int passo_fuso = 5; //Declara o passo do fuso int pegaZ; //Variável que receberá o valor da posição de salva int SELECT; //Variável para leitura do botão SELECT da IHM int contador_SELECT = 0; //Define o contator do SELECT da IHM int contador_emergencia = 0; //Define o contator do botão de emergência int contador_rise = 0; int seguranca_fdc = 0; // ------------------Acionamento da Pipeta------------------ // Valores de Teste int total_pega = 6; // quantidade de mL na posição de pega disponível int quant_desejada = 3; // quantidade de mL na posição de solta 1 //int npos_solta = [1,2,3,4]; int pos_solta_total = 4; float posZ_atual = 3; float posX_atual = 4; float posY_atual = 5; float posX0_desejada = 3; float posY0_desejada = 5; float posZ0_desejada = 4; float posX_desejada = 2; float posY_desejada = 6; float posZ_desejada = 2; float deslocamento_X = 0; //Define o deslocamento linear total float deslocamento_Y = 0; //Define o deslocamento linear total float deslocamento_Z = 0; //Define o deslocamento linear total float deslocamento_max_X = 0; //Define o deslocamento linear total float deslocamento_max_Y = 0; //Define o deslocamento linear total float deslocamento_max_Z = 0; //Define o deslocamento linear total float velocidade = 0.003; //Armazena a velocidade dos motores int atual_pega = total_pega; // "total_pega" é a quantidade inserida pelo usuário na posição de pega //int quant_desejada; // "quant desejada" é a quantidade inserida pelo usuário na posição de solta int quant_depositada = 0; int n_pulsosX; int n_pulsosY; int n_pulsosZ; int posZ_origem = 0; int deslocamentoZ_partida = posZ_origem - deslocamento_Z; // deslocamento do eixo Z até a posição de partida (origem) int deslocamento_X0 = posX0_desejada - posX_atual; // deslocamento do eixo X até a posição de pega desejada int deslocamento_Y0 = posY0_desejada - posY_atual; // deslocamento do eixo Y até a posição de pega desejada int deslocamento_Z0 = posZ0_desejada - posZ_atual; // deslocamento do eixo Z até a posição de pega desejada int deslocamento_solta_X = posX_desejada - posX_atual; // deslocamento do eixo X até a posição de solta desejada int deslocamento_solta_Y = posY_desejada - posY_atual; // deslocamento do eixo Y até a posição de solta desejada int deslocamento_solta_Z = posZ_desejada - posZ_atual; // deslocamento do eixo Z até a posição de solta desejada // ------------------Acionamento da Pipeta------------------ float tempo_horario, tempo_anti_horario; //Define os tempos de acionamento do motor float passo_motor = 5.625/32; //Declara o passo angular do motor float tempo = 1.5; // Define o tempo que a pipeta fica acionada int pulsos_Z = 0; //Contagem dos pulsos para o motor_Z int pulsos_X = 0; //Contagem dos pulsos para o motor_X int pulsos_Y = 0; //Contagem dos pulsos para o motor_Y int contador_botao_seleciona = 0; //Boleana para a lógica do botão SELECT do joystick bool valor_SELECT = false; //Boleana para lógica do botão SELECT da IHM bool estado_referenciamento = false; //Boleana para identificar a necessidade do referênciamento bool estado_botao_emergencia_in = false; //Boleana para identificar a necessidade do referênciamentosatisfazer a lógica da rotina_emergencia_in bool motor_referenciamento = false; //Boleana para permitir o movimento automático do motot no referenciamento // Rotinas do programa void rotina_posicao_salva (void); void rotina_emergencia_in (void); void rotina_velocidade_eixo_Z (void); void rotina_deslocamento_eixo_Z (void); void rotina_deslocamento_eixo_menos_Z (void); void rotina_JOG (void); void rotina_botoes_IHM (void); void Rotina_Pega (void); void Rotina_Solta (void); void teste2dora (void); void reposiciona_pipeta_origem (void); void rotina_fdc_rise (void); void referenciamento (void); void rotina_estado_botao_seleciona (void); int main() { pc.baud(115200); //Define a velocidade da porta USB motor_x = 0x00; //Estabelece a condição inicial do motor do eixo X motor_y = 0x00; //Estabelece a condição inicial do motor do eixo Y motor_z = 0x00; //Estabelece a condição inicial do motor do eixo Z //Declara os pinos de interrupção com suas funções botao_seleciona.rise(&rotina_estado_botao_seleciona); botao_emergencia_in.rise(&rotina_emergencia_in); botao_fim_curso_rise.rise(&rotina_fdc_rise); //Inicializa os timers debounce1.start(); debounce2.start(); debounce3.start(); //Inicia o LCD wait_ms(500); lcd.locate(2,0); lcd.printf("SELECT para"); lcd.locate(0,1); lcd.printf("referenciamento"); while(1) { //Leitura de variáveis J_XYZ = joystick.read_u16(); //SELECT = botao_SELECT.read_u16(); //pc.printf("estado_referenciamento=%4d, estado_botao_emergencia_in=%d valor_SELECT=%d\r\n", estado_referenciamento, estado_botao_emergencia_in, valor_SELECT); //pc.printf("deslocamento_Z=%4f, pulsos=%d\r\n", deslocamento_Z, pulsos); //pc.printf("J_XYZ= %d\r\n", J_XYZ); if(estado_referenciamento == true & estado_botao_emergencia_in == false & contador_botao_seleciona == 2) { //Condição para poder disponibilizar a função JOG //Chama a rotina do JOG rotina_JOG(); //LCD lcd.locate(2,0); lcd.printf("PosicaoZ:"); lcd.locate(0,1); lcd.printf("%4fmm",deslocamento_Z); //pc.printf("J_XYZ= %d\r\n", J_XYZ); } else { //Chama a rotina dos botões da IHM //rotina_botoes_IHM(); if(valor_SELECT == false) { //se estiver 0, mudar para 1 -- no PC da dora fica 0 pela LCD dela lcd.cls(); lcd.locate(2,0); lcd.printf("Iniciando o"); lcd.locate(0,1); lcd.printf("referenciamento"); pc.printf("Referenciamento \r\n"); contador_SELECT = 1; estado_referenciamento = false; //Permite o movimento automático do motor até atingir o fim de curso referenciamento(); pc.printf("Referenciamento feito\r\n"); lcd.cls(); lcd.locate(0,0); lcd.printf("Pressione SELECT"); lcd.locate(0,1); lcd.printf("para continuar"); } } //======================================================================================== //while (npos_solta < pos_solta_total) { //checa se existem mais posições de solta if(botao_seleciona == 1) { //pressiona para entrar nesse if // o usuario nao quer alterar nenhum parametro pc.printf("pressionado\r\n"); quant_depositada = 0; while (quant_depositada < quant_desejada) { // "quant_desejada" definido pelo usuário na IHM if (atual_pega == 0) { lcd.cls(); lcd.locate(0,0); lcd.printf("Coleta vazia"); lcd.locate(0,1); lcd.printf("Insira mais subst"); wait(4); pc.printf("Coleta vazia \r\n"); exit(0); // obriga o usuário a recomeçar //levanta_pipeta(); //void para levantar a pipeta até o zero //ALTERAR: PIPETA VAI PARA A ORIGEM NO EIXO Z } //referenciamento(); //break; else { Rotina_Pega(); wait(tempo); Rotina_Solta(); wait(tempo); } atual_pega = atual_pega - 1; quant_depositada = quant_depositada + 1; pc.printf("atual_pega: %d \r\n",atual_pega); pc.printf("quant_depositada: %d \r\n",quant_depositada); } } pc.printf("fora do if\r\n"); //referenciamento(); } //while(1) } //int main() void rotina_estado_botao_seleciona() { if(debounce1.read_ms() >= 10 & estado_referenciamento == true & estado_botao_emergencia_in == false) { contador_botao_seleciona += 1; pc.printf("contador_botao_seleciona= %d\r\n", contador_botao_seleciona); lcd.cls(); } debounce1.reset(); } void rotina_emergencia_in() { if(debounce2.read_ms() >= 10) { motor_x = 0x00; //Não permite que pulsos sejam enviados para o motor do eixo X motor_y = 0x00; //Não permite que pulsos sejam enviados para o motor do eixo Y motor_z = 0x00; //Não permite que pulsos sejam enviados para o motor do eixo Z estado_referenciamento = false; //Solicita um novo referenciamento estado_botao_emergencia_in =! estado_botao_emergencia_in; contador_emergencia += 1; lcd.cls(); wait_ms(500); lcd.locate(0,0); lcd.printf("Emergencia ON"); lcd.locate(0,1); lcd.printf("Pressione RST"); exit(0); //Encerra o programa e obriga o usuário a resetar o sistema debounce2.reset(); } } void rotina_velocidade_eixo_Z() { //Converte a leitura do Joystick para tempo de acionamento do motor J_XYZ = joystick.read_u16(); tempo_horario = -1*J_XYZ*0.0000028 + 0.1875; tempo_anti_horario = J_XYZ*0.000002785 + 0.0025; } void rotina_velocidade_referenciamento_eixo_Z() { //Converte a leitura do Joystick para tempo de acionamento do motor J_XYZ = joystick.read_u16(); tempo_horario = (-1*J_XYZ*0.0000028 + 0.1875)*2; tempo_anti_horario = (J_XYZ*0.000002785 + 0.0025)*2; } void rotina_deslocamento_eixo() { //Calcula os deslocamentos no eixo Z deslocamento_X = (passo_fuso*pulsos_X*passo_motor)/360; deslocamento_Y = (passo_fuso*pulsos_Y*passo_motor)/360; deslocamento_Z = (passo_fuso*pulsos_Z*passo_motor)/360; // recebe_arduino.printf("X%3.2f\n", deslocamento_X); // recebe_arduino.printf("Y%3.2f\n", deslocamento_Y); // recebe_arduino.printf("Z%3.2f\n", deslocamento_Z); pc.printf("X%3.2f, Y%3.2f, Z%3.2f, J_XYZ=%d\n", deslocamento_X, deslocamento_Y, deslocamento_Z, J_XYZ); } //void rotina_botoes_IHM() //{ // if(SELECT > 60000 & SELECT < 65000) valor_SELECT =! valor_SELECT; // else valor_SELECT = 0; //} void referenciamento() { while(estado_referenciamento == false & estado_botao_emergencia_in == false & contador_SELECT == 1) {//W1 for(i = 0; i < 4; i++) { motor_x = 1 << i; motor_y = 1 << i; motor_z = 1 << i; wait(0.003); } if(contador_rise == 1) {//if1 while(estado_referenciamento == false & estado_botao_emergencia_in == false & contador_rise == 1) {//W2 for(i = 3; i > -1; i--) { motor_x = 1 << i; motor_y = 1 << i; motor_z = 1 << i; wait(0.003); } if(contador_rise == 2) {//if2 while(estado_referenciamento == false & estado_botao_emergencia_in == false & contador_rise == 2) {//W3 for(i = 0; i < 4; i++) { motor_x = 1 << i; motor_y = 1 << i; motor_z = 1 << i; wait(0.003); } if(contador_rise == 3) {//if3 while(seguranca_fdc != 8 & estado_referenciamento == false & estado_botao_emergencia_in == false & contador_rise == 3) {//W4 for(i = 3; i > -1; i--) { motor_x = 1 << i; motor_y = 1 << i; motor_z = 1 << i; wait(0.003); } seguranca_fdc += 1; }//Fecha W4 estado_referenciamento = true; contador_SELECT = 0; contador_rise = 0; seguranca_fdc = 0; valor_SELECT = true; contador_botao_seleciona = 0; deslocamento_X = 0; //Define o deslocamento linear total deslocamento_Y = 0; //Define o deslocamento linear total deslocamento_Z = 0; //Define o deslocamento linear total pulsos_X = 0; pulsos_Y = 0; pulsos_Z = 0; deslocamento_max_X = 5; //Define o deslocamento linear total deslocamento_max_Y = 5; //Define o deslocamento linear total deslocamento_max_Z = 5; //Define o deslocamento linear total // velocidade = 0.1; // recebe_arduino.printf("D\n"); //Done referenciamento }//Fecha if3 }//Fecha W3 }//Fecha if2 }//Fecha W2 }//Fecha if1 }//Fecha W1 motor_x = 0x00; motor_y = 0x00; motor_z = 0x00; }//Fecha funcao void rotina_fdc_rise() { if(debounce3.read_ms() >= 50 & estado_botao_emergencia_in == false & estado_referenciamento == false & contador_SELECT == 1) { contador_rise += 1; pc.printf("contador_rise=%d\n", contador_rise); debounce3.reset(); } } void rotina_JOG() { J_XYZ = joystick.read_u16(); if(32400 <= J_XYZ & J_XYZ <= 34100) { motor_x = 0x00; motor_y = 0x00; motor_z = 0x00; } else { //============== Movimenta Eixo Y ====================================== if (J_XYZ > 34100 & deslocamento_Y > 0 & pulsos_Y > 0) { // tempo_motor.start(); // while(deslocamento_Y > 0) { J_XYZ = joystick.read_u16(); for(i = 0; i < 4; i++) { motor_y = 1 << i; // rotina_velocidade_eixo(); rotina_deslocamento_eixo(); pulsos_Y-=1; wait(velocidade); } // } // tempo_motor.reset(); // tempo_motor.stop(); } if(J_XYZ < 32400 & deslocamento_max_Y > deslocamento_Y & pulsos_Y < 2048) { // tempo_motor.start(); // while(deslocamento_max_Y > deslocamento_Y) { J_XYZ = joystick.read_u16(); for(i = 3; i > -1; i--) { motor_y = 1 << i; // rotina_velocidade_eixo(); rotina_deslocamento_eixo(); pulsos_Y+=1; wait(velocidade); } // } // tempo_motor.reset(); // tempo_motor.stop(); } //============== Movimenta Eixo X ====================================== if (J_XYZ > 34100 & deslocamento_X > 0 & pulsos_X > 0) { // tempo_motor.start(); // while(deslocamento_X > 0) { for(i = 0; i < 4; i++) { motor_x = 1 << i; // rotina_velocidade_eixo(); rotina_deslocamento_eixo(); pulsos_X-=1; wait(velocidade); } // } // tempo_motor.reset(); // tempo_motor.stop(); } if(J_XYZ < 32400 & deslocamento_max_X > deslocamento_X & pulsos_X < 2048) { // tempo_motor.start(); // while(deslocamento_max_X > deslocamento_X) { for(i = 3; i > -1; i--) { motor_x = 1 << i; // rotina_velocidade_eixo(); rotina_deslocamento_eixo(); pulsos_X+=1; wait(velocidade); } // } // tempo_motor.reset(); // tempo_motor.stop(); } //============== Movimenta Eixo Z ====================================== if (J_XYZ > 34100 & deslocamento_Z > 0 & pulsos_Z > 0) { // tempo_motor.start(); // while(deslocamento_Z > 0) { for(i = 0; i < 4; i++) { motor_z = 1 << i; // rotina_velocidade_eixo(); rotina_deslocamento_eixo(); pulsos_Z-=1; wait(velocidade); } // } // tempo_motor.reset(); // tempo_motor.stop(); } if(J_XYZ < 32400 & deslocamento_max_Z > deslocamento_Z & pulsos_Z < 2048) { // tempo_motor.start(); // while(deslocamento_max_Z > deslocamento_Z) { for(i = 3; i > -1; i--) { motor_z = 1 << i; // rotina_velocidade_eixo(); rotina_deslocamento_eixo(); pulsos_Z+=1; wait(velocidade); } // } // tempo_motor.reset(); // tempo_motor.stop(); } } } void Rotina_Pega() { sinal = 0; // saída nível lógico "baixo" pc.printf("posZ_atual: %f, posZ_origem: %d \r\n",posZ_atual, posZ_origem); //if(posZ_atual > posZ_origem) { while (deslocamento_Z != posZ_origem) { //While para verificar que o motor funcione até a a posição desejada ser alcançada for(i = 0; i < 4; i++) { motor_z = 1 << i; pulsos_Z -= 1; wait(velocidade); rotina_deslocamento_eixo(); pc.printf("Pos atualZ H: %f \r\n", deslocamento_Z); } } //} // else { //não faz nada // while (deslocamento_Z < posZ0_desejada) { // //While para verificar que o motor funcione até a a posição desejada ser alcançada // for(i = 0; i < 4; i++) { // motor_z = 1 << i; // pulsos_Z -= 1; // wait(velocidade); // rotina_deslocamento_eixo(); // pc.printf("Pos atualZ H: %d\r\n", deslocamento_Z); // } // } // } posX_atual = deslocamento_X; pc.printf("posX_atual: %f, posX0_desejada:%f \r\n",posX_atual, posX0_desejada); if(posX_atual < posX0_desejada) { while (deslocamento_X > posX0_desejada) { //While para verificar que o motor funcione até a a posição desejada ser alcançada for(i = 3; i > -1; i--) { motor_x = 1 << i; pulsos_X += 1; wait(velocidade); rotina_deslocamento_eixo(); pc.printf("Pos atualX AH: %f\r\n", deslocamento_X); } pc.printf("Entrou no while posX_atual"); } } else { while (deslocamento_X < posX0_desejada) { //While para verificar que o motor funcione até a a posição desejada ser alcançada for(i = 0; i < 4; i++) { motor_x = 1 << i; pulsos_X -= 1; wait(velocidade); rotina_deslocamento_eixo(); pc.printf("Pos atualX H: %f\r\n", deslocamento_X); } } } posY_atual = deslocamento_Y; pc.printf("posY_atual: %f, posY0_desejada: %f \r\n",posY_atual, posY0_desejada); if(posY_atual < posY0_desejada) { while (posY_atual > posY0_desejada) { for(i = 3; i > -1; i--) { motor_y = 1 << i; pulsos_Y += 1; wait(velocidade); rotina_deslocamento_eixo(); } } } else { while (posY_atual < posY0_desejada) { for(i = 0; i < 4; i++) { motor_y = 1 << i; pulsos_Y -= 1; wait(velocidade); rotina_deslocamento_eixo(); } } } posZ_atual = deslocamento_Z; pc.printf("posZ_atual: %f, posZ0_desejada: %f \r\n",posZ_atual, posZ0_desejada); if(posZ_atual < posZ0_desejada) { while (deslocamento_Z > posZ0_desejada) { //While para verificar que o motor funcione até a a posição desejada ser alcançada for(i = 3; i > -1; i--) { motor_z = 1 << i; pulsos_Z += 1; wait(velocidade); rotina_deslocamento_eixo(); pc.printf("Pos atualZ AH: %f\r\n", deslocamento_X); } } } else { while (deslocamento_Z < posZ0_desejada) { //While para verificar que o motor funcione até a a posição desejada ser alcançada for(i = 0; i < 4; i++) { motor_z = 1 << i; pulsos_Z -= 1; wait(velocidade); rotina_deslocamento_eixo(); pc.printf("Pos atualX H: %f\r\n", deslocamento_X); } } } sinal = 1; // saída nível lógico "alto" lcd.cls(); lcd.locate(0,0); lcd.printf("Coletando"); pc.printf("Coletando\r\n"); wait(tempo); } void Rotina_Solta() { sinal = 0; // saída nível lógico "baixo" n_pulsosZ = (1/(passo_motor*passo_fuso))*360*deslocamentoZ_partida; // desloca a pipeta no eixo Z para sua posição de partida para evitar colisão n_pulsosX = (1/(passo_motor*passo_fuso))*360*deslocamento_solta_X; //movimentação do eixo X para posição de pega n_pulsosY = (1/(passo_motor*passo_fuso))*360*deslocamento_solta_Y; //movimentação do eixo Y para posição de pega n_pulsosZ = (1/(passo_motor*passo_fuso))*360*deslocamento_solta_Z; //movimentação do eixo Z para posição de pega sinal = 1; // saída nível lógico "alto" lcd.cls(); lcd.locate(0,0); lcd.printf("Depositando"); pc.printf("Depositando\r\n"); wait(tempo); }