Conteo de pulsos con Arduino

tampoco sé que hace ahí D3, excepto aumentar la tensión del umbral de disparo, lo que sí en vez de 1N4007, los reemplazaría por 1N4148, porque éstos últimos son rápidos, pues son de señal.
 
Aun no me llegaron los sensores hall, acá dejo una foto real del motor.
No me di cuenta que en la foto no esta el reed switch porque lo saque para buscar el datasheet :facepalm: pero va ubicado como esta el rectángulo rojo
Hay 4 imanes en el engranaje negro
Este es el datasheet del sensor
https://datasheet.octopart.com/59025-010-Littelfuse-datasheet-11783426.pdf
Lo probé con el tester y parece estar bien, cuando no tiene un imán marca infinito (en escala de Mohm) y cuando lo acerco marca 0 ohm.
 

Adjuntos

  • IMG_20190803_155732.jpg
    IMG_20190803_155732.jpg
    334 KB · Visitas: 16
He leído casi todo el hilo para darme cuenta que no encontré salvo cuando otro usuario lo publicó un código completo tuyo, o tal vez se me pasó por alto pero he visto cosas parciales de tu código.
20Hz como te han dicho se cuentan simplemente sin interrupciones pero ya que las usas, es raro que tengas los problemas que describes.
Cual es tu código completo?
Puedes publicarlo? Digo porque con solo probarlo uno se da cuenta donde puede estar tu fallo.
 
He leído casi todo el hilo para darme cuenta que no encontré salvo cuando otro usuario lo publicó un código completo tuyo, o tal vez se me pasó por alto pero he visto cosas parciales de tu código.
20Hz como te han dicho se cuentan simplemente sin interrupciones pero ya que las usas, es raro que tengas los problemas que describes.
Cual es tu código completo?
Puedes publicarlo? Digo porque con solo probarlo uno se da cuenta donde puede estar tu fallo.

Si el código completo lo puedo subir, pero el problema se puede recrear de esta forma:
Código:
void setup() {
pinMode(7,OUTPUT); //motor
pinMode(26,OUTPUT); // sentido giro
pinMode(20,INPUT); //reed switch
pinMode(14,INPUT_PULLUP); //boton
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(20), sumarPulsosM1, CHANGE);
}
int boton = 0;

void sumarPulsosM1() {
  digitalWrite(7, LOW);
  detachInterrupt(digitalPinToInterrupt(20)); //aca para la interrupcion
}

void loop() {
  boton = digitalRead(14);
if (boton == 0){
    Serial.println("pulso");
    delay(100);
    digitalWrite(7,HIGH);
    delay(1000);
  }
}

Básicamente al pulsar el boton el motor debe moverse, disparar la interrupción, el motor se apaga, la interrupción se desactiva.
Eso es la teoría, lo que realmente sucede es:
pulso boton, motor se mueve, dispara interrupción,el motor NO se apaga (el pin no cambia de estado), interrupción se desactiva.
Si dentro de la interrupción se pone una variable para contar la cantidad de pulsos y se quita la linea que desactiva la interrupción claramente se ve que la interrupción se dispara 2 o 3 veces y ahí el motor si se para. Usando un arduino mega 2560

Como comprobé que haciendo funcionar el motor mas lento esto no sucede, voy a implementar un PWM y que baje la velocidad un 50% unos 50 pulsos antes quizas?, voy a probar.
Encargue varios sensores hall para probar también, pero aun no me llegaron.
Y también quiero hacer la misma prueba con un arduino UNO a ver que sucede.

este es el diagrama que uso para activar el motor que recomiendan cambiar para usar el PWM ?
captura-png.178830


Actualmente D1 = 1n5408, R3 = 6.8k, R1 = 4.7K
 
Sin haberme leído el datasheet del MOSFET, yo quitaría la R de 10k y pondría la de 100k de 10k o menos.
Veo unas impedancias desaforadamente enormes ahí.
Ese circuito me parece que hace inútil el pwm, no creo que el MOSFET corte .
 
Sin haberme leído el datasheet del MOSFET, yo quitaría la R de 10k y pondría la de 100k de 10k o menos.
Veo unas impedancias desaforadamente enormes ahí.
Ese circuito me parece que hace inútil el pwm, no creo que el MOSFET corte .

Ok, quito entonces la que tengo ahora de 4.7k (R1) y dejo la de 6.8k (la de 100k en el diagrama).

El diodo lo tengo que cambiar también? es un 1n5408 cual me recomiendas?
el mosfet es un irf3205
 
No conozco ese diodo pero no suele ser crítico. Yo suelo usar 1N4007 o similar pero quizás para PWM sufra más de la cuenta.
 
El mosfet que sugieres es de 100A!
Necesitas controlar una carga digamos de varias decenas de Amper?
Ahora no tengo idea pero la corriente de freewheeling seguramente no será de 3A con una carga de decenas de Amper. Asi que tal vez el diodo este mal. Pero depende de tu carga.

