Projeto de software do projeto mecatrônico

Dependencies:   Servo TCS3200 TextLCD2 X_NUCLEO_IHM01A1 mbed

Fork of PROJETO by Victor Mirkhan

Committer:
Victor_Mirkhan
Date:
Mon Jun 05 21:52:27 2017 +0000
Revision:
4:5dd6e95b5706
Parent:
3:77d4b108568c
Atualiza??o;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Victor_Mirkhan 3:77d4b108568c 1 #include "TextLCD.h"
Victor_Mirkhan 2:666ad168bacb 2 #include "L6474.h"
Victor_Mirkhan 3:77d4b108568c 3 #include "TCS3200.h"
Victor_Mirkhan 3:77d4b108568c 4 #include "Servo.h"
Victor_Mirkhan 2:666ad168bacb 5
Victor_Mirkhan 3:77d4b108568c 6
Victor_Mirkhan 3:77d4b108568c 7 // Set do display LCD 20x4 com o módulo I2C
Victor_Mirkhan 2:666ad168bacb 8
Victor_Mirkhan 3:77d4b108568c 9 I2C i2c_lcd(D14,D15);
Victor_Mirkhan 3:77d4b108568c 10 TextLCD_I2C lcd(&i2c_lcd, 0x7E,TextLCD::LCD20x4);
Victor_Mirkhan 2:666ad168bacb 11
Victor_Mirkhan 2:666ad168bacb 12 /*-----Declaração dos pinos e suas funções-----*/
Victor_Mirkhan 2:666ad168bacb 13
Victor_Mirkhan 2:666ad168bacb 14 //PINOS DE INTERRUPÇÃO.
Victor_Mirkhan 2:666ad168bacb 15
Victor_Mirkhan 3:77d4b108568c 16 InterruptIn jog_button_pos(PC_12); // Botão para jog+ e navegação no menu
Victor_Mirkhan 3:77d4b108568c 17 InterruptIn jog_button_neg(PA_15); // Botão para jog- e navegação no menu
Victor_Mirkhan 3:77d4b108568c 18
Victor_Mirkhan 3:77d4b108568c 19 InterruptIn btnX(PC_3); // Botão para selecionar o eixo X
Victor_Mirkhan 3:77d4b108568c 20 InterruptIn btnY(PC_2); // Botão para selecionar o eixo Y
Victor_Mirkhan 3:77d4b108568c 21 InterruptIn btnZ(PC_0); // Botão para selecionar o eixo Z
Victor_Mirkhan 2:666ad168bacb 22
Victor_Mirkhan 3:77d4b108568c 23 InterruptIn confirma(PC_13); // Botão OK do menu (pino do botão do usuario)
Victor_Mirkhan 3:77d4b108568c 24 InterruptIn back_btn(PB_7); // Botão para a função "voltar" do menu
Victor_Mirkhan 2:666ad168bacb 25
Victor_Mirkhan 4:5dd6e95b5706 26 InterruptIn FDC(PC_5); // Fim de curso para o eixo Z
Victor_Mirkhan 3:77d4b108568c 27 InterruptIn FDC2(PC_8); // Fim de curso para o eixo X
Victor_Mirkhan 3:77d4b108568c 28 InterruptIn FDC3(PC_6); // Fim de curso para o eixo Y
Victor_Mirkhan 2:666ad168bacb 29
Victor_Mirkhan 2:666ad168bacb 30 /*-----Declaração de variaveis globais do código-----*/
Victor_Mirkhan 2:666ad168bacb 31
Victor_Mirkhan 3:77d4b108568c 32 bool referZ = false; // Parametro para o referenciamento do motor 1
Victor_Mirkhan 3:77d4b108568c 33 bool referX = false; // Parametro para o referenciamento do motor 2
Victor_Mirkhan 3:77d4b108568c 34 bool referY = false; // Parametro para o referenciamento do motor 3
Victor_Mirkhan 3:77d4b108568c 35
Victor_Mirkhan 3:77d4b108568c 36 bool save_pos = false; // Parametro para definir o fim da rotina de save pick\drop
Victor_Mirkhan 3:77d4b108568c 37
Victor_Mirkhan 3:77d4b108568c 38 bool dirx = false; // Indicador que o motor ira se movimentar no eixo x
Victor_Mirkhan 3:77d4b108568c 39 bool diry = false; // Indicador que o motor ira se movimentar no eixo y
Victor_Mirkhan 3:77d4b108568c 40 bool dirz = false; // Indicador que o motor ira se movimentar no eixo z
Victor_Mirkhan 3:77d4b108568c 41
Victor_Mirkhan 3:77d4b108568c 42 bool jog_pos = false; // Indicador para a movimentação do motor no jog (+)
Victor_Mirkhan 3:77d4b108568c 43 bool jog_neg = false; // Indicador para a movimentação do motor no jog (-)
Victor_Mirkhan 3:77d4b108568c 44 bool ref_cycle = true; // Indicador para a realização do ciclo Pick/Place
Victor_Mirkhan 2:666ad168bacb 45
Victor_Mirkhan 3:77d4b108568c 46 bool enable = false; // Variavel auxiliar para navegação no motor
Victor_Mirkhan 3:77d4b108568c 47 bool flag = true; // Variavel auxiliar para utilizar mais de uma vez as funções disponiveis no menu
Victor_Mirkhan 3:77d4b108568c 48
Victor_Mirkhan 3:77d4b108568c 49 signed char change = 0; // Numero que varia de 0 a 2, indicando qual set de velocidade será usado
Victor_Mirkhan 3:77d4b108568c 50 signed char ref_cursor = 0; // Numero de referência para a posição do cursor
Victor_Mirkhan 3:77d4b108568c 51 unsigned char ref_menu = 0; // Numero para indicar o menu atual
Victor_Mirkhan 2:666ad168bacb 52
Victor_Mirkhan 3:77d4b108568c 53 /*Criação de uma struct (basicamente, uma classe) para sets de velocidades e acelerações
Victor_Mirkhan 3:77d4b108568c 54 diferentes. Cada objeto dessa struct possui os argumentos de velocidades max e min e
Victor_Mirkhan 3:77d4b108568c 55 aceleração e desaceleração.
Victor_Mirkhan 3:77d4b108568c 56 */
Victor_Mirkhan 2:666ad168bacb 57
Victor_Mirkhan 2:666ad168bacb 58 struct set_velocidades {
Victor_Mirkhan 3:77d4b108568c 59 unsigned int maxspeed;
Victor_Mirkhan 3:77d4b108568c 60 unsigned int minspeed;
Victor_Mirkhan 3:77d4b108568c 61 unsigned int ac;
Victor_Mirkhan 3:77d4b108568c 62 unsigned int dc;
Victor_Mirkhan 2:666ad168bacb 63 };
Victor_Mirkhan 2:666ad168bacb 64
Victor_Mirkhan 3:77d4b108568c 65 struct set_velocidades set[3]; /* Cria um objeto da struct set_velocidades com três
Victor_Mirkhan 3:77d4b108568c 66 objetos dentro dele (basicamente, um objeto triplo).
Victor_Mirkhan 3:77d4b108568c 67 */
Victor_Mirkhan 2:666ad168bacb 68
Victor_Mirkhan 2:666ad168bacb 69 //Struct para sets de coordenadas, com argumentos de posição em x,y e z.
Victor_Mirkhan 3:77d4b108568c 70
Victor_Mirkhan 2:666ad168bacb 71 struct Coordenadas {
Victor_Mirkhan 2:666ad168bacb 72 int posx;
Victor_Mirkhan 2:666ad168bacb 73 int posy;
Victor_Mirkhan 2:666ad168bacb 74 int posz;
Victor_Mirkhan 2:666ad168bacb 75 };
Victor_Mirkhan 2:666ad168bacb 76
Victor_Mirkhan 3:77d4b108568c 77 struct Coordenadas PickPos,DropPos[3]; //Cria objeto unico para posição de pick, e objeto triplo para posição de place.
Victor_Mirkhan 3:77d4b108568c 78
Victor_Mirkhan 3:77d4b108568c 79 // Perfil de incialização do motor
Victor_Mirkhan 2:666ad168bacb 80
Victor_Mirkhan 3:77d4b108568c 81 L6474_init_t init = {
Victor_Mirkhan 3:77d4b108568c 82 160, /* Acceleration rate in pps^2. Range: (0..+inf). */
Victor_Mirkhan 3:77d4b108568c 83 160, /* Deceleration rate in pps^2. Range: (0..+inf). */
Victor_Mirkhan 3:77d4b108568c 84 1600, /* Maximum speed in pps. Range: (30..10000]. */
Victor_Mirkhan 3:77d4b108568c 85 800, /* Minimum speed in pps. Range: [30..10000). */
Victor_Mirkhan 3:77d4b108568c 86 1000, /* Torque regulation current in mA. Range: 31.25mA to 4000mA. */
Victor_Mirkhan 3:77d4b108568c 87 L6474_OCD_TH_1500mA, /* Overcurrent threshold (OCD_TH register). */
Victor_Mirkhan 3:77d4b108568c 88 L6474_CONFIG_OC_SD_ENABLE, /* Overcurrent shutwdown (OC_SD field of CONFIG register). */
Victor_Mirkhan 3:77d4b108568c 89 L6474_CONFIG_EN_TQREG_TVAL_USED, /* Torque regulation method (EN_TQREG field of CONFIG register). */
Victor_Mirkhan 3:77d4b108568c 90 L6474_STEP_SEL_1_8, /* Step selection (STEP_SEL field of STEP_MODE register). */
Victor_Mirkhan 3:77d4b108568c 91 L6474_SYNC_SEL_1_2, /* Sync selection (SYNC_SEL field of STEP_MODE register). */
Victor_Mirkhan 3:77d4b108568c 92 L6474_FAST_STEP_12us, /* Fall time value (T_FAST field of T_FAST register). Range: 2us to 32us. */
Victor_Mirkhan 3:77d4b108568c 93 L6474_TOFF_FAST_8us, /* Maximum fast decay time (T_OFF field of T_FAST register). Range: 2us to 32us. */
Victor_Mirkhan 3:77d4b108568c 94 3, /* Minimum ON time in us (TON_MIN register). Range: 0.5us to 64us. */
Victor_Mirkhan 3:77d4b108568c 95 21, /* Minimum OFF time in us (TOFF_MIN register). Range: 0.5us to 64us. */
Victor_Mirkhan 3:77d4b108568c 96 L6474_CONFIG_TOFF_044us, /* Target Swicthing Period (field TOFF of CONFIG register). */
Victor_Mirkhan 3:77d4b108568c 97 L6474_CONFIG_SR_320V_us, /* Slew rate (POW_SR field of CONFIG register). */
Victor_Mirkhan 3:77d4b108568c 98 L6474_CONFIG_INT_16MHZ, /* Clock setting (OSC_CLK_SEL field of CONFIG register). */
Victor_Mirkhan 3:77d4b108568c 99 L6474_ALARM_EN_OVERCURRENT |
Victor_Mirkhan 3:77d4b108568c 100 L6474_ALARM_EN_THERMAL_SHUTDOWN |
Victor_Mirkhan 3:77d4b108568c 101 L6474_ALARM_EN_THERMAL_WARNING |
Victor_Mirkhan 3:77d4b108568c 102 L6474_ALARM_EN_UNDERVOLTAGE |
Victor_Mirkhan 3:77d4b108568c 103 L6474_ALARM_EN_SW_TURN_ON |
Victor_Mirkhan 3:77d4b108568c 104 L6474_ALARM_EN_WRONG_NPERF_CMD /* Alarm (ALARM_EN register). */
Victor_Mirkhan 3:77d4b108568c 105 };
Victor_Mirkhan 3:77d4b108568c 106
Victor_Mirkhan 3:77d4b108568c 107 // Declaração dos motores utilizados
Victor_Mirkhan 3:77d4b108568c 108
Victor_Mirkhan 3:77d4b108568c 109 L6474 *motorZ;
Victor_Mirkhan 3:77d4b108568c 110 L6474 *motorX;
Victor_Mirkhan 3:77d4b108568c 111 L6474 *motorY;
Victor_Mirkhan 2:666ad168bacb 112
Victor_Mirkhan 2:666ad168bacb 113 /*-----Declaração de funções auxiliares----*/
Victor_Mirkhan 2:666ad168bacb 114
Victor_Mirkhan 3:77d4b108568c 115 /* FUNÇÕES "sobe_cursor(void)" E "desce_cursor(void)":
Victor_Mirkhan 3:77d4b108568c 116 1-) Adiciona ou subtrai 1 da variavel ref_cursor;
Victor_Mirkhan 3:77d4b108568c 117 2-) Atribui o valor de linha máx ou mín se o ref_cursor atravessar algum
Victor_Mirkhan 3:77d4b108568c 118 extremo da tela LCD;
Victor_Mirkhan 3:77d4b108568c 119 3-) O cursor se posiciona de acordo com a posição designada;
Victor_Mirkhan 3:77d4b108568c 120 */
Victor_Mirkhan 3:77d4b108568c 121 void sobe_cursor(void)
Victor_Mirkhan 3:77d4b108568c 122 {
Victor_Mirkhan 3:77d4b108568c 123 ref_cursor += 1;
Victor_Mirkhan 3:77d4b108568c 124 if (ref_cursor > 3) {
Victor_Mirkhan 3:77d4b108568c 125 ref_cursor = 0;
Victor_Mirkhan 3:77d4b108568c 126 }
Victor_Mirkhan 3:77d4b108568c 127 }
Victor_Mirkhan 3:77d4b108568c 128
Victor_Mirkhan 3:77d4b108568c 129 void desce_cursor(void)
Victor_Mirkhan 3:77d4b108568c 130 {
Victor_Mirkhan 3:77d4b108568c 131 ref_cursor -= 1;
Victor_Mirkhan 3:77d4b108568c 132 if (ref_cursor < 0) {
Victor_Mirkhan 3:77d4b108568c 133 ref_cursor = 3;
Victor_Mirkhan 3:77d4b108568c 134 }
Victor_Mirkhan 3:77d4b108568c 135 }
Victor_Mirkhan 3:77d4b108568c 136
Victor_Mirkhan 3:77d4b108568c 137 /* FUNÇÃO "conclusao(char n)":
Victor_Mirkhan 3:77d4b108568c 138 1-)Desliga o cursor;
Victor_Mirkhan 3:77d4b108568c 139 2-)Apresenta uma mensagem de conclusão do salvamento das posições:
Victor_Mirkhan 3:77d4b108568c 140 -> Se n = 0, apresenta a mensagem de conclusão do PICK;
Victor_Mirkhan 3:77d4b108568c 141 -> Se n != 0, apresenta a mensagem de alguma das posições de DROP (depende do valor de n);
Victor_Mirkhan 3:77d4b108568c 142 */
Victor_Mirkhan 3:77d4b108568c 143
Victor_Mirkhan 3:77d4b108568c 144 void conclusao(char n)
Victor_Mirkhan 3:77d4b108568c 145 {
Victor_Mirkhan 3:77d4b108568c 146 lcd.setCursor(TextLCD::CurOff_BlkOff);
Victor_Mirkhan 3:77d4b108568c 147 if (n == 0) {
Victor_Mirkhan 3:77d4b108568c 148 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 149 lcd.locate(4,0);
Victor_Mirkhan 3:77d4b108568c 150 lcd.printf("PICK POSITION");
Victor_Mirkhan 3:77d4b108568c 151 lcd.locate(7,1);
Victor_Mirkhan 3:77d4b108568c 152 lcd.printf("SALVA!");
Victor_Mirkhan 3:77d4b108568c 153 wait(2);
Victor_Mirkhan 3:77d4b108568c 154 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 155 }
Victor_Mirkhan 3:77d4b108568c 156 if (n > 0) {
Victor_Mirkhan 3:77d4b108568c 157 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 158 lcd.locate(3,0);
Victor_Mirkhan 3:77d4b108568c 159 lcd.printf("DROP POSITION %d", n);
Victor_Mirkhan 3:77d4b108568c 160 lcd.locate(7,1);
Victor_Mirkhan 3:77d4b108568c 161 lcd.printf("SALVA!");
Victor_Mirkhan 3:77d4b108568c 162 wait(2);
Victor_Mirkhan 3:77d4b108568c 163 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 164 }
Victor_Mirkhan 3:77d4b108568c 165 }
Victor_Mirkhan 3:77d4b108568c 166
Victor_Mirkhan 3:77d4b108568c 167 /*FUNÇÃO "menu_jog(void)":
Victor_Mirkhan 3:77d4b108568c 168 -> Prepara a estrutura para printar no LCD as posições atuais de cada eixo.
Victor_Mirkhan 3:77d4b108568c 169 */
Victor_Mirkhan 3:77d4b108568c 170
Victor_Mirkhan 3:77d4b108568c 171 void menu_jog(void)
Victor_Mirkhan 3:77d4b108568c 172 {
Victor_Mirkhan 3:77d4b108568c 173 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 174 lcd.locate(0,1);
Victor_Mirkhan 3:77d4b108568c 175 lcd.printf("X: ");
Victor_Mirkhan 3:77d4b108568c 176 lcd.locate(0,2);
Victor_Mirkhan 3:77d4b108568c 177 lcd.printf("Y: ");
Victor_Mirkhan 3:77d4b108568c 178 lcd.locate(0,3);
Victor_Mirkhan 3:77d4b108568c 179 lcd.printf("Z: ");
Victor_Mirkhan 3:77d4b108568c 180 }
Victor_Mirkhan 3:77d4b108568c 181
Victor_Mirkhan 4:5dd6e95b5706 182 /*FUNÇÃO "menu_passivo(char n)":
Victor_Mirkhan 3:77d4b108568c 183 -> A função apresenta um menu estático diferente de acordo com o valor n recebido.
Victor_Mirkhan 3:77d4b108568c 184 Os menus aqui disponiveis são estáticos pois são temporários e não possibilitam
Victor_Mirkhan 3:77d4b108568c 185 seleção de funções ou movimento do cursor.
Victor_Mirkhan 3:77d4b108568c 186 -> Os menus estáticos são chamados para avisar ao usuário da realização de alguma
Victor_Mirkhan 3:77d4b108568c 187 função, da inicialização da maquina e seu estado de operação.
Victor_Mirkhan 3:77d4b108568c 188 */
Victor_Mirkhan 3:77d4b108568c 189
Victor_Mirkhan 4:5dd6e95b5706 190 void menu_passivo(char n)
Victor_Mirkhan 3:77d4b108568c 191 {
Victor_Mirkhan 3:77d4b108568c 192 switch(n) {
Victor_Mirkhan 3:77d4b108568c 193
Victor_Mirkhan 3:77d4b108568c 194 // Menu estático 1 é o menu de abertura (ao ligar a máquina)
Victor_Mirkhan 3:77d4b108568c 195 case 1: {
Victor_Mirkhan 3:77d4b108568c 196 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 197 lcd.locate(6,0);
Victor_Mirkhan 3:77d4b108568c 198 lcd.printf("Maquina");
Victor_Mirkhan 3:77d4b108568c 199 lcd.locate(3,1);
Victor_Mirkhan 3:77d4b108568c 200 lcd.printf("Pick-and-Place");
Victor_Mirkhan 3:77d4b108568c 201 lcd.locate(5,2);
Victor_Mirkhan 3:77d4b108568c 202 lcd.printf("RAWCAMBOLE");
Victor_Mirkhan 3:77d4b108568c 203 wait(3);
Victor_Mirkhan 3:77d4b108568c 204 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 205 break;
Victor_Mirkhan 3:77d4b108568c 206 }
Victor_Mirkhan 3:77d4b108568c 207 // Menu estático 2 é o menu chamado durante a ação de referenciamento da máquina
Victor_Mirkhan 3:77d4b108568c 208 case 2: {
Victor_Mirkhan 3:77d4b108568c 209 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 210 lcd.printf("Setando ponto de");
Victor_Mirkhan 3:77d4b108568c 211 lcd.locate(5,1);
Victor_Mirkhan 3:77d4b108568c 212 lcd.printf("origem!");
Victor_Mirkhan 3:77d4b108568c 213 lcd.locate(5,3);
Victor_Mirkhan 3:77d4b108568c 214 lcd.printf("AGUARDE...");
Victor_Mirkhan 3:77d4b108568c 215 break;
Victor_Mirkhan 3:77d4b108568c 216 }
Victor_Mirkhan 3:77d4b108568c 217 // Menu estático 3 é chamado durante o ciclo infinito
Victor_Mirkhan 3:77d4b108568c 218 case 3: {
Victor_Mirkhan 3:77d4b108568c 219 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 220 lcd.printf("Maquina operando");
Victor_Mirkhan 3:77d4b108568c 221 lcd.locate(2,1);
Victor_Mirkhan 3:77d4b108568c 222 lcd.printf(" em ciclo");
Victor_Mirkhan 3:77d4b108568c 223 lcd.locate(2,3);
Victor_Mirkhan 3:77d4b108568c 224 lcd.printf("STOP-> Press Back");
Victor_Mirkhan 3:77d4b108568c 225 break;
Victor_Mirkhan 3:77d4b108568c 226 }
Victor_Mirkhan 3:77d4b108568c 227 // Menu estático 4 é chamado durante o ciclo único
Victor_Mirkhan 3:77d4b108568c 228 case 4: {
Victor_Mirkhan 3:77d4b108568c 229 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 230 lcd.printf("Maquina operando");
Victor_Mirkhan 3:77d4b108568c 231 lcd.locate(2,1);
Victor_Mirkhan 3:77d4b108568c 232 lcd.printf("apenas um ciclo");
Victor_Mirkhan 3:77d4b108568c 233 break;
Victor_Mirkhan 3:77d4b108568c 234 }
Victor_Mirkhan 3:77d4b108568c 235
Victor_Mirkhan 3:77d4b108568c 236 }
Victor_Mirkhan 3:77d4b108568c 237 }
Victor_Mirkhan 2:666ad168bacb 238
Victor_Mirkhan 3:77d4b108568c 239 /* FUNÇÕES "jog_(...)":
Victor_Mirkhan 3:77d4b108568c 240 -> As funções de jog vem em pares de "on" e "off", um par para cada direção.
Victor_Mirkhan 3:77d4b108568c 241 1-) A função "on" apenas seta uma variavel em TRUE, possibilitando a movimentação
Victor_Mirkhan 3:77d4b108568c 242 em determinada direção;
Victor_Mirkhan 3:77d4b108568c 243 2-) A função "off" seta o valor mesma variavel em FALSE e para a movimentação do motor,
Victor_Mirkhan 3:77d4b108568c 244 terminando com a operação de jog em determinada direção;
Victor_Mirkhan 3:77d4b108568c 245 */
Victor_Mirkhan 3:77d4b108568c 246
Victor_Mirkhan 3:77d4b108568c 247 void jog_pos_on(void)
Victor_Mirkhan 3:77d4b108568c 248 {
Victor_Mirkhan 3:77d4b108568c 249 jog_pos = true;
Victor_Mirkhan 3:77d4b108568c 250 }
Victor_Mirkhan 3:77d4b108568c 251
Victor_Mirkhan 3:77d4b108568c 252 void jog_pos_off(void)
Victor_Mirkhan 3:77d4b108568c 253 {
Victor_Mirkhan 3:77d4b108568c 254 jog_pos = false;
Victor_Mirkhan 3:77d4b108568c 255 motorZ->hard_stop();
Victor_Mirkhan 3:77d4b108568c 256 motorX->hard_stop();
Victor_Mirkhan 3:77d4b108568c 257 motorY->hard_stop();
Victor_Mirkhan 3:77d4b108568c 258 }
Victor_Mirkhan 3:77d4b108568c 259
Victor_Mirkhan 3:77d4b108568c 260 void jog_neg_on(void)
Victor_Mirkhan 3:77d4b108568c 261 {
Victor_Mirkhan 3:77d4b108568c 262 jog_neg = true;
Victor_Mirkhan 3:77d4b108568c 263 }
Victor_Mirkhan 3:77d4b108568c 264
Victor_Mirkhan 3:77d4b108568c 265 void jog_neg_off(void)
Victor_Mirkhan 3:77d4b108568c 266 {
Victor_Mirkhan 3:77d4b108568c 267 jog_neg = false;
Victor_Mirkhan 3:77d4b108568c 268 motorZ->hard_stop();
Victor_Mirkhan 3:77d4b108568c 269 motorX->hard_stop();
Victor_Mirkhan 3:77d4b108568c 270 motorY->hard_stop();
Victor_Mirkhan 3:77d4b108568c 271 }
Victor_Mirkhan 3:77d4b108568c 272
Victor_Mirkhan 3:77d4b108568c 273 /* FUNÇÕES "motorN_off(void)":
Victor_Mirkhan 3:77d4b108568c 274 1-) Para a movimentação do motor;
Victor_Mirkhan 3:77d4b108568c 275 2-) Seta uma variavel booleana em TRUE para indicar que o referenciamento de tal
Victor_Mirkhan 3:77d4b108568c 276 eixo está pronto;
Victor_Mirkhan 3:77d4b108568c 277 */
Victor_Mirkhan 3:77d4b108568c 278
Victor_Mirkhan 3:77d4b108568c 279 void motorZ_off(void)
Victor_Mirkhan 3:77d4b108568c 280 {
Victor_Mirkhan 3:77d4b108568c 281 motorZ->hard_stop();
Victor_Mirkhan 3:77d4b108568c 282 referZ = true;
Victor_Mirkhan 3:77d4b108568c 283 }
Victor_Mirkhan 3:77d4b108568c 284
Victor_Mirkhan 3:77d4b108568c 285 void motorX_off(void)
Victor_Mirkhan 3:77d4b108568c 286 {
Victor_Mirkhan 3:77d4b108568c 287 motorX->hard_stop();
Victor_Mirkhan 3:77d4b108568c 288 referX = true;
Victor_Mirkhan 3:77d4b108568c 289 }
Victor_Mirkhan 3:77d4b108568c 290
Victor_Mirkhan 3:77d4b108568c 291 void motorY_off(void)
Victor_Mirkhan 3:77d4b108568c 292 {
Victor_Mirkhan 3:77d4b108568c 293 motorY->hard_stop();
Victor_Mirkhan 3:77d4b108568c 294 referY = true;
Victor_Mirkhan 3:77d4b108568c 295 }
Victor_Mirkhan 3:77d4b108568c 296
Victor_Mirkhan 3:77d4b108568c 297 /*FUNÇÕES "set_aceleracoesN(...)":
Victor_Mirkhan 3:77d4b108568c 298 -> Função recebe os seguintes parâmetros:
Victor_Mirkhan 3:77d4b108568c 299 1-) Velocidade máxima;
Victor_Mirkhan 3:77d4b108568c 300 2-) Velocidade mínima;
Victor_Mirkhan 3:77d4b108568c 301 3-) Aceleração;
Victor_Mirkhan 3:77d4b108568c 302 4-) Desaceleração;
Victor_Mirkhan 3:77d4b108568c 303 -> Função seta esses valores no motor N
Victor_Mirkhan 3:77d4b108568c 304 */
Victor_Mirkhan 3:77d4b108568c 305 void set_aceleracoesZ(int maxspeed,int minspeed,int ac,int dc)
Victor_Mirkhan 3:77d4b108568c 306 {
Victor_Mirkhan 4:5dd6e95b5706 307 motorZ->set_max_speed(maxspeed)/2;
Victor_Mirkhan 4:5dd6e95b5706 308 motorZ->set_min_speed(minspeed)/2;
Victor_Mirkhan 4:5dd6e95b5706 309 motorZ->set_acceleration(ac)/2;
Victor_Mirkhan 4:5dd6e95b5706 310 motorZ->set_deceleration(dc)/2;
Victor_Mirkhan 2:666ad168bacb 311 }
Victor_Mirkhan 3:77d4b108568c 312
Victor_Mirkhan 3:77d4b108568c 313 void set_aceleracoesX(int maxspeed,int minspeed,int ac,int dc)
Victor_Mirkhan 3:77d4b108568c 314 {
Victor_Mirkhan 3:77d4b108568c 315 motorX->set_max_speed(maxspeed);
Victor_Mirkhan 3:77d4b108568c 316 motorX->set_min_speed(minspeed);
Victor_Mirkhan 3:77d4b108568c 317 motorX->set_acceleration(ac);
Victor_Mirkhan 3:77d4b108568c 318 motorX->set_deceleration(dc);
Victor_Mirkhan 3:77d4b108568c 319 }
Victor_Mirkhan 3:77d4b108568c 320
Victor_Mirkhan 3:77d4b108568c 321 void set_aceleracoesY(int maxspeed,int minspeed,int ac,int dc)
Victor_Mirkhan 3:77d4b108568c 322 {
Victor_Mirkhan 3:77d4b108568c 323 motorY->set_max_speed(maxspeed);
Victor_Mirkhan 3:77d4b108568c 324 motorY->set_min_speed(minspeed);
Victor_Mirkhan 3:77d4b108568c 325 motorY->set_acceleration(ac);
Victor_Mirkhan 3:77d4b108568c 326 motorY->set_deceleration(dc);
Victor_Mirkhan 3:77d4b108568c 327 }
Victor_Mirkhan 3:77d4b108568c 328
Victor_Mirkhan 3:77d4b108568c 329 /*FUNÇÕES "save_pick_pos()" E "save_dropN":
Victor_Mirkhan 3:77d4b108568c 330 1-) Função captura as posições atuais dos 3 motores e armazenam seus valores
Victor_Mirkhan 3:77d4b108568c 331 nos atributos respectivos de seu objeto respectivo.
Victor_Mirkhan 3:77d4b108568c 332 2-) Altera o valor de uma variavel booleana para TRUE, indicando o fim da
Victor_Mirkhan 3:77d4b108568c 333 operação de jog.
Victor_Mirkhan 3:77d4b108568c 334 */
Victor_Mirkhan 3:77d4b108568c 335
Victor_Mirkhan 3:77d4b108568c 336 void save_pick_pos(void)
Victor_Mirkhan 3:77d4b108568c 337 {
Victor_Mirkhan 3:77d4b108568c 338 PickPos.posx = motorX->get_position();
Victor_Mirkhan 3:77d4b108568c 339 PickPos.posy = motorY->get_position();
Victor_Mirkhan 3:77d4b108568c 340 PickPos.posz = motorZ->get_position();
Victor_Mirkhan 3:77d4b108568c 341 save_pos = true;
Victor_Mirkhan 3:77d4b108568c 342 }
Victor_Mirkhan 3:77d4b108568c 343
Victor_Mirkhan 3:77d4b108568c 344 void save_drop1()
Victor_Mirkhan 3:77d4b108568c 345 {
Victor_Mirkhan 3:77d4b108568c 346 DropPos[0].posx = motorX->get_position();
Victor_Mirkhan 3:77d4b108568c 347 DropPos[0].posy = motorY->get_position();
Victor_Mirkhan 3:77d4b108568c 348 DropPos[0].posz = motorZ->get_position();
Victor_Mirkhan 3:77d4b108568c 349 save_pos = true;
Victor_Mirkhan 3:77d4b108568c 350 }
Victor_Mirkhan 3:77d4b108568c 351
Victor_Mirkhan 3:77d4b108568c 352 void save_drop2()
Victor_Mirkhan 3:77d4b108568c 353 {
Victor_Mirkhan 3:77d4b108568c 354 DropPos[1].posx = motorX->get_position();
Victor_Mirkhan 3:77d4b108568c 355 DropPos[1].posy = motorY->get_position();
Victor_Mirkhan 3:77d4b108568c 356 DropPos[1].posz = motorZ->get_position();
Victor_Mirkhan 3:77d4b108568c 357 save_pos = true;
Victor_Mirkhan 3:77d4b108568c 358 }
Victor_Mirkhan 3:77d4b108568c 359
Victor_Mirkhan 3:77d4b108568c 360 void save_drop3()
Victor_Mirkhan 3:77d4b108568c 361 {
Victor_Mirkhan 3:77d4b108568c 362 DropPos[2].posx = motorX->get_position();
Victor_Mirkhan 3:77d4b108568c 363 DropPos[2].posy = motorY->get_position();
Victor_Mirkhan 3:77d4b108568c 364 DropPos[2].posz = motorZ->get_position();
Victor_Mirkhan 3:77d4b108568c 365 save_pos = true;
Victor_Mirkhan 3:77d4b108568c 366 }
Victor_Mirkhan 3:77d4b108568c 367
Victor_Mirkhan 3:77d4b108568c 368 /* FUNÇÃO "reconhecimento_peca()":
Victor_Mirkhan 3:77d4b108568c 369 1-) Função primeiro usa o sensor de cor para identificar a cor predominante:
Victor_Mirkhan 3:77d4b108568c 370 verde, vermelho ou azul e também o indutivo para identificar o material;
Victor_Mirkhan 3:77d4b108568c 371 -> De acordo com a leitura do sensor, definiram-se apenas duas opções: ver-
Victor_Mirkhan 3:77d4b108568c 372 de ou não verde (se não verde, ele retorna vermelho);
Victor_Mirkhan 3:77d4b108568c 373 2-) Um reconhecimento é feito a cada 0.1 segundos por 1 segundo, e cada um dos três resultados
Victor_Mirkhan 3:77d4b108568c 374 possiveis recebe um tag:
Victor_Mirkhan 3:77d4b108568c 375 -> Tag 0 = etiqueta verde e metal;
Victor_Mirkhan 3:77d4b108568c 376 -> Tag 1 = etiqueta verde e polimero;
Victor_Mirkhan 3:77d4b108568c 377 -> Tag 2 = etiqueta vermelha, qualquer material;
Victor_Mirkhan 3:77d4b108568c 378 O valor do tag de cada medição é armazenado em uma array.
Victor_Mirkhan 3:77d4b108568c 379 3-) Em um par de loops, avalia-se qual foi o tag que mais apareceu. O que for
Victor_Mirkhan 3:77d4b108568c 380 a maioria, será considerado como o tag (ou cor) verdadeiro, que é o valor
Victor_Mirkhan 3:77d4b108568c 381 retornado pela função;
Victor_Mirkhan 3:77d4b108568c 382 4-) Esse tag servirá como o indice da struct de structs "DropPos", indicando
Victor_Mirkhan 3:77d4b108568c 383 para qual posição de DROP ele deveria ir
Victor_Mirkhan 3:77d4b108568c 384 */
Victor_Mirkhan 2:666ad168bacb 385
Victor_Mirkhan 3:77d4b108568c 386 int reconhecimento_peca(void)
Victor_Mirkhan 3:77d4b108568c 387 {
Victor_Mirkhan 3:77d4b108568c 388 TCS3200 color(PC_4, PB_14, PB_1, PB_13, PB_15); // Declara os pinos para o sensor RGB
Victor_Mirkhan 3:77d4b108568c 389 DigitalIn sensor(PB_2); // Declara pino para o sensor indutivo
Victor_Mirkhan 3:77d4b108568c 390 long red, green, blue, clear; // Valores de leitura para cada cor
Victor_Mirkhan 3:77d4b108568c 391 int tagy, i = 0, j = 0, tag[10];
Victor_Mirkhan 3:77d4b108568c 392 int contador = 0, contador_max = 0, elemento;
Victor_Mirkhan 3:77d4b108568c 393
Victor_Mirkhan 3:77d4b108568c 394 // Modo de operação do sensor
Victor_Mirkhan 3:77d4b108568c 395 color.SetMode(TCS3200::SCALE_20);
Victor_Mirkhan 3:77d4b108568c 396
Victor_Mirkhan 3:77d4b108568c 397 while(i <= 9) {
Victor_Mirkhan 3:77d4b108568c 398
Victor_Mirkhan 3:77d4b108568c 399 red = color.ReadRed();
Victor_Mirkhan 3:77d4b108568c 400 green = color.ReadGreen();
Victor_Mirkhan 3:77d4b108568c 401 blue = color.ReadBlue();
Victor_Mirkhan 3:77d4b108568c 402 clear = color.ReadClear();
Victor_Mirkhan 4:5dd6e95b5706 403
Victor_Mirkhan 4:5dd6e95b5706 404 if(green > 30) {
Victor_Mirkhan 3:77d4b108568c 405 tagy = 2;
Victor_Mirkhan 3:77d4b108568c 406 }
Victor_Mirkhan 4:5dd6e95b5706 407 if((green <= 30)&&(sensor)) {
Victor_Mirkhan 3:77d4b108568c 408 tagy = 0;
Victor_Mirkhan 3:77d4b108568c 409 }
Victor_Mirkhan 4:5dd6e95b5706 410 if((green <= 30) && (!sensor)) {
Victor_Mirkhan 3:77d4b108568c 411
Victor_Mirkhan 3:77d4b108568c 412 tagy = 1;
Victor_Mirkhan 3:77d4b108568c 413 }
Victor_Mirkhan 3:77d4b108568c 414
Victor_Mirkhan 3:77d4b108568c 415 tag[i] = tagy;
Victor_Mirkhan 3:77d4b108568c 416 i = i + 1;
Victor_Mirkhan 3:77d4b108568c 417 wait(0.1);
Victor_Mirkhan 3:77d4b108568c 418
Victor_Mirkhan 3:77d4b108568c 419 }
Victor_Mirkhan 3:77d4b108568c 420
Victor_Mirkhan 3:77d4b108568c 421 // Loops para avaliar qual tag aparece mais
Victor_Mirkhan 3:77d4b108568c 422
Victor_Mirkhan 3:77d4b108568c 423 for (i = 0; i <= 9; i++) {
Victor_Mirkhan 3:77d4b108568c 424 for (j = 0; j <= 9; j++) {
Victor_Mirkhan 3:77d4b108568c 425 if (tag[i] == tag[j]) {
Victor_Mirkhan 3:77d4b108568c 426 contador += 1;
Victor_Mirkhan 3:77d4b108568c 427 }
Victor_Mirkhan 3:77d4b108568c 428 }
Victor_Mirkhan 3:77d4b108568c 429 if (contador > contador_max) {
Victor_Mirkhan 3:77d4b108568c 430 contador_max = contador;
Victor_Mirkhan 3:77d4b108568c 431 elemento = tag[i];
Victor_Mirkhan 3:77d4b108568c 432 }
Victor_Mirkhan 3:77d4b108568c 433 contador = 0;
Victor_Mirkhan 3:77d4b108568c 434 }
Victor_Mirkhan 3:77d4b108568c 435
Victor_Mirkhan 3:77d4b108568c 436 return elemento;
Victor_Mirkhan 2:666ad168bacb 437 }
Victor_Mirkhan 2:666ad168bacb 438
Victor_Mirkhan 4:5dd6e95b5706 439 /* FUNÇÃO "sefta_origem()":
Victor_Mirkhan 3:77d4b108568c 440 -> A função realiza o referenciamento completo para os 3 eixos, um de cada vez;
Victor_Mirkhan 3:77d4b108568c 441 -> Por ser uma função mais longa, o processo é detalhado dentro da própria função;
Victor_Mirkhan 3:77d4b108568c 442 */
Victor_Mirkhan 3:77d4b108568c 443
Victor_Mirkhan 3:77d4b108568c 444 void seta_origem()
Victor_Mirkhan 3:77d4b108568c 445 {
Victor_Mirkhan 4:5dd6e95b5706 446 menu_passivo(2);
Victor_Mirkhan 3:77d4b108568c 447
Victor_Mirkhan 3:77d4b108568c 448 //Seta uma alta velocidade para o referenciamento
Victor_Mirkhan 3:77d4b108568c 449
Victor_Mirkhan 4:5dd6e95b5706 450 set_aceleracoesZ(3500/2,1200,100/2,100/2);
Victor_Mirkhan 4:5dd6e95b5706 451 set_aceleracoesX(4000,3000,100,100);
Victor_Mirkhan 4:5dd6e95b5706 452 set_aceleracoesY(4000,3000,100,100);
Victor_Mirkhan 4:5dd6e95b5706 453
Victor_Mirkhan 4:5dd6e95b5706 454 InterruptIn confirma(PC_13);
Victor_Mirkhan 4:5dd6e95b5706 455 confirma.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 456
Victor_Mirkhan 3:77d4b108568c 457 while(1) {
Victor_Mirkhan 4:5dd6e95b5706 458
Victor_Mirkhan 4:5dd6e95b5706 459
Victor_Mirkhan 4:5dd6e95b5706 460 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 461 FDC.fall(&motorZ_off);
Victor_Mirkhan 4:5dd6e95b5706 462 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 463
Victor_Mirkhan 4:5dd6e95b5706 464 confirma.fall(&motorZ_off);
Victor_Mirkhan 3:77d4b108568c 465
Victor_Mirkhan 3:77d4b108568c 466 //Chamada do fim de curso para a função de interrupção
Victor_Mirkhan 3:77d4b108568c 467
Victor_Mirkhan 4:5dd6e95b5706 468
Victor_Mirkhan 3:77d4b108568c 469 if (referZ == false) {
Victor_Mirkhan 3:77d4b108568c 470 motorZ->run(StepperMotor::BWD);
Victor_Mirkhan 3:77d4b108568c 471 motorZ->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 472 }
Victor_Mirkhan 3:77d4b108568c 473
Victor_Mirkhan 3:77d4b108568c 474 // Se a interrupção for chamada, a variavel referZ se torna TRUE, acionando
Victor_Mirkhan 3:77d4b108568c 475 // os comandos a seguir.
Victor_Mirkhan 3:77d4b108568c 476
Victor_Mirkhan 3:77d4b108568c 477 else {
Victor_Mirkhan 3:77d4b108568c 478 motorZ->move(StepperMotor::FWD,1000); //Leve recuo
Victor_Mirkhan 3:77d4b108568c 479 motorZ->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 480 motorZ->set_home(); // Seta posição de Home
Victor_Mirkhan 3:77d4b108568c 481 int HomePosition = motorZ->get_position();
Victor_Mirkhan 3:77d4b108568c 482 printf("Posicao Home = %d\r\n",HomePosition); //Verificar que HomePosition = 0
Victor_Mirkhan 3:77d4b108568c 483 referZ = false;
Victor_Mirkhan 3:77d4b108568c 484 break; //Quebra do loop while, pois referenciamento do motor foi feito
Victor_Mirkhan 3:77d4b108568c 485 }
Victor_Mirkhan 3:77d4b108568c 486
Victor_Mirkhan 3:77d4b108568c 487 }
Victor_Mirkhan 4:5dd6e95b5706 488
Victor_Mirkhan 3:77d4b108568c 489 while(1) {
Victor_Mirkhan 4:5dd6e95b5706 490
Victor_Mirkhan 3:77d4b108568c 491 // Motor continua andando em uma só direção enquanto variavel referX estiver
Victor_Mirkhan 3:77d4b108568c 492 // em FALSE
Victor_Mirkhan 4:5dd6e95b5706 493
Victor_Mirkhan 4:5dd6e95b5706 494 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 495 FDC.fall(&motorX_off);
Victor_Mirkhan 4:5dd6e95b5706 496 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 497
Victor_Mirkhan 3:77d4b108568c 498 if (referX == false) {
Victor_Mirkhan 3:77d4b108568c 499 motorX->run(StepperMotor::BWD);
Victor_Mirkhan 3:77d4b108568c 500 motorX->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 501 }
Victor_Mirkhan 4:5dd6e95b5706 502
Victor_Mirkhan 3:77d4b108568c 503
Victor_Mirkhan 3:77d4b108568c 504 // Se a interrupção for chamada, a variavel referX se torna TRUE, acionando
Victor_Mirkhan 3:77d4b108568c 505 // os comandos a seguir.
Victor_Mirkhan 3:77d4b108568c 506
Victor_Mirkhan 3:77d4b108568c 507 else {
Victor_Mirkhan 3:77d4b108568c 508 motorX->move(StepperMotor::FWD,1000); //Leve recuo
Victor_Mirkhan 3:77d4b108568c 509 motorX->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 510 motorX->set_home(); // Seta posição de Home
Victor_Mirkhan 3:77d4b108568c 511 int HomePosition = motorX->get_position();
Victor_Mirkhan 3:77d4b108568c 512 referX = false;
Victor_Mirkhan 3:77d4b108568c 513 break; //Quebra do loop while, pois referenciamento do motor foi feito
Victor_Mirkhan 3:77d4b108568c 514 }
Victor_Mirkhan 3:77d4b108568c 515
Victor_Mirkhan 3:77d4b108568c 516 }
Victor_Mirkhan 4:5dd6e95b5706 517
Victor_Mirkhan 4:5dd6e95b5706 518 referY = false; //Caso os botôes de fim de curso sejam apertados sem querer antes de seus zeramentos, tem certeza que vai entrar no loop, ja que são interrupçõs
Victor_Mirkhan 4:5dd6e95b5706 519
Victor_Mirkhan 3:77d4b108568c 520 while(1) {
Victor_Mirkhan 4:5dd6e95b5706 521
Victor_Mirkhan 4:5dd6e95b5706 522
Victor_Mirkhan 4:5dd6e95b5706 523 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 524 FDC.fall(&motorY_off);
Victor_Mirkhan 4:5dd6e95b5706 525 FDC.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 526 //Motor continua andando em uma só direção enquanto variavel referX estiver
Victor_Mirkhan 3:77d4b108568c 527 // em FALSE
Victor_Mirkhan 3:77d4b108568c 528
Victor_Mirkhan 3:77d4b108568c 529 if (referY == false) {
Victor_Mirkhan 3:77d4b108568c 530 motorY->run(StepperMotor::BWD);
Victor_Mirkhan 3:77d4b108568c 531 motorY->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 532 }
Victor_Mirkhan 3:77d4b108568c 533
Victor_Mirkhan 3:77d4b108568c 534 // Se a interrupção for chamada, a variavel referX se torna TRUE, acionando
Victor_Mirkhan 3:77d4b108568c 535 // os comandos a seguir.
Victor_Mirkhan 2:666ad168bacb 536
Victor_Mirkhan 3:77d4b108568c 537 else {
Victor_Mirkhan 3:77d4b108568c 538 motorY->move(StepperMotor::FWD,1000); //Leve recuo
Victor_Mirkhan 3:77d4b108568c 539 motorY->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 540 motorY->set_home(); // Seta posição de Home
Victor_Mirkhan 3:77d4b108568c 541 int HomePosition = motorY->get_position();
Victor_Mirkhan 3:77d4b108568c 542 printf("Posicao Home = %d\r\n", HomePosition); //Verificar que HomePosition = 0
Victor_Mirkhan 3:77d4b108568c 543 referY = false;
Victor_Mirkhan 3:77d4b108568c 544 break; //Quebra do loop while, pois referenciamento do motor foi feito
Victor_Mirkhan 3:77d4b108568c 545 }
Victor_Mirkhan 3:77d4b108568c 546
Victor_Mirkhan 3:77d4b108568c 547 }
Victor_Mirkhan 3:77d4b108568c 548 }
Victor_Mirkhan 3:77d4b108568c 549
Victor_Mirkhan 3:77d4b108568c 550 /* FUNÇÃO "muda_velocidade(void)":
Victor_Mirkhan 3:77d4b108568c 551 1-) Acrescenta-se 1 à variavel "change", que indica qual dos sets será sele-
Victor_Mirkhan 3:77d4b108568c 552 cionado.
Victor_Mirkhan 3:77d4b108568c 553 2-) De acordo com o valor da variável "change", um dos sets é ativado para
Victor_Mirkhan 3:77d4b108568c 554 todos os motores.
Victor_Mirkhan 3:77d4b108568c 555 3-) De acordo com o valor da variáve l "change", um dos três leds é aceso
Victor_Mirkhan 3:77d4b108568c 556 para indicar a velocidade atual.
Victor_Mirkhan 3:77d4b108568c 557 */
Victor_Mirkhan 3:77d4b108568c 558
Victor_Mirkhan 3:77d4b108568c 559 void muda_velocidade(void)
Victor_Mirkhan 3:77d4b108568c 560 {
Victor_Mirkhan 3:77d4b108568c 561 change += 1;
Victor_Mirkhan 3:77d4b108568c 562
Victor_Mirkhan 3:77d4b108568c 563 // O valor máximo de "change" é 2, então ao chegar em 3, é zerado novamente
Victor_Mirkhan 3:77d4b108568c 564 if (change == 3) {
Victor_Mirkhan 3:77d4b108568c 565 change = 0;
Victor_Mirkhan 3:77d4b108568c 566 }
Victor_Mirkhan 4:5dd6e95b5706 567 set_aceleracoesZ(set[change].maxspeed/2,set[change].minspeed/2,set[change].ac/2,set[change].dc/2);
Victor_Mirkhan 4:5dd6e95b5706 568 set_aceleracoesX(set[change].maxspeed,set[change].minspeed,set[change].ac,set[change].dc);
Victor_Mirkhan 4:5dd6e95b5706 569 set_aceleracoesY(set[change].maxspeed,set[change].minspeed,set[change].ac,set[change].dc);
Victor_Mirkhan 3:77d4b108568c 570
Victor_Mirkhan 3:77d4b108568c 571 switch(change) {
Victor_Mirkhan 3:77d4b108568c 572 case 0: {
Victor_Mirkhan 3:77d4b108568c 573 DigitalOut LED1(PC_1);
Victor_Mirkhan 3:77d4b108568c 574 LED1 = 1;
Victor_Mirkhan 3:77d4b108568c 575 DigitalOut LED2(PA_1);
Victor_Mirkhan 3:77d4b108568c 576 LED2 = 0;
Victor_Mirkhan 3:77d4b108568c 577 DigitalOut LED3(PA_4);
Victor_Mirkhan 3:77d4b108568c 578 LED3 = 0;
Victor_Mirkhan 3:77d4b108568c 579 break;
Victor_Mirkhan 3:77d4b108568c 580 }
Victor_Mirkhan 3:77d4b108568c 581 case 1: {
Victor_Mirkhan 3:77d4b108568c 582 DigitalOut LED1(PC_1);
Victor_Mirkhan 3:77d4b108568c 583 LED1 = 0;
Victor_Mirkhan 3:77d4b108568c 584 DigitalOut LED2(PA_1);
Victor_Mirkhan 3:77d4b108568c 585 LED2 = 1;
Victor_Mirkhan 3:77d4b108568c 586 DigitalOut LED3(PA_4);
Victor_Mirkhan 3:77d4b108568c 587 LED3 = 0;
Victor_Mirkhan 3:77d4b108568c 588 break;
Victor_Mirkhan 3:77d4b108568c 589 }
Victor_Mirkhan 3:77d4b108568c 590 case 2: {
Victor_Mirkhan 3:77d4b108568c 591 DigitalOut LED1(PC_1);
Victor_Mirkhan 3:77d4b108568c 592 LED1 = 0;
Victor_Mirkhan 3:77d4b108568c 593 DigitalOut LED2(PA_1);
Victor_Mirkhan 3:77d4b108568c 594 LED2 = 0;
Victor_Mirkhan 3:77d4b108568c 595 DigitalOut LED3(PA_4);
Victor_Mirkhan 3:77d4b108568c 596 LED3 = 1;
Victor_Mirkhan 3:77d4b108568c 597 break;
Victor_Mirkhan 3:77d4b108568c 598 }
Victor_Mirkhan 3:77d4b108568c 599 }
Victor_Mirkhan 3:77d4b108568c 600
Victor_Mirkhan 3:77d4b108568c 601 }
Victor_Mirkhan 3:77d4b108568c 602
Victor_Mirkhan 3:77d4b108568c 603 /* FUNÇÃO "ativa_eixoN(void)":
Victor_Mirkhan 3:77d4b108568c 604 -> Desativa a variável referente aos outros eixos, setando-as como "false",
Victor_Mirkhan 3:77d4b108568c 605 e ativa a do eixo N, setando-a como TRUE
Victor_Mirkhan 3:77d4b108568c 606 */
Victor_Mirkhan 3:77d4b108568c 607
Victor_Mirkhan 3:77d4b108568c 608 void ativa_eixoX(void)
Victor_Mirkhan 3:77d4b108568c 609 {
Victor_Mirkhan 3:77d4b108568c 610 dirx = true;
Victor_Mirkhan 3:77d4b108568c 611 dirz = false;
Victor_Mirkhan 3:77d4b108568c 612 diry = false;
Victor_Mirkhan 3:77d4b108568c 613 muda_velocidade();
Victor_Mirkhan 3:77d4b108568c 614 }
Victor_Mirkhan 3:77d4b108568c 615
Victor_Mirkhan 3:77d4b108568c 616 void ativa_eixoY(void)
Victor_Mirkhan 3:77d4b108568c 617 {
Victor_Mirkhan 3:77d4b108568c 618 dirx = false;
Victor_Mirkhan 3:77d4b108568c 619 dirz = false;
Victor_Mirkhan 3:77d4b108568c 620 diry = true;
Victor_Mirkhan 3:77d4b108568c 621 muda_velocidade();
Victor_Mirkhan 2:666ad168bacb 622 }
Victor_Mirkhan 2:666ad168bacb 623
Victor_Mirkhan 3:77d4b108568c 624 void ativa_eixoZ(void)
Victor_Mirkhan 3:77d4b108568c 625 {
Victor_Mirkhan 3:77d4b108568c 626 dirx = false;
Victor_Mirkhan 3:77d4b108568c 627 dirz = true;
Victor_Mirkhan 3:77d4b108568c 628 diry = false;
Victor_Mirkhan 3:77d4b108568c 629 muda_velocidade();
Victor_Mirkhan 3:77d4b108568c 630 }
Victor_Mirkhan 3:77d4b108568c 631
Victor_Mirkhan 3:77d4b108568c 632 /* FUNÇÃO "selecao_funcao(void)":
Victor_Mirkhan 3:77d4b108568c 633 -> A função apenas coloca o valor de "enable" em TRUE. No loop principal do
Victor_Mirkhan 3:77d4b108568c 634 programa, o enable em TRUE permite a seleção de alguma das funções do menu
Victor_Mirkhan 3:77d4b108568c 635 por parte do usuário.
Victor_Mirkhan 3:77d4b108568c 636 */
Victor_Mirkhan 3:77d4b108568c 637
Victor_Mirkhan 3:77d4b108568c 638 void selecao_funcao(void)
Victor_Mirkhan 3:77d4b108568c 639 {
Victor_Mirkhan 3:77d4b108568c 640 enable = true;
Victor_Mirkhan 3:77d4b108568c 641 }
Victor_Mirkhan 3:77d4b108568c 642
Victor_Mirkhan 3:77d4b108568c 643 /* FUNÇÃO "disco_disco(void)":
Victor_Mirkhan 3:77d4b108568c 644 -> Função completamente inútil, feita apenas para divertir o usuário;
Victor_Mirkhan 3:77d4b108568c 645 */
Victor_Mirkhan 3:77d4b108568c 646
Victor_Mirkhan 3:77d4b108568c 647 void disco_disco(void) {
Victor_Mirkhan 3:77d4b108568c 648 unsigned char i = 0;
Victor_Mirkhan 3:77d4b108568c 649 while (i < 50) {
Victor_Mirkhan 3:77d4b108568c 650 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 651 lcd.setBacklight(TextLCD::LightOn);
Victor_Mirkhan 3:77d4b108568c 652 lcd.printf(" DI$CO DI$CO DI$CO");
Victor_Mirkhan 3:77d4b108568c 653 lcd.locate(0,1);
Victor_Mirkhan 3:77d4b108568c 654 lcd.printf(" DI$CO DI$CO DI$CO");
Victor_Mirkhan 3:77d4b108568c 655 lcd.locate(0,2);
Victor_Mirkhan 3:77d4b108568c 656 lcd.printf(" DI$CO DI$CO DI$CO");
Victor_Mirkhan 3:77d4b108568c 657 lcd.locate(0,3);
Victor_Mirkhan 3:77d4b108568c 658 lcd.printf(" DI$CO DI$CO DI$CO");
Victor_Mirkhan 3:77d4b108568c 659 wait(0.05);
Victor_Mirkhan 3:77d4b108568c 660 lcd.setBacklight(TextLCD::LightOff);
Victor_Mirkhan 3:77d4b108568c 661 wait(0.05);
Victor_Mirkhan 3:77d4b108568c 662 i += 1;
Victor_Mirkhan 3:77d4b108568c 663 }
Victor_Mirkhan 3:77d4b108568c 664 lcd.setBacklight(TextLCD::LightOn);
Victor_Mirkhan 2:666ad168bacb 665 }
Victor_Mirkhan 2:666ad168bacb 666
Victor_Mirkhan 3:77d4b108568c 667 /* FUNÇÃO "menu_dinamico(char n)":
Victor_Mirkhan 3:77d4b108568c 668 -> Um "menu_dinamico" é considerado, neste programa, como um menu em que o
Victor_Mirkhan 3:77d4b108568c 669 usuario consegue movimentar o cursor e selecionar funções (ou seja, é a
Victor_Mirkhan 3:77d4b108568c 670 parte interativa do menu).
Victor_Mirkhan 3:77d4b108568c 671 1-) Os botões "Confirma","Jog_button_pos" e "Jog_button_neg" são setados para
Victor_Mirkhan 3:77d4b108568c 672 chamar certas funções relacionadas à navegação no menu ao detectar uma
Victor_Mirkhan 3:77d4b108568c 673 borda de subida (comando "rise");
Victor_Mirkhan 3:77d4b108568c 674 2-) Há dois menus dinâmicos no projeto:
Victor_Mirkhan 3:77d4b108568c 675 A-) A tela inicial, contendo as opções:
Victor_Mirkhan 3:77d4b108568c 676 ->Cycle Start (inicia a operação ciclica de Pick/Place);
Victor_Mirkhan 3:77d4b108568c 677 ->Set positions (transição para o próximo menu dinâmico);
Victor_Mirkhan 3:77d4b108568c 678 ->Referenciamento (realiza operação de zeramento dos eixos novamente);
Victor_Mirkhan 3:77d4b108568c 679 ->Disco Disco! (executa a função "disco_disco");
Victor_Mirkhan 3:77d4b108568c 680 B-) A tela referente às posições à serem salvas:
Victor_Mirkhan 3:77d4b108568c 681 ->Set Pick (inicia o jog para salvar a posição de Pick);
Victor_Mirkhan 3:77d4b108568c 682 ->Set Drop 1 (inicia o jog para salvar a posição de Drop 1);
Victor_Mirkhan 3:77d4b108568c 683 ->Set Drop 2 (inicia o jog para salvar a posição de Drop 2);
Victor_Mirkhan 3:77d4b108568c 684 ->Set Drop 3 (inicia o jog para salvar a posição de Drop 3);
Victor_Mirkhan 3:77d4b108568c 685 3-) A variável "n" que entra como input da função define qual dos menus é
Victor_Mirkhan 3:77d4b108568c 686 chamado.
Victor_Mirkhan 3:77d4b108568c 687 */
Victor_Mirkhan 3:77d4b108568c 688
Victor_Mirkhan 3:77d4b108568c 689 void menu_dinamico(char n)
Victor_Mirkhan 3:77d4b108568c 690 {
Victor_Mirkhan 3:77d4b108568c 691
Victor_Mirkhan 3:77d4b108568c 692 confirma.fall(&selecao_funcao);
Victor_Mirkhan 3:77d4b108568c 693 jog_button_pos.fall(&sobe_cursor);
Victor_Mirkhan 3:77d4b108568c 694 jog_button_neg.fall(&desce_cursor);
Victor_Mirkhan 3:77d4b108568c 695
Victor_Mirkhan 3:77d4b108568c 696 switch(n) {
Victor_Mirkhan 3:77d4b108568c 697 case 0: {
Victor_Mirkhan 3:77d4b108568c 698 lcd.setCursor(TextLCD::CurOn_BlkOn);
Victor_Mirkhan 3:77d4b108568c 699 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 700 lcd.locate(1,0);
Victor_Mirkhan 3:77d4b108568c 701 lcd.printf("->Cycle start");
Victor_Mirkhan 3:77d4b108568c 702 lcd.locate(1,1);
Victor_Mirkhan 3:77d4b108568c 703 lcd.printf("->Set positions");
Victor_Mirkhan 3:77d4b108568c 704 lcd.locate(1,2);
Victor_Mirkhan 3:77d4b108568c 705 lcd.printf("->Referenciamento");
Victor_Mirkhan 3:77d4b108568c 706 lcd.setAddress(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 707 lcd.locate(1,3);
Victor_Mirkhan 3:77d4b108568c 708 lcd.printf("->DISCO DISCO!");
Victor_Mirkhan 3:77d4b108568c 709 lcd.setAddress(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 710 break;
Victor_Mirkhan 3:77d4b108568c 711 }
Victor_Mirkhan 3:77d4b108568c 712 case 1: {
Victor_Mirkhan 3:77d4b108568c 713 lcd.setCursor(TextLCD::CurOn_BlkOn);
Victor_Mirkhan 3:77d4b108568c 714 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 715 lcd.locate(1,0);
Victor_Mirkhan 3:77d4b108568c 716 lcd.printf("->Set Pick");
Victor_Mirkhan 3:77d4b108568c 717 lcd.locate(1,1);
Victor_Mirkhan 3:77d4b108568c 718 lcd.printf("->Set Drop 1");
Victor_Mirkhan 3:77d4b108568c 719 lcd.locate(1,2);
Victor_Mirkhan 3:77d4b108568c 720 lcd.printf("->Set Drop 2");
Victor_Mirkhan 3:77d4b108568c 721 lcd.locate(1,3);
Victor_Mirkhan 3:77d4b108568c 722 lcd.printf("->Set Drop 3");
Victor_Mirkhan 3:77d4b108568c 723 lcd.setAddress(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 724 break;
Victor_Mirkhan 3:77d4b108568c 725 }
Victor_Mirkhan 3:77d4b108568c 726 case 2: {
Victor_Mirkhan 3:77d4b108568c 727 lcd.setCursor(TextLCD::CurOn_BlkOn);
Victor_Mirkhan 3:77d4b108568c 728 lcd.cls();
Victor_Mirkhan 3:77d4b108568c 729 lcd.locate(1,0);
Victor_Mirkhan 3:77d4b108568c 730 lcd.printf("->Ciclo infinito");
Victor_Mirkhan 3:77d4b108568c 731 lcd.locate(1,1);
Victor_Mirkhan 3:77d4b108568c 732 lcd.printf("->Ciclo unico");
Victor_Mirkhan 3:77d4b108568c 733 lcd.setAddress(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 734 break;
Victor_Mirkhan 3:77d4b108568c 735 }
Victor_Mirkhan 3:77d4b108568c 736 }
Victor_Mirkhan 2:666ad168bacb 737 }
Victor_Mirkhan 3:77d4b108568c 738
Victor_Mirkhan 3:77d4b108568c 739 /*FUNÇÕES "cycle_stop(void)" E "cycle(char n)":
Victor_Mirkhan 3:77d4b108568c 740 A-) "cycle_stop(void)": função seta a variável "ref_cycle" como FALSE, parâ-
Victor_Mirkhan 3:77d4b108568c 741 metro que irá finalizar o ciclo ao final da rotina;
Victor_Mirkhan 3:77d4b108568c 742 B-) "cycle":
Victor_Mirkhan 3:77d4b108568c 743 -> Seta o botão "back" para chamar a função "cycle_stop" e finalizar a
Victor_Mirkhan 3:77d4b108568c 744 operação em ciclo;
Victor_Mirkhan 3:77d4b108568c 745 1-) Leva o motor para a posição de HOME (apenas uma vez);
Victor_Mirkhan 3:77d4b108568c 746 2-) Motor vai até a posição de PICK;
Victor_Mirkhan 3:77d4b108568c 747 3-) Ativa a função "reconhecimento_peca()" para determinar aonde a peça
Victor_Mirkhan 3:77d4b108568c 748 será levada (posição de DROP);
Victor_Mirkhan 3:77d4b108568c 749 4-) Vai para a posição de DROP e solta a peça;
Victor_Mirkhan 3:77d4b108568c 750 5-) Retorna para o PICK, reiniciando o ciclo;
Victor_Mirkhan 3:77d4b108568c 751 -> OBS: A função "cycle" recebe um parâmetro n. Se esse parâmetro for 1, o
Victor_Mirkhan 3:77d4b108568c 752 ciclo é realizado apenas uma vez. Se for 0, o ciclo se repetirá até o u-
Victor_Mirkhan 3:77d4b108568c 753 suário pressionar o botão de "back".
Victor_Mirkhan 3:77d4b108568c 754 */
Victor_Mirkhan 2:666ad168bacb 755
Victor_Mirkhan 3:77d4b108568c 756 void cycle_stop(void)
Victor_Mirkhan 3:77d4b108568c 757 {
Victor_Mirkhan 3:77d4b108568c 758 ref_cycle = false;
Victor_Mirkhan 3:77d4b108568c 759 }
Victor_Mirkhan 3:77d4b108568c 760
Victor_Mirkhan 3:77d4b108568c 761 void cycle(char n)
Victor_Mirkhan 3:77d4b108568c 762 {
Victor_Mirkhan 3:77d4b108568c 763 Servo garra(PA_11); // Declaração do servo
Victor_Mirkhan 3:77d4b108568c 764 garra.calibrate(0.001,90); // Calibração de sua abertura
Victor_Mirkhan 3:77d4b108568c 765
Victor_Mirkhan 3:77d4b108568c 766 back_btn.fall(&cycle_stop);
Victor_Mirkhan 3:77d4b108568c 767
Victor_Mirkhan 3:77d4b108568c 768 if (n == 0) {
Victor_Mirkhan 4:5dd6e95b5706 769 menu_passivo(3); // Ciclo infinito
Victor_Mirkhan 3:77d4b108568c 770 }
Victor_Mirkhan 3:77d4b108568c 771
Victor_Mirkhan 3:77d4b108568c 772 if (n == 1) {
Victor_Mirkhan 4:5dd6e95b5706 773 menu_passivo(4); // Ciclo único
Victor_Mirkhan 3:77d4b108568c 774 }
Victor_Mirkhan 3:77d4b108568c 775
Victor_Mirkhan 4:5dd6e95b5706 776 int tag; // Tag que sairá como resultado da função de reconhecimento da peça
Victor_Mirkhan 3:77d4b108568c 777
Victor_Mirkhan 3:77d4b108568c 778 printf("Comeco do ciclo!\r\n");
Victor_Mirkhan 2:666ad168bacb 779
Victor_Mirkhan 3:77d4b108568c 780 //Alta velocidade para retornar para a posição de home
Victor_Mirkhan 3:77d4b108568c 781
Victor_Mirkhan 4:5dd6e95b5706 782 set_aceleracoesZ(set[2].maxspeed/2,set[2].minspeed/2,set[2].ac/2,set[2].dc/2);
Victor_Mirkhan 3:77d4b108568c 783 set_aceleracoesX(set[2].maxspeed,set[2].minspeed,set[2].ac,set[2].dc);
Victor_Mirkhan 3:77d4b108568c 784 set_aceleracoesY(set[2].maxspeed,set[2].minspeed,set[2].ac,set[2].dc);
Victor_Mirkhan 3:77d4b108568c 785
Victor_Mirkhan 3:77d4b108568c 786 motorZ->go_home();
Victor_Mirkhan 3:77d4b108568c 787 motorZ->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 788
Victor_Mirkhan 3:77d4b108568c 789 motorX->go_home();
Victor_Mirkhan 3:77d4b108568c 790 motorX->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 791
Victor_Mirkhan 3:77d4b108568c 792 motorY->go_home();
Victor_Mirkhan 3:77d4b108568c 793 motorY->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 794
Victor_Mirkhan 3:77d4b108568c 795
Victor_Mirkhan 3:77d4b108568c 796 // Seta velocidaes/acelerações para o ciclo
Victor_Mirkhan 3:77d4b108568c 797
Victor_Mirkhan 3:77d4b108568c 798 set_aceleracoesZ(set[0].maxspeed,set[0].minspeed,set[0].ac,set[0].dc);
Victor_Mirkhan 3:77d4b108568c 799 set_aceleracoesX(set[1].maxspeed,set[1].minspeed,set[1].ac,set[1].dc);
Victor_Mirkhan 3:77d4b108568c 800 set_aceleracoesY(set[1].maxspeed,set[1].minspeed,set[1].ac,set[1].dc);
Victor_Mirkhan 3:77d4b108568c 801
Victor_Mirkhan 3:77d4b108568c 802 ref_cycle = true;
Victor_Mirkhan 2:666ad168bacb 803
Victor_Mirkhan 4:5dd6e95b5706 804 garra = 1;
Victor_Mirkhan 4:5dd6e95b5706 805
Victor_Mirkhan 2:666ad168bacb 806 while(1) {
Victor_Mirkhan 2:666ad168bacb 807
Victor_Mirkhan 3:77d4b108568c 808 // Vai para a posição de PICK
Victor_Mirkhan 3:77d4b108568c 809 motorX->go_to(PickPos.posx);
Victor_Mirkhan 3:77d4b108568c 810 motorX->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 811 motorY->go_to(PickPos.posy);
Victor_Mirkhan 3:77d4b108568c 812 motorY->wait_while_active();
Victor_Mirkhan 4:5dd6e95b5706 813 motorZ->go_to(PickPos.posz - 1000);
Victor_Mirkhan 3:77d4b108568c 814 motorZ->wait_while_active();
Victor_Mirkhan 2:666ad168bacb 815
Victor_Mirkhan 3:77d4b108568c 816 tag = reconhecimento_peca(); // Reconhece a peça e qual posição de Drop irá
Victor_Mirkhan 3:77d4b108568c 817 garra = 0.7; // Fecha a garra
Victor_Mirkhan 3:77d4b108568c 818 wait(1);
Victor_Mirkhan 2:666ad168bacb 819
Victor_Mirkhan 3:77d4b108568c 820 // Vai para a posição de DROP
Victor_Mirkhan 4:5dd6e95b5706 821 motorZ->move(StepperMotor::BWD,3000);
Victor_Mirkhan 3:77d4b108568c 822 motorZ->wait_while_active();
Victor_Mirkhan 4:5dd6e95b5706 823 motorY->go_to(DropPos[tag].posy);
Victor_Mirkhan 4:5dd6e95b5706 824 motorY->wait_while_active();
Victor_Mirkhan 4:5dd6e95b5706 825 motorX->go_to(DropPos[tag].posx);
Victor_Mirkhan 3:77d4b108568c 826 motorX->wait_while_active();
Victor_Mirkhan 4:5dd6e95b5706 827 motorZ->go_to(DropPos[tag].posz);
Victor_Mirkhan 4:5dd6e95b5706 828 motorZ->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 829 wait(1);
Victor_Mirkhan 3:77d4b108568c 830 garra = 1; // Garra abre e deixa o objeto
Victor_Mirkhan 2:666ad168bacb 831
Victor_Mirkhan 3:77d4b108568c 832 /*Se a chamada para finalizar o ciclo foi chamada, volta-se para o menu
Victor_Mirkhan 3:77d4b108568c 833 inicial e quebra o loop while; */
Victor_Mirkhan 3:77d4b108568c 834
Victor_Mirkhan 3:77d4b108568c 835 if ((ref_cycle == false) || (n == 1)) {
Victor_Mirkhan 3:77d4b108568c 836 enable = false;
Victor_Mirkhan 3:77d4b108568c 837 menu_dinamico(ref_menu);
Victor_Mirkhan 3:77d4b108568c 838 break;
Victor_Mirkhan 2:666ad168bacb 839 }
Victor_Mirkhan 3:77d4b108568c 840
Victor_Mirkhan 3:77d4b108568c 841 }
Victor_Mirkhan 2:666ad168bacb 842 }
Victor_Mirkhan 2:666ad168bacb 843
Victor_Mirkhan 3:77d4b108568c 844 /* FUNÇÕES DE "jog_(...)":
Victor_Mirkhan 3:77d4b108568c 845 -> Chama o layout para o menu do jog;
Victor_Mirkhan 3:77d4b108568c 846 -> O botão "Confirma" é setado para salvar a posição;
Victor_Mirkhan 3:77d4b108568c 847 -> Basicamente, cada botão de jog, ao ser segurado (borda de descida) faz o motor
Victor_Mirkhan 3:77d4b108568c 848 seguir em movimento. Ao ser solto (borda de subida) faz o motor parar;
Victor_Mirkhan 3:77d4b108568c 849 -> Habilitam-se os botões dos eixos para que o usuário possa mover um eixo de
Victor_Mirkhan 3:77d4b108568c 850 cada vez. Quando o usuario apertar um desses botões, a velocidade é alterada
Victor_Mirkhan 3:77d4b108568c 851 também;
Victor_Mirkhan 3:77d4b108568c 852 */
Victor_Mirkhan 3:77d4b108568c 853
Victor_Mirkhan 4:5dd6e95b5706 854 void paradaZ(void)
Victor_Mirkhan 4:5dd6e95b5706 855 {
Victor_Mirkhan 4:5dd6e95b5706 856 motorZ->hard_stop();
Victor_Mirkhan 4:5dd6e95b5706 857 wait(1);
Victor_Mirkhan 4:5dd6e95b5706 858 int posicao = motorZ->get_position();
Victor_Mirkhan 4:5dd6e95b5706 859 if (posicao < 0) {
Victor_Mirkhan 4:5dd6e95b5706 860 motorZ->move(StepperMotor::FWD,2000);
Victor_Mirkhan 4:5dd6e95b5706 861 }
Victor_Mirkhan 4:5dd6e95b5706 862 else {
Victor_Mirkhan 4:5dd6e95b5706 863 motorZ->move(StepperMotor::BWD,2000);
Victor_Mirkhan 4:5dd6e95b5706 864 }
Victor_Mirkhan 4:5dd6e95b5706 865 }
Victor_Mirkhan 4:5dd6e95b5706 866
Victor_Mirkhan 4:5dd6e95b5706 867 void paradaX(void)
Victor_Mirkhan 4:5dd6e95b5706 868 {
Victor_Mirkhan 4:5dd6e95b5706 869 motorX->hard_stop();
Victor_Mirkhan 4:5dd6e95b5706 870 wait(1);
Victor_Mirkhan 4:5dd6e95b5706 871 int posicao = motorX->get_position();
Victor_Mirkhan 4:5dd6e95b5706 872 if (posicao < 0) {
Victor_Mirkhan 4:5dd6e95b5706 873 motorX->move(StepperMotor::FWD,3000);
Victor_Mirkhan 4:5dd6e95b5706 874 }
Victor_Mirkhan 4:5dd6e95b5706 875 else {
Victor_Mirkhan 4:5dd6e95b5706 876 motorX->move(StepperMotor::BWD,3000);
Victor_Mirkhan 4:5dd6e95b5706 877 }
Victor_Mirkhan 4:5dd6e95b5706 878 }
Victor_Mirkhan 4:5dd6e95b5706 879 void paradaY(void)
Victor_Mirkhan 4:5dd6e95b5706 880 {
Victor_Mirkhan 4:5dd6e95b5706 881 motorY->hard_stop();
Victor_Mirkhan 4:5dd6e95b5706 882 wait(1);
Victor_Mirkhan 4:5dd6e95b5706 883 int posicao = motorY->get_position();
Victor_Mirkhan 4:5dd6e95b5706 884 if (posicao < 0) {
Victor_Mirkhan 4:5dd6e95b5706 885 motorY->move(StepperMotor::FWD,3000);
Victor_Mirkhan 4:5dd6e95b5706 886 }
Victor_Mirkhan 4:5dd6e95b5706 887 else {
Victor_Mirkhan 4:5dd6e95b5706 888 motorY->move(StepperMotor::BWD,3000);
Victor_Mirkhan 4:5dd6e95b5706 889 }
Victor_Mirkhan 4:5dd6e95b5706 890 }
Victor_Mirkhan 4:5dd6e95b5706 891
Victor_Mirkhan 3:77d4b108568c 892 void jog(char n) {
Victor_Mirkhan 3:77d4b108568c 893 menu_jog();
Victor_Mirkhan 3:77d4b108568c 894 lcd.locate(3,0);
Victor_Mirkhan 3:77d4b108568c 895 /*
Victor_Mirkhan 3:77d4b108568c 896 De acordo com o valor de entrada "n", seta-se o botão "Confirma" para
Victor_Mirkhan 3:77d4b108568c 897 salvar a posição de Save,Drop1, Drop2 ou Drop3;
Victor_Mirkhan 3:77d4b108568c 898 */
Victor_Mirkhan 3:77d4b108568c 899 InterruptIn confirma(PC_13);
Victor_Mirkhan 3:77d4b108568c 900 confirma.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 901
Victor_Mirkhan 3:77d4b108568c 902 switch(n) {
Victor_Mirkhan 3:77d4b108568c 903 case 0: {
Victor_Mirkhan 3:77d4b108568c 904 printf("Posicao de Save\r\n");
Victor_Mirkhan 3:77d4b108568c 905 lcd.printf("PICK POSITION");
Victor_Mirkhan 3:77d4b108568c 906 confirma.fall(&save_pick_pos);
Victor_Mirkhan 3:77d4b108568c 907 break;
Victor_Mirkhan 3:77d4b108568c 908 }
Victor_Mirkhan 3:77d4b108568c 909 case 1: {
Victor_Mirkhan 3:77d4b108568c 910 lcd.locate(3,0);
Victor_Mirkhan 3:77d4b108568c 911 lcd.printf("DROP POSITION %d",n);
Victor_Mirkhan 3:77d4b108568c 912 confirma.fall(&save_drop1);
Victor_Mirkhan 3:77d4b108568c 913 break;
Victor_Mirkhan 3:77d4b108568c 914 }
Victor_Mirkhan 3:77d4b108568c 915 case 2: {
Victor_Mirkhan 3:77d4b108568c 916 lcd.locate(3,0);
Victor_Mirkhan 3:77d4b108568c 917 lcd.printf("DROP POSITION %d",n);
Victor_Mirkhan 3:77d4b108568c 918 confirma.fall(&save_drop2);
Victor_Mirkhan 3:77d4b108568c 919 break;
Victor_Mirkhan 3:77d4b108568c 920 }
Victor_Mirkhan 3:77d4b108568c 921 case 3: {
Victor_Mirkhan 3:77d4b108568c 922 lcd.locate(3,0);
Victor_Mirkhan 3:77d4b108568c 923 lcd.printf("DROP POSITION %d",n);
Victor_Mirkhan 3:77d4b108568c 924 confirma.fall(&save_drop3);
Victor_Mirkhan 3:77d4b108568c 925 break;
Victor_Mirkhan 3:77d4b108568c 926 }
Victor_Mirkhan 3:77d4b108568c 927 }
Victor_Mirkhan 3:77d4b108568c 928
Victor_Mirkhan 3:77d4b108568c 929 InterruptIn jog_button_pos(PC_12);
Victor_Mirkhan 3:77d4b108568c 930 jog_button_pos.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 931 InterruptIn jog_button_neg(PA_15);
Victor_Mirkhan 3:77d4b108568c 932 jog_button_neg.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 933
Victor_Mirkhan 3:77d4b108568c 934 jog_button_pos.fall(&jog_pos_on);
Victor_Mirkhan 3:77d4b108568c 935 jog_button_neg.fall(&jog_neg_on);
Victor_Mirkhan 2:666ad168bacb 936
Victor_Mirkhan 3:77d4b108568c 937 jog_button_pos.rise(&jog_pos_off);
Victor_Mirkhan 3:77d4b108568c 938 jog_button_neg.rise(&jog_neg_off);
Victor_Mirkhan 3:77d4b108568c 939
Victor_Mirkhan 3:77d4b108568c 940 btnX.fall(&ativa_eixoX);
Victor_Mirkhan 3:77d4b108568c 941 btnY.fall(&ativa_eixoY);
Victor_Mirkhan 3:77d4b108568c 942 btnZ.fall(&ativa_eixoZ);
Victor_Mirkhan 4:5dd6e95b5706 943
Victor_Mirkhan 3:77d4b108568c 944 while(save_pos == false) {
Victor_Mirkhan 3:77d4b108568c 945
Victor_Mirkhan 3:77d4b108568c 946 float posz = motorZ->get_position();
Victor_Mirkhan 3:77d4b108568c 947 float posx = motorX->get_position();
Victor_Mirkhan 3:77d4b108568c 948 float posy = motorY->get_position();
Victor_Mirkhan 3:77d4b108568c 949 lcd.locate(3,1);
Victor_Mirkhan 4:5dd6e95b5706 950 lcd.printf("%.2f mm",posx*3/800);
Victor_Mirkhan 3:77d4b108568c 951 lcd.locate(3,2);
Victor_Mirkhan 4:5dd6e95b5706 952 lcd.printf("%.2f mm",posy*3/800);
Victor_Mirkhan 3:77d4b108568c 953 lcd.locate(3,3);
Victor_Mirkhan 4:5dd6e95b5706 954 lcd.printf("%.2f mm",posz*5/800);
Victor_Mirkhan 3:77d4b108568c 955
Victor_Mirkhan 3:77d4b108568c 956 if (jog_pos == true) {
Victor_Mirkhan 3:77d4b108568c 957 if (dirx == true) {
Victor_Mirkhan 4:5dd6e95b5706 958 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 959 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 960 FDC.fall(&paradaX);
Victor_Mirkhan 3:77d4b108568c 961 motorX->run(StepperMotor::FWD);
Victor_Mirkhan 3:77d4b108568c 962 motorX->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 963 }
Victor_Mirkhan 3:77d4b108568c 964 if (diry == true) {
Victor_Mirkhan 4:5dd6e95b5706 965 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 966 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 967 FDC.fall(&paradaY);
Victor_Mirkhan 3:77d4b108568c 968 motorY->run(StepperMotor::FWD);
Victor_Mirkhan 3:77d4b108568c 969 motorY->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 970 }
Victor_Mirkhan 3:77d4b108568c 971 if (dirz == true) {
Victor_Mirkhan 4:5dd6e95b5706 972 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 973 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 974 FDC.fall(&paradaZ);
Victor_Mirkhan 3:77d4b108568c 975 motorZ->run(StepperMotor::FWD);
Victor_Mirkhan 3:77d4b108568c 976 motorZ->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 977 }
Victor_Mirkhan 3:77d4b108568c 978 }
Victor_Mirkhan 3:77d4b108568c 979
Victor_Mirkhan 3:77d4b108568c 980 if (jog_neg == true) {
Victor_Mirkhan 3:77d4b108568c 981 if (dirx == true) {
Victor_Mirkhan 4:5dd6e95b5706 982 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 983 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 984 FDC.fall(&paradaX);
Victor_Mirkhan 3:77d4b108568c 985 motorX->run(StepperMotor::BWD);
Victor_Mirkhan 3:77d4b108568c 986 motorX->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 987 }
Victor_Mirkhan 3:77d4b108568c 988 if (diry == true) {
Victor_Mirkhan 4:5dd6e95b5706 989 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 990 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 991 FDC.fall(&paradaY);
Victor_Mirkhan 3:77d4b108568c 992 motorY->run(StepperMotor::BWD);
Victor_Mirkhan 3:77d4b108568c 993 motorY->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 994 }
Victor_Mirkhan 3:77d4b108568c 995 if (dirz == true) {
Victor_Mirkhan 4:5dd6e95b5706 996 InterruptIn FDC(PC_5);
Victor_Mirkhan 4:5dd6e95b5706 997 FDC.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 998 FDC.fall(&paradaZ);
Victor_Mirkhan 3:77d4b108568c 999 motorZ->run(StepperMotor::BWD);
Victor_Mirkhan 3:77d4b108568c 1000 motorZ->wait_while_active();
Victor_Mirkhan 3:77d4b108568c 1001 }
Victor_Mirkhan 3:77d4b108568c 1002 }
Victor_Mirkhan 2:666ad168bacb 1003 }
Victor_Mirkhan 3:77d4b108568c 1004 save_pos = false;
Victor_Mirkhan 3:77d4b108568c 1005 ref_menu = 1;
Victor_Mirkhan 3:77d4b108568c 1006 flag = true;
Victor_Mirkhan 3:77d4b108568c 1007 conclusao(n);
Victor_Mirkhan 3:77d4b108568c 1008 menu_dinamico(ref_menu);
Victor_Mirkhan 2:666ad168bacb 1009 }
aberk 0:bcff39fac858 1010
Victor_Mirkhan 3:77d4b108568c 1011 /* FUNÇÃO "back_op(void)":
Victor_Mirkhan 3:77d4b108568c 1012 -> Se a tela for referente a um sub-menu, a função irá fazer retornar para o
Victor_Mirkhan 3:77d4b108568c 1013 menu principal. Caso contrário, nada ocorre;
Victor_Mirkhan 3:77d4b108568c 1014 */
Victor_Mirkhan 3:77d4b108568c 1015
Victor_Mirkhan 3:77d4b108568c 1016 void back_op(void)
Victor_Mirkhan 3:77d4b108568c 1017 {
Victor_Mirkhan 4:5dd6e95b5706 1018 ref_cursor = 4; // O valor de ref_cursor em 4 chama um case que chama a primeira tela dinâmica;
Victor_Mirkhan 4:5dd6e95b5706 1019 enable = true;
Victor_Mirkhan 4:5dd6e95b5706 1020 printf("BACK\r\n");
Victor_Mirkhan 3:77d4b108568c 1021 }
Victor_Mirkhan 3:77d4b108568c 1022
Victor_Mirkhan 3:77d4b108568c 1023 int main()
Victor_Mirkhan 3:77d4b108568c 1024 {
Victor_Mirkhan 2:666ad168bacb 1025 //Prepara os 3 sets de velocidade, com velocidaes e acelerações variadas.
Victor_Mirkhan 3:77d4b108568c 1026
Victor_Mirkhan 2:666ad168bacb 1027 set[0].maxspeed = 2000;
Victor_Mirkhan 2:666ad168bacb 1028 set[0].minspeed = 1000;
Victor_Mirkhan 3:77d4b108568c 1029 set[0].ac = 100;
Victor_Mirkhan 3:77d4b108568c 1030 set[0].dc = 100;
Victor_Mirkhan 3:77d4b108568c 1031
Victor_Mirkhan 2:666ad168bacb 1032 set[1].maxspeed = 4000;
Victor_Mirkhan 3:77d4b108568c 1033 set[1].minspeed = 3000;
Victor_Mirkhan 3:77d4b108568c 1034 set[1].ac = 100;
Victor_Mirkhan 3:77d4b108568c 1035 set[1].dc = 100;
Victor_Mirkhan 3:77d4b108568c 1036
Victor_Mirkhan 3:77d4b108568c 1037 set[2].maxspeed = 4200;
Victor_Mirkhan 3:77d4b108568c 1038 set[2].minspeed = 3500;
Victor_Mirkhan 3:77d4b108568c 1039 set[2].ac = 100;
Victor_Mirkhan 3:77d4b108568c 1040 set[2].dc = 100;
Victor_Mirkhan 3:77d4b108568c 1041
Victor_Mirkhan 2:666ad168bacb 1042
Victor_Mirkhan 3:77d4b108568c 1043 //Seta comunicação SPI
Victor_Mirkhan 2:666ad168bacb 1044 DevSPI dev_spi(D11, D12, D13);
aberk 0:bcff39fac858 1045
Victor_Mirkhan 2:666ad168bacb 1046 //Inicialização dos componentes dos motores
Victor_Mirkhan 3:77d4b108568c 1047 motorZ = new L6474(D2, D8, D7, D9, D10, dev_spi);
Victor_Mirkhan 3:77d4b108568c 1048 motorX = new L6474(D2, D8, D4, D3, D10, dev_spi);
Victor_Mirkhan 3:77d4b108568c 1049 motorY = new L6474(D2, D8, D5, D6, D10, dev_spi);
Victor_Mirkhan 3:77d4b108568c 1050
Victor_Mirkhan 3:77d4b108568c 1051 if (motorZ->init(&init) != COMPONENT_OK) {
Victor_Mirkhan 2:666ad168bacb 1052 exit(EXIT_FAILURE);
Victor_Mirkhan 2:666ad168bacb 1053 }
Victor_Mirkhan 3:77d4b108568c 1054 if (motorX->init(&init) != COMPONENT_OK) {
Victor_Mirkhan 2:666ad168bacb 1055 exit(EXIT_FAILURE);
Victor_Mirkhan 2:666ad168bacb 1056 }
Victor_Mirkhan 3:77d4b108568c 1057 if (motorY->init(&init) != COMPONENT_OK) {
Victor_Mirkhan 2:666ad168bacb 1058 exit(EXIT_FAILURE);
aberk 0:bcff39fac858 1059 }
Victor_Mirkhan 3:77d4b108568c 1060
Victor_Mirkhan 3:77d4b108568c 1061 // Seta todos os motores para que trabalhem com microstep de 8
Victor_Mirkhan 3:77d4b108568c 1062 motorZ->set_step_mode(StepperMotor::STEP_MODE_1_4);
Victor_Mirkhan 3:77d4b108568c 1063 motorX->set_step_mode(StepperMotor::STEP_MODE_1_4);
Victor_Mirkhan 3:77d4b108568c 1064 motorY->set_step_mode(StepperMotor::STEP_MODE_1_4);
Victor_Mirkhan 2:666ad168bacb 1065
Victor_Mirkhan 3:77d4b108568c 1066 //Seta velocidades e acelerações inciciais
Victor_Mirkhan 3:77d4b108568c 1067 set_aceleracoesZ(set[0].maxspeed,set[0].minspeed,set[0].ac,set[0].dc);
Victor_Mirkhan 3:77d4b108568c 1068 set_aceleracoesX(set[0].maxspeed,set[0].minspeed,set[0].ac,set[0].dc);
Victor_Mirkhan 3:77d4b108568c 1069 set_aceleracoesY(set[0].maxspeed,set[0].minspeed,set[0].ac,set[0].dc);
Victor_Mirkhan 3:77d4b108568c 1070
Victor_Mirkhan 3:77d4b108568c 1071 lcd.setCursor(TextLCD::CurOn_BlkOn); // Liga o cursor
Victor_Mirkhan 3:77d4b108568c 1072
Victor_Mirkhan 3:77d4b108568c 1073 lcd.setBacklight(TextLCD::LightOn); // Liga o backlight do LCD
Victor_Mirkhan 3:77d4b108568c 1074 lcd.setAddress(0,0);
Victor_Mirkhan 3:77d4b108568c 1075 lcd.setCursor(TextLCD::CurOff_BlkOff); // Desliga o cursor para o menu estático
Victor_Mirkhan 4:5dd6e95b5706 1076 menu_passivo(1);
Victor_Mirkhan 3:77d4b108568c 1077
Victor_Mirkhan 3:77d4b108568c 1078 lcd.setCursor(TextLCD::CurOn_BlkOn); // Liga o cursor novamente pro usuario poder mexe-lo
Victor_Mirkhan 3:77d4b108568c 1079 menu_dinamico(0);
Victor_Mirkhan 3:77d4b108568c 1080
Victor_Mirkhan 3:77d4b108568c 1081
Victor_Mirkhan 3:77d4b108568c 1082 /* Loops principais do funcionamento do motor:
Victor_Mirkhan 2:666ad168bacb 1083
Victor_Mirkhan 3:77d4b108568c 1084 -> Os dois loops aninhados (while e do_while) definem o funcionamento conti-
Victor_Mirkhan 3:77d4b108568c 1085 nuo da máquina.
Victor_Mirkhan 3:77d4b108568c 1086 -> O funcionamento geral é o seguinte:
Victor_Mirkhan 3:77d4b108568c 1087 1-) O do_while depende de um parametro booleano chamado "flag". O flag
Victor_Mirkhan 3:77d4b108568c 1088 permanece em TRUE até alguma função do menu ser chamada. Qualquer fun-
Victor_Mirkhan 3:77d4b108568c 1089 ção chamada no Menu que resulte em uma ação seta o flag como FALSE.
Victor_Mirkhan 3:77d4b108568c 1090 Por exemplo, cliquar em alguma opção do menu que leve para outro sub
Victor_Mirkhan 3:77d4b108568c 1091 menu não setaria o "flag" como FALSE, pois nenhuma ação real foi feita.
Victor_Mirkhan 3:77d4b108568c 1092 Agora, entrar em qualquer operação de jog ou de ciclo, setaria a variavel
Victor_Mirkhan 3:77d4b108568c 1093 em FALSE, finalizando o do_while após o término da ação.
Victor_Mirkhan 3:77d4b108568c 1094 2-) Para evitar que a máquina pare de funcionar depois do término de uma ação,
Victor_Mirkhan 3:77d4b108568c 1095 aninha-se o do_while em um loop infinito while(1). Ao sair do do_while, o
Victor_Mirkhan 3:77d4b108568c 1096 flag retorna para TRUE, permitindo que o usuario possa escolher alguma ação
Victor_Mirkhan 3:77d4b108568c 1097 novamente.
Victor_Mirkhan 3:77d4b108568c 1098 -> Variaveis importantes:
Victor_Mirkhan 3:77d4b108568c 1099 a) "ref_menu": Seu valor indica em qual dos menus o usuário está no momento;
Victor_Mirkhan 3:77d4b108568c 1100 b) "ref_cursor": Seu valor indica em qual das linhas o cursor está localizado;
Victor_Mirkhan 3:77d4b108568c 1101 c) "enable": A variavel "enable" possui FALSE como estado padrão. Quando o botão
Victor_Mirkhan 3:77d4b108568c 1102 de "confirma" for pressionado, ele comuta para TRUE. Quando isso acontece,
Victor_Mirkhan 3:77d4b108568c 1103 avalia-se o valor de "ref_menu" e "ref_cursor" para indicar que ação deve
Victor_Mirkhan 3:77d4b108568c 1104 ocorrer naquele momento (ir para outro submenu, referenciar, jog, etc.).
Victor_Mirkhan 3:77d4b108568c 1105 Seu valor sempre retorna para FALSE após qualquer operação ou ao fim do
Victor_Mirkhan 3:77d4b108568c 1106 do_while;
Victor_Mirkhan 3:77d4b108568c 1107 -> Cada menu dinâmico disponivel tem seu aninhamento com switch-case para avaliar
Victor_Mirkhan 3:77d4b108568c 1108 as funções que podem ser chamadas dentro dele;
Victor_Mirkhan 3:77d4b108568c 1109 -> OBS: O ref_cursor só vai de 0 a 3 (linha 1 a 4 do LCD). Entretanto, coloca-se nos
Victor_Mirkhan 3:77d4b108568c 1110 dois sub-menus um case em que ref_cursor vale 4. No uso normal do cursor, isso nunca
Victor_Mirkhan 3:77d4b108568c 1111 vai ocorrer. Esse valor é SETADO para o ref_cursor forçadamente quando o usuario apertar
Victor_Mirkhan 3:77d4b108568c 1112 o botão de BACK. Isso faz com que acione-se uma operação unica para este botão, retornando
Victor_Mirkhan 3:77d4b108568c 1113 para o menu principal.
Victor_Mirkhan 3:77d4b108568c 1114 */
Victor_Mirkhan 2:666ad168bacb 1115 while(1) {
Victor_Mirkhan 2:666ad168bacb 1116
Victor_Mirkhan 3:77d4b108568c 1117 /* Redeclaração da maioria dos pinos. Isso é feito para evitar qualquer
Victor_Mirkhan 3:77d4b108568c 1118 confito entre as chamadas de cada pino. Muitos são desativados quando
Victor_Mirkhan 3:77d4b108568c 1119 o sensor RGB é declarado, então esse processo faz com que nenhuma função
Victor_Mirkhan 3:77d4b108568c 1120 seja perdida no meio do uso da máquina */
Victor_Mirkhan 3:77d4b108568c 1121
Victor_Mirkhan 3:77d4b108568c 1122 InterruptIn confirma(PC_13);
Victor_Mirkhan 3:77d4b108568c 1123 confirma.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 1124 InterruptIn jog_button_pos(PC_12);
Victor_Mirkhan 3:77d4b108568c 1125 jog_button_pos.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 1126 InterruptIn jog_button_neg(PA_15);
Victor_Mirkhan 3:77d4b108568c 1127 jog_button_neg.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 1128 InterruptIn btnX(PC_3); // Botão para selecionar o eixo X
Victor_Mirkhan 3:77d4b108568c 1129 btnX.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 1130 InterruptIn btnY(PC_2); // Botão para selecionar o eixo Y
Victor_Mirkhan 3:77d4b108568c 1131 btnY.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 1132 InterruptIn btnZ(PC_0); // Botão para selecionar o eixo Z
Victor_Mirkhan 3:77d4b108568c 1133 btnZ.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 1134
Victor_Mirkhan 4:5dd6e95b5706 1135 InterruptIn back_btn(PB_7);
Victor_Mirkhan 4:5dd6e95b5706 1136 back_btn.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 1137
Victor_Mirkhan 3:77d4b108568c 1138 confirma.fall(&selecao_funcao);
Victor_Mirkhan 4:5dd6e95b5706 1139
Victor_Mirkhan 3:77d4b108568c 1140 jog_button_pos.fall(&sobe_cursor);
Victor_Mirkhan 3:77d4b108568c 1141 jog_button_neg.fall(&desce_cursor);
Victor_Mirkhan 4:5dd6e95b5706 1142
Victor_Mirkhan 3:77d4b108568c 1143 btnX.fall(&ativa_eixoX);
Victor_Mirkhan 3:77d4b108568c 1144 btnY.fall(&ativa_eixoY);
Victor_Mirkhan 3:77d4b108568c 1145 btnZ.fall(&ativa_eixoZ);
Victor_Mirkhan 4:5dd6e95b5706 1146
Victor_Mirkhan 3:77d4b108568c 1147 do {
Victor_Mirkhan 3:77d4b108568c 1148 wait(0.1);
Victor_Mirkhan 3:77d4b108568c 1149 lcd.locate(0,ref_cursor); // Movimentação do cursor
Victor_Mirkhan 3:77d4b108568c 1150
Victor_Mirkhan 3:77d4b108568c 1151 // Menu prinicipal
Victor_Mirkhan 3:77d4b108568c 1152 if (ref_menu == 0) {
Victor_Mirkhan 3:77d4b108568c 1153 if (enable == true) {
Victor_Mirkhan 3:77d4b108568c 1154 switch(ref_cursor) {
Victor_Mirkhan 3:77d4b108568c 1155 case 0: {
Victor_Mirkhan 3:77d4b108568c 1156 // Mudança para o submenu com as opções de ciclo
Victor_Mirkhan 3:77d4b108568c 1157 ref_cursor = 0;
Victor_Mirkhan 3:77d4b108568c 1158 lcd.locate(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 1159 ref_menu = 2;
Victor_Mirkhan 3:77d4b108568c 1160 menu_dinamico(ref_menu);
Victor_Mirkhan 3:77d4b108568c 1161 enable = false;
Victor_Mirkhan 3:77d4b108568c 1162 break;
Victor_Mirkhan 3:77d4b108568c 1163 }
Victor_Mirkhan 3:77d4b108568c 1164 case 1: {
Victor_Mirkhan 3:77d4b108568c 1165 // Mudança para o submenu com as 4 posições a serem salvas
Victor_Mirkhan 3:77d4b108568c 1166 ref_cursor = 0;
Victor_Mirkhan 3:77d4b108568c 1167 lcd.locate(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 1168 ref_menu = 1;
Victor_Mirkhan 3:77d4b108568c 1169 menu_dinamico(ref_menu);
Victor_Mirkhan 3:77d4b108568c 1170 enable = false;
Victor_Mirkhan 3:77d4b108568c 1171 break;
Victor_Mirkhan 3:77d4b108568c 1172 }
Victor_Mirkhan 3:77d4b108568c 1173 case 2: {
Victor_Mirkhan 3:77d4b108568c 1174 // Operação de referenciamento
Victor_Mirkhan 4:5dd6e95b5706 1175 //int tag = reconhecimento_peca();
Victor_Mirkhan 3:77d4b108568c 1176 seta_origem();
Victor_Mirkhan 3:77d4b108568c 1177 flag = false;
Victor_Mirkhan 3:77d4b108568c 1178 break;
Victor_Mirkhan 3:77d4b108568c 1179 }
Victor_Mirkhan 3:77d4b108568c 1180 case 3: {
Victor_Mirkhan 3:77d4b108568c 1181 // Operação disco-disco
Victor_Mirkhan 3:77d4b108568c 1182 disco_disco();
Victor_Mirkhan 3:77d4b108568c 1183 flag = false;
Victor_Mirkhan 3:77d4b108568c 1184 break;
Victor_Mirkhan 3:77d4b108568c 1185 }
Victor_Mirkhan 3:77d4b108568c 1186 }
Victor_Mirkhan 2:666ad168bacb 1187 }
Victor_Mirkhan 2:666ad168bacb 1188 }
Victor_Mirkhan 3:77d4b108568c 1189
Victor_Mirkhan 3:77d4b108568c 1190 // Sub-menu para as posições a serem salvas
Victor_Mirkhan 4:5dd6e95b5706 1191
Victor_Mirkhan 3:77d4b108568c 1192 if(ref_menu == 1) {
Victor_Mirkhan 4:5dd6e95b5706 1193 back_btn.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 1194 back_btn.fall(&back_op);
Victor_Mirkhan 3:77d4b108568c 1195 if (enable == true) {
Victor_Mirkhan 3:77d4b108568c 1196 switch(ref_cursor) {
Victor_Mirkhan 3:77d4b108568c 1197 case 0: {
Victor_Mirkhan 3:77d4b108568c 1198 // Posição de Pick
Victor_Mirkhan 3:77d4b108568c 1199 jog(0);
Victor_Mirkhan 3:77d4b108568c 1200 flag = false;
Victor_Mirkhan 4:5dd6e95b5706 1201 InterruptIn back_btn(PB_7);
Victor_Mirkhan 4:5dd6e95b5706 1202 back_btn.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 1203 back_btn.fall(&back_op);
Victor_Mirkhan 3:77d4b108568c 1204 break;
Victor_Mirkhan 3:77d4b108568c 1205 }
Victor_Mirkhan 3:77d4b108568c 1206 case 1: {
Victor_Mirkhan 3:77d4b108568c 1207 // Posição de Drop 1
Victor_Mirkhan 3:77d4b108568c 1208 jog(1);
Victor_Mirkhan 3:77d4b108568c 1209 flag = false;
Victor_Mirkhan 4:5dd6e95b5706 1210 InterruptIn back_btn(PB_7);
Victor_Mirkhan 4:5dd6e95b5706 1211 back_btn.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 1212 back_btn.fall(&back_op);
Victor_Mirkhan 3:77d4b108568c 1213 break;
Victor_Mirkhan 3:77d4b108568c 1214 }
Victor_Mirkhan 3:77d4b108568c 1215 case 2: {
Victor_Mirkhan 3:77d4b108568c 1216 // Posição de Drop 2
Victor_Mirkhan 3:77d4b108568c 1217 jog(2);
Victor_Mirkhan 3:77d4b108568c 1218 flag = false;
Victor_Mirkhan 4:5dd6e95b5706 1219 InterruptIn back_btn(PB_7);
Victor_Mirkhan 4:5dd6e95b5706 1220 back_btn.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 1221 back_btn.fall(&back_op);
Victor_Mirkhan 3:77d4b108568c 1222 break;
Victor_Mirkhan 3:77d4b108568c 1223 }
Victor_Mirkhan 3:77d4b108568c 1224 case 3: {
Victor_Mirkhan 3:77d4b108568c 1225 // Posição de Drop 3
Victor_Mirkhan 3:77d4b108568c 1226 jog(3);
Victor_Mirkhan 3:77d4b108568c 1227 flag = false;
Victor_Mirkhan 4:5dd6e95b5706 1228 InterruptIn back_btn(PB_7);
Victor_Mirkhan 4:5dd6e95b5706 1229 back_btn.mode(PullUp);
Victor_Mirkhan 4:5dd6e95b5706 1230 back_btn.fall(&back_op);
Victor_Mirkhan 3:77d4b108568c 1231 break;
Victor_Mirkhan 3:77d4b108568c 1232 }
Victor_Mirkhan 3:77d4b108568c 1233 case 4: {
Victor_Mirkhan 3:77d4b108568c 1234 // Case para quando botão BACK for pressionado. Retorna para o menu inicial
Victor_Mirkhan 3:77d4b108568c 1235 ref_cursor = 0;
Victor_Mirkhan 3:77d4b108568c 1236 lcd.locate(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 1237 ref_menu = 0;
Victor_Mirkhan 3:77d4b108568c 1238 menu_dinamico(ref_menu);
Victor_Mirkhan 3:77d4b108568c 1239 enable = false;
Victor_Mirkhan 3:77d4b108568c 1240 break;
Victor_Mirkhan 3:77d4b108568c 1241 }
Victor_Mirkhan 3:77d4b108568c 1242 }
Victor_Mirkhan 2:666ad168bacb 1243 }
Victor_Mirkhan 2:666ad168bacb 1244 }
Victor_Mirkhan 3:77d4b108568c 1245
Victor_Mirkhan 3:77d4b108568c 1246 if (ref_menu == 2) {
Victor_Mirkhan 3:77d4b108568c 1247 back_btn.fall(&back_op);
Victor_Mirkhan 4:5dd6e95b5706 1248 back_btn.mode(PullUp);
Victor_Mirkhan 3:77d4b108568c 1249 if (enable == true) {
Victor_Mirkhan 3:77d4b108568c 1250 switch(ref_cursor) {
Victor_Mirkhan 3:77d4b108568c 1251 case 0: {
Victor_Mirkhan 3:77d4b108568c 1252 // Opção para ciclo infinito
Victor_Mirkhan 3:77d4b108568c 1253 cycle(0);
Victor_Mirkhan 3:77d4b108568c 1254 flag = false;
Victor_Mirkhan 3:77d4b108568c 1255 break;
Victor_Mirkhan 3:77d4b108568c 1256 }
Victor_Mirkhan 3:77d4b108568c 1257 case 1: {
Victor_Mirkhan 3:77d4b108568c 1258 // Opção para ciclo único
Victor_Mirkhan 3:77d4b108568c 1259 cycle(1);
Victor_Mirkhan 3:77d4b108568c 1260 flag = false;
Victor_Mirkhan 3:77d4b108568c 1261 break;
Victor_Mirkhan 3:77d4b108568c 1262 }
Victor_Mirkhan 3:77d4b108568c 1263 case 4: {
Victor_Mirkhan 3:77d4b108568c 1264 // Case para quando botão BACK for pressionado. Retorna para o menu inicial
Victor_Mirkhan 3:77d4b108568c 1265 ref_cursor = 0;
Victor_Mirkhan 3:77d4b108568c 1266 lcd.locate(0,ref_cursor);
Victor_Mirkhan 3:77d4b108568c 1267 ref_menu = 0;
Victor_Mirkhan 3:77d4b108568c 1268 menu_dinamico(ref_menu);
Victor_Mirkhan 3:77d4b108568c 1269 enable = false;
Victor_Mirkhan 3:77d4b108568c 1270 break;
Victor_Mirkhan 3:77d4b108568c 1271 }
Victor_Mirkhan 3:77d4b108568c 1272 }
Victor_Mirkhan 3:77d4b108568c 1273 }
Victor_Mirkhan 3:77d4b108568c 1274 }
Victor_Mirkhan 3:77d4b108568c 1275
Victor_Mirkhan 3:77d4b108568c 1276 } while(flag == true);
Victor_Mirkhan 2:666ad168bacb 1277
Victor_Mirkhan 3:77d4b108568c 1278 flag = true;
Victor_Mirkhan 3:77d4b108568c 1279 enable = false;
Victor_Mirkhan 3:77d4b108568c 1280 menu_dinamico(ref_menu);
Victor_Mirkhan 2:666ad168bacb 1281 }
Victor_Mirkhan 2:666ad168bacb 1282 }