hola amigos.
aunque sea un t贸pico, y repetido hasta la saciedad.... soyyyy NUEVO.
bueno ahora biene mi pregunta.
estoy realizando, (mas bien adjuntado codigo) un sketch.
aunque el mismo me funciona tengo un problema.
Bien, se trata de un motor, el cual mide las revoluciones, y lo que quiero es que, al llegar el contador a unas revoluciones determinadas, Arduino me active una bobina NC de un rele, que corte la alimentaci贸n del motor haciendolo parar.
Pues bien, el problema biene que cuando detecta que el contador a bajado de las revoluciones puestas, en la condici贸n del contador, efectivamente activa la bobina y el contacto NC lo pasa a NO y se para, pero lo que me gustaria esque antes de ejecutar esa condici贸n, al menos deberia chekear unas 5 repeticiones, para estar seguro que el motor efectivamente esta a las revoluciones que necesita para parar el motor y que no ha sido una lectura puntual erronea.
volatile int contador = 0; 聽 // Variable entera que se almacena en la RAM del Micro
// unsigned long lastTime = 0; 聽 聽 聽 聽 // almacenar谩 el 煤ltimo valor de tiempo fue enviado
// const long interval = 1000; 聽 聽 聽 聽 // intervalo en el que enviar el resultado en milisegundos. 1000 ms = 1 segundo
int adelanteMotor=12; 聽 聽 聽 聽 聽 聽 //pin habilitaci贸n motor
int atrasMotor=13; 聽 聽 聽 聽 聽 聽 聽 聽//pin habilitaci贸n motor
int habilitarMotor=8; 聽 聽 聽 聽 聽 聽 //pin habilitaci贸n motor PWM (por medio de este se controla)
int paramotor=4; 聽 聽 聽 聽 聽 聽 聽 聽 聽//para motor;
int senalPWM = 130; 聽 聽 聽 聽 聽 聽 聽 //senal de PWM
void setup() {
聽Serial.begin(9600);
聽pinMode(2, INPUT); 聽 聽 聽 聽 聽 // set pin to input
聽digitalWrite(2, HIGH); 聽 聽 聽 // turn on pullup resistors
聽pinMode(adelanteMotor,OUTPUT); 聽 聽// se define como pin de salida
聽pinMode(atrasMotor,OUTPUT); 聽 聽 聽 // se define como pin de salida
聽pinMode (paramotor, OUTPUT);
聽pinMode (habilitarMotor, OUTPUT);
聽attachInterrupt(0,interrupcion0,RISING); 聽// Interrupcion 0 (pin2)
} 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// LOW, CHANGE, RISING, FALLING
void loop() {
聽delay(999); 聽 聽 聽 聽 聽 聽 聽 // retardo de casi 1 segundo
聽Serial.print(contador*10); // Como son seis interrupciones por vuelta (contador * (60/6))
聽Serial.println(" RPM"); 聽 聽// 聽El numero 6 depende del numero aspas de la helise del motor en prueba
聽if (contador < 50){
聽 聽delay(5000);
聽 聽digitalWrite(paramotor,HIGH);
聽}
聽contador = 0;
聽digitalWrite(adelanteMotor,HIGH); 聽 聽// habilitar giro motor
聽digitalWrite(atrasMotor,LOW); 聽 聽 聽 聽 // habilitar giro motor
聽analogWrite(habilitarMotor,senalPWM); 聽// habilitar potencia motor
聽// digitalWrite(paramotor,LOW);
聽// Condici贸n por la cual queremos que el c贸digo se ejecute
聽// si una variable 'x' es menor que 500 RPM
}
void interrupcion0() 聽 聽// Funcion que se ejecuta durante cada interrupion
{
聽contador++; 聽 聽 聽 聽 聽 // Se incrementa en uno el contador
}
hola ArduMyth , gracias por contestar.
sip, correcto lo del c贸digo, soy un desastre, quito, pongo, hago pruebas, entre que llevo unos dos dias con arduino, y que no soy muy organizado, al final queda una piltrafa.
te/os comento.
el contador de vueltas las hago con un encoder y un fototransitor, el encoder (casero), lleva seis interrupcciones, que efectivamente corresponder铆an a los 360潞.
Ahora lo que pretendo, es que el motor, cuando baje de por ejemplo 500 RPM, (ya que en este caso podr谩 llegar a 20mil), por medio del pin 4 de arduino me active la bobina del rele y me pare el motor.
y entiendo (pero puedo estar equivocado en el planteamiento), que si efectivamente las 6 interrupcciones las divido entre 60, me dan 10, por eso contador lo multiplico por 10).
posteriormente le digo que si contador es inferior (entiendo que 50x10=500), me active la bobina transcurridos 5 segundos.
Nose si ahora a podido quedar un poco mas claro, (mi propuesta.... no el c贸digo.... jjajajajaj).
gracias surbyte .
bueno, no se si ahora estar谩 correcto, me he pegado toda la ma帽ana, buscando por los manuales de Arduino, las dichosas etiquetas... jajajjajajajaja.
logicamente se refer铆a a la insercci贸n del c贸digo dentro del posteo.
en fin, ultimamente no se puede ser nuevo en nada,
Gracias, por la ayuda y la paciencia.
Byez.
Entiendo el uso de las interrupciones al usar encoder 贸pticos/optointerruptores pero la mayor铆a de los modelos de Arduino s贸lo disponen de 2 pines para ello y yo personalmente prefiero dejarlos libre salvo imprescindible.
Aunque entiendo el punto de vista de ArduMyth, las cosas estan para usarse, y si no hay nada mas que requiera interrupciones porque no usarla?
En este caso me parece acertado.
al menos deberia chekear unas 5 repeticiones
Nada en tu c贸digo cuenta 5 lecturas x debajo de 50 RPM.
Tu c贸digo solo hace esto
digitalWrite(paramotor,HIGH);
que si controla un rele, lo estas desenergizando. Porque un HIGH lo desactiva y un LOW lo activa.
jajajajaja. GRACIAS. que maquinas.
bueno este es la configuracion que tengo montado en una protoboar en casa.
si me funcionase, me gustaria implementarla en un motor mas grande.
la idea, es como ya he comentado, que cuando baje de "X" revoluciones, podrian ser por ejemplo 500, me detectase que efectivamente son esas revoluciones, y mediante el pin 4 de arduino, me active la bobina del rele, al activarse, como la alimentacion del motor pasa mediante un contacto normalmente cerrado, me lo abrir谩 dejando sin alimentaci贸n al motor par谩ndose.
bueno voy a rpobar lo que me habeis pasado.
EDITO: O脩O.... veo ke no sale la imagen que he adjuntado. (voy a repasar).
vale ahora lo estaba probando.
carga perfecto, todo bien, pero en el monitor serie, aparece el contador, 1,2,3..etc..etc... hasta 30, y luego salen las RPM, (nose... un poco bajas), me salen 6,80, por ahi.
y si efectivamente cuando baje de .... por ejemplo 500 RPM, me active el pin 3como HIGH , que has puesto tu, y me abra el rele.
esto es lo que me sale en el monitor serie, las RPM, tal vez bajas nop驴?, ya que es un motorcillo que puede llegar a las 15mil RPM.
Luego si le invierto esta condici贸n de tu c贸digo:
Muchas gracias ArduMyth , por tu dedicaci贸n y paciencia.
vale voy a seguir haciendo pruebas.
sip, hay un potenciometro, que desde ahi puedo regular la tension, o tambien podria a trav茅s de PWM ( que tenia en el primer sketch, que adjunte), luego el encoder rotativo, bueno... que empleo yo como encoder rotativo no es mas que la parte reductora del motor, que casualmente tiene esas 6 interrupciones por vuelta y que empleo para este proyectillo.
Y si te fijas se ve en rojo el transmisor del fototransistor (este venia encapsulado, pero que desarme para emplearlo en la proto), al otro lado de la rueda del encoder en un amarillo casi blanco esta el receptor, (apenas se ve).
bueno, no he sabido hacerle mas cambios, y no acaba de realizar lo que quiero.
el sketch me hace un conteo hasta 30 (1,2,3,4,,5.....etc..etc...),y en el 30 me saca las revoluciones (demasido bajas).
y lo que querria esque en cada conteo me saque revoluciones, pero al bajar de un numero determinado de revoluciones, me active un pin como salida de arduino.
bueno muchas gracias por la paciencia, y colaboraci贸n, espero volvercon un poco mas de idea (creo...jajajajajaj).
// Contador de RPM聽 by: kikorro
// Conexion de la entrada de la interrupcion 0聽 por el PIN 2
// Configurar el monitor serial a 9600 Baudios para visualizar los RPM
volatile int contador = 0;聽 // Variable entera que se almacena en la RAM del Micro
unsigned long lastTime = 0;聽 聽 聽 聽 // almacenar谩 el 煤ltimo valor de tiempo fue enviado
const long interval = 1000;聽 聽 聽 聽 // intervalo en el que enviar el resultado en milisegundos. 1000 ms = 1 segundo
int adelanteMotor=12;聽 聽 聽 聽 聽 聽 //pin habilitaci贸n motor
int atrasMotor=13;聽 聽 聽 聽 聽 聽 聽 聽 //pin habilitaci贸n motor
int habilitarMotor=8;聽 聽 聽 聽 聽 聽 //pin habilitaci贸n motor PWM (por medio de este se controla)
int paramotor=4;聽 聽 聽 聽 聽 聽 聽 聽 聽 //para motor;
int senalPWM = 150;聽 聽 聽 聽 聽 聽 聽 //senal de PWM
void setup() {
聽 Serial.begin(9600);
聽 pinMode(2, INPUT);聽 聽 聽 聽 聽 // set pin to input
聽 // digitalWrite(2, HIGH);聽 聽 聽 // turn on pullup resistors
聽 pinMode(adelanteMotor,OUTPUT);聽 聽 // se define como pin de salida
聽 pinMode(atrasMotor,OUTPUT);聽 聽 聽 // se define como pin de salida
聽 pinMode (paramotor, OUTPUT);
聽 pinMode (habilitarMotor, OUTPUT);
聽 attachInterrupt(0,interrupcion0,RISING);聽 // Interrupcion 0 (pin2)
}聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // LOW, CHANGE, RISING, FALLING
void loop() {
聽 contador = 0;
聽 delay(1000);聽 聽 聽 聽 聽 聽 聽 聽 // retardo de 1 segundo
聽 Serial.print(contador *10);聽 // Como son seis interrupciones por vuelta (contador * (60/6))
聽 Serial.println(" RPM");聽 聽 //聽 El numero 6 depende del numero aspas del encoder
聽 analogWrite(habilitarMotor,senalPWM);聽 // habilitar potencia motor
聽 digitalWrite(paramotor,LOW);
聽
聽 // Condici贸n por la cual queremos que el c贸digo se ejecute
聽 // si una variable 'x' es menor que 3000 RPM
if (contador > 300){
聽 digitalWrite(paramotor,LOW);
}
else if (contador < 300){
聽 聽 聽 digitalWrite(paramotor,HIGH);
聽 delay(1000);
聽 }
}
void interrupcion0()聽 聽 // Funcion que se ejecuta durante cada interrupion
{
聽 contador++;聽 聽 聽 聽 聽 // Se incrementa en uno el contador
}
adjunto este codigo, y creo que he hecho poco peroooo, ahora FUNCIONA.
como veis las revoluciones est谩n un poco altas porque estos motorcillos van a muchas revoluciones, y como no lleva carga pues a 500 milivoltios aun va por encima de 3000 RPM.
y as铆 para hacer pruebas facilmente y jugando con la alimentacion, puedo hacer que baje y suba facilmente de las RPM, y ahora efectivamente al bajar el contador de las 3000 RPM, activa el pin de salida 4 (paramotor), que me activa la bobina del rele abriendolo y por consiguiente parando el motor.
Asi, que me gustaria que me dieseis vuestra opini贸n, sobre todo con los delays, y como podria intercalar la opci贸n de los millis, y dejar los delays.