ajustes na implementacao do encoder magnetico

This commit is contained in:
Diego Freitas 2024-05-10 21:57:08 -03:00
parent 8a68046098
commit 205c9508df
34 changed files with 78 additions and 34 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"Conectado":false,"QuantidadeBicos":4,"DensidadeHerbicida":1.05,"CapacidadeReservatorio":30.0,"AtuacaoNivelAlto":true,"BicosPulverizadores":[{"ID":"B01","Posicao":1,"Atuado":true,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":34.42987713140743},{"ID":"B02","Posicao":2,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":14.876485059544191},{"ID":"B03","Posicao":3,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":18.103588945512129},{"ID":"B04","Posicao":4,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":18.437319738098896},{"ID":"B05","Posicao":5,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B06","Posicao":6,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B07","Posicao":7,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B08","Posicao":8,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B09","Posicao":9,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B10","Posicao":10,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0}],"BombaPressurizadora":{"ID":"BOMBA","BombaAtuada":false,"Ligado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[14,35,36,37,5],"PressaoSP":85.0,"Pressao":82.01,"Potencia":0.0},"Sensores":[{"LogGrafico":[],"ID":"FLXLN","Prioridade":23,"Descricao":"Fluxo na linha principal","Componente":198,"Aferir":true,"DelayAmostragem":300,"Inicializado":false,"Testando":false,"Funcoes":[25],"Parametros":[],"UnidadeMedida":"mL/s","Leituras":[0.0,0.0],"ValorMinimo":0.0,"ValorMaximo":25222.0,"LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"MASRS","Prioridade":3,"Descricao":"Massa do reservatório de herbicida","Componente":532,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[22,23],"Parametros":[],"UnidadeMedida":"Kg","Leituras":[1117263.12],"ValorMinimo":-1.281631101976581E+32,"ValorMaximo":2.8836731440342142E+24,"LimiteMaximo":50.0,"LimiteMinimo":5.0},{"LogGrafico":[],"ID":"PRSLN","Prioridade":3,"Descricao":"Pressão na linha principal","Componente":333,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[24],"Parametros":[["Vmin","000.00"],["Vmax","004.50"],["Pmax","174.04"]],"UnidadeMedida":"psi","Leituras":[82.01],"ValorMinimo":0.0,"ValorMaximo":127.63,"LimiteMaximo":120.0,"LimiteMinimo":60.0}],"PercentualInicioPulverizacao":0.3,"ScriptDeteccaoErvas":"weed-detector-v7.py","_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"_MassaLeitura":1117263.12,"MassaReservatorio":15.236908365395459,"VolumeReservatorio":14.511341300376627,"PercentualReservatorio":48.371137667922085,"VolumeVazaoAferido":102.0,"_FluxoMlRef":102.0,"_FluxoPulsoRef":80.0,"_LeituraPulsos":0,"_LeituraPeriodo":0,"VazaoFluxoMLpS":0.0,"VolumeVazaoML":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"_LeituraPressao":2631.0,"PressaoLinha":82.01,"PressaoLinhaCalc":82.0030336996337}
{"Conectado":false,"QuantidadeBicos":4,"DensidadeHerbicida":1.05,"CapacidadeReservatorio":30.0,"AtuacaoNivelAlto":true,"BicosPulverizadores":[{"ID":"B01","Posicao":1,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":34.42987713140743},{"ID":"B02","Posicao":2,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":14.876485059544191},{"ID":"B03","Posicao":3,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":18.103588945512129},{"ID":"B04","Posicao":4,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":18.437319738098896},{"ID":"B05","Posicao":5,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B06","Posicao":6,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B07","Posicao":7,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B08","Posicao":8,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B09","Posicao":9,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B10","Posicao":10,"Atuado":false,"Comandar":false,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0}],"BombaPressurizadora":{"ID":"BOMBA","BombaAtuada":false,"Ligado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[14,35,36,37,5],"PressaoSP":85.0,"Pressao":82.01,"Potencia":0.0},"Sensores":[{"LogGrafico":[],"ID":"FLXLN","Prioridade":23,"Descricao":"Fluxo na linha principal","Componente":198,"Aferir":true,"DelayAmostragem":300,"Inicializado":false,"Testando":false,"Funcoes":[25],"Parametros":[],"UnidadeMedida":"mL/s","Leituras":[0.0,0.0],"ValorMinimo":0.0,"ValorMaximo":25222.0,"LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"MASRS","Prioridade":3,"Descricao":"Massa do reservatório de herbicida","Componente":532,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[22,23],"Parametros":[],"UnidadeMedida":"Kg","Leituras":[1117263.12],"ValorMinimo":-1.281631101976581E+32,"ValorMaximo":2.8836731440342142E+24,"LimiteMaximo":50.0,"LimiteMinimo":5.0},{"LogGrafico":[],"ID":"PRSLN","Prioridade":3,"Descricao":"Pressão na linha principal","Componente":333,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[24],"Parametros":[["Vmin","000.00"],["Vmax","004.50"],["Pmax","174.04"]],"UnidadeMedida":"psi","Leituras":[82.01],"ValorMinimo":0.0,"ValorMaximo":127.63,"LimiteMaximo":120.0,"LimiteMinimo":60.0}],"PercentualInicioPulverizacao":0.3,"ScriptDeteccaoErvas":"weed-detector-v7.py","_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"_MassaLeitura":1117263.12,"MassaReservatorio":15.236908365395459,"VolumeReservatorio":14.511341300376627,"PercentualReservatorio":48.371137667922085,"VolumeVazaoAferido":102.0,"_FluxoMlRef":102.0,"_FluxoPulsoRef":80.0,"_LeituraPulsos":0,"_LeituraPeriodo":0,"VazaoFluxoMLpS":0.0,"VolumeVazaoML":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"_LeituraPressao":2631.0,"PressaoLinha":82.01,"PressaoLinhaCalc":82.0030336996337}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -25,7 +25,7 @@
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_485de4fe4992e7b597d3f52d56de1299 {
#map_2a3d14da3dec6f21186e1667373ce43a {
position: relative;
width: 100.0%;
height: 100.0%;
@ -39,14 +39,14 @@
<body>
<div class="folium-map" id="map_485de4fe4992e7b597d3f52d56de1299" ></div>
<div class="folium-map" id="map_2a3d14da3dec6f21186e1667373ce43a" ></div>
</body>
<script>
var map_485de4fe4992e7b597d3f52d56de1299 = L.map(
"map_485de4fe4992e7b597d3f52d56de1299",
var map_2a3d14da3dec6f21186e1667373ce43a = L.map(
"map_2a3d14da3dec6f21186e1667373ce43a",
{
center: [0.0, 0.0],
crs: L.CRS.EPSG3857,
@ -59,6 +59,15 @@
var tile_layer_f6a6232487eccae056d94768bd7259ef = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
);
tile_layer_f6a6232487eccae056d94768bd7259ef.addTo(map_2a3d14da3dec6f21186e1667373ce43a);
</script>
<script>
@ -78,7 +87,7 @@
}
trajeto_json_add({"features": []});
trajeto_json.addTo(map_485de4fe4992e7b597d3f52d56de1299);
trajeto_json.addTo(map_2a3d14da3dec6f21186e1667373ce43a);
function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria);
@ -103,7 +112,7 @@
}
} else {
console.log("Feature com ID " + idGeometria + " n<EFBFBD>o encontrada.");
console.log("Feature com ID " + idGeometria + " não encontrada.");
}
}
@ -136,29 +145,29 @@
var marcadorDinamico = L.marker([0, 0], {
icon: customIcon
}).addTo(map_485de4fe4992e7b597d3f52d56de1299);
}).addTo(map_2a3d14da3dec6f21186e1667373ce43a);
// Conectar ao broker MQTT
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conex<EFBFBD>o segura
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
// Quando conectado, inscreva-se no t<EFBFBD>pico desejado
// Quando conectado, inscreva-se no tópico desejado
client.on('connect', function () {
console.log('Conectado ao broker MQTT');
// Inscrever-se no t<EFBFBD>pico
// Inscrever-se no tópico
client.subscribe('coordenadas_gps', function (err) {
if (!err) {
console.log("Inscri<EFBFBD><EFBFBD>o bem-sucedida no t<>pico");
console.log("Inscrição bem-sucedida no tópico");
} else {
console.error("Falha na inscri<EFBFBD><EFBFBD>o do t<>pico", err);
console.error("Falha na inscrição do tópico", err);
}
});
});
// Lidar com mensagens recebidas para o t<EFBFBD>pico inscrito
// Lidar com mensagens recebidas para o tópico inscrito
client.on('message', function (topic, message) {
// A mensagem <EFBFBD> um Buffer, converta para string ou objeto conforme necess<73>rio
//console.log(`Mensagem recebida no t<EFBFBD>pico '${topic}': ${message.toString()}`);
// A mensagem é um Buffer, converta para string ou objeto conforme necessário
//console.log(`Mensagem recebida no tópico '${topic}': ${message.toString()}`);
var dados = JSON.parse(message);
var novaLatitude = dados.latitude;
var novaLongitude = dados.longitude;
@ -175,7 +184,7 @@
marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_485de4fe4992e7b597d3f52d56de1299.setView(novaPosicao, map_485de4fe4992e7b597d3f52d56de1299.getZoom());
map_2a3d14da3dec6f21186e1667373ce43a.setView(novaPosicao, map_2a3d14da3dec6f21186e1667373ce43a.getZoom());
});
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {
@ -185,18 +194,18 @@
const latB = P2latitude * (Math.PI / 180.0);
const lonB = P2longitude * (Math.PI / 180.0);
// Calcular a diferen<EFBFBD>a de longitude
// Calcular a diferença de longitude
const deltaLon = lonB - lonA;
// Calcular a dire<EFBFBD><EFBFBD>o
// Calcular a direção
const y = Math.sin(deltaLon) * Math.cos(latB);
const x = Math.cos(latA) * Math.sin(latB) - Math.sin(latA) * Math.cos(latB) * Math.cos(deltaLon);
const direcaoRadianos = Math.atan2(y, x);
// Converter a dire<EFBFBD><EFBFBD>o de radianos para graus
// Converter a direção de radianos para graus
let direcaoGraus = direcaoRadianos * (180.0 / Math.PI);
// Normalizar a dire<EFBFBD><EFBFBD>o para que esteja no intervalo de 0 a 360 graus
// Normalizar a direção para que esteja no intervalo de 0 a 360 graus
direcaoGraus = (direcaoGraus + 360) % 360;
return direcaoGraus;

View File

@ -441,4 +441,4 @@ C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\Debug\Python\Models\deeplabv3pl
C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\Debug\AgroBase.exe.config
C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\Debug\AgroBase.exe
C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\Debug\AgroBase.pdb
C:\ZendionINC\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.csproj.Up2Date
C:\ZendionInc\agrobot_base\AgroBase\AgroBase\obj\Debug\AgroBase.csproj.CopyComplete

View File

@ -5,6 +5,7 @@
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\Pinout.h"
#include <SimpleKalmanFilter.h>
#define D_Code Dir
#define VERSION 8
@ -37,6 +38,8 @@ class Motor {
PinoModel _pinoDIR;
PinoModel _pinoPUL;
PinoModel _pinoEncoder;
SimpleKalmanFilter* encoderKalman;
bool Iniciado = false;
bool Testando = false;
@ -72,6 +75,8 @@ class Motor {
_pinoENA.Conectar(true);
_pinoDIR.Conectar(false);
_pinoEncoder.Conectar();
encoderKalman = new SimpleKalmanFilter(2, 2, 0.01);
xTaskCreatePinnedToCore(&Motor::RampaTaskWrapper, "RampaTask", 5000, this, 20 - _canal, &RampaTaskHandle, tskNO_AFFINITY);
@ -108,6 +113,8 @@ class Motor {
// Parar a execução das tarefas
vTaskDelete(RampaTaskHandle);
delete encoderKalman;
// Redefinir as configurações para os valores iniciais
_pinoENA.Desconectar();
_pinoDIR.Desconectar();
@ -132,6 +139,8 @@ class Motor {
private:
double _anguloAnterior = 0;
TaskHandle_t RampaTaskHandle = NULL;
static void RampaTaskWrapper(void *pvParameters) {
Motor *motor = static_cast<Motor*>(pvParameters);
@ -171,16 +180,18 @@ class Motor {
void Atualizar() {
_pinoENA.set(!_MotorLigado);
_pinoDIR.set(_Sentido_SP != Horario);
_pinoDIR.set(_Sentido_SP != Antihorario);
}
int leituras = 0;
void AferirPosicao() {
if (_pinoEncoder.Definido()) {
// Lê o valor analógico do pino conectado à saída analógica do AS5600
int sensorValue = _pinoEncoder.get();
int leitura = _pinoEncoder.get();
float leituraNormalizada = encoderKalman->updateEstimate(leitura);
// Converte a leitura para ângulo (0V a 3.3V corresponde a 0 a 360 graus)
double _angulo = (sensorValue / 4095.0) * 360.0;
double _angulo = (leituraNormalizada / 4095.0) * 360.0;
// Ajusta o ângulo com o offset
double angulo_com_offset = _angulo - _Angulo_Offset; // Considerando que o offset pode ser positivo ou negativo
@ -189,6 +200,16 @@ class Motor {
while (angulo_com_offset > 180) angulo_com_offset -= 360;
while (angulo_com_offset < -180) angulo_com_offset += 360;
if (leituras > 700) {
_Sentido =
_MotorLigado && angulo_com_offset > _anguloAnterior ? Horario :
_MotorLigado && angulo_com_offset < _anguloAnterior ? Antihorario :
Parado;
leituras = 0;
_anguloAnterior = angulo_com_offset;
}
leituras++;
_Angulo = angulo_com_offset;
}
}
@ -203,7 +224,7 @@ class Motor {
_MotorLigado = false;
}
}
else {
else if (false) {
if (Referenciado && (_Sentido_SP == Horario && _Angulo >= RefMax)) {
_MotorLigado = false;
}
@ -230,7 +251,7 @@ class Motor {
_MotorLigado = false;
}
else {
_Sentido_SP = (_Angulo < 0) ? Horario : Antihorario;
_Sentido_SP = (_Angulo > 0) ? Antihorario : Horario;
}
}

View File

@ -522,7 +522,6 @@ class SensorMagnetometro {
vTaskDelay(1000);
continue;
}
long intMillis = (millis() - firstMilis);
// A cada _TaxaAmostragem, enviar os dados para o software
@ -541,8 +540,9 @@ class SensorMagnetometro {
int x, y, z;
float orientacao;
qmc->read(&x, &y, &z,&orientacao);
EnviarDadosSerial(MontarProtocoloSensor(sMAG, _ID, MontarDadosProtocoloMagnetometro(x, y, z, orientacao)));
if (x != 0 && y != 0 && z != 0) {
EnviarDadosSerial(MontarProtocoloSensor(sMAG, _ID, MontarDadosProtocoloMagnetometro(x, y, z, orientacao)));
}
}
};
@ -934,7 +934,7 @@ void ProcessarProtocolo(String Protocolo, F_Code _funcao, int idMensagem) {
int pinoSDA = Partes[3].toInt();
int pinoSCL = Partes[4].toInt();
if (pinoSDA > -1 && pinoSCL > -1) {
if (pinoSDA > -1 && pinoSCL > -1 && false) {
_pinoSDA = pinoSDA;
_pinoSCL = pinoSCL;
Wire.end();