ARIDIO 201903121559
   TESTE_SEMAFORO


#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
  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();
   
    //Se o caracter for L então é o início da mensagem
    if (commandChar == 'L') {
      commandPointer = 0;     
    } else commandPointer++;

    //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) {
    //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

ARDUINO COM DISPLAY LCD 16X2 COM BACKLIGHT VOLTIMETRO

CONTROLE REMOTO 433MHz