Si ese es el caso como vas a montar el MOSFET para que disipe el calor?
Si usas un MOSFET para corrientes elevadas, debes proteger al Arduino de la posiblidad que el GATE del MOSFET tome demasiada corriente y para ello se pone un Resistor de bajo valor en serie que limite la corriente. Suele ser de 10 a 100 ohms y actua como fusible en caso de fallos por disipación o porque falle el diodo de freewheeling, traducido se quema de algun modo el MOSFET y hay conducción excesiva en el Gate donde antes no la había.

Luego en un código con interrupciones pones delay(100) dos veces? incoherente. Se puede si, pero para mi no va el uso de delay().
Y para colmo, la interrupción funciona 1 vez porque la activas en el setup y a la primer oportunidad la desactivas y luego no hay nada que la vuelva a poner en marcha.
 
El mosfet que sugieres es de 100A!
Necesitas controlar una carga digamos de varias decenas de Amper?
Ahora no tengo idea pero la corriente de freewheeling seguramente no será de 3A con una carga de decenas de Amper. Asi que tal vez el diodo este mal. Pero depende de tu carga.

Si ese es el caso como vas a montar el MOSFET para que disipe el calor?
Si usas un MOSFET para corrientes elevadas, debes proteger al Arduino de la posiblidad que el GATE del MOSFET tome demasiada corriente y para ello se pone un Resistor de bajo valor en serie que limite la corriente. Suele ser de 10 a 100 ohms y actua como fusible en caso de fallos por disipación o porque falle el diodo de freewheeling, traducido se quema de algun modo el MOSFET y hay conducción excesiva en el Gate donde antes no la había.

Luego en un código con interrupciones pones delay(100) dos veces? incoherente. Se puede si, pero para mi no va el uso de delay().
Y para colmo, la interrupción funciona 1 vez porque la activas en el setup y a la primer oportunidad la desactivas y luego no hay nada que la vuelva a poner en marcha.

El mosfet ya lo tengo, se me complica mas cambiarlo que usar ese.
Lo maximo que le medi al motor fueron 1.5A, actualmente no uso PWM y lo tengo con un diodo 1n5408 es de 3A pero no es rapido.
El mosfet acualmente solo enciende y apaga el motor, no se calienta para nada, pero si al usar PWM toma temperatura le pongo un disipador y listo.
Pondré la resistencia que suguieres en el GATE, ademas el mosfet esta optoacoplado del arduino.

Sobre el funcionamiento de la interrupcion, quizas me exprese mal.
El ejemplo de codigo encima sirve para recrear el fallo que tengo.
Con ese codigo lo que deberia de suceder es lo siguiente:
presiono boton
activo motor
interrupcion dispara
apaga motor
interrupcion desactiva
motor no debe de girar ni tampoco volver a disparar mas interrupciones porque están desactivadas

Pero por algún extraño motivo el pin nunca cambia de estado en el PRIMER disparo de la interrupción, le toma 2 o 3 disparos mas para que el pin cambie el estado y como en el primer disparo la interrupción se desactiva, nunca vuelve a ocurrir y el motor gira infinitamente (algo completamente logico)
eso es solo para demostrar el problema, si te pongo el codigo que realmente uso lo que sucede es que el motor sigue 2 o 3 pulsos de mas o menos y nunca se para donde debe.

En el video que esta mas arriba puedes ver lo que te estoy comentando.
Este problema solo sucede cuando se usan las interrupciones en modo CHANGE y seria bueno usarlo de ese modo porque tengo mas precisión.
El delay que ves esta dentro del loop() en este caso no afecta lo que sucede dentro de la interrupcion y la funcion de ese delay es actuar como "anti rebote" del pulsador, se que se puede hacer de otra forma pero es solo un simple ejemplo y no va por ahí la solución.
Recien probe activar el motor con analogWrite(pin,valor)
resultados:
analogWrite(pin,255) -> tension de salida 36Vcc, no se posiciona bien
analogWrite(pin,127) -> tension de salida 32Vcc, no se posiciona bien
analogWrite(pin,50) -> tension de salida 24Vcc, a veces falla
analogWrite(pin,20) -> tension de salida 19Vcc, parece funcionar bien
Lo que pienso hacer es variar la velocidad en base a la cantidad de pulsos a mover por ejemplo:
menor a 100 pulsos -> analogWrite(pin,20)
mayor a 100 pulsos->analogWrite(pin,255)
Cuando resten 30 pulsos para llegar a destino ->analogWrite(pin,20)
Que opinan?, es atarlo con alambre o puede ser la solución? Estoy escribiendo el codigo para probar.
Por ahora hice la prueba con el 1n5408 y no se rompio nada :LOL:

Edit: el mosfet toma un poquito de temperatura y al motor no le senti ruidos raros
 
