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.
}
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
Postar um comentário