ARIDIO 201810181839

    BARCO2018.1010


#include <Servo.h>

Servo leme;

//Configuração de pinos
#define lemePin 5
#define forwardPin 11
#define reversePin 6

//Variáveis para receber os comandos do bluetooth
char commandChar;
char command[5];
int commandPointer = 0;

//Valor atual de comando do leme e motor, de 00 a 99
int lemeValue;
int motorValue;

void setup() {
  //Serial é o bluetooth, nos pinos 0 e 1.
  Serial.begin(9600);

  //Configura pinos como OUTPUT
  pinMode(lemePin, OUTPUT);
  pinMode(forwardPin, OUTPUT);
  pinMode(reversePin, OUTPUT);

  //Parar o motor na inicialização
  digitalWrite(forwardPin,0);
  digitalWrite(reversePin,0);

  //Iniciar servo (para o zero)
  leme.attach(lemePin);
}

//Converte CHAR para INT (menos "0")
int char2int(char input) {
  return input - '0';
}

//Move o motor
void motorCommand(int motorValue) {
  //Se o comando for 50, centro do joystick, parar o motor
  if (motorValue == 50) {
    digitalWrite(forwardPin,0);
    digitalWrite(reversePin,0);
  }

  //Maior que 50, motor para frente
  if (motorValue < 50) {
    digitalWrite(forwardPin,0);

    //motorValue = 0 -> PWM = 200
    //motorValue = 50 -> PWM = 0
    analogWrite(reversePin, (50-motorValue)*4);
  }

  //Menor que 50, motor para frente
  if (motorValue > 50) {
    digitalWrite(reversePin,0);

    //motorValue = 51 -> PWM = 0 (quase, dá 4)
    //motorValue = 99 -> PWM = 200 (quase)
    analogWrite(forwardPin, (motorValue-50)*4);
  }
}

//Envia comandos para o leme
void lemeCommand(int lemeValue) {

  //lemeValue = 0 -> ANGLE = 0
  //lemeValue = 99 -> ANGLE = 198

  //if (lemeValue < 25) lemeValue = 25;
  //if (lemeValue > 75) lemeValue = 75;
  leme.write(lemeValue*2);


}

//Loop!
void loop() {
  //Se há transmissão via bluetooth (na porta serial pinos 0 e 1)
  if (Serial.available()) {
    //ler o caracter enviado
    commandChar = Serial.read();

    //Remova o comentário abaixo para ter uma forma de debug...
    //Serial.println(commandChar);
 
    //Se o caracter for L então é o início da mensagem
    if (commandChar == 'L') {
      commandPointer = 0;   
    } else {
      commandPointer++;
    }

    if (commandPointer < 6) {
      //Armazena o comando em command (array)
      command[commandPointer] = commandChar; 
    }
  }

  //Se o ponteiro atinge 5 então o comando está completo (L00M00)
  //                                                      012345  <-

  if (commandPointer >= 5) {
    //Remova o comentário abaixo para ter uma forma de debug...
    Serial.println(command);
 
    //Converte CHAR para INT considenrando que o primeiro char vale 10x
    lemeValue = 10*char2int(command[1]) + char2int(command[2]);

    //Converte CHAR para INT considenrando que o primeiro char vale 10x
    motorValue = 10*char2int(command[4]) + char2int(command[5]);

    //Volta o ponteiro para zero
    commandPointer=0;

    //Envia os dois comandos com os valores capturados
    motorCommand(motorValue);
    lemeCommand(lemeValue);
  }

  //Talvez seja necessário um DELAY aqui.
}

Comentários

Postagens mais visitadas deste blog

GPS NEO 6M NO ARDUINO PAGINA ELETROGATE

ESQUEMA DE ARDUINO DIY BÁSICO

Endereços Barramento I2C