Como o projeto está até agora....

Dependencies:   Servo TCS3200 X_NUCLEO_IHM01A1 mbed TextLCD2

Fork of QEI_HelloWorld by Aaron Berk

Committer:
Victor_Mirkhan
Date:
Mon May 29 14:47:22 2017 +0000
Revision:
3:77d4b108568c
Parent:
2:666ad168bacb
Child:
4:5dd6e95b5706
Projeto!;

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