Olá a todos.

 Sei  que a idéia principal do Arduino é o aprendizado.  Estou “trabalhando”, quando há tempo neste projeto,  há um bom tempo, pois se trata de diversão e não tentar ganhar com isso, pelo menos no meu caso.

Já havia desenvolvido boa parte do projeto que é um PAN/TILT ,  a parte de movimentação dos servos  através de joystick estava tudo  testado e ok, mas infelizmente houve um problema na meu HD e meu backup  não estava atualizado.

Pedi tudo, ou quase tudo. Agora estou co problemas justamente nesta parte.

Estou tentando controlar um servo 360º , através do monitor serial “d” direita e “e” esquerda, o problema ocorre no “fim de curso”, que servi para o servo não dá 360º, digitando “d” o servo deve ir  para direita ate o ” fim de curso” e não aceitar mais o comando “d”, somente o “e”, voltando para esquerda, seguindo a mesma lógica.

Peço ajuda, o que tem de errado ? 


//
// Acionamento de PAN
//
// myservoH = Servo 360º
// Fim_Curso = reed switch acionamento por imâ (conforme imagem)
//
//
//

#include <Servo.h>
 
Servo myservoH; // Servo Horizontal

int posH = 0;    // variavel que guarda posição do servo H

//
// Vel.      passos
// 1  = 20  -  1
// 2  = 40  -  2
// 3  = 80  -  4
// 4  = 100 -  5
// 5  = 200 -  10
// 6  = 300 -  15
// 7  = 400 -  20
// 8  = 600 -  30
int passoH = 4;

char Direcao;
int PinoLed = 6;  // Led pino 6
int Fim_Curso = 2 ; // Fim de curso pino 7

// Array de char que receberá o comando
// via serial
char buffer[1];
//
/ Variavel que identifica quantos
// caracteres foram recebidos, pois só é
// possível receber um caracter por vez
int received;

void setup()
{
  myservoH.attach(8);  // attaches the servo on pin 9 to the servo object
  myservoH.write(90);  // para o servo 90
  //
  Serial.begin(9600); // inicializar porta serial
  pinMode(PinoLed, OUTPUT); // LED
  pinMode(Fim_Curso, INPUT); // Fim de Curso
  
  // Atribui o valor 0 para a variavel received
  received = 0;
  // Na posição 0 do array, atribui o valor '\0'
  // que identifica onde começa o array
  buffer[received] = '\0';
 }
 

//
void loop()
   {
    digitalWrite(PinoLed, LOW);
   // Verifica se existe alguma entrada de dados
   // disponivel na entrada serial
   if(Serial.available()){

     // Salva os caracteres no array a cada iteração
     buffer[received++] = Serial.read();

     // Verifica se não há mais entrada pela serial
     if(received >= (sizeof(buffer)-1)){

       // Zera novamente a variavel
       received = 0;
       }
       Direcao = char(buffer[0]);
      // Limpa o buffer da entrada serial
      Serial.flush();
     //
      switch (Direcao){
      case 'd':                           // direita
               for (int x = 1; x <= passoH; x++) { 
                   if (digitalRead(Fim_Curso) == LOW){              
                       myservoH.write(180);  // Direita 180
                       delay(20);       //  passo 20
                       myservoH.write(90);  // para o servo 90
                       posH++;
                       Serial.println(posH);  // TEMPORARIO
                     }   
                    else {   // encontrado fim move 1 passo esquerda
                       digitalWrite(PinoLed, HIGH);
                       myservoH.write(0); // Esquerda 0   
                       delay(50);          //  passo 20
                       myservoH.write(90);  // para o servo 90
                       posH--;
                       break;
                    } 
                }
              break;
     
      case 'e':                                       // esqueda
                for (int x = 1; x <= passoH; x++) { 
                  if (digitalRead(Fim_Curso) == LOW){ 
                     myservoH.write(0); // Esquerda 0   
                     delay(20);          //  passo 20
                     myservoH.write(90);  // para o servo 90
                     posH--;                    
                     Serial.println(posH);
                  }
                  else {  // encontrado fim move 1 passo direita
                     digitalWrite(PinoLed, HIGH);
                     myservoH.write(180);  // Direita 180
                     delay(50);       //  passo 20
                     myservoH.write(90);  // para o servo 90
                     posH++;  
                     break;              
                  } 
                 }
            break;
          
      }
      }    
   }

Agradeço a atenção.

Vou colocar o código e uma imagem.

FCaldeira

Exibições: 171

Anexos

Responder esta

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço