Oi, estou fazendo um projeto: Sonar 360 graus, estou usando 2 sensores ultrassônicos para medir a distancia, um servo motor de rotacao continua para movimentar os dois sensores e o Arduino para controle. Basicamente os dados que os sensores detectarem vao ser enviados para outro software chamado Processing, onde com os dados sera feito o grafico em forma de radar dando o angulo e a distancia dependendo da situacao. Entao, eu acabei meu codigo do Processing, mais agora estou com um problema no código arduino, a funcao que envia os dados dos sensores ao Processing esta no meu void loop, mais eu preciso que ao mesmo tempo que os sensores fazem essas leituras o servo motor gire permanentemente para que os sensores tenham movimento, por isso me veio essa ideia de colocar um loop dentro do void loop, como eu posso incluir uma funcao para que meu servo gire permanentemente?

Nota: Por ser um servo de rotacao continua o valor enviado pelo sinal só vai mudar a velocidade e sentido do motor, por exemplo ´´myServo.write(180)´´, ele vai girar em sentido horário à velocidade máxima.

Edit1: 

Eu pensei em refazer o codigo pois o fato do meu motor ser de rotacao continua esta me atrapalhando. Se fosse um servo normal 180º tipo o SG90,eu poderia colocar isto dentro do loop e ter um melhor controle do angulo:

for(int i=0;i<=180;i++)delay(30);
distance = calculateDistance();// Calcula distancia

Serial.print(i); // Envia o valor do i à porta serial,
//ou seja o grau em que o servo está
Serial.print(","); // virgula e o ponto é o que separa Angulo
//e a Distancia para que meu Programa do
//radar possa identificar esses 2 valores
Serial.print(distance); // Envia o valor da distancia
//calculada pelos sensores

 Entao cada vez que for enviado o valor do i ( angulo do servo) e distancia para meu programa do radar. O problema é que os servos normais só funcionam em 180º , e meu programa foi feito para 360º, eu descartei a ideia do servo de rotacao continua porque o sinal que eu envio só altera a velocidade, portanto perco a precisao que um servo 180º poderia me dar. Entao, eu pensei em motores de passo, eu nao trabalhei muito com esse tipo de motores nao tenho tanta experiencia como com os servos. Eu queria saber se tem algum jeito de controlar o angulo do motor de passo como o exemplo do servo 180º que dei mais acima.

,

 

Exibições: 319

Anexos

As respostas para este tópico estão encerradas.

Respostas a este tópico

Boa noite FSL,

Recomendações:
1. Remova seu sketch da área de texto do seu tópico;
2. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
3. Clique em : " Deseja carregar arquivos? " e depois em " Escolher arquivo" e anexe o arquivo
    com o seu sketch.

RV

Sou novo desculpa, ja arrumei

Bom dia, 

Lembre-se que o sensor ultrasônico precisa de tempo para identificar a distância. 

Portanto a velocidade do seu motor precisa ser baixa. E enquanto o sensor ultrasonico esta medindo a distância, recomendo que pare o motor. 

Supondo distâncias  entre 30 e 300 cm . 

Velocidade do som =  340m/s

O pulso de ultrasom precisa ir em direção ao obstáculo, e voltar para o sensor. Portanto a distância é o dobro. 

O tempo gasto pelo pulso de som para ir e voltar :

   V = d / t 

  para d = 300 cm ( 2 x 3 m)   ===>  t = d / V = 6 / 340 = 17,64 milisegundos

  para d = 30 cm ( 2 x 0,3) ===>  t = d / V = 0,6 / 340  = 1,764 milisegundos

Considere um pouco mais, para o tempo de processamento do Arduino. 

O manual do sensor HC-SR04 sugere um intervalo de 60 milisegundos entre o início das medições.

https://www.mouser.com/ds/2/813/HCSR04-1022824.pdf

Apliquei sua lógica e a precisao das medicoes dos sensores mehoraram, agora o problema é substituir o servo por um motor de passo, pois o meu servo de rotacao continua esta atrapalhando na leitura do angulo dentro do meu gráfico do radar, por causa que o sinal so muda a velocidade . Agora tenho a duvida se tem como controlar o angulo de um motor de passo como em um servo 180º?

Bom dia FSL,


pelo que entendi, você quer que o servo fique recebendo continuamente
comando para girar, mas está com dificuldade para fazer isto.
Certo?


A frequência de refresh do servo é de 50 Hz ( 20 milissegundos)
e para um giro de 180°, o tempo é cerca de 2 milissegundos.


Então a cada 20 milissegundos, você terá que enviar um servo,write(180);
para seu servo.


Como o controle do servo não roda "sozinho" tal como uma saída PWM,
você terá que a cada 20ms parar seu processamento e comandar o
seu servo por 2 milissegundos.


Isto causará um problema no restante do seu processamento.


Talvez a possibilidade melhor seja o uso da biblioteca threads.h.
Ela cria processamentos virtuais no Arduíno.


Estude esta biblioteca e veja se serve para seu projeto.


RV

Eu tentei, foi uma boa ideia a de usar threads, primeira vez que escuto deles, eu tentei aplicar no meu codigo mais infelizmente ele interrompe o resto do codigo, ou seja ele nao consigo fazer as leituras dos sensores ao mesmo tempo que ele gira.

Procure refinar a biblioteca, use a função millis, organizando direitinho vc vai resolver seu problema com esta função.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço