From 15c0bb29cd98a464d0c2f4c1f23bb4189ee80dad Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Tue, 3 Mar 2026 14:31:59 -0300 Subject: [PATCH] Referenciamento com uso do sensor AS5600 --- .../Models/Modules/DirecionalModel.cs | 68 ++++++++++++++++--- 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs b/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs index 98c6ae974..d8f5fc3eb 100644 --- a/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs +++ b/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs @@ -353,12 +353,62 @@ namespace AgroBase.Models.Modules public async Task ReferenciaMotor() { + if (Referenciando || !Inicializado) return; + Referenciando = true; await Task.Delay(1000); Referenciado = false; + bool sensorAngRealConectado = (SensorAnguloReal?.Inicializado ?? false); + + if (sensorAngRealConectado) + { + Referenciado = await ReferenciaMotorAbsoluto(); + } + else + { + Referenciado = await ReferenciaMotorRelativo(); + } + + if (Referenciado) + { + await SetZero(); + Console.WriteLine($"[DIR {Mod_ID}] - Referenciamento Concluído!"); + } + else + { + Console.WriteLine($"[DIR {Mod_ID}] - Referenciamento Falhou!"); + } + + Referenciando = false; + + UltimoReferenciamento = DateTime.Now; + } + + public async Task ReferenciaMotorAbsoluto() + { + double angControle = Math.Abs(AnguloReal); + + if (angControle <= 0.8) + { + Console.WriteLine($"[DIR {Mod_ID}] - RefAbs: AnguloReal já dentro da tolerância ({AnguloReal:F2}°)."); + return true; + } + + int velocidade = 10; + Sentido _sentido = AnguloReal > 0 ? Sentido.Antihorario : Sentido.Horario; + MKS057DCanService.Movimento(_EnderecoCAN_Tx, _EnderecoCAN_Rx, angControle, velocidade, _sentido); + + bool AtingiuSP() => AtingiuAnguloSP; + await FuncoesGlobais.AguardarCondicaoAsync(AtingiuSP, 5000, 200); + + return AtingiuSP(); + } + + public async Task ReferenciaMotorRelativo() + { await SetZero(); bool Sucesso = false; @@ -409,21 +459,18 @@ namespace AgroBase.Models.Modules anguloAnterior = AnguloLeitura; Sucesso = AnguloEntrada != 9999 && AnguloSaida != 9999 && (FuncoesMatematicas.ValorEstaEntre(Leitura.AnguloEstimado(), _anguloSP, 0.5)); - if (Sucesso) - { - await SetZero(); - Console.WriteLine($"[DIR {Mod_ID}] - Referenciamento Concluído!"); - Referenciado = true; - } DateTime Inicio = DateTime.Now; bool NovoDado() => MKS057DCanService.DadosLeitura.Any(x => x.EnderecoRx == _EnderecoCAN_Rx && x.UltimoComandoRecebido > Inicio); await FuncoesGlobais.AguardarCondicaoAsync(NovoDado, 500, 100); } - Referenciando = false; + if (!Sucesso) + { + Console.WriteLine($"[DIR {Mod_ID}] - ReferenciaMotorRelativo falhou (timeout ou não inicializado). Entrada={AnguloEntrada}, Saida={AnguloSaida}"); + } - UltimoReferenciamento = DateTime.Now; + return Sucesso; } private int DefineVelocidadeReferenciamento() @@ -477,6 +524,9 @@ namespace AgroBase.Models.Modules } + + + public void RequisitarDadosSensoresExternos() { @@ -490,7 +540,7 @@ namespace AgroBase.Models.Modules { if (SensorAnguloReal != null) { - double angulo = SensorAnguloReal.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraAngulo)?.atual?.valor ?? double.NaN; + double angulo = SensorAnguloReal.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraAngulo)?.atual?.valor ?? double.NaN; if (!double.IsNaN(angulo)) { double bruto = angulo + OffsetAnguloReal;