- Dom, 10 Jul 2016 21:01
#1352551
motores de todas clases
receptores diversos
emisoras, RadioMaster TX16S Open TX, otras Open Tx también
electrónica a patadas
Arduinos diversos
ESP8266, ESP32
STM32
Cacharros de todo tipo
Algunos hasta funcionan
Hola a todos, he visto que siempre es útil un circuito que encienda las luces, o lo que nos apetezca, como si fuese un interruptor electrónico pero decidiendo nosotros el punto exacto de conmutación, también pongo este post porque la electrónica que he comprado de alarma de perdida de señal no me gusta como reacciona, con este no hay qu esperar un minuto y medio o estar todo el rato tocando el joystick porque pita sin sentido cada dos por tres.
He usado un Arduino mini, por razones de peso y de espacio, y le he programado, a partir de un canal de la emisora, varias funciones, que no es necesario usar a la vez, aunque puede hacerse sin problema, estas son las siguientes:
Salida regulada de 0 a 100% en PWM, para controlar la luminosidad de una luz, la velocidad de un motor o lo que se os ocurra.
Salida nº 1, salida on/off pensada para encender las luces de posición, pensada originalmente para un barco, pero que se puede usar para otro tipo de aparato, su función original es simple, se enciende a partir de un punto desde un potenciómetro de la emisora, ojo, también se enciende si hay alarma de pérdida de señal.
Salida nº 2, salida on/off pensada para encender luces interiores del barco, tras haber encendido las luces de posición, se enciende en una posición mas avanzada del mismo potenciómetro, se apaga girando en sentido contrario, es simple
Salida de alarma, esta se conecta a los led rojos de alarma del barco, los enciende de manera intermitente cada vez que se queda sin señal de la emisora, al tirmpo que conecta de forma fija la salida nº1 o luces de posición y hace sonar un beeper, (salida nº , para poder buscar el modelo siguiendo el sonido.
No está acabado, de momento me cuesta mucho ponerme con ello, cuando esté bien de la vista intentare acabarlo, si alguien tiene ideas o sugerencias serán bien recibidas.
Este es el código a programar en el Arduino Mini:
/*Lee entrada desde un receptor de RC y regula la luz de un led, la velocidad de un motor o lo que se conecte a esta salida en función de la señal de uno de los potenciometros de la emisora, el potenciometro tambien puede ser uno de los joystick,
si se usa en un canal del receptor controlada por un interruptor de la emisora, obviamente no hay regulación, sino salidas todo o nada, tanto la que está regulada como las que conmutan on/off.
La luz nº 1, es decir, la salida 12 está pensada como luces de posición, si salta la alarma se encienden fijas tambien.
Es independiente de si el canal del receptor está conectado a un potenciometro o a un interruptor para dar la señal de perdida del modelo o de emisora apagada.
si la emisora está apagada o si el modelo está fuera del alcance de la radio, empieza a emitir una señal sonora por el altavoz, en forma de pitidos intermitentes y tambien pone intermitentes las luces conectadas a la salida nº 11.
todo esto con un solo canal, para mas canales es sencillo replicar el mismo programa.
Este codigo puede ser usado o modificado libremente
Jose Mª Escrich
*/
int rcPinA = 5; //Entrada desde el receptor TDP
int Speaker = 8; //Altavoz para señalizar modelo perdido en pin 8
int ledPin = 10; //Salida regulada
int errorled = 11; //Led de perdida de señal
int ledPin12 = 12; //Señal que se conmuta ON u OFF (1), usada como luces de posición
int ledPin13 = 13; //Señal que se conmuta ON u OFF (2), usada como luz interior
int servolimitLow = 1100; //Limite inferior para entrada desde receptor
int servolimitHigh = 1900; //Limite superior para entrada desde receptor
int CorteInterruptor1 = 1400; //Posición a partir de la que encendemos la luz fija 1
int CorteInterruptor2 = 1700; //Posición a partir de la que encendemos la luz fija 2
bool ErrorSignal = HIGH; //Señal de perdida del modelo
bool errorledout = LOW; //Variable para el led intermitente
// Variables usadas para generar intermitencia
int intermitencia = LOW; // señal que cambia de estado para usar como intermitente
unsigned long anteriorMillis = 0; // guarda el valor del tiempo del ultimo cambio
const long intervalo = 500; // intervalo para intermitencia en milisegundos
void setup()
{
pinMode(rcPinA, INPUT); //Entrada desde el receptor TDP
pinMode(ledPin, OUTPUT); //Salida regulada
pinMode(errorled, OUTPUT); //Led de perdida de señal
pinMode(ledPin12, OUTPUT); //Señal que se conmuta ON u OFF (1)
pinMode(ledPin13, OUTPUT); //Señal que se conmuta ON u OFF (2)
Serial.begin(9600);
}
void loop()
{
Intermitencias();//Llamada a la rutina que genera la señal intermitente
//int inputState = pulseIn(rcPinA, HIGH, 25000); //Lectura del pulso de entrada con timeout
int inputState = pulseIn(rcPinA, HIGH); //Lectura del pulso de entrada sin timeout
Serial.println(inputState);
//error aqui
if (inputState == 0)ErrorSignal = HIGH; //Si la señal es cero, hemos perdido la cobertura o la emisora está apagada
else
{
ErrorSignal = LOW;
}
if (ErrorSignal == HIGH)EmisoraApagada(); //Si no tenemos señal de emisora vamos a la rutina de Emisora Apagada
//****************************************************************************************************************************
//Encendido del led de error //Si no tenemos señal de emisora encendemos intermitentes las señales luminosas de perdida
if (ErrorSignal == HIGH && intermitencia == HIGH){
errorledout = HIGH;
tone(Speaker, 2400, 150);//Señal de alarma
}
else
errorledout = LOW;
digitalWrite (errorled, errorledout); //Activación de la salida de perdida de señal de emisora
//****************************************************************************************************************************
if (inputState < servolimitLow)inputState = servolimitLow; //Vigilamos los limites de la señal de entrada y los ajustamos si están fuera de rango
if (inputState > servolimitHigh)inputState = servolimitHigh;
//****************************************************************************************************************************
//Encendemos progresivamente las luces conectadas a esta entrada en función de la posicion del Joystick o potenciometro de la emisora
int ledBright = map(inputState, servolimitLow, servolimitHigh, 0, 255);
analogWrite(ledPin, ledBright);
//****************************************************************************************************************************
//Encendemos las luces conectadas a esta entrada si la posicion del Joystick o potenciometro de la emisora son mayores del valor establecido por nosotros para encender
if (inputState > CorteInterruptor1 || ErrorSignal) { //Luces de posición, si se enciende el led de error tambien se encienden las luces de posición
digitalWrite(ledPin12, HIGH);
Serial.println("Led uno encendido");
}
else
{
digitalWrite(ledPin12, LOW);
}
if (inputState > CorteInterruptor2) {
digitalWrite(ledPin13, HIGH);
Serial.println("Led dos encendido");
}
else
{
digitalWrite(ledPin13, LOW);
}
//****************************************************************************************************************************
delay (100); //Retardo para evitar parpadeos en las salidas
}
//#####################################################################################################
//*****************************************************************************************************
void EmisoraApagada() // Estado de alarma si se apaga la emisora o estamos fuera del radio de acción
{
Serial.println("Emergencia activada");
/*
//Generación señal Morse con SOS, a rehacer para que los retardos no influyan en la luz intermitente
int espacio = 400;
int tono = 2400;
int punto = 80;
int raya = 250;
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, raya); //raya
delay (espacio);
tone(Speaker, tono, raya); //raya
delay (espacio);
tone(Speaker, tono, raya); //raya
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
*/
}
//#####################################################################################################
//*****************************************************************************************************
//Rutina que genera la señal intermitente para ser usada donde haga falta
void Intermitencias()
{
// Generación de señal intermitente
unsigned long actualMillis = millis();
if (actualMillis - anteriorMillis >= intervalo) {
// guarda el momento en que se produjo el ultimo cambio
anteriorMillis = actualMillis;
// Si la señal está a uno la pone a cero, si está a cero la pone a uno
if (intermitencia == LOW)
intermitencia = HIGH;
else
intermitencia = LOW;
}
}
He usado un Arduino mini, por razones de peso y de espacio, y le he programado, a partir de un canal de la emisora, varias funciones, que no es necesario usar a la vez, aunque puede hacerse sin problema, estas son las siguientes:
Salida regulada de 0 a 100% en PWM, para controlar la luminosidad de una luz, la velocidad de un motor o lo que se os ocurra.
Salida nº 1, salida on/off pensada para encender las luces de posición, pensada originalmente para un barco, pero que se puede usar para otro tipo de aparato, su función original es simple, se enciende a partir de un punto desde un potenciómetro de la emisora, ojo, también se enciende si hay alarma de pérdida de señal.
Salida nº 2, salida on/off pensada para encender luces interiores del barco, tras haber encendido las luces de posición, se enciende en una posición mas avanzada del mismo potenciómetro, se apaga girando en sentido contrario, es simple
Salida de alarma, esta se conecta a los led rojos de alarma del barco, los enciende de manera intermitente cada vez que se queda sin señal de la emisora, al tirmpo que conecta de forma fija la salida nº1 o luces de posición y hace sonar un beeper, (salida nº , para poder buscar el modelo siguiendo el sonido.
No está acabado, de momento me cuesta mucho ponerme con ello, cuando esté bien de la vista intentare acabarlo, si alguien tiene ideas o sugerencias serán bien recibidas.
Este es el código a programar en el Arduino Mini:
/*Lee entrada desde un receptor de RC y regula la luz de un led, la velocidad de un motor o lo que se conecte a esta salida en función de la señal de uno de los potenciometros de la emisora, el potenciometro tambien puede ser uno de los joystick,
si se usa en un canal del receptor controlada por un interruptor de la emisora, obviamente no hay regulación, sino salidas todo o nada, tanto la que está regulada como las que conmutan on/off.
La luz nº 1, es decir, la salida 12 está pensada como luces de posición, si salta la alarma se encienden fijas tambien.
Es independiente de si el canal del receptor está conectado a un potenciometro o a un interruptor para dar la señal de perdida del modelo o de emisora apagada.
si la emisora está apagada o si el modelo está fuera del alcance de la radio, empieza a emitir una señal sonora por el altavoz, en forma de pitidos intermitentes y tambien pone intermitentes las luces conectadas a la salida nº 11.
todo esto con un solo canal, para mas canales es sencillo replicar el mismo programa.
Este codigo puede ser usado o modificado libremente
Jose Mª Escrich
*/
int rcPinA = 5; //Entrada desde el receptor TDP
int Speaker = 8; //Altavoz para señalizar modelo perdido en pin 8
int ledPin = 10; //Salida regulada
int errorled = 11; //Led de perdida de señal
int ledPin12 = 12; //Señal que se conmuta ON u OFF (1), usada como luces de posición
int ledPin13 = 13; //Señal que se conmuta ON u OFF (2), usada como luz interior
int servolimitLow = 1100; //Limite inferior para entrada desde receptor
int servolimitHigh = 1900; //Limite superior para entrada desde receptor
int CorteInterruptor1 = 1400; //Posición a partir de la que encendemos la luz fija 1
int CorteInterruptor2 = 1700; //Posición a partir de la que encendemos la luz fija 2
bool ErrorSignal = HIGH; //Señal de perdida del modelo
bool errorledout = LOW; //Variable para el led intermitente
// Variables usadas para generar intermitencia
int intermitencia = LOW; // señal que cambia de estado para usar como intermitente
unsigned long anteriorMillis = 0; // guarda el valor del tiempo del ultimo cambio
const long intervalo = 500; // intervalo para intermitencia en milisegundos
void setup()
{
pinMode(rcPinA, INPUT); //Entrada desde el receptor TDP
pinMode(ledPin, OUTPUT); //Salida regulada
pinMode(errorled, OUTPUT); //Led de perdida de señal
pinMode(ledPin12, OUTPUT); //Señal que se conmuta ON u OFF (1)
pinMode(ledPin13, OUTPUT); //Señal que se conmuta ON u OFF (2)
Serial.begin(9600);
}
void loop()
{
Intermitencias();//Llamada a la rutina que genera la señal intermitente
//int inputState = pulseIn(rcPinA, HIGH, 25000); //Lectura del pulso de entrada con timeout
int inputState = pulseIn(rcPinA, HIGH); //Lectura del pulso de entrada sin timeout
Serial.println(inputState);
//error aqui
if (inputState == 0)ErrorSignal = HIGH; //Si la señal es cero, hemos perdido la cobertura o la emisora está apagada
else
{
ErrorSignal = LOW;
}
if (ErrorSignal == HIGH)EmisoraApagada(); //Si no tenemos señal de emisora vamos a la rutina de Emisora Apagada
//****************************************************************************************************************************
//Encendido del led de error //Si no tenemos señal de emisora encendemos intermitentes las señales luminosas de perdida
if (ErrorSignal == HIGH && intermitencia == HIGH){
errorledout = HIGH;
tone(Speaker, 2400, 150);//Señal de alarma
}
else
errorledout = LOW;
digitalWrite (errorled, errorledout); //Activación de la salida de perdida de señal de emisora
//****************************************************************************************************************************
if (inputState < servolimitLow)inputState = servolimitLow; //Vigilamos los limites de la señal de entrada y los ajustamos si están fuera de rango
if (inputState > servolimitHigh)inputState = servolimitHigh;
//****************************************************************************************************************************
//Encendemos progresivamente las luces conectadas a esta entrada en función de la posicion del Joystick o potenciometro de la emisora
int ledBright = map(inputState, servolimitLow, servolimitHigh, 0, 255);
analogWrite(ledPin, ledBright);
//****************************************************************************************************************************
//Encendemos las luces conectadas a esta entrada si la posicion del Joystick o potenciometro de la emisora son mayores del valor establecido por nosotros para encender
if (inputState > CorteInterruptor1 || ErrorSignal) { //Luces de posición, si se enciende el led de error tambien se encienden las luces de posición
digitalWrite(ledPin12, HIGH);
Serial.println("Led uno encendido");
}
else
{
digitalWrite(ledPin12, LOW);
}
if (inputState > CorteInterruptor2) {
digitalWrite(ledPin13, HIGH);
Serial.println("Led dos encendido");
}
else
{
digitalWrite(ledPin13, LOW);
}
//****************************************************************************************************************************
delay (100); //Retardo para evitar parpadeos en las salidas
}
//#####################################################################################################
//*****************************************************************************************************
void EmisoraApagada() // Estado de alarma si se apaga la emisora o estamos fuera del radio de acción
{
Serial.println("Emergencia activada");
/*
//Generación señal Morse con SOS, a rehacer para que los retardos no influyan en la luz intermitente
int espacio = 400;
int tono = 2400;
int punto = 80;
int raya = 250;
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, raya); //raya
delay (espacio);
tone(Speaker, tono, raya); //raya
delay (espacio);
tone(Speaker, tono, raya); //raya
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
tone(Speaker, tono, punto); //punto
delay (espacio);
*/
}
//#####################################################################################################
//*****************************************************************************************************
//Rutina que genera la señal intermitente para ser usada donde haga falta
void Intermitencias()
{
// Generación de señal intermitente
unsigned long actualMillis = millis();
if (actualMillis - anteriorMillis >= intervalo) {
// guarda el momento en que se produjo el ultimo cambio
anteriorMillis = actualMillis;
// Si la señal está a uno la pone a cero, si está a cero la pone a uno
if (intermitencia == LOW)
intermitencia = HIGH;
else
intermitencia = LOW;
}
}
motores de todas clases
receptores diversos
emisoras, RadioMaster TX16S Open TX, otras Open Tx también
electrónica a patadas
Arduinos diversos
ESP8266, ESP32
STM32
Cacharros de todo tipo
Algunos hasta funcionan