COMO IMPLEMENTAR HOMEPOSITION

Boa noite! Estou desenvolvendo um projeto de rastreamento solar e, na atual etapa, estou utilizado um sensor de fim de curso tanto como limitador para a movimentação (isto é, quando ele for atingido, o motor deve se movimentar para o outro lado) como também para a calibração do sensor de posição (que é o potenciômetro). Para resolver este último caso,eu gostaria de implementar uma rotina de homeposition.

Há duas funções principais para a movimentação da estrutura, que são chamadas dentro do loop, e que são o rastreamento (que utiliza 4 LDR's como sensores - 2 para cada eixo)e o posicionamentopotenciometro (que usa o 2 potenciometros, um para cada eixo, como sensor). O loop é baseado na verificação de sinais (HIGH ou LOW) de 3 pinos digitais vindos de um datalogger, a partir dos quais se decide qual configuração será realizada (painel fixo, rastreamento em um eixo, rastreamento em dois eixos) .

Um outro ponto para destacar é que estou utilizado 4 sensores de fim de curso, sendo 2 para cada eixo de movimentação (eixo vertical e eixo horizontal). Em cada eixo, os sensores estão posicionados em lados opostos. Todos os 4 sensores estão ligados a um mesmo pino digital, visto que não há mais portas disponíveis para serem utilizadas. Para identificar qual sensor de fim de curso foi acionado, utilizei uma variável global para indicar o eixoatual (vertical ou horizontal) e um array para indicar a direção e grava-la para cada eixo.

Tentei utilizar a função interrupt para implementar a rotina de calibração do sensor de posição (potenciometro). O que havia pensado é o seguinte:

  1. Sensor de fim de curso acionado
  2. Função sensordefimdecurso é chamada
  3. Dependendo do modo de configuração atual (marcação feita pela variavel global: indicacaodefuncao), chama-se duas funções:

3.1 - Posicionamento (Homeposition)

  1. Calcula-se a posição atual do motor de passo (leitura do valor do potenciometro)
  2. Calculo comparativo entre a posição atual (leitura do potenciometro) e a leitura gravada no EEPROM (memoria). Caso a diferença encontrada for maior que x valor, continua a executar o passo seguinte.
  3. Direção do motor é trocada
  4. Motor se movimenta até o outro lado do eixo até encostar no outro sensor de fim de curso
  5. Direção do motor é trocada novamente
  6. Motor se movimenta 90º e deve parar
  7. Retorno para o loop

3.2 - Rastreamento (Calibracaorastreamento)

  1. Calcula-se a posição atual do motor de passo (leitura do valor do potenciometro)
  2. Calculo comparativo entre a posição atual (leitura do potenciometro) e a leitura gravada no EEPROM (memoria). Caso a diferença encontrada for maior que x valor, continua a executar o passo seguinte.
  3. Direção do motor é trocada
  4. Motor se movimenta 90° e deve parar
  5. Retorno para o loop

No entanto, ao utilizar o Interrupt, há uma série de problemas:

  1. O Interrupt não aceita funções temporais, como delay e millis, e eu precisava marcar o tempo para realização dos pulsos para execução dos passos. (para a movimentação da placa realizado pelo motor)
  2. Quando eu uso interrupt para ser acionado quando há uma mudança no sinal (HIGH para LOW), ou seja, quando o sensor de fim de curso é acionado, haverá um problema durante a execução do 4º passo, visto que o sensor de fim de curso será acionado novamente (estado LOW) e a função Interrupt será chamada novamente, sem finalizar o passo a passo que determinei.

Tentei também pensar em utilizar o conceito de State Machine, que é a montagem da programação com base em estados. No entanto, quando eu faço esse conceito, não consigo pensar em uma maneira de chamar essa função dentro do loop. Seria possível eu simplesmente declará-la dentro do loop, porém quero que ela seja chamada apenas quando algum dos sensores de fim de curso for acionado e não toda vez que passar pelo loop. Uma forma seria utilizar o Interrupt, porém há os problemas que citei anteriormente.

A questão é a seguinte: durante a execução da rotina do loop, o sensor de fim de curso poderia ser acionado ocasionalmente (por falha nos passos do motor ou pelos sensores de luminosidade indicarem uma posição além da amplitude estabelecida). Quando isso acontecer, como eu faria para fazer evitar a movimentação para além do sensor de fim de curso e, ao mesmo tempo, utilizar o fim de curso para calibrar o potenciometro?

O que eu devo pensar neste caso? Qual a melhor ideia a se tomar? Como posso resolver esse problema? Venho tentando pensar há alguns dias, mas sem sucesso!

Os códigos feitos estão em anexo.

state_machine.ino (3.81 KB)

SWITCHS_IMPLEMENTADOS_-_CALIBRACAO.ino (33.2 KB)