Projeto de software do projeto mecatrônico
Dependencies: Servo TCS3200 TextLCD2 X_NUCLEO_IHM01A1 mbed
Fork of PROJETO by
main.cpp@4:5dd6e95b5706, 2017-06-05 (annotated)
- 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?
User | Revision | Line number | New 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(¶daX); |
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(¶daY); |
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(¶daZ); |
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(¶daX); |
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(¶daY); |
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(¶daZ); |
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 | } |