Projeto Mecatrônico
/
Referenciamento
Referenciamento do eixo Z
Referenciamento.cpp@4:f01f91e5aefb, 2021-06-01 (annotated)
- Committer:
- doradalberto
- Date:
- Tue Jun 01 13:12:44 2021 +0000
- Revision:
- 4:f01f91e5aefb
- Parent:
- Referenciamneto.cpp@3:8f569cc10b95
rename;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
diogonac | 0:7049aa99ce41 | 1 | #include "mbed.h" |
diogonac | 0:7049aa99ce41 | 2 | #include "TextLCD.h" |
diogonac | 0:7049aa99ce41 | 3 | |
diogonac | 1:e8be78899409 | 4 | TextLCD lcd(D8, D9, D4, D5, D6, D7); //Comunicação com LCD |
diogonac | 3:8f569cc10b95 | 5 | BusOut motor_z(PB_1, PB_15, PB_14, PB_13); //Pinos para acionamento do motor |
diogonac | 3:8f569cc10b95 | 6 | |
diogonac | 1:e8be78899409 | 7 | Serial pc (D1, D0); //Comunicação com USB |
diogonac | 1:e8be78899409 | 8 | AnalogIn eixo_Z(PC_2); //Joystick eixo Z |
diogonac | 1:e8be78899409 | 9 | AnalogIn botao_SELECT(A0); //Botão SELECT da IHM |
diogonac | 1:e8be78899409 | 10 | InterruptIn posicao_salva(PA_15); //Botão de salva posição Joystick |
diogonac | 2:3eb5c816d496 | 11 | InterruptIn botao_emergencia_in(PC_4); //Botão de emergência para detectar acionamento |
diogonac | 1:e8be78899409 | 12 | InterruptIn botao_fim_curso(PC_12); //Chave de fim de curso |
diogonac | 1:e8be78899409 | 13 | DigitalIn botao_indicador_fonte_externa(PC_10); //Indica se os componentes dependentes da fonte externa estão energizados |
diogonac | 0:7049aa99ce41 | 14 | |
diogonac | 3:8f569cc10b95 | 15 | Timer debounce1; //Correção para botão de posição de salva |
diogonac | 3:8f569cc10b95 | 16 | Timer debounce2; //Correção para botão de emergência |
diogonac | 3:8f569cc10b95 | 17 | Timer debounce3; //Correção para chave de fim de curso |
diogonac | 1:e8be78899409 | 18 | |
diogonac | 3:8f569cc10b95 | 19 | int pulsos_horario, pulsos_anti_horario; //Contagem dos pulsos para o motor |
diogonac | 3:8f569cc10b95 | 20 | int i; //Variável para contar o incremento no motor |
diogonac | 3:8f569cc10b95 | 21 | int J_Z; //Variável para ler o potenciometro do Joystick |
diogonac | 3:8f569cc10b95 | 22 | int passo_fuso = 5; //Declara o passo do fuso |
diogonac | 3:8f569cc10b95 | 23 | int pegaZ; //Variável que receberá o valor da posição de salva |
diogonac | 3:8f569cc10b95 | 24 | int fonte_externa; //Variável para poder ler a existência da alimentação externa |
diogonac | 3:8f569cc10b95 | 25 | int SELECT; //Variável para leitura do botão SELECT da IHM |
diogonac | 3:8f569cc10b95 | 26 | int contador_SELECT = 0; //Define o contator do botão SELECT |
diogonac | 3:8f569cc10b95 | 27 | int contador_emergencia = 0; //Define o contator do botão de emergência |
diogonac | 2:3eb5c816d496 | 28 | |
diogonac | 3:8f569cc10b95 | 29 | float tempo_horario, tempo_anti_horario; //Define os tempos de acionamento do motor |
diogonac | 3:8f569cc10b95 | 30 | float deslocamento_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido horário (negativo) |
diogonac | 3:8f569cc10b95 | 31 | float deslocamento_anti_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido anti-horário (positivo) |
diogonac | 3:8f569cc10b95 | 32 | float deslocamento_Z = 0; //Define o deslocamento linear total |
diogonac | 3:8f569cc10b95 | 33 | float deslocamento_max_Z = 0; //Define o deslocamento linear máximo permitido |
diogonac | 3:8f569cc10b95 | 34 | float passo_motor = 5.625/32; //Declara o passo angular do motor |
diogonac | 2:3eb5c816d496 | 35 | |
diogonac | 3:8f569cc10b95 | 36 | bool valor_SELECT = false; //Boleana para lógica do botão SELECT |
diogonac | 3:8f569cc10b95 | 37 | bool estado_referenciamento = false; //Boleana para identificar a necessidade do referênciamento |
diogonac | 3:8f569cc10b95 | 38 | bool estado_botao_emergencia_in = false; //Boleana para identificar a necessidade do referênciamentosatisfazer a lógica da rotina_emergencia_in |
diogonac | 3:8f569cc10b95 | 39 | bool motor_referenciamento = false; //Boleana para permitir o movimento automático do motot no referenciamento |
diogonac | 2:3eb5c816d496 | 40 | |
diogonac | 3:8f569cc10b95 | 41 | // Rotinas do programa |
diogonac | 0:7049aa99ce41 | 42 | void rotina_posicao_salva(void); |
diogonac | 2:3eb5c816d496 | 43 | void rotina_emergencia_in(void); |
diogonac | 1:e8be78899409 | 44 | void rotina_velocidade_eixo_Z(void); |
diogonac | 1:e8be78899409 | 45 | void rotina_deslocamento_eixo_Z (void); |
diogonac | 1:e8be78899409 | 46 | void rotina_JOG_Z (void); |
diogonac | 1:e8be78899409 | 47 | void rotina_botoes_IHM (void); |
diogonac | 1:e8be78899409 | 48 | void rotina_referenciamento (void); |
diogonac | 0:7049aa99ce41 | 49 | |
diogonac | 0:7049aa99ce41 | 50 | |
diogonac | 0:7049aa99ce41 | 51 | int main() |
diogonac | 0:7049aa99ce41 | 52 | { |
diogonac | 3:8f569cc10b95 | 53 | pc.baud(115200); //Define a velocidade da porta USB |
diogonac | 3:8f569cc10b95 | 54 | motor_z = 0x00; //Estabelece a condição inicial do motor |
diogonac | 0:7049aa99ce41 | 55 | |
diogonac | 3:8f569cc10b95 | 56 | //Declara os pinos de interrupção com suas funções |
diogonac | 0:7049aa99ce41 | 57 | posicao_salva.rise(&rotina_posicao_salva); |
diogonac | 2:3eb5c816d496 | 58 | botao_emergencia_in.rise(&rotina_emergencia_in); |
diogonac | 1:e8be78899409 | 59 | botao_fim_curso.rise(&rotina_referenciamento); |
diogonac | 3:8f569cc10b95 | 60 | |
diogonac | 3:8f569cc10b95 | 61 | //Inicia o LCD |
diogonac | 1:e8be78899409 | 62 | wait_ms(500); |
diogonac | 1:e8be78899409 | 63 | lcd.locate(2,0); |
diogonac | 1:e8be78899409 | 64 | lcd.printf("SELECT para"); |
diogonac | 1:e8be78899409 | 65 | lcd.locate(0,1); |
diogonac | 1:e8be78899409 | 66 | lcd.printf("referenciamento"); |
diogonac | 0:7049aa99ce41 | 67 | |
diogonac | 0:7049aa99ce41 | 68 | while(1) { |
diogonac | 0:7049aa99ce41 | 69 | |
diogonac | 3:8f569cc10b95 | 70 | //Leitura de variáveis |
diogonac | 0:7049aa99ce41 | 71 | J_Z = eixo_Z.read_u16(); |
diogonac | 0:7049aa99ce41 | 72 | fonte_externa = botao_indicador_fonte_externa.read(); |
diogonac | 1:e8be78899409 | 73 | SELECT = botao_SELECT.read_u16(); |
diogonac | 0:7049aa99ce41 | 74 | |
diogonac | 3:8f569cc10b95 | 75 | if(fonte_externa == 0 & estado_referenciamento == true & estado_botao_emergencia_in == true) { //Condição para poder disponibilizar a função JOG |
diogonac | 2:3eb5c816d496 | 76 | |
diogonac | 3:8f569cc10b95 | 77 | //LCD |
diogonac | 1:e8be78899409 | 78 | lcd.locate(2,0); |
diogonac | 1:e8be78899409 | 79 | lcd.printf("PosicaoZ:"); |
diogonac | 0:7049aa99ce41 | 80 | lcd.locate(0,1); |
diogonac | 2:3eb5c816d496 | 81 | lcd.printf("%4fmm",deslocamento_Z); |
diogonac | 3:8f569cc10b95 | 82 | |
diogonac | 3:8f569cc10b95 | 83 | //Chama a rotina do JOG |
diogonac | 1:e8be78899409 | 84 | rotina_JOG_Z(); |
diogonac | 0:7049aa99ce41 | 85 | |
diogonac | 1:e8be78899409 | 86 | } else { |
diogonac | 3:8f569cc10b95 | 87 | |
diogonac | 3:8f569cc10b95 | 88 | //Chama a rotina dos botões da IHM |
diogonac | 1:e8be78899409 | 89 | rotina_botoes_IHM(); |
diogonac | 3:8f569cc10b95 | 90 | |
diogonac | 1:e8be78899409 | 91 | if(valor_SELECT == 1) { |
diogonac | 1:e8be78899409 | 92 | contador_SELECT = 1; |
diogonac | 3:8f569cc10b95 | 93 | |
diogonac | 1:e8be78899409 | 94 | lcd.cls(); |
diogonac | 1:e8be78899409 | 95 | lcd.locate(2,0); |
diogonac | 1:e8be78899409 | 96 | lcd.printf("Iniciando"); |
diogonac | 1:e8be78899409 | 97 | lcd.locate(0,1); |
diogonac | 1:e8be78899409 | 98 | lcd.printf("referenciamento"); |
diogonac | 3:8f569cc10b95 | 99 | |
diogonac | 3:8f569cc10b95 | 100 | //Permite o movimento automático do motor até atingir o fim de curso |
diogonac | 3:8f569cc10b95 | 101 | while(motor_referenciamento == false) { |
diogonac | 3:8f569cc10b95 | 102 | for(i = 0; i < 4; i++) { |
diogonac | 3:8f569cc10b95 | 103 | motor_z = 1 << i; |
diogonac | 3:8f569cc10b95 | 104 | wait(0.003); |
diogonac | 2:3eb5c816d496 | 105 | } |
diogonac | 2:3eb5c816d496 | 106 | |
diogonac | 2:3eb5c816d496 | 107 | } |
diogonac | 1:e8be78899409 | 108 | } |
diogonac | 0:7049aa99ce41 | 109 | } |
diogonac | 0:7049aa99ce41 | 110 | } |
diogonac | 0:7049aa99ce41 | 111 | } |
diogonac | 0:7049aa99ce41 | 112 | |
diogonac | 0:7049aa99ce41 | 113 | |
diogonac | 0:7049aa99ce41 | 114 | void rotina_posicao_salva() |
diogonac | 0:7049aa99ce41 | 115 | { |
diogonac | 1:e8be78899409 | 116 | debounce1.start(); |
diogonac | 3:8f569cc10b95 | 117 | |
diogonac | 3:8f569cc10b95 | 118 | if(debounce1.read_ms() >= 10) pegaZ = deslocamento_Z; //Salva a posição de pega |
diogonac | 0:7049aa99ce41 | 119 | else pegaZ = 0; |
diogonac | 3:8f569cc10b95 | 120 | |
diogonac | 1:e8be78899409 | 121 | debounce1.reset(); |
diogonac | 0:7049aa99ce41 | 122 | } |
diogonac | 0:7049aa99ce41 | 123 | |
diogonac | 2:3eb5c816d496 | 124 | void rotina_emergencia_in() |
diogonac | 0:7049aa99ce41 | 125 | { |
diogonac | 1:e8be78899409 | 126 | debounce2.start(); |
diogonac | 3:8f569cc10b95 | 127 | |
diogonac | 2:3eb5c816d496 | 128 | if(debounce2.read_ms() >= 120) { |
diogonac | 2:3eb5c816d496 | 129 | |
diogonac | 3:8f569cc10b95 | 130 | motor_z = 0x00; //Não permite que pulsos sejam enviados para o motor |
diogonac | 3:8f569cc10b95 | 131 | estado_referenciamento = false; //Solicita um novo referenciamento |
diogonac | 2:3eb5c816d496 | 132 | estado_botao_emergencia_in =! estado_botao_emergencia_in; |
diogonac | 2:3eb5c816d496 | 133 | contador_emergencia+=1; |
diogonac | 1:e8be78899409 | 134 | |
diogonac | 1:e8be78899409 | 135 | } |
diogonac | 3:8f569cc10b95 | 136 | |
diogonac | 1:e8be78899409 | 137 | debounce2.reset(); |
diogonac | 3:8f569cc10b95 | 138 | |
diogonac | 2:3eb5c816d496 | 139 | if(contador_emergencia > 1) { |
diogonac | 2:3eb5c816d496 | 140 | lcd.cls(); |
diogonac | 2:3eb5c816d496 | 141 | wait_ms(500); |
diogonac | 2:3eb5c816d496 | 142 | lcd.locate(0,0); |
diogonac | 2:3eb5c816d496 | 143 | lcd.printf("Emergencia ON"); |
diogonac | 2:3eb5c816d496 | 144 | lcd.locate(0,1); |
diogonac | 2:3eb5c816d496 | 145 | lcd.printf("Pressione RST"); |
diogonac | 3:8f569cc10b95 | 146 | |
diogonac | 3:8f569cc10b95 | 147 | exit(0); //Encerra o programa e obriga o usuário a resetar o sistema |
diogonac | 2:3eb5c816d496 | 148 | } |
diogonac | 0:7049aa99ce41 | 149 | } |
diogonac | 0:7049aa99ce41 | 150 | |
diogonac | 1:e8be78899409 | 151 | void rotina_velocidade_eixo_Z() |
diogonac | 0:7049aa99ce41 | 152 | { |
diogonac | 3:8f569cc10b95 | 153 | //Converte a leitura do Joystick para tempo de acionamento do motor |
diogonac | 3:8f569cc10b95 | 154 | tempo_horario = -1*J_Z*0.0000028 + 0.1875; |
diogonac | 2:3eb5c816d496 | 155 | tempo_anti_horario = J_Z*0.000002785 + 0.0025; |
diogonac | 0:7049aa99ce41 | 156 | } |
diogonac | 0:7049aa99ce41 | 157 | |
diogonac | 1:e8be78899409 | 158 | void rotina_deslocamento_eixo_Z() |
diogonac | 0:7049aa99ce41 | 159 | { |
diogonac | 3:8f569cc10b95 | 160 | //Calcula os deslocamentos no eixo Z |
diogonac | 0:7049aa99ce41 | 161 | deslocamento_horario_Z = (passo_fuso*pulsos_horario*passo_motor)/360; |
diogonac | 0:7049aa99ce41 | 162 | deslocamento_anti_horario_Z = (passo_fuso*pulsos_anti_horario*passo_motor)/360; |
diogonac | 2:3eb5c816d496 | 163 | deslocamento_Z = deslocamento_anti_horario_Z - deslocamento_horario_Z; |
diogonac | 0:7049aa99ce41 | 164 | } |
diogonac | 0:7049aa99ce41 | 165 | |
diogonac | 1:e8be78899409 | 166 | void rotina_botoes_IHM() |
diogonac | 1:e8be78899409 | 167 | { |
diogonac | 1:e8be78899409 | 168 | if(SELECT > 60000 & SELECT < 65000) valor_SELECT =! valor_SELECT; |
diogonac | 1:e8be78899409 | 169 | else valor_SELECT = 0; |
diogonac | 1:e8be78899409 | 170 | } |
diogonac | 1:e8be78899409 | 171 | |
diogonac | 1:e8be78899409 | 172 | void rotina_referenciamento() |
diogonac | 1:e8be78899409 | 173 | { |
diogonac | 3:8f569cc10b95 | 174 | debounce3.start(); |
diogonac | 1:e8be78899409 | 175 | |
diogonac | 2:3eb5c816d496 | 176 | if(debounce3.read_ms() >= 10 & contador_SELECT == 1 & estado_botao_emergencia_in == true) { |
diogonac | 3:8f569cc10b95 | 177 | |
diogonac | 1:e8be78899409 | 178 | estado_referenciamento =! estado_referenciamento; |
diogonac | 2:3eb5c816d496 | 179 | motor_referenciamento =! motor_referenciamento; |
diogonac | 3:8f569cc10b95 | 180 | |
diogonac | 2:3eb5c816d496 | 181 | deslocamento_max_Z = 100; |
diogonac | 3:8f569cc10b95 | 182 | |
diogonac | 1:e8be78899409 | 183 | lcd.cls(); |
diogonac | 1:e8be78899409 | 184 | wait_ms(50); |
diogonac | 1:e8be78899409 | 185 | lcd.locate(2,0); |
diogonac | 1:e8be78899409 | 186 | lcd.printf("Detectado"); |
diogonac | 1:e8be78899409 | 187 | wait_ms(1500); |
diogonac | 1:e8be78899409 | 188 | lcd.cls(); |
diogonac | 3:8f569cc10b95 | 189 | |
diogonac | 1:e8be78899409 | 190 | contador_SELECT = 0; |
diogonac | 1:e8be78899409 | 191 | } |
diogonac | 3:8f569cc10b95 | 192 | |
diogonac | 1:e8be78899409 | 193 | debounce3.reset(); |
diogonac | 1:e8be78899409 | 194 | } |
diogonac | 1:e8be78899409 | 195 | |
diogonac | 1:e8be78899409 | 196 | void rotina_JOG_Z() |
diogonac | 0:7049aa99ce41 | 197 | { |
diogonac | 3:8f569cc10b95 | 198 | if(31000 <= J_Z & J_Z <= 35000) motor_z = 0x00; |
diogonac | 0:7049aa99ce41 | 199 | |
diogonac | 3:8f569cc10b95 | 200 | else { |
diogonac | 2:3eb5c816d496 | 201 | if (J_Z > 31000 & deslocamento_Z > 0) { |
diogonac | 0:7049aa99ce41 | 202 | for(i = 0; i < 4; i++) { |
diogonac | 0:7049aa99ce41 | 203 | motor_z = 1 << i; |
diogonac | 1:e8be78899409 | 204 | rotina_velocidade_eixo_Z(); |
diogonac | 1:e8be78899409 | 205 | rotina_deslocamento_eixo_Z(); |
diogonac | 0:7049aa99ce41 | 206 | wait(tempo_horario); |
diogonac | 0:7049aa99ce41 | 207 | pulsos_horario+=1; |
diogonac | 0:7049aa99ce41 | 208 | } |
diogonac | 3:8f569cc10b95 | 209 | } else motor_z = 0x00; |
diogonac | 0:7049aa99ce41 | 210 | |
diogonac | 2:3eb5c816d496 | 211 | if(J_Z < 35000 & deslocamento_Z < deslocamento_max_Z) { |
diogonac | 0:7049aa99ce41 | 212 | for(i = 3; i > -1; i--) { |
diogonac | 0:7049aa99ce41 | 213 | motor_z = 1 << i; |
diogonac | 1:e8be78899409 | 214 | rotina_velocidade_eixo_Z(); |
diogonac | 1:e8be78899409 | 215 | rotina_deslocamento_eixo_Z(); |
diogonac | 0:7049aa99ce41 | 216 | wait(tempo_anti_horario); |
diogonac | 0:7049aa99ce41 | 217 | pulsos_anti_horario+=1; |
diogonac | 0:7049aa99ce41 | 218 | |
diogonac | 0:7049aa99ce41 | 219 | } |
diogonac | 3:8f569cc10b95 | 220 | } else motor_z = 0x00; |
diogonac | 0:7049aa99ce41 | 221 | } |
diogonac | 0:7049aa99ce41 | 222 | } |