agrobot_base/Firmware/Direcional/direcional_base/direcional_base.ino

208 lines
5.4 KiB
C++

#include "C:\Zendion Inc\agrobot_base\Firmware\Modulos\SerialService.h"
#define D_Code Dir
int PinoReleGeral = 23;
bool Conectado = false;
int _TaxaAmostragem;
const int PPR = 12800; // Pulsos por revolução
bool M1_Ativado = false;
bool M2_Ativado = false;
bool M3_Ativado = false;
bool M4_Ativado = false;
class Motor {
public:
// Construtor
Motor(String desc, int canal, int _ena, int _dir, int _pul) {
_descricao = desc;
_canal = canal;
_pinoENA = _ena;
_pinoDIR = _dir;
_pinoPUL = _pul;
}
// Definições
String _descricao;
int _canal;
int _pinoENA;
int _pinoDIR;
int _pinoPUL;
bool Iniciado = false;
bool Testando = false;
// Consumo
double Angulo;
// Entrada de dados
double _Angulo_SP;
Sentido _Sentido = Parado;
bool _RampaAtivada = false;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
pinMode(_pinoENA, OUTPUT);
pinMode(_pinoDIR, OUTPUT);
pinMode(_pinoPUL, OUTPUT);
digitalWrite(_pinoENA, LOW);
digitalWrite(_pinoDIR, LOW);
digitalWrite(_pinoPUL, LOW);
ledcSetup(_canal, 1000, 10);
ledcAttachPin(_pinoPUL, _canal);
EnviarDadosSerial(_descricao + " Iniciado");
Iniciado = true;
EnviarDadosSerial(MontarProtocoloSensor(sCfg, _descricao, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
EnviarDadosSerial(_descricao + " nao esta inicializado");
return;
}
// Desanexar o canal PWM
ledcDetachPin(_pinoPUL);
// Redefinir as configurações para os valores iniciais
pinMode(_pinoENA, INPUT);
pinMode(_pinoDIR, INPUT);
pinMode(_pinoPUL, INPUT);
// Outras redefinições de variáveis de estado, se necessário
EnviarDadosSerial(_descricao + " Desligado");
Iniciado = false;
EnviarDadosSerial(MontarProtocoloSensor(sCfg, _descricao, Iniciado ? "1" : "0"));
}
void Testar() {
Testando = true;
Testando = false;
}
private:
};
Motor M1("ET", 0, 13, 12, 22);
Motor M2("EF", 1, 14, 33, 32);
Motor M3("DT", 2, 15, 02, 04);
Motor M4("DF", 3, 05, 18, 21);
void setup() {
Serial.begin(_baudRate);
pinMode(PinoReleGeral, OUTPUT);
digitalWrite(PinoReleGeral, LOW);
TaskHandle_t SerialTaskHandle = NULL;
xTaskCreatePinnedToCore(SerialTask, "SerialTask", 4000, NULL, 20, &SerialTaskHandle, 1);
}
void loop() {
float x = 1509 / 300;
}
void SerialTask(void *pvParameters) {
unsigned long previousMillisSerial = millis();
const int TempoLeitura = 100;
while (1)
{
if (Serial.available() > 3) {
String Protocolo = "";
F_Code _funcao = Nda;
while (Serial.available()) {
char Entrada = (char)Serial.read();
if (Entrada == EndLine) {
break;
}
Protocolo += Entrada;
if (Protocolo.length() == 3) {
if (_funcao == Nda) {
_funcao = (F_Code)((String)Protocolo[0] + (String)Protocolo[1] + (String)Protocolo[2]).toInt();
Protocolo = "";
}
}
}
if (_funcao == Chk) {
EnviarDadosSerial(MontarProtocoloVerificacao(D_Code));
}
else if (_funcao == Cfg) {
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
bool Conectar = (String)Protocolo[3] == "1";
if (ID == "MD") {
int _PinoReleGeral = ((String)Protocolo[5] + (String)Protocolo[6]).toInt();
int _PPR = ((String)Protocolo[8] + (String)Protocolo[9] + (String)Protocolo[10] + (String)Protocolo[11] + (String)Protocolo[12]).toInt();
//PPR = _PPR;
PinoReleGeral = _PinoReleGeral;
pinMode(PinoReleGeral, OUTPUT);
digitalWrite(PinoReleGeral, Conectado);
vTaskDelay(pdMS_TO_TICKS(100));
Conectado = Conectar;
EnviarDadosSerial(MontarProtocoloSensor(sCFG, "MD", Conectado ? "1" : "0"));
}
else {
_TaxaAmostragem = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7] + (String)Protocolo[8] + (String)Protocolo[9]).toInt();
bool motor_ativado = (String)Protocolo[11] == "1";
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
if (motor_ativado) {
if (Conectar) {
_motor->Inicializar();
}
else {
_motor->Desligar();
}
vTaskDelay(pdMS_TO_TICKS(500));
}
}
}
else if (_funcao == Cmd) {
//canal;sentido;angulo
//0;0;000.00
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
_motor->_Sentido = (Sentido)((String)Protocolo[3]).toInt();
_motor->_Angulo_SP = ((String)Protocolo[5] + (String)Protocolo[6] + (String)Protocolo[7] + (String)Protocolo[8] + (String)Protocolo[9] + (String)Protocolo[10]).toInt();
_motor->_RampaAtivada = true;
}
else if (_funcao == Tst) {
String ID = ((String)Protocolo[0] + (String)Protocolo[1]);
Motor* _motor = ID == "ET" ? &M1 : ID == "EF" ? &M2 : ID == "DT" ? &M3 : &M4;
bool EmTeste = _motor->Testando;
if (!EmTeste) {
_motor->Testar();
}
}
}
vTaskDelay(pdMS_TO_TICKS(TempoLeitura));
}
}