Como o projeto está até agora....
Dependencies: Servo TCS3200 X_NUCLEO_IHM01A1 mbed TextLCD2
Fork of QEI_HelloWorld by
main.cpp@3:77d4b108568c, 2017-05-29 (annotated)
- 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?
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 | 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 | } |