2023-11-30 00:41:22 +00:00
// Dispositivo: Movimentação
2024-01-23 17:10:34 +00:00
// Versão Firmware: 14
// Ultima atualização: 16/01/2024
2023-11-30 00:41:22 +00:00
2024-01-18 19:22:28 +00:00
# include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
# include "C:\ZendionInc\agrobot_base\Firmware\Modulos\utils.h"
2023-11-30 00:41:22 +00:00
# include <PID_v1.h>
2023-10-09 16:06:23 +00:00
# define D_Code Mov
2023-11-30 00:41:22 +00:00
# define _pinoLED RGB_BUILTIN
2023-12-06 13:04:54 +00:00
int _pinoReleGeral = - 1 ;
2023-11-30 00:41:22 +00:00
2023-10-09 16:06:23 +00:00
long _baudRate = 115200 ;
bool Conectado = false ;
2023-11-30 00:41:22 +00:00
int _TaxaAmostragem = 500 ;
const int PPR = 22 ; // Pulsos por revolução
2023-10-09 16:06:23 +00:00
int RampaMin = 0 ;
2023-11-30 00:41:22 +00:00
int ZeroRampa = 0 ;
2023-10-09 16:06:23 +00:00
int RampaMax = 1023 ;
class Motor {
public :
// Construtor
2024-01-23 17:10:34 +00:00
Motor ( String desc ) {
2023-10-09 16:06:23 +00:00
_ID = desc ;
}
// Definições
String _ID ;
int _canal ;
int _pinoPWM ;
int _pinoDIR ;
int _pinoBRK ;
int _pinoSTP ;
2023-11-30 00:41:22 +00:00
int _pinoHLA ;
int _pinoHLB ;
int _pinoHLC ;
double _Kp ;
double _Ki ;
double _Kd ;
PID * _PID = nullptr ;
2023-10-09 16:06:23 +00:00
bool Iniciado = false ;
bool Testando = false ;
2023-11-30 00:41:22 +00:00
bool Revertendo = false ;
bool SentidoContrario = false ;
StatusMotor Aceleracao = Estavel ;
StatusMotor AceleracaoA = Estavel ;
2023-10-09 16:06:23 +00:00
// Consumo
2023-11-30 00:41:22 +00:00
const int leituras = 5 ;
volatile float RPM_arr [ 5 ] ;
volatile bool Hall_arr [ 5 ] [ 3 ] ;
double RPM ;
double PotenciaAtual ;
volatile int ultimaLeituraHallA = 0 ;
2024-01-23 17:10:34 +00:00
volatile int ultimaLeituraHallB = 0 ;
volatile int ultimaLeituraHallC = 0 ;
2023-11-30 00:41:22 +00:00
volatile unsigned int tempoAnterior = 0 ;
volatile float periodo = 0 ;
2023-10-09 16:06:23 +00:00
// Entrada de dados
2023-11-30 00:41:22 +00:00
bool _MalhaFechada ;
int _PotMap ;
2023-10-09 16:06:23 +00:00
double _RPM_SP ;
2023-11-30 00:41:22 +00:00
Sentido _SentidoSP = Parado ;
Sentido _SentidoM = Parado ;
2023-10-09 16:06:23 +00:00
Sentido _Sentido = Parado ;
2023-11-30 00:41:22 +00:00
int _US_Addr ;
bool _Freio = false ;
2023-10-09 16:06:23 +00:00
int _Margem = 2 ;
void Inicializar ( ) {
if ( Iniciado ) {
EnviarDadosSerial ( _ID + " ja inicializado " ) ;
EnviarDadosSerial ( MontarProtocoloSensor ( sCFG , _ID , Iniciado ? " 1 " : " 0 " ) ) ;
return ;
}
if ( _pinoPWM > - 1 ) {
ledcSetup ( _canal , 1000 , 10 ) ;
ledcAttachPin ( _pinoPWM , _canal ) ;
2023-11-30 00:41:22 +00:00
PotenciaAtual = ZeroRampa ;
_PotMap = PotenciaAtual ;
_RPM_SP = 0 ;
ledcWrite ( _canal , _PotMap ) ;
2023-10-09 16:06:23 +00:00
}
if ( _pinoDIR > - 1 ) {
pinMode ( _pinoDIR , OUTPUT ) ;
2023-11-30 00:41:22 +00:00
digitalWrite ( _pinoDIR , LOW ) ;
2024-01-23 17:10:34 +00:00
_SentidoM = Parado ;
2023-10-09 16:06:23 +00:00
}
if ( _pinoBRK > - 1 ) {
pinMode ( _pinoBRK , OUTPUT ) ;
digitalWrite ( _pinoBRK , LOW ) ;
}
if ( _pinoSTP > - 1 ) {
pinMode ( _pinoSTP , OUTPUT ) ;
2023-11-30 00:41:22 +00:00
digitalWrite ( _pinoSTP , HIGH ) ;
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
if ( _pinoHLA > - 1 ) {
pinMode ( _pinoHLA , INPUT ) ;
ultimaLeituraHallA = digitalRead ( _pinoHLA ) ;
RPM = 0 ;
periodo = 0 ;
tempoAnterior = 0 ;
xTaskCreatePinnedToCore ( & Motor : : RPMTaskWrapper , " RPMTask " , 15000 , this , 25 - _canal , & RPMTaskHandle , tskNO_AFFINITY ) ;
ReiniciarAceleracaoArr ( ) ;
ReiniciarHallArr ( ) ;
_PID = new PID ( & RPM , & PotenciaAtual , & _RPM_SP , _Kp , _Ki , _Kd , DIRECT ) ;
_PID - > SetOutputLimits ( RampaMin , RampaMax ) ;
_PID - > SetMode ( AUTOMATIC ) ;
}
if ( _pinoHLB > - 1 ) {
pinMode ( _pinoHLB , INPUT ) ;
2024-01-23 17:10:34 +00:00
ultimaLeituraHallB = digitalRead ( _pinoHLB ) ;
2023-11-30 00:41:22 +00:00
}
if ( _pinoHLC > - 1 ) {
pinMode ( _pinoHLC , INPUT ) ;
2024-01-23 17:10:34 +00:00
ultimaLeituraHallC = digitalRead ( _pinoHLC ) ;
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
xTaskCreatePinnedToCore ( & Motor : : RampaTaskWrapper , " RampaTask " , 5000 , this , 21 - _canal + 4 , & RampaTaskHandle , tskNO_AFFINITY ) ;
2023-10-09 16:06:23 +00:00
EnviarDadosSerial ( _ID + " Iniciado " ) ;
Iniciado = true ;
EnviarDadosSerial ( MontarProtocoloSensor ( sCFG , _ID , Iniciado ? " 1 " : " 0 " ) ) ;
}
void Desligar ( ) {
if ( ! Iniciado ) {
EnviarDadosSerial ( _ID + " nao esta inicializado " ) ;
2023-11-30 00:41:22 +00:00
EnviarDadosSerial ( MontarProtocoloSensor ( sCFG , _ID , Iniciado ? " 1 " : " 0 " ) ) ;
2023-10-09 16:06:23 +00:00
return ;
}
// Parar a execução das tarefas
vTaskDelete ( RampaTaskHandle ) ;
2023-11-30 00:41:22 +00:00
if ( _pinoHLA > - 1 ) {
vTaskDelete ( RPMTaskHandle ) ;
}
2023-10-09 16:06:23 +00:00
// Desanexar o canal PWM
2023-11-30 00:41:22 +00:00
if ( _pinoPWM > - 1 ) {
ledcDetachPin ( _pinoPWM ) ;
}
2023-10-09 16:06:23 +00:00
// Redefinir as configurações para os valores iniciais
pinMode ( _pinoPWM , INPUT ) ;
pinMode ( _pinoDIR , INPUT ) ;
pinMode ( _pinoBRK , INPUT ) ;
pinMode ( _pinoSTP , INPUT ) ;
2023-11-30 00:41:22 +00:00
pinMode ( _pinoHLA , INPUT ) ;
pinMode ( _pinoHLB , INPUT ) ;
pinMode ( _pinoHLC , INPUT ) ;
2023-10-09 16:06:23 +00:00
// Outras redefinições de variáveis de estado, se necessário
2023-11-30 00:41:22 +00:00
delete _PID ;
2023-10-09 16:06:23 +00:00
EnviarDadosSerial ( _ID + " Desligado " ) ;
Iniciado = false ;
EnviarDadosSerial ( MontarProtocoloSensor ( sCFG , _ID , Iniciado ? " 1 " : " 0 " ) ) ;
}
2023-11-30 00:41:22 +00:00
void ReiniciarAceleracaoArr ( ) {
for ( int i = 0 ; i < leituras ; i + + ) {
RPM_arr [ i ] = - 1.0 ;
}
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
void ReiniciarHallArr ( ) {
for ( int i = 0 ; i < leituras ; i + + ) {
Hall_arr [ i ] [ 0 ] = false ;
Hall_arr [ i ] [ 1 ] = false ;
Hall_arr [ i ] [ 2 ] = false ;
}
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
void ReverterSentidoGiro ( ) {
_SentidoM = _SentidoM = = Horario ? Antihorario : Horario ;
2023-10-09 16:06:23 +00:00
}
private :
TaskHandle_t RPMTaskHandle = NULL ;
static void RPMTaskWrapper ( void * pvParameters ) {
Motor * motor = static_cast < Motor * > ( pvParameters ) ;
motor - > RPMTask ( ) ;
}
void RPMTask ( ) {
2023-11-30 00:41:22 +00:00
const int RpmMax = 650 ; // RPM Máximo aferir
const float RelacaoPPR = ( 60 / PPR ) * 1000 ; // Multiplicador do cálculo de RPM (período em ms)
const float MenorPeriodo = RelacaoPPR / RpmMax ; // Tempo mínimo de leitura
2023-10-09 16:06:23 +00:00
unsigned long firstMilis = millis ( ) ;
int pulsos = 0 ;
while ( 1 )
{
if ( ! Conectado ) {
2023-11-30 00:41:22 +00:00
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
vTaskDelay ( 1000 ) ;
2023-10-09 16:06:23 +00:00
continue ;
}
2023-11-30 00:41:22 +00:00
// Medir RPM apenas quando ocorrer um pulso no sensor HALL
2024-01-23 17:10:34 +00:00
bool LeituraHa = digitalRead ( _pinoHLA ) = = 1 ;
2023-11-30 00:41:22 +00:00
if ( LeituraHa ! = ultimaLeituraHallA ) {
ultimaLeituraHallA = LeituraHa ;
2023-10-09 16:06:23 +00:00
pulsos + + ;
2023-11-30 00:41:22 +00:00
2023-10-09 16:06:23 +00:00
// Calcular o período em microssegundos
unsigned long tempoAtual = micros ( ) ;
2023-11-30 00:41:22 +00:00
unsigned long periodoUs = tempoAtual - tempoAnterior ;
periodo = periodoUs / 1000.0 ; // Converte de us para ms (2300 us para 2,3 ms)
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
// Salva o valor do RPM anterior
2023-10-09 16:06:23 +00:00
double RPM_A = RPM ;
2023-11-30 00:41:22 +00:00
// Se o período entre pulsos for menor que o tempo mínimo entre pulsos em ms, significa que o sensor está em uma posição em que existe oscilação de leitura,
// pois o RPM estaria acima do máximo, logo, assumir o valor de RPM aferido anteriormente
if ( periodo < MenorPeriodo ) {
2023-10-09 16:06:23 +00:00
RPM = RPM_A ;
}
2023-11-30 00:41:22 +00:00
// Calcular RPM se houve variação de tempo entre o pulso atual e o pulso anterior
2023-10-09 16:06:23 +00:00
else if ( periodo ! = 0 ) {
2023-11-30 00:41:22 +00:00
// RPM = 60 / (Pulsos por Revolução * Período em segundos)
// A fórmula foi adaptada para otimizar processamento
RPM = RelacaoPPR / periodo ;
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
// Se não houve alteração no período, então o motor não se moveu
else {
RPM = 0 ;
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
CalcularSentidoGiro ( RPM ) ;
2023-10-09 16:06:23 +00:00
// Reiniciar variáveis
tempoAnterior = tempoAtual ;
}
2023-11-30 00:41:22 +00:00
CorrigirPotenciaMotor ( ) ;
2023-10-09 16:06:23 +00:00
long intMillis = ( millis ( ) - firstMilis ) ;
2023-11-30 00:41:22 +00:00
// A cada _TaxaAmostragem, enviar os dados para o software
2023-10-09 16:06:23 +00:00
if ( intMillis > = _TaxaAmostragem ) {
if ( pulsos = = 0 ) {
RPM = 0 ;
periodo = 0 ;
2023-11-30 00:41:22 +00:00
CalcularSentidoGiro ( RPM ) ;
2023-10-09 16:06:23 +00:00
}
pulsos = 0 ;
2023-11-30 00:41:22 +00:00
double PotAtual = fmap ( PotenciaAtual , RampaMin , RampaMax , 0.0 , 100.0 ) ;
EnviarDadosSerial ( MontarProtocoloSensor ( sRPM , _ID , MontarDadosProtocoloRPM ( RPM , PotAtual , Aceleracao , _Sentido , Revertendo ) ) ) ;
2023-10-09 16:06:23 +00:00
firstMilis = millis ( ) ;
}
2023-11-30 00:41:22 +00:00
// Aguarda metade do menor período possível entre leituras
2023-10-09 16:06:23 +00:00
vTaskDelay ( 1 ) ;
}
}
2023-11-30 00:41:22 +00:00
void CalcularSentidoGiro ( float _RPM ) {
if ( _pinoHLA = = - 1 | | _pinoHLB = = - 1 | | _pinoHLC = = - 1 ) {
CalculaAceleracao ( _RPM ) ;
return ;
}
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
bool LeituraHa = ultimaLeituraHallA = = 1 ;
bool LeituraHb = digitalRead ( _pinoHLB ) = = 1 ;
bool LeituraHc = digitalRead ( _pinoHLC ) = = 1 ;
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
for ( int i = 1 ; i < leituras ; i + + ) {
Hall_arr [ i - 1 ] [ 0 ] = Hall_arr [ i ] [ 0 ] ;
Hall_arr [ i - 1 ] [ 1 ] = Hall_arr [ i ] [ 1 ] ;
Hall_arr [ i - 1 ] [ 2 ] = Hall_arr [ i ] [ 2 ] ;
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
Hall_arr [ leituras - 1 ] [ 0 ] = LeituraHa ;
Hall_arr [ leituras - 1 ] [ 1 ] = LeituraHb ;
Hall_arr [ leituras - 1 ] [ 2 ] = LeituraHc ;
// Leituras dos sensores Hall nas leituras anteriores
bool LeituraAnteriorHa = Hall_arr [ leituras - 2 ] [ 0 ] ;
bool LeituraAnteriorHb = Hall_arr [ leituras - 2 ] [ 1 ] ;
bool LeituraAnteriorHc = Hall_arr [ leituras - 2 ] [ 2 ] ;
// Comparação das leituras atuais com as leituras anteriores
if ( LeituraHa = = LeituraAnteriorHc & & LeituraHc = = LeituraAnteriorHa ) {
2024-01-23 17:10:34 +00:00
_Sentido = Antihorario ;
2023-11-30 00:41:22 +00:00
}
else if ( LeituraHa = = LeituraAnteriorHb & & LeituraHb = = LeituraAnteriorHa ) {
2024-01-23 17:10:34 +00:00
_Sentido = Horario ;
2023-11-30 00:41:22 +00:00
}
else {
// Outros casos (não determinados)
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
CalculaAceleracao ( _RPM ) ;
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
void CalculaAceleracao ( float _RPM ) {
float RPM_total = _RPM ;
int Desconsiderar = 0 ;
// Salvar as ultimas leituras
for ( int i = 1 ; i < leituras ; i + + ) {
RPM_arr [ i - 1 ] = RPM_arr [ i ] ;
RPM_total + = RPM_arr [ i - 1 ] < 0 ? 0 : RPM_arr [ i - 1 ] ;
Desconsiderar + = RPM_arr [ i - 1 ] < 0 ? 1 : 0 ;
}
RPM_arr [ leituras - 1 ] = _RPM ;
float RPM_medio = RPM_total / ( leituras - Desconsiderar ) ;
AceleracaoA = Aceleracao ;
if ( _SentidoSP = = Parado & & _RPM = = 0 ) {
Aceleracao = Estavel ;
} else if ( RPM_arr [ leituras - 3 ] < ( RPM_arr [ leituras - 2 ] - _Margem ) & & RPM_arr [ leituras - 2 ] < ( _RPM - _Margem ) ) {
Aceleracao = Acelerando ;
} else if ( RPM_arr [ leituras - 3 ] > ( RPM_arr [ leituras - 2 ] + _Margem ) & & RPM_arr [ leituras - 2 ] > ( _RPM + _Margem ) ) {
Aceleracao = Desacelerando ;
} else {
Aceleracao = Estavel ;
2023-10-09 16:06:23 +00:00
}
}
2023-11-30 00:41:22 +00:00
void CorrigirPotenciaMotor ( ) {
if ( _MalhaFechada & & ! Revertendo & & _SentidoSP ! = Parado ) {
if ( _pinoHLA > - 1 & & _pinoHLB > - 1 & & _pinoHLC > - 1 ) {
SentidoContrario = _Sentido ! = _SentidoSP ;
}
float _rpmA = RPM ;
if ( SentidoContrario ) {
RPM = RPM * - 1 ;
}
/*else if (Aceleracao == Desacelerando && AceleracaoA == Estavel) {
RPM = 0 ;
} */
_PID - > Compute ( ) ;
//RPM = _rpmA;
}
}
2023-10-09 16:06:23 +00:00
TaskHandle_t RampaTaskHandle = NULL ;
static void RampaTaskWrapper ( void * pvParameters ) {
Motor * motor = static_cast < Motor * > ( pvParameters ) ;
motor - > RampaTask ( ) ;
}
void RampaTask ( ) {
2024-01-23 17:10:34 +00:00
unsigned long firstMilis = millis ( ) ;
2023-10-09 16:06:23 +00:00
while ( 1 )
{
if ( ! Conectado ) {
2023-11-30 00:41:22 +00:00
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
vTaskDelay ( 1000 ) ;
2023-10-09 16:06:23 +00:00
continue ;
}
2023-11-30 00:41:22 +00:00
Atualizar ( ) ;
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
vTaskDelay ( 1 ) ;
}
}
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
void Atualizar ( ) {
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
bool Travado = _PotMap > ZeroRampa & & RPM_arr [ leituras - 1 ] = = 0 & & RPM_arr [ leituras - 2 ] > 0 & & RPM_arr [ leituras - 3 ] > 0 & & _Sentido ! = Parado ;
if ( _pinoPWM > - 1 & & Travado ) {
_PotMap = ZeroRampa ;
ledcWrite ( _canal , _PotMap ) ;
vTaskDelay ( 400 ) ;
_PotMap = PotenciaAtual ;
}
if ( _pinoDIR > - 1 ) {
Revertendo = _SentidoSP ! = Parado & & _SentidoSP ! = _SentidoM ;
if ( Revertendo ) {
2024-01-23 17:10:34 +00:00
ledcWrite ( _canal , ZeroRampa ) ;
vTaskDelay ( 400 ) ;
2023-11-30 00:41:22 +00:00
_SentidoM = _SentidoSP ;
Revertendo = false ;
2023-10-09 16:06:23 +00:00
}
2024-01-23 17:10:34 +00:00
digitalWrite ( _pinoDIR , _SentidoSP = = Horario ) ;
2023-11-30 00:41:22 +00:00
}
if ( _pinoBRK > - 1 ) {
digitalWrite ( _pinoBRK , _Freio ) ;
}
if ( _pinoSTP > - 1 ) {
//digitalWrite(_pinoSTP, HIGH);
}
if ( _pinoPWM > - 1 ) {
if ( _SentidoSP = = Parado ) {
_PotMap = ZeroRampa ;
}
else {
_PotMap = PotenciaAtual ;
}
ledcWrite ( _canal , _PotMap ) ;
2023-10-09 16:06:23 +00:00
}
}
} ;
2024-01-23 17:10:34 +00:00
Motor M1 ( " ET " ) ;
Motor M2 ( " EF " ) ;
Motor M3 ( " DT " ) ;
Motor M4 ( " DF " ) ;
Motor * MotorPorID ( String ID ) {
Motor * _motor =
ID = = " ET " ? & M1 :
ID = = " EF " ? & M2 :
ID = = " DT " ? & M3 :
ID = = " DF " ? & M4 :
nullptr ;
return _motor ;
}
2023-10-09 16:06:23 +00:00
void setup ( ) {
Serial . begin ( _baudRate ) ;
2023-11-30 00:41:22 +00:00
delay ( 10 ) ;
2023-12-06 13:04:54 +00:00
if ( _pinoReleGeral > - 1 ) {
pinMode ( _pinoReleGeral , OUTPUT ) ;
digitalWrite ( _pinoReleGeral , LOW ) ;
}
2023-10-09 16:06:23 +00:00
}
void loop ( ) {
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 = " " ;
}
}
}
2023-11-30 00:41:22 +00:00
EnviarDadosSerial ( " OK " ) ;
2023-10-09 16:06:23 +00:00
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 " ) {
2023-11-30 00:41:22 +00:00
_TaxaAmostragem = ( ( String ) Protocolo [ 5 ] + ( String ) Protocolo [ 6 ] + ( String ) Protocolo [ 7 ] + ( String ) Protocolo [ 8 ] + ( String ) Protocolo [ 9 ] ) . toInt ( ) ;
int pinoReleGeral = ( ( String ) Protocolo [ 11 ] + ( String ) Protocolo [ 12 ] ) . toInt ( ) ;
int _RampaMin = ( ( String ) Protocolo [ 14 ] + ( String ) Protocolo [ 15 ] + ( String ) Protocolo [ 16 ] + ( String ) Protocolo [ 17 ] ) . toInt ( ) ;
int _RampaMax = ( ( String ) Protocolo [ 19 ] + ( String ) Protocolo [ 20 ] + ( String ) Protocolo [ 21 ] + ( String ) Protocolo [ 22 ] ) . toInt ( ) ;
int _PPR = ( ( String ) Protocolo [ 24 ] + ( String ) Protocolo [ 25 ] + ( String ) Protocolo [ 26 ] ) . toInt ( ) ;
2023-10-09 16:06:23 +00:00
RampaMin = _RampaMin ;
RampaMax = _RampaMax ;
2023-11-30 00:41:22 +00:00
//PPR = _PPR;
if ( pinoReleGeral > - 1 ) {
pinMode ( _pinoReleGeral , INPUT ) ;
_pinoReleGeral = pinoReleGeral ;
pinMode ( _pinoReleGeral , OUTPUT ) ;
digitalWrite ( _pinoReleGeral , Conectar ) ;
}
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
vTaskDelay ( pdMS_TO_TICKS ( 100 ) ) ;
2023-10-09 16:06:23 +00:00
Conectado = Conectar ;
EnviarDadosSerial ( MontarProtocoloSensor ( sCFG , " MD " , Conectado ? " 1 " : " 0 " ) ) ;
}
else {
int canal = ( ( String ) Protocolo [ 5 ] ) . toInt ( ) ;
bool _foc = ( String ) Protocolo [ 7 ] = = " 1 " ;
2023-11-30 00:41:22 +00:00
bool motor_ativado = ( String ) Protocolo [ 9 ] = = " 1 " ;
double _Kp = ( ( String ) Protocolo [ 11 ] + ( String ) Protocolo [ 12 ] + ( String ) Protocolo [ 13 ] + ( String ) Protocolo [ 14 ] + ( String ) Protocolo [ 15 ] ) . toDouble ( ) ;
double _Ki = ( ( String ) Protocolo [ 17 ] + ( String ) Protocolo [ 18 ] + ( String ) Protocolo [ 19 ] + ( String ) Protocolo [ 20 ] + ( String ) Protocolo [ 21 ] ) . toDouble ( ) ;
double _Kd = ( ( String ) Protocolo [ 23 ] + ( String ) Protocolo [ 24 ] + ( String ) Protocolo [ 25 ] + ( String ) Protocolo [ 26 ] + ( String ) Protocolo [ 27 ] ) . toDouble ( ) ;
int pwm = ( ( String ) Protocolo [ 29 ] + ( String ) Protocolo [ 30 ] ) . toInt ( ) ;
int dir = ( ( String ) Protocolo [ 32 ] + ( String ) Protocolo [ 33 ] ) . toInt ( ) ;
int brk = ( ( String ) Protocolo [ 35 ] + ( String ) Protocolo [ 36 ] ) . toInt ( ) ;
int stp = ( ( String ) Protocolo [ 38 ] + ( String ) Protocolo [ 39 ] ) . toInt ( ) ;
int hallA = ( ( String ) Protocolo [ 41 ] + ( String ) Protocolo [ 42 ] ) . toInt ( ) ;
int hallB = ( ( String ) Protocolo [ 44 ] + ( String ) Protocolo [ 45 ] ) . toInt ( ) ;
int hallC = ( ( String ) Protocolo [ 47 ] + ( String ) Protocolo [ 48 ] ) . toInt ( ) ;
2023-10-09 16:06:23 +00:00
2024-01-23 17:10:34 +00:00
Motor * _motor = MotorPorID ( ID ) ;
2023-10-09 16:06:23 +00:00
if ( motor_ativado ) {
if ( Conectar ) {
_motor - > _canal = canal ;
_motor - > _pinoPWM = pwm ;
_motor - > _pinoDIR = dir ;
_motor - > _pinoBRK = brk ;
_motor - > _pinoSTP = stp ;
2023-11-30 00:41:22 +00:00
_motor - > _pinoHLA = hallA ;
_motor - > _pinoHLB = hallB ;
_motor - > _pinoHLC = hallC ;
_motor - > _MalhaFechada = _foc ;
_motor - > _Kp = _Kp ;
_motor - > _Ki = _Ki ;
_motor - > _Kd = _Kd ;
2023-10-09 16:06:23 +00:00
_motor - > Inicializar ( ) ;
}
else {
_motor - > Desligar ( ) ;
}
2023-11-30 00:41:22 +00:00
vTaskDelay ( pdMS_TO_TICKS ( 500 ) ) ;
2023-10-09 16:06:23 +00:00
}
}
}
else if ( _funcao = = Cmd ) {
//canal;potencia;sentido;rampa;precisao;rpm
//0;000;0;000;000;000
String ID = ( ( String ) Protocolo [ 0 ] + ( String ) Protocolo [ 1 ] ) ;
2024-01-23 17:10:34 +00:00
Motor * _motor = MotorPorID ( ID ) ;
2023-10-09 16:06:23 +00:00
2023-11-30 00:41:22 +00:00
_motor - > _SentidoSP = ( Sentido ) ( ( String ) Protocolo [ 3 ] ) . toInt ( ) ;
_motor - > _RPM_SP = ( ( String ) Protocolo [ 5 ] + ( String ) Protocolo [ 6 ] + ( String ) Protocolo [ 7 ] ) . toInt ( ) ;
_motor - > _MalhaFechada = ( String ) Protocolo [ 9 ] = = " 1 " ;
_motor - > ReiniciarAceleracaoArr ( ) ;
bool reverter = ( ( String ) Protocolo [ 11 ] ) = = " 1 " ;
if ( reverter ) {
_motor - > ReverterSentidoGiro ( ) ;
}
2023-10-09 16:06:23 +00:00
}
else if ( _funcao = = Tst ) {
String ID = ( ( String ) Protocolo [ 0 ] + ( String ) Protocolo [ 1 ] ) ;
2023-11-30 00:41:22 +00:00
2024-01-23 17:10:34 +00:00
Motor * _motor = MotorPorID ( ID ) ;
2023-10-09 16:06:23 +00:00
bool EmTeste = _motor - > Testando ;
if ( ! EmTeste ) {
2023-11-30 00:41:22 +00:00
//_motor->Testar();
2023-10-09 16:06:23 +00:00
}
2023-11-30 00:41:22 +00:00
2023-10-09 16:06:23 +00:00
}
}
}