Advertisement
Guest User

Untitled

a guest
Nov 19th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.64 KB | None | 0 0
  1. #include <RotaryEncoder.h> //Biblioteca para uso de encoder.
  2. #include <LiquidCrystal.h> //Biblioteca para uso de LCD.
  3. #include <Stepper.h> //Biblioteca para uso de motor de passo.
  4. #include <EEPROM.h> // Biblioteca para controle de dados na EEPROM.
  5. #define minimo -100000 //Definição do limite mínimo de contagem do encoder.
  6. #define maximo 100000 //Definição do limite máximo de contagem do encoder.
  7. int posant, valor, menu = 0, menuant, selecionado = 0, selecionadomax = 3, selecionadoant = -1, patual, pant, pselect = 0, selecionar = 0, voltar = 1,  //Declaração das variáveis e constantes utilizadas na programação do menu.
  8. comparacao1, comparacao2, comparacao3, motor1, motor2, motor3, salvo[45], etapa, passo = 200, b1m1 = 2, b2m1 = 3, b3m1 = 4, b4m1 = 5, b1m2 = 6, b2m2 = 7, b3m2 = 8, b4m2 = 9, b1m3 = 10, b2m3 = 11, b3m3 = 12, b4m3 = 13;  //Declaração das variáveis e constantes utilizadas na programação dos motores.
  9. int s[45]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16, //Variáveis para funcionamento da biblioteca EEPROM.
  10. 0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C};
  11. byte selec[8] = {0b00010,0b00110,0b01110,0b11110,0b01110,0b00110,0b00010,0b00000}; //Configuração dos bits para formar o caractere que indica qual opção está selecionada.
  12. byte pgdown[8] = {0b00100,0b00100,0b00100,0b00100,0b00100,0b11111,0b01110,0b00100}; //Configuração dos bits para formar o caractere que indica a existência de uma página abaixo.
  13. byte pgup[8] = {0b00100,0b01110,0b11111,0b00100,0b00100,0b00100,0b00100,0b00100}; //Configuração dos bits para formar o caractere que indica a existência de uma página acima.
  14. RotaryEncoder encoder(A0, A1); //Criação de objeto para o encoder.
  15. LiquidCrystal lcd(19, 18, 17, 16, 15, 14); //Criação de objeto para o LCD.
  16. Stepper M1(passo, b1m1, b2m1, b3m1, b4m1);//Criação de objeto para o motor 1. * EDITAR DEPOIS *
  17. Stepper M2(passo, b1m2, b2m2, b3m2, b4m2);//Criação de objeto para o motor 2. * EDITAR DEPOIS *
  18. Stepper M3(passo, b1m3, b2m3, b3m3, b4m3);//Criação de objeto para o motor 3. * EDITAR DEPOIS *
  19. void setup(){
  20. Serial.begin(9600); //* EDITAR DEPOIS *
  21. lcd.begin(20,4); //Inicializa o LCD com dimensões 20x4.
  22. lcd.createChar(0, selec); //Atribuição de byte para o caractere que indica qual opção está selecionada.
  23. lcd.createChar(1, pgdown); //Atribuição de byte para o caractere que indica a existência de uma página abaixo.
  24. lcd.createChar(2, pgup); //Atribuição de byte para o caractere que indica a existência de uma página acima.
  25. pinMode(selecionar, INPUT_PULLUP); //* EDITAR DEPOIS *
  26. pinMode(voltar, INPUT_PULLUP);} //* EDITAR DEPOIS *
  27. //=================Igualar======================  
  28. void igualar (int comparacao1, int comparacao2, int comparacao3){ //Função para rotacionar os motores até a posição selecionada.
  29.   while(comparacao1!=motor1||comparacao2!=motor2||comparacao3!=motor3){ //Mantém o loop até que os motores estejam na posição correta.
  30.     if(comparacao1>motor1){M1.step(1); motor1++; EEPROM.write(s[45], motor1); delay(5);} //Rotaciona o motor 1 no sentido horário caso sua posição atual seja de angulação menor que a desejada. * EDITAR DEPOIS *
  31.     if(comparacao1<motor1){M1.step(-1); motor1--; EEPROM.write(s[45], motor1); delay(5);} //Rotaciona o motor 1 no sentido anti-horário caso sua posição atual seja de angulação maior que a desejada. * EDITAR DEPOIS *
  32.     if(comparacao2>motor2){M2.step(1); motor2++; EEPROM.write(s[46], motor2); delay(5);} //Rotaciona o motor 2 no sentido horário caso sua posição atual seja de angulação menor que a desejada. * EDITAR DEPOIS *
  33.     if(comparacao2<motor2){M2.step(-1); motor2--; EEPROM.write(s[46], motor2); delay(5);} //Rotaciona o motor 2 no sentido anti-horário caso sua posição atual seja de angulação maior que a desejada. * EDITAR DEPOIS *
  34.     if(comparacao3>motor3){M3.step(1); motor3++; EEPROM.write(s[47], motor3); delay(5);} //Rotaciona o motor 3 no sentido horário caso sua posição atual seja de angulação menor que a desejada. * EDITAR DEPOIS *
  35.     if(comparacao3<motor3){M3.step(-1); motor3--; EEPROM.write(s[47], motor3); delay(5);}}} //Rotaciona o motor 3 no sentido anti-horário caso sua posição atual seja de angulação maior que a desejada. * EDITAR DEPOIS *
  36. void loop(){
  37. //=================Encoder======================  
  38. encoder.tick(); //Comando da biblioteca RotaryEncoder, não sei exatamente o que faz, somente copiei da estrutura de exemplo.
  39. valor = encoder.getPosition(); //Define "valor" igual a posição atual do encoder.
  40. if (valor < minimo) {encoder.setPosition(minimo);valor = minimo;} //Detecta quando o encoder é movido no sentido anti-horário, não sei por que ele compara com o valor mínimo, nem por que ele define "valor" igual a "minimo", mas aparentemente funciona.
  41. else if (valor > maximo) {encoder.setPosition(maximo);valor = maximo;} //Detecta quando o encoder é movido no sentido horário, não sei por que ele compara com o valor máximo, nem por que ele define "valor" igual a "maximo", mas aparentemente funciona.
  42. if (posant != valor) { //Detecta quando houve variação de posição.
  43. if (posant > valor && selecionado > 0) {selecionado--;} //Diminui "selecionado" caso o encoder seja movido no sentido anti-horário e o novo valor esteja dentro da gama de valores possíveis dele assumir.
  44. if (posant < valor && selecionado < selecionadomax) {selecionado++;} //Aumenta "selecionado" caso o encoder seja movido no sentido horário e o novo valor esteja dentro da gama de valores possíveis dele assumir.
  45. if (posant > valor && pselect == 1 && patual > 1) {patual--;} //Diminui "patual" caso o encoder seja movido no sentido anti-horário no menu "Definir posição/Manusear" e o novo valor esteja dentro da gama de valores possíveis dele assumir.
  46. if (posant < valor && pselect == 1 && patual < 15) {patual++;} //Aumenta "patual" caso o encoder seja movido no sentido horário no menu "Definir posição/Manusear" e o novo valor esteja dentro da gama de valores possíveis dele assumir.
  47. posant = valor;} //Iguala "posant" a "valor".
  48. //===================Menu=======================
  49. // Menu        Função
  50. //  0       Menu inicial
  51. //  1       Definir posição/Manusear
  52. //  2       Edição da posição
  53. //  3       Modo automático
  54. if (menu != menuant) {selecionado = 0; menuant = menu; selecionadoant = -1;} //Volta o selecionado para "0" quando houver seleção ou retorno entre menus.
  55. if (menu == 0) {selecionadomax = 2; pselect = 0; //Menu inicial.
  56. if (selecionadoant != selecionado) {selecionadoant = selecionado; //Só envia algum dado para ser exibido no display caso haja alteração em algo.
  57.   lcd.clear(); //Limpa todos os dados exibidos no LCD.
  58.   if (selecionado == 0) {lcd.setCursor(0,0); lcd.print("Definir posicoes");lcd.write(byte(0));} else {lcd.setCursor(0,0); lcd.print("Definir posicoes");} //Primeira linha do menu inicial.
  59.   if (selecionado == 1) {lcd.setCursor(0,1); lcd.print("Modo automatico");lcd.write(byte(0));} else {lcd.setCursor(0,1); lcd.print("Modo automatico");} //Segunda linha do menu inicial.
  60.   if (selecionado == 2) {lcd.setCursor(0,2); lcd.print("Desligar");lcd.write(byte(0));} else {lcd.setCursor(0,2); lcd.print("Desligar");}} //Terceira linha do menu inicial.
  61.   if (selecionado == 0 && digitalRead(selecionar) == 0) {menu = 1; patual = 1; pant = 0; while (digitalRead(selecionar) == 0) {} Serial.println("Selecionei");} //Avança para o menu de definir posições caso o botão seja pressionado. * EDITAR DEPOIS *
  62.   if (selecionado == 1 && digitalRead(selecionar) == 0) {menu = 3; while (digitalRead(selecionar) == 0) {}} //Avança para o menu do modo automático caso o botão seja pressionado. * EDITAR DEPOIS *
  63.   if (selecionado == 2 && digitalRead(selecionar) == 0) {}} //Desliga o robô caso o botão seja pressionado. * EDITAR DEPOIS *
  64. if (menu == 1) {selecionadomax = 0; pselect = 1; //Menu "Definir posição/Manusear".
  65.   if (pant != patual) { //Atualiza o que está sendo exibido no display caso haja alguma alteração.
  66.   lcd.clear(); //Limpa todos os dados exibidos no LCD.
  67.   if (patual < 5) { //Primeira página do menu de posições.
  68.     if (patual == 1) {lcd.setCursor(0,0); lcd.print("Posicao 1"); lcd.write(byte(0));} else {lcd.setCursor(0,0); lcd.print("Posicao 1");} //Primeira linha da primeira página.
  69.     if (patual == 2) {lcd.setCursor(0,1); lcd.print("Posicao 2"); lcd.write(byte(0));} else {lcd.setCursor(0,1); lcd.print("Posicao 2");} //Segunda linha da primeira página.
  70.     if (patual == 3) {lcd.setCursor(0,2); lcd.print("Posicao 3"); lcd.write(byte(0));} else {lcd.setCursor(0,2); lcd.print("Posicao 3");} //Terceira linha da primeira página.
  71.     if (patual == 4) {lcd.setCursor(0,3); lcd.print("Posicao 4"); lcd.write(byte(0)); lcd.setCursor(19,3); lcd.write(byte(1));} else {lcd.setCursor(0,3); lcd.print("Posicao 4");lcd.setCursor(19,3); lcd.write(byte(1));}} //Quarta linha da primeira página.
  72.   if (patual > 4 && patual < 9) { //Segunda página do menu de posições.
  73.     if (patual == 5) {lcd.setCursor(0,0); lcd.print("Posicao 5"); lcd.write(byte(0)); lcd.setCursor(19,0); lcd.write(byte(2));} else {lcd.setCursor(0,0); lcd.print("Posicao 5");lcd.setCursor(19,0); lcd.write(byte(2));} //Primeira linha da segunda página.
  74.     if (patual == 6) {lcd.setCursor(0,1); lcd.print("Posicao 6"); lcd.write(byte(0));} else {lcd.setCursor(0,1); lcd.print("Posicao 6");} //Segunda linha da segunda página.
  75.     if (patual == 7) {lcd.setCursor(0,2); lcd.print("Posicao 7"); lcd.write(byte(0));} else {lcd.setCursor(0,2); lcd.print("Posicao 7");} //Terceira linha da segunda página.
  76.     if (patual == 8) {lcd.setCursor(0,3); lcd.print("Posicao 8"); lcd.write(byte(0)); lcd.setCursor(19,3); lcd.write(byte(1));} else {lcd.setCursor(0,3); lcd.print("Posicao 8");lcd.setCursor(19,3); lcd.write(byte(1));}} //Quarta linha da segunda página.
  77.   if (patual > 8 && patual < 13) { //Terceira página do menu de posições.
  78.     if (patual == 9) {lcd.setCursor(0,0); lcd.print("Posicao 9"); lcd.write(byte(0)); lcd.setCursor(19,0); lcd.write(byte(2));} else {lcd.setCursor(0,0); lcd.print("Posicao 9");lcd.setCursor(19,0); lcd.write(byte(2));} //Primeira linha da terceira página.
  79.     if (patual == 10) {lcd.setCursor(0,1); lcd.print("Posicao 10"); lcd.write(byte(0));} else {lcd.setCursor(0,1); lcd.print("Posicao 10");} //Segunda linha da terceira página.
  80.     if (patual == 11) {lcd.setCursor(0,2); lcd.print("Posicao 11"); lcd.write(byte(0));} else {lcd.setCursor(0,2); lcd.print("Posicao 11");} //Terceira linha da terceira página.
  81.     if (patual == 12) {lcd.setCursor(0,3); lcd.print("Posicao 12"); lcd.write(byte(0)); lcd.setCursor(19,3); lcd.write(byte(1));} else {lcd.setCursor(0,3); lcd.print("Posicao 12");lcd.setCursor(19,3); lcd.write(byte(1));}} //Quarta linha da terceira página.
  82.   if (patual > 12) { //Quarta página do menu de posições.
  83.     if (patual == 13) {lcd.setCursor(0,0); lcd.print("Posicao 13"); lcd.write(byte(0)); lcd.setCursor(19,0); lcd.write(byte(2));} else {lcd.setCursor(0,0); lcd.print("Posicao 13");lcd.setCursor(19,0); lcd.write(byte(2));} //Primeira linha da quarta página.
  84.     if (patual == 14) {lcd.setCursor(0,1); lcd.print("Posicao 14"); lcd.write(byte(0));} else {lcd.setCursor(0,1); lcd.print("Posicao 14");} //Segunda linha da quarta página.
  85.     if (patual == 15) {lcd.setCursor(0,2); lcd.print("Posicao 15"); lcd.write(byte(0));} else {lcd.setCursor(0,2); lcd.print("Posicao 15");}} //Terceira linha da quarta página.
  86.     pant = patual;} //Iguala "pant" a "patual".
  87.   if (digitalRead(voltar) == 0) {menu = 0; while (digitalRead(voltar) == 0) {}} //Retorna para o Menu inicial.  
  88.   if (digitalRead(selecionar) == 0) {menu = 2; while (digitalRead(selecionar) == 0) {} lcd.clear(); lcd.setCursor(4,1); lcd.print("Posicionando"); lcd.setCursor(6,2); lcd.print("Aguarde."); //* EDITAR DEPOIS *
  89.   igualar(comparacao1=EEPROM.read(s[patual*3-2]),EEPROM.read(salvo[patual*3-1]),comparacao3=EEPROM.read(s[patual*3])); etapa = 1;}} //Avança para o menu de edição da posição. * EDITAR DEPOIS *
  90. if (menu == 2) { //Menu de edição da posição.
  91.   if (selecionadoant != selecionado) {
  92.   selecionadoant = selecionado;
  93.   lcd.clear();
  94.   lcd.setCursor(0,0); lcd.print("Posicione o motor");
  95.   lcd.setCursor(0,1); lcd.print("Motor 1:");
  96.   lcd.setCursor(0,2); lcd.print("Motor 2:");
  97.   lcd.setCursor(0,3); lcd.print("Motor 3:");
  98.   if (etapa == 1) {lcd.setCursor(18,0); lcd.print("1."); lcd.setCursor(8,1); lcd.print(motor1); lcd.write(byte(0));} else {}
  99.   if (etapa == 2) {lcd.setCursor(18,0); lcd.print("2."); lcd.setCursor(8,2); lcd.print(motor2);} else {}
  100.   if (etapa == 3) {lcd.setCursor(18,0); lcd.print("3."); lcd.setCursor(8,3); lcd.print(motor3);} else {}
  101.   }}}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement