Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Servo TCS3200 X_NUCLEO_IHM01A1 mbed TextLCD2
Fork of QEI_HelloWorld by
Revision 2:666ad168bacb, committed 2017-05-12
- Comitter:
- Victor_Mirkhan
- Date:
- Fri May 12 18:46:45 2017 +0000
- Parent:
- 1:30696e4d196b
- Child:
- 3:77d4b108568c
- Commit message:
- Projeto at? agora...;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QEI.lib Fri May 12 18:46:45 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/aberk/code/QEI/#5c2ad81551aa
--- a/QEI_lib.lib Wed Aug 11 09:15:10 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/aberk/programs/QEI_lib/latest \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RPG.lib Fri May 12 18:46:45 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/canderson199/code/RPG/#0b389c2c21b5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/X_NUCLEO_IHM01A1.lib Fri May 12 18:46:45 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/teams/ST/code/X_NUCLEO_IHM01A1/#974ca699c792
--- a/main.cpp Wed Aug 11 09:15:10 2010 +0000
+++ b/main.cpp Fri May 12 18:46:45 2017 +0000
@@ -1,16 +1,256 @@
-#include "QEI.h"
+#include "mbed.h"
+#include "RPG.h"
+#include "L6474.h"
+
+// Seta o encoder utilizado. Precisa de duas entradas (D14 e D15) e uma terceira
+// que seria o seu botão. Como nosso encoder não tem um botão, declara-se qualquer
+// pino, já que nem será utilizado.
+
+RPG rpg1(D14,D15,PC_13);
+
+/*-----Declaração dos pinos e suas funções-----*/
+
+//PINOS DE INTERRUPÇÃO.
+
+// Pinos D15 e D14 são ligados ao encoder e setados como pinos de interrupção.
+InterruptIn encod1(D15);
+InterruptIn encod2(D14);
+
+// Botão do usuario é setado para interrupção, especialmente para a fase de
+// prototipação.
+InterruptIn usuario(PC_13);
+
+//PINOS DE SAIDA DIGITAL.
+
+// Declara o Led da placa como saída digital.
+DigitalOut Led(D13);
+
+/*-----Declaração de variaveis globais do código-----*/
+
+bool refer1 = false; // Parametro para o referenciamento do motor 1
+bool refer2 = false; // Parametro para o referenciamento do motor 2
+bool refer3 = false; // Parametro para o referenciamento do motor 3
+
+int count; // Contagem de pulsos do encoder
+int change = 0; // Numero que varia de 0 a 2, indicando qual set de velocidade será usado
+int dirt = 0; // Variavel que pega o estado presente do encoder
+
+// Criação de uma struct (basicamente, uma classe) para sets de velocidades e acelerações
+// diferentes. Cada objeto dessa struct possui os argumentos de velocidades max e min e
+// aceleração e desaceleração.
+
+struct set_velocidades {
+ int maxspeed;
+ int minspeed;
+ int ac;
+ int dc;
+};
+
+struct set_velocidades set[3]; //Cria um objeto da struct set_velocidades com três
+ //objetos dentro dele (basicamente, um objeto triplo).
+
+//Struct para sets de coordenadas, com argumentos de posição em x,y e z.
+struct Coordenadas {
+ int posx;
+ int posy;
+ int posz;
+};
+
+struct Coordenadas PickPos,DropPos[3]; //Cria objeto unico para posição de pick, e
+ //objeto triplo para posição de place.
+
+// Declaração dos motores utilizados.
+
+L6474 *motor1;
+L6474 *motor2;
+L6474 *motor3;
+
+/*-----Declaração de funções auxiliares----*/
+
+// Função chamada ao atingir o sensor fim de curso. Para o motor e aciona o zera-
+// mento ao alterar o valor da variavel refer.
+
+void motor1_off(void) {
+ motor1->hard_stop();
+ printf("Interrupcao Feita!\r\n");
+ refer1 = true;
+}
+
+// Função chamada na interrupção de um dos sentidos de rotação do encoder. Basicamente,
+// desabilita as interrupções enquanto opera ("disable_irq()"), aumenta o contador e
+// depois ativa as interrupções novamente ("enable_irq()").
-Serial pc(USBTX, USBRX);
-//Use X4 encoding.
-//QEI wheel(p29, p30, NC, 624, QEI::X4_ENCODING);
-//Use X2 encoding by default.
-QEI wheel (p29, p30, NC, 624);
+void mais(void){
+ encod2.disable_irq();
+ encod1.disable_irq();
+ count = count + 1 ;
+ wait(0.002);
+ encod1.enable_irq();
+ encod2.enable_irq();
+}
+
+// Função chamada na interrupção de um dos sentidos de rotação do encoder. Basicamente,
+// desabilita as interrupções enquanto opera ("disable_irq()"), diminui o contador e
+// depois ativa as interrupções novamente ("enable_irq()").
+
+void menos(void){
+ encod2.disable_irq();
+ encod1.disable_irq();
+ count = count - 1;
+ wait(0.002);
+ encod1.enable_irq();
+ encod2.enable_irq();
+}
+
+// Função que seta para o motor 1 suas velocidades máxima e minima, aceleração
+// e desaceleração.
+
+void set_aceleracoes(int maxspeed,int minspeed,int ac,int dc) {
+ motor1->set_max_speed(maxspeed);
+ motor1->set_min_speed(minspeed);
+ motor1->set_acceleration(ac);
+ motor1->set_deceleration(dc);
+}
+
+void save_pick(void) {
+ PickPos.posx = motor1->get_position();
+ PickPos.posy = motor2->get_position();
+ PickPos.posz = motor3->get_position();
+ printf("Posicao de Pick:\r\n");
+ printf("X = %d, Y = %d, Z = %d\r\n",PickPos.posx,PickPos.posy,PickPos.posz);
+}
+//Função que é chamada logo na inicialização do programa para realizar o zera-
+// mento das posições dos motores.
+
+void seta_origem() {
+
+ set_aceleracoes(7000,2000,1000,500); //Seta uma alta aceleração para o referenciamento
+ usuario.rise(&motor1_off); //Chamada do fim de curso para a função de interrupção
+
+ while(1) {
+
+ //Motor continua andando em uma só direção enquanto variavel refer1 estiver
+ // em FALSE
+
+ if (refer1 == false){
+ motor1->run(StepperMotor::BWD);
+ motor1->wait_while_active();
+ }
+
+ // Se a interrupção for chamada, a variavel refer1 se torna TRUE, acionando
+ // os comandos a seguir.
+
+ else {
+ motor1->move(StepperMotor::FWD,1000); //Leve recuo
+ motor1->wait_while_active();
+ motor1->set_home(); // Seta posição de Home
+ int HomePosition = motor1->get_position();
+ printf("Posicao Home = %d\r\n",HomePosition); //Verificar que HomePosition = 0
+ refer1 = false;
+ break; //Quebra do loop while, pois referenciamento do motor foi feito
+ }
+
+ }
+}
+
+// Função chamada para alternar entre os sets de velocidade.
+
+void muda_velocidade() {
+ change = change + 1;
+ if (change == 3) {
+ change = 0;
+ }
+ printf("Velocidade %d\r\n",change + 1);
+ set_aceleracoes(set[change].maxspeed,set[change].minspeed,set[change].ac,set[change].dc);
+}
int main() {
+
+ //Prepara os 3 sets de velocidade, com velocidaes e acelerações variadas.
+
+ set[0].maxspeed = 2000;
+ set[0].minspeed = 1000;
+ set[0].ac = 500;
+ set[0].dc = 500;
+
+ set[1].maxspeed = 4000;
+ set[1].minspeed = 2000;
+ set[1].ac = 750;
+ set[1].dc = 750;
+
+ set[2].maxspeed = 7000;
+ set[2].minspeed = 5000;
+ set[2].ac = 1000;
+ set[2].dc = 1000;
+
+
+ DevSPI dev_spi(D11, D12, D13);
- while(1){
- wait(0.1);
- pc.printf("Pulses is: %i\n", wheel.getPulses());
+ //Inicialização dos componentes dos motores
+ motor1 = new L6474(D2, D8, D7, D9, D10, dev_spi);
+ motor2 = new L6474(D2, D8, D4, D3, D10, dev_spi);
+ motor3 = new L6474(D2, D8, D5, D6, D10, dev_spi);
+
+ if (motor1->init() != COMPONENT_OK) {
+ exit(EXIT_FAILURE);
+ }
+ if (motor2->init() != COMPONENT_OK) {
+ exit(EXIT_FAILURE);
+ }
+ if (motor3->init() != COMPONENT_OK) {
+ exit(EXIT_FAILURE);
}
-
-}
+
+ // Após inicializar tudo, inicia o zeramento.
+ seta_origem();
+
+ //Seta a velocidade inicial como a primeira combinação do set
+ set_aceleracoes(set[0].maxspeed,set[0].minspeed,set[0].ac,set[1].dc);
+
+ while(1) {
+
+ //Declara as funções a serem chamadas nas bordas se subida de cada entrada.
+
+ encod1.rise(&mais);
+ encod2.rise(&menos);
+ usuario.rise(&muda_velocidade);
+ //usuario.rise(&save_pick);
+
+ /*---PAR DE LOOPS PARA O JOG---*/
+
+ // Esse loop faz com que, caso e enquanto o contador for menor que zero,
+ // o motor proporcione o movimento BACKWARD.
+
+ if (count < 0) {
+ while(count < 0) {
+ motor1->run(StepperMotor::BWD);
+ wait(0.1);
+ count = count + 1; //Acrescenta 1 ao contador a cada 0.1seg, aproximando-o de zero.
+ if (count >= 0) { //Se o contador mudar para 0 ou positivo, motor para e quebra o while.
+ motor1->hard_stop();
+ count = 0;
+ break;
+ }
+ }
+ }
+
+ // Esse loop faz com que, caso e enquanto o contador for maior que zero,
+ // o motor proporcione o movimento FOWARD.
+
+ if (count > 0) {
+ while(count > 0) {
+ motor1->run(StepperMotor::FWD);
+ wait(0.1);
+ count = count - 1; //Decrescenta 1 ao contador a cada 0.1seg, aproximando-o de zero.
+ if (count <= 0) { //Se o contador mudar para 0 ou negativo, motor para e quebra o while.
+ motor1->hard_stop();
+ count = 0;
+ break;
+ }
+ }
+ }
+
+ count = 0;
+
+ }
+}
\ No newline at end of file
--- a/mbed.bld Wed Aug 11 09:15:10 2010 +0000 +++ b/mbed.bld Fri May 12 18:46:45 2017 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/9114680c05da +https://mbed.org/users/mbed_official/code/mbed/builds/794e51388b66 \ No newline at end of file
