hola, a todos, mi duda es, por que la sumilacion no funciona en el proteus, cuando todo funciona perfectamete en el arduino fisico?, he probado de todo y no encentro solucion, al respecto, espero me puedan ayudar, es importante para mi proyecto poder simularlo en proteus.
¿De qué proyecto estamos hablando?
En lo personal he encontrado unas cuantas cosas que no funcionan del todo bien en Proteus.
No sé si es problema del propio Proteus o del código de los componentes simulados, lo cierto es que hay cosas que no funcionan como deberían.
Por ejemplo, las interrupciones en arduino solo trabajan por LOW, los otros modos los ignora. Otro, la comunicación I2C entre dos arduinos se emula bien de maestro a esclavo pero no funciona del esclavo al maestro. Y otro más, la simulación de RTC, a pesar de tener seteado que inicie con la hora del sistema, inicia con cualquier hora.
Saludos
@anon90500195 este seria el proyecto, es el mismo que el del otro hilo que tengo abierto pero me gustaria simularlo para cmbiarle unos sensores y probar otras cosas, pero si no funciona de salida no me fio pues no se si al cambiar cosas fallara el simulador o el codigo que vaya a editar... por eso me gustaria saber ants de naad que todo funciona correctamente en el simulador.
// ---------------------------------------------------------------------------
// Control de 2 sensores de distancia HC-SR04
// ---------------------------------------------------------------------------
#include <NewPing.h> // Libreria necesaria
#define SONAR_NUM 2 // Numero de sensores
#define MAX_DISTANCE 400 // Distancia maxima en centimetros
#define LEDR1 2
#define LEDG1 3
#define LEDB1 4
#define TIGGER 5
#define ECHO0 6
#define ECHO1 8
NewPing sonar[SONAR_NUM] = { // Sensor object array.
NewPing(TIGGER, ECHO0, MAX_DISTANCE), // Sensor 0 (Tigger, Echo, Distancia maxima)
NewPing(TIGGER, ECHO1, MAX_DISTANCE) // Sensor 1 (Tigger, Echo, Distancia maxima)
};
float distancia[SONAR_NUM];
// CONSTANTES
const float umbral[SONAR_NUM] = {15, 5};
//SI POSICION INCORRECTA
void MOTORcorregir() {
LEDrojo();
}
//SI POSICION CORRECTA
void MOTORbajar() {
LEDverde();
}
//SI POSICION BAJA
void MOTORsubir() {
LEDblanco();
}
//ENCIENDE LED BLANCO
void LEDblanco()
{
//PONER LED EN BLANCO
analogWrite(LEDR1, 255);
analogWrite(LEDG1, 255);
analogWrite(LEDB1, 255);
}
//ENCIENDE LED VERDE
void LEDverde()
{
//PONER LED EN VERDE
analogWrite(LEDR1, 0);
analogWrite(LEDG1, 255);
analogWrite(LEDB1, 0);
}
//ENCIENDE LED ROJO
void LEDrojo(){
//PONER LED EN ROJO
analogWrite(LEDR1, 255);
analogWrite(LEDG1, 0);
analogWrite(LEDB1, 0);
}
//APAGAR LED
void LEDoff(){
//PONER LED EN OFF
analogWrite(LEDR1, 0);
analogWrite(LEDG1, 0);
analogWrite(LEDB1, 0);
}
void setup() {
Serial.begin(9600); // Conectar el monitor serial
//LED EN INICIO COLOR BLANCO
LEDblanco();
}
void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
delay(100); // Wait 100ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
Serial.print("Sonar");
Serial.print(i);
Serial.print("=");
distancia[i] = sonar[i].ping_cm();
Serial.print(distancia[i]);
Serial.print("cm ");
}
Serial.println();
delay(500);
//REALIZAMOS LA OPERACION
if (distancia[0] <= umbral[1] && distancia[1] <= umbral[1]) {
MOTORsubir();
}
else if (distancia[0] >= umbral[0] && distancia[1] >= umbral[0]) {
MOTORbajar();
}
else if (distancia[0] < umbral[0] && distancia[0] > umbral[1] || distancia[1] < umbral[0] && distancia[1] > umbral[1]) {
MOTORcorregir();
}
else LEDoff();
delay(100);
}
Que simulador me recomendarias que fuera fiable?? por que este lo veo bastante bien pero si tiene fallos mal vamos...
Solo he usado Proteus (con los "detalles" que te marqué), UnoArduSim (pero es bastante limitado) y en línea he usado wokwi (bastante limitado también). Los dos últimos, para cosas sencillas sirven.
Otros no he usado.
Saludos
Moderador:
Por favor, lee las Normas del foro
No abras hilos relacionados con el mismo tema.
Agota el tema cuando gustes y si tienes otro proyecto diferente entonces si, abres un hilo nuevo de lo contrario sigues acá.
@Surbyte Perdona, pensaba que al ser tema de proteus no debia de mezclarlo con el tema de los posibles errores de programacion
Bueno una duda solucionada, el problema no era de proteus era de mi ignorancia, al no entender totalmente el funcionamiento del software, y quizas un relentizado en este por mi pc antiguo con falta de potencia.....
Zanajado el tema de proteus, continuo estudiando el porque del tema central de este hilo:
Ya me di cuenta por qué el sensor2 te devuelve 0 cm salvo que la distancia a medir sea muy cercana o inferior a la que lee sensor1 cuando usas un trigger único.
Todavía no miré como lo maneja la librería (que no da este error de medición) pero en tu código ocurre lo siguiente (y que tiene algo que ver con lo que te había dicho antes):
- Envias el pulso de disparo.
- Ambos sensores comienzan la medición.
- Haces la medición con pulseIn() y obtienes el resultado del ancho del pulso de respuesta del sensor1.
- Haces el cálculo e imprimes el resultado (lo que consume algunos useg y te favorece)
Hasta acá todo bien pero en este punto empieza el problema...
Si la distancia es menor, igual o apenas mayor a la que detecta el sensor1, el sensor2 ya hizo la medición del trigger "falso", el pulso de respuesta se pierde (no es problema porque no interesa), pero lo que importa es que el sensor queda en espera de un nuevo pulso de disparo, entonces
- Envias el pulso de disparo.
- Ambos sensores comienzan la medición.
- Haces la medición con pulseIn() y obtienes el resultado del ancho del pulso de respuesta del sensor2.
- Haces el cálculo e imprimes el resultado.
- Haces un delay de 500 mseg.
Pero si la distancia a medir por el sensor2 es mayor a la del sensor1, como hubo un disparo previo (el "falso" trigger), el sensor2 todavía está enviando el pulso de respuesta (por lo que ignora el nuevo pulso de trigger), y como cuando llamas a pulseIn() el pin ya está en HIGH no detecta cambio de flanco y no "encuentra" nada que medir, y al terminar el timeout devuelve 0.
Y a causa del timeout (que por defecto es de 1000 mseg) es que "se pone lento".
Si pones un delay de 60 mseg (como sugiere indirectamente Sparkfun en la hoja de datos del módulo) al final de calcularDistancia1() se elimina el problema.
De hecho, el delay de 500 mseg al final de calcularDistancia2() es lo que evita que el sensor1 también falle.
Saludos
PD: Lo simulé en wokwi y trabaja sin problemas. Lo pruebo en Proteus y te cuento.
@anon90500195, increible, tienes toda la razon del mundo, lo que me esperaba una tonteria de nada que ni me di cuenta en mirar. Eres un crak, yo solo no lo hubiera sacado ni en mil años.
Simplemente he puesto otro delay(500) al final del calculo de distancia1 y solucionado, medidas perfectas en los 2 sensores sea cual sea la distancia, probado fisicamente sin simulacion.
Me quito el sombrero ante ti....
@tarantulatattoo En Proteus funciona correctamente.
¿No te olvidaste de alimentar los módulos?
@anon90500195, Si lo del proteus ya esta solucionado, tambien
Seguramente. Tengo una notebook del 2007 con Celerón (no te miento, una HP530), que a estas alturas solo le pude cargar Ubuntu 16.2 para que tenga un funcionamiento más o menos fluído, así que Proteus lo tuve que cargar en una máquina virtual y es una tortuga (y tortura). ![]()
Lo bueno es que me forzó a comprar una notebook más moderna. ![]()
Saludos
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
