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:
Fri May 12 18:46:45 2017 +0000
Revision:
2:666ad168bacb
Parent:
1:30696e4d196b
Child:
3:77d4b108568c
Projeto at? agora...;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Victor_Mirkhan 2:666ad168bacb 1 #include "mbed.h"
Victor_Mirkhan 2:666ad168bacb 2 #include "RPG.h"
Victor_Mirkhan 2:666ad168bacb 3 #include "L6474.h"
Victor_Mirkhan 2:666ad168bacb 4
Victor_Mirkhan 2:666ad168bacb 5 // Seta o encoder utilizado. Precisa de duas entradas (D14 e D15) e uma terceira
Victor_Mirkhan 2:666ad168bacb 6 // que seria o seu botão. Como nosso encoder não tem um botão, declara-se qualquer
Victor_Mirkhan 2:666ad168bacb 7 // pino, já que nem será utilizado.
Victor_Mirkhan 2:666ad168bacb 8
Victor_Mirkhan 2:666ad168bacb 9 RPG rpg1(D14,D15,PC_13);
Victor_Mirkhan 2:666ad168bacb 10
Victor_Mirkhan 2:666ad168bacb 11 /*-----Declaração dos pinos e suas funções-----*/
Victor_Mirkhan 2:666ad168bacb 12
Victor_Mirkhan 2:666ad168bacb 13 //PINOS DE INTERRUPÇÃO.
Victor_Mirkhan 2:666ad168bacb 14
Victor_Mirkhan 2:666ad168bacb 15 // Pinos D15 e D14 são ligados ao encoder e setados como pinos de interrupção.
Victor_Mirkhan 2:666ad168bacb 16 InterruptIn encod1(D15);
Victor_Mirkhan 2:666ad168bacb 17 InterruptIn encod2(D14);
Victor_Mirkhan 2:666ad168bacb 18
Victor_Mirkhan 2:666ad168bacb 19 // Botão do usuario é setado para interrupção, especialmente para a fase de
Victor_Mirkhan 2:666ad168bacb 20 // prototipação.
Victor_Mirkhan 2:666ad168bacb 21 InterruptIn usuario(PC_13);
Victor_Mirkhan 2:666ad168bacb 22
Victor_Mirkhan 2:666ad168bacb 23 //PINOS DE SAIDA DIGITAL.
Victor_Mirkhan 2:666ad168bacb 24
Victor_Mirkhan 2:666ad168bacb 25 // Declara o Led da placa como saída digital.
Victor_Mirkhan 2:666ad168bacb 26 DigitalOut Led(D13);
Victor_Mirkhan 2:666ad168bacb 27
Victor_Mirkhan 2:666ad168bacb 28 /*-----Declaração de variaveis globais do código-----*/
Victor_Mirkhan 2:666ad168bacb 29
Victor_Mirkhan 2:666ad168bacb 30 bool refer1 = false; // Parametro para o referenciamento do motor 1
Victor_Mirkhan 2:666ad168bacb 31 bool refer2 = false; // Parametro para o referenciamento do motor 2
Victor_Mirkhan 2:666ad168bacb 32 bool refer3 = false; // Parametro para o referenciamento do motor 3
Victor_Mirkhan 2:666ad168bacb 33
Victor_Mirkhan 2:666ad168bacb 34 int count; // Contagem de pulsos do encoder
Victor_Mirkhan 2:666ad168bacb 35 int change = 0; // Numero que varia de 0 a 2, indicando qual set de velocidade será usado
Victor_Mirkhan 2:666ad168bacb 36 int dirt = 0; // Variavel que pega o estado presente do encoder
Victor_Mirkhan 2:666ad168bacb 37
Victor_Mirkhan 2:666ad168bacb 38 // Criação de uma struct (basicamente, uma classe) para sets de velocidades e acelerações
Victor_Mirkhan 2:666ad168bacb 39 // diferentes. Cada objeto dessa struct possui os argumentos de velocidades max e min e
Victor_Mirkhan 2:666ad168bacb 40 // aceleração e desaceleração.
Victor_Mirkhan 2:666ad168bacb 41
Victor_Mirkhan 2:666ad168bacb 42 struct set_velocidades {
Victor_Mirkhan 2:666ad168bacb 43 int maxspeed;
Victor_Mirkhan 2:666ad168bacb 44 int minspeed;
Victor_Mirkhan 2:666ad168bacb 45 int ac;
Victor_Mirkhan 2:666ad168bacb 46 int dc;
Victor_Mirkhan 2:666ad168bacb 47 };
Victor_Mirkhan 2:666ad168bacb 48
Victor_Mirkhan 2:666ad168bacb 49 struct set_velocidades set[3]; //Cria um objeto da struct set_velocidades com três
Victor_Mirkhan 2:666ad168bacb 50 //objetos dentro dele (basicamente, um objeto triplo).
Victor_Mirkhan 2:666ad168bacb 51
Victor_Mirkhan 2:666ad168bacb 52 //Struct para sets de coordenadas, com argumentos de posição em x,y e z.
Victor_Mirkhan 2:666ad168bacb 53 struct Coordenadas {
Victor_Mirkhan 2:666ad168bacb 54 int posx;
Victor_Mirkhan 2:666ad168bacb 55 int posy;
Victor_Mirkhan 2:666ad168bacb 56 int posz;
Victor_Mirkhan 2:666ad168bacb 57 };
Victor_Mirkhan 2:666ad168bacb 58
Victor_Mirkhan 2:666ad168bacb 59 struct Coordenadas PickPos,DropPos[3]; //Cria objeto unico para posição de pick, e
Victor_Mirkhan 2:666ad168bacb 60 //objeto triplo para posição de place.
Victor_Mirkhan 2:666ad168bacb 61
Victor_Mirkhan 2:666ad168bacb 62 // Declaração dos motores utilizados.
Victor_Mirkhan 2:666ad168bacb 63
Victor_Mirkhan 2:666ad168bacb 64 L6474 *motor1;
Victor_Mirkhan 2:666ad168bacb 65 L6474 *motor2;
Victor_Mirkhan 2:666ad168bacb 66 L6474 *motor3;
Victor_Mirkhan 2:666ad168bacb 67
Victor_Mirkhan 2:666ad168bacb 68 /*-----Declaração de funções auxiliares----*/
Victor_Mirkhan 2:666ad168bacb 69
Victor_Mirkhan 2:666ad168bacb 70 // Função chamada ao atingir o sensor fim de curso. Para o motor e aciona o zera-
Victor_Mirkhan 2:666ad168bacb 71 // mento ao alterar o valor da variavel refer.
Victor_Mirkhan 2:666ad168bacb 72
Victor_Mirkhan 2:666ad168bacb 73 void motor1_off(void) {
Victor_Mirkhan 2:666ad168bacb 74 motor1->hard_stop();
Victor_Mirkhan 2:666ad168bacb 75 printf("Interrupcao Feita!\r\n");
Victor_Mirkhan 2:666ad168bacb 76 refer1 = true;
Victor_Mirkhan 2:666ad168bacb 77 }
Victor_Mirkhan 2:666ad168bacb 78
Victor_Mirkhan 2:666ad168bacb 79 // Função chamada na interrupção de um dos sentidos de rotação do encoder. Basicamente,
Victor_Mirkhan 2:666ad168bacb 80 // desabilita as interrupções enquanto opera ("disable_irq()"), aumenta o contador e
Victor_Mirkhan 2:666ad168bacb 81 // depois ativa as interrupções novamente ("enable_irq()").
aberk 0:bcff39fac858 82
Victor_Mirkhan 2:666ad168bacb 83 void mais(void){
Victor_Mirkhan 2:666ad168bacb 84 encod2.disable_irq();
Victor_Mirkhan 2:666ad168bacb 85 encod1.disable_irq();
Victor_Mirkhan 2:666ad168bacb 86 count = count + 1 ;
Victor_Mirkhan 2:666ad168bacb 87 wait(0.002);
Victor_Mirkhan 2:666ad168bacb 88 encod1.enable_irq();
Victor_Mirkhan 2:666ad168bacb 89 encod2.enable_irq();
Victor_Mirkhan 2:666ad168bacb 90 }
Victor_Mirkhan 2:666ad168bacb 91
Victor_Mirkhan 2:666ad168bacb 92 // Função chamada na interrupção de um dos sentidos de rotação do encoder. Basicamente,
Victor_Mirkhan 2:666ad168bacb 93 // desabilita as interrupções enquanto opera ("disable_irq()"), diminui o contador e
Victor_Mirkhan 2:666ad168bacb 94 // depois ativa as interrupções novamente ("enable_irq()").
Victor_Mirkhan 2:666ad168bacb 95
Victor_Mirkhan 2:666ad168bacb 96 void menos(void){
Victor_Mirkhan 2:666ad168bacb 97 encod2.disable_irq();
Victor_Mirkhan 2:666ad168bacb 98 encod1.disable_irq();
Victor_Mirkhan 2:666ad168bacb 99 count = count - 1;
Victor_Mirkhan 2:666ad168bacb 100 wait(0.002);
Victor_Mirkhan 2:666ad168bacb 101 encod1.enable_irq();
Victor_Mirkhan 2:666ad168bacb 102 encod2.enable_irq();
Victor_Mirkhan 2:666ad168bacb 103 }
Victor_Mirkhan 2:666ad168bacb 104
Victor_Mirkhan 2:666ad168bacb 105 // Função que seta para o motor 1 suas velocidades máxima e minima, aceleração
Victor_Mirkhan 2:666ad168bacb 106 // e desaceleração.
Victor_Mirkhan 2:666ad168bacb 107
Victor_Mirkhan 2:666ad168bacb 108 void set_aceleracoes(int maxspeed,int minspeed,int ac,int dc) {
Victor_Mirkhan 2:666ad168bacb 109 motor1->set_max_speed(maxspeed);
Victor_Mirkhan 2:666ad168bacb 110 motor1->set_min_speed(minspeed);
Victor_Mirkhan 2:666ad168bacb 111 motor1->set_acceleration(ac);
Victor_Mirkhan 2:666ad168bacb 112 motor1->set_deceleration(dc);
Victor_Mirkhan 2:666ad168bacb 113 }
Victor_Mirkhan 2:666ad168bacb 114
Victor_Mirkhan 2:666ad168bacb 115 void save_pick(void) {
Victor_Mirkhan 2:666ad168bacb 116 PickPos.posx = motor1->get_position();
Victor_Mirkhan 2:666ad168bacb 117 PickPos.posy = motor2->get_position();
Victor_Mirkhan 2:666ad168bacb 118 PickPos.posz = motor3->get_position();
Victor_Mirkhan 2:666ad168bacb 119 printf("Posicao de Pick:\r\n");
Victor_Mirkhan 2:666ad168bacb 120 printf("X = %d, Y = %d, Z = %d\r\n",PickPos.posx,PickPos.posy,PickPos.posz);
Victor_Mirkhan 2:666ad168bacb 121 }
Victor_Mirkhan 2:666ad168bacb 122 //Função que é chamada logo na inicialização do programa para realizar o zera-
Victor_Mirkhan 2:666ad168bacb 123 // mento das posições dos motores.
Victor_Mirkhan 2:666ad168bacb 124
Victor_Mirkhan 2:666ad168bacb 125 void seta_origem() {
Victor_Mirkhan 2:666ad168bacb 126
Victor_Mirkhan 2:666ad168bacb 127 set_aceleracoes(7000,2000,1000,500); //Seta uma alta aceleração para o referenciamento
Victor_Mirkhan 2:666ad168bacb 128 usuario.rise(&motor1_off); //Chamada do fim de curso para a função de interrupção
Victor_Mirkhan 2:666ad168bacb 129
Victor_Mirkhan 2:666ad168bacb 130 while(1) {
Victor_Mirkhan 2:666ad168bacb 131
Victor_Mirkhan 2:666ad168bacb 132 //Motor continua andando em uma só direção enquanto variavel refer1 estiver
Victor_Mirkhan 2:666ad168bacb 133 // em FALSE
Victor_Mirkhan 2:666ad168bacb 134
Victor_Mirkhan 2:666ad168bacb 135 if (refer1 == false){
Victor_Mirkhan 2:666ad168bacb 136 motor1->run(StepperMotor::BWD);
Victor_Mirkhan 2:666ad168bacb 137 motor1->wait_while_active();
Victor_Mirkhan 2:666ad168bacb 138 }
Victor_Mirkhan 2:666ad168bacb 139
Victor_Mirkhan 2:666ad168bacb 140 // Se a interrupção for chamada, a variavel refer1 se torna TRUE, acionando
Victor_Mirkhan 2:666ad168bacb 141 // os comandos a seguir.
Victor_Mirkhan 2:666ad168bacb 142
Victor_Mirkhan 2:666ad168bacb 143 else {
Victor_Mirkhan 2:666ad168bacb 144 motor1->move(StepperMotor::FWD,1000); //Leve recuo
Victor_Mirkhan 2:666ad168bacb 145 motor1->wait_while_active();
Victor_Mirkhan 2:666ad168bacb 146 motor1->set_home(); // Seta posição de Home
Victor_Mirkhan 2:666ad168bacb 147 int HomePosition = motor1->get_position();
Victor_Mirkhan 2:666ad168bacb 148 printf("Posicao Home = %d\r\n",HomePosition); //Verificar que HomePosition = 0
Victor_Mirkhan 2:666ad168bacb 149 refer1 = false;
Victor_Mirkhan 2:666ad168bacb 150 break; //Quebra do loop while, pois referenciamento do motor foi feito
Victor_Mirkhan 2:666ad168bacb 151 }
Victor_Mirkhan 2:666ad168bacb 152
Victor_Mirkhan 2:666ad168bacb 153 }
Victor_Mirkhan 2:666ad168bacb 154 }
Victor_Mirkhan 2:666ad168bacb 155
Victor_Mirkhan 2:666ad168bacb 156 // Função chamada para alternar entre os sets de velocidade.
Victor_Mirkhan 2:666ad168bacb 157
Victor_Mirkhan 2:666ad168bacb 158 void muda_velocidade() {
Victor_Mirkhan 2:666ad168bacb 159 change = change + 1;
Victor_Mirkhan 2:666ad168bacb 160 if (change == 3) {
Victor_Mirkhan 2:666ad168bacb 161 change = 0;
Victor_Mirkhan 2:666ad168bacb 162 }
Victor_Mirkhan 2:666ad168bacb 163 printf("Velocidade %d\r\n",change + 1);
Victor_Mirkhan 2:666ad168bacb 164 set_aceleracoes(set[change].maxspeed,set[change].minspeed,set[change].ac,set[change].dc);
Victor_Mirkhan 2:666ad168bacb 165 }
aberk 0:bcff39fac858 166
aberk 0:bcff39fac858 167 int main() {
Victor_Mirkhan 2:666ad168bacb 168
Victor_Mirkhan 2:666ad168bacb 169 //Prepara os 3 sets de velocidade, com velocidaes e acelerações variadas.
Victor_Mirkhan 2:666ad168bacb 170
Victor_Mirkhan 2:666ad168bacb 171 set[0].maxspeed = 2000;
Victor_Mirkhan 2:666ad168bacb 172 set[0].minspeed = 1000;
Victor_Mirkhan 2:666ad168bacb 173 set[0].ac = 500;
Victor_Mirkhan 2:666ad168bacb 174 set[0].dc = 500;
Victor_Mirkhan 2:666ad168bacb 175
Victor_Mirkhan 2:666ad168bacb 176 set[1].maxspeed = 4000;
Victor_Mirkhan 2:666ad168bacb 177 set[1].minspeed = 2000;
Victor_Mirkhan 2:666ad168bacb 178 set[1].ac = 750;
Victor_Mirkhan 2:666ad168bacb 179 set[1].dc = 750;
Victor_Mirkhan 2:666ad168bacb 180
Victor_Mirkhan 2:666ad168bacb 181 set[2].maxspeed = 7000;
Victor_Mirkhan 2:666ad168bacb 182 set[2].minspeed = 5000;
Victor_Mirkhan 2:666ad168bacb 183 set[2].ac = 1000;
Victor_Mirkhan 2:666ad168bacb 184 set[2].dc = 1000;
Victor_Mirkhan 2:666ad168bacb 185
Victor_Mirkhan 2:666ad168bacb 186
Victor_Mirkhan 2:666ad168bacb 187 DevSPI dev_spi(D11, D12, D13);
aberk 0:bcff39fac858 188
Victor_Mirkhan 2:666ad168bacb 189 //Inicialização dos componentes dos motores
Victor_Mirkhan 2:666ad168bacb 190 motor1 = new L6474(D2, D8, D7, D9, D10, dev_spi);
Victor_Mirkhan 2:666ad168bacb 191 motor2 = new L6474(D2, D8, D4, D3, D10, dev_spi);
Victor_Mirkhan 2:666ad168bacb 192 motor3 = new L6474(D2, D8, D5, D6, D10, dev_spi);
Victor_Mirkhan 2:666ad168bacb 193
Victor_Mirkhan 2:666ad168bacb 194 if (motor1->init() != COMPONENT_OK) {
Victor_Mirkhan 2:666ad168bacb 195 exit(EXIT_FAILURE);
Victor_Mirkhan 2:666ad168bacb 196 }
Victor_Mirkhan 2:666ad168bacb 197 if (motor2->init() != COMPONENT_OK) {
Victor_Mirkhan 2:666ad168bacb 198 exit(EXIT_FAILURE);
Victor_Mirkhan 2:666ad168bacb 199 }
Victor_Mirkhan 2:666ad168bacb 200 if (motor3->init() != COMPONENT_OK) {
Victor_Mirkhan 2:666ad168bacb 201 exit(EXIT_FAILURE);
aberk 0:bcff39fac858 202 }
Victor_Mirkhan 2:666ad168bacb 203
Victor_Mirkhan 2:666ad168bacb 204 // Após inicializar tudo, inicia o zeramento.
Victor_Mirkhan 2:666ad168bacb 205 seta_origem();
Victor_Mirkhan 2:666ad168bacb 206
Victor_Mirkhan 2:666ad168bacb 207 //Seta a velocidade inicial como a primeira combinação do set
Victor_Mirkhan 2:666ad168bacb 208 set_aceleracoes(set[0].maxspeed,set[0].minspeed,set[0].ac,set[1].dc);
Victor_Mirkhan 2:666ad168bacb 209
Victor_Mirkhan 2:666ad168bacb 210 while(1) {
Victor_Mirkhan 2:666ad168bacb 211
Victor_Mirkhan 2:666ad168bacb 212 //Declara as funções a serem chamadas nas bordas se subida de cada entrada.
Victor_Mirkhan 2:666ad168bacb 213
Victor_Mirkhan 2:666ad168bacb 214 encod1.rise(&mais);
Victor_Mirkhan 2:666ad168bacb 215 encod2.rise(&menos);
Victor_Mirkhan 2:666ad168bacb 216 usuario.rise(&muda_velocidade);
Victor_Mirkhan 2:666ad168bacb 217 //usuario.rise(&save_pick);
Victor_Mirkhan 2:666ad168bacb 218
Victor_Mirkhan 2:666ad168bacb 219 /*---PAR DE LOOPS PARA O JOG---*/
Victor_Mirkhan 2:666ad168bacb 220
Victor_Mirkhan 2:666ad168bacb 221 // Esse loop faz com que, caso e enquanto o contador for menor que zero,
Victor_Mirkhan 2:666ad168bacb 222 // o motor proporcione o movimento BACKWARD.
Victor_Mirkhan 2:666ad168bacb 223
Victor_Mirkhan 2:666ad168bacb 224 if (count < 0) {
Victor_Mirkhan 2:666ad168bacb 225 while(count < 0) {
Victor_Mirkhan 2:666ad168bacb 226 motor1->run(StepperMotor::BWD);
Victor_Mirkhan 2:666ad168bacb 227 wait(0.1);
Victor_Mirkhan 2:666ad168bacb 228 count = count + 1; //Acrescenta 1 ao contador a cada 0.1seg, aproximando-o de zero.
Victor_Mirkhan 2:666ad168bacb 229 if (count >= 0) { //Se o contador mudar para 0 ou positivo, motor para e quebra o while.
Victor_Mirkhan 2:666ad168bacb 230 motor1->hard_stop();
Victor_Mirkhan 2:666ad168bacb 231 count = 0;
Victor_Mirkhan 2:666ad168bacb 232 break;
Victor_Mirkhan 2:666ad168bacb 233 }
Victor_Mirkhan 2:666ad168bacb 234 }
Victor_Mirkhan 2:666ad168bacb 235 }
Victor_Mirkhan 2:666ad168bacb 236
Victor_Mirkhan 2:666ad168bacb 237 // Esse loop faz com que, caso e enquanto o contador for maior que zero,
Victor_Mirkhan 2:666ad168bacb 238 // o motor proporcione o movimento FOWARD.
Victor_Mirkhan 2:666ad168bacb 239
Victor_Mirkhan 2:666ad168bacb 240 if (count > 0) {
Victor_Mirkhan 2:666ad168bacb 241 while(count > 0) {
Victor_Mirkhan 2:666ad168bacb 242 motor1->run(StepperMotor::FWD);
Victor_Mirkhan 2:666ad168bacb 243 wait(0.1);
Victor_Mirkhan 2:666ad168bacb 244 count = count - 1; //Decrescenta 1 ao contador a cada 0.1seg, aproximando-o de zero.
Victor_Mirkhan 2:666ad168bacb 245 if (count <= 0) { //Se o contador mudar para 0 ou negativo, motor para e quebra o while.
Victor_Mirkhan 2:666ad168bacb 246 motor1->hard_stop();
Victor_Mirkhan 2:666ad168bacb 247 count = 0;
Victor_Mirkhan 2:666ad168bacb 248 break;
Victor_Mirkhan 2:666ad168bacb 249 }
Victor_Mirkhan 2:666ad168bacb 250 }
Victor_Mirkhan 2:666ad168bacb 251 }
Victor_Mirkhan 2:666ad168bacb 252
Victor_Mirkhan 2:666ad168bacb 253 count = 0;
Victor_Mirkhan 2:666ad168bacb 254
Victor_Mirkhan 2:666ad168bacb 255 }
Victor_Mirkhan 2:666ad168bacb 256 }