Última edición:
Les dejo el codigo completo por si quieren verlo, aun no esta terminado hay muchos delays y cosas peores por ahi.
Pero actualmente funciona bien. mañana cambiare el diodo por uno rapido para quedarme mas tranquilo y tengo que oir mas de cerca el motor a ver si hace algun ruido extraño al usar el PWM, por lo menos medí la intensidad y es menor que a plena velocidad. Igualmente es por muy poco tiempo que baja la velocidad.
Esta programado con visual studio + visual micro en las versiones gratuitas, pero igual pueden ver los archivos con notepad
El archivo "principal" es "diseqcPositioner.ino" intente tener el codigo un poco organizado en varios archivos .ino
 

Adjuntos

  • diseqcPositioner.zip
    1.7 MB · Visitas: 1
Lo maximo que le medi al motor fueron 1.5A, actualmente no uso PWM y lo tengo con un diodo 1n5408 es de 3A pero no es rapido.
El mosfet acualmente solo enciende y apaga el motor, no se calienta para nada, pero si al usar PWM toma temperatura le pongo un disipador y listo.
Pondré la resistencia que suguieres en el GATE, ademas el mosfet esta optoacoplado del arduino.
Bueno ahora las cosas tienen otro sentido. Explicas porque semejante MOSFET y porque con esa carga ese diodo esta bien.

Pondré la resistencia que suguieres en el GATE, ademas el mosfet esta optoacoplado del arduino.
Si quieres hazlo pero no tiene sentido para el consumo que tendrás.

Este problema solo sucede cuando se usan las interrupciones en modo CHANGE y seria bueno usarlo de ese modo porque tengo mas precisión.
Sigues hablando de precisión pero no es la palabra adecuada cuando usas un REED SWITCH como sensor.
Quien te asegura que el Reed Switch no pierde pulsos? Porque no usas un sensor Hall en su reemplazo o un optico?

Yo creo que todo pasa por ahi. Tu sensor no se si esta trabajando bien.
 
Mientras no cambie el sensor, me parece a mí que no hay nada que hacer. 10 o 20Hz es "corriente continua" pero para un elemento mecánico es "ultra alta frecuencia"
 
El sensor funciona. Trabajé con alguien en un sistema de rally europeo de velocidad controlada y usaba Reed switches.
De hecho si tengo algo que decir tal vez este mal el imán o la distancia al Reed
 
en esa parte del código es que el LOW tiene un espacio despues de la coma
No tiene nada de extraño. Es un parametro de digitalWrite y despues de la coma podes escribirlo donde te plazca, incluso en la linea de abajo o al extremo derecho de la pantalla. Al compilador no le importa.

PD: yo usaría un opto como el CNY70
1_f24b5eba-9250-43f3-a321-5530cff87c65_1024x1024.png

Y dejaria de jugar con los reed...
 
Última edición:
La certeza de que sea o no sea no la tengo, pero bien no viene. Yo no es que lo habría quitado ya, es que no lo habría puesto.

En cualquier caso, se pone el osciloscopio y se ve que pasa.
 
En cualquier caso, se pone el osciloscopio y se ve que pasa.
Opino igual, para mí el imán está a una distancia u orientación que falla de tanto en tanto.
Cómo dije mi amigo lee con 4 Reed switches el desplazamiento de la rueda del auto. Los lee con un Nano y por interrupciones sin fallos usando FALLING pero esto no cambia nada. Estos datos los envía los BT a una tablet.
Voy a confirmar que imán usa.
 
No tiene nada de extraño. Es un parametro de digitalWrite y despues de la coma podes escribirlo donde te plazca, incluso en la linea de abajo o al extremo derecho de la pantalla. Al compilador no le importa.

PD: yo usaría un opto como el CNY70
1_f24b5eba-9250-43f3-a321-5530cff87c65_1024x1024.png

Y dejaria de jugar con los reed...
Dices que cambie el reed switch por este sensor y modifique la parte de los imanes para que sea tipo un encoder?

Por ahora voy a probar con los sensores hall, lo que pasa que pedi varios modelos en ali y demora unos meses.

Por las dudas aclaro que el motor y la parte mecánica yo no la hice, eso viene todo listo para estas parabólicas. Hay varios tipos y fabricantes, este en especifico es de una radioshack que se vendía en los años 90. La adquirí en mal estado y la restaure hasta ponerla en funcionamiento.
Debe de tener unos 30 o 35 años por lo menos.
Cuando digo precisión me refiero a lo maximo que se puede obtener con el reed switch
Si eso lo conecto en un posicionador comercial, que no tiene mas de 20 resistencias, un PIC,4 transistores y unos pocos capacitores funciona perfectamente.
Solo que es bastante limitado, como pueden ver en el codigo este que estoy haciendo permite manejar 2 motores y conmutar entre 2 receptores.
El posicionador comercial no lo revise mucho pero me parece que de los 4 transistores que tiene, 2 son para manejar los relees y los otros 2 podrian ser un schmitt trigger
Ahora usando el PWM y bajando la velocidad unos pulsos antes de llegar al destino se posiciona bien.
Lo que no entiendo es porque a toda velocidad (maximo 20 hz) la interrupcion no apaga el motor cuando debe.

edit: probe otro actuador lineal que tengo y se mueve pero zumba un poquito, eso le afecta al motor?
 
Última edición:
Atrás
Arriba