//libreria de control remoto
#include <IRremote.h>
#include <Servo.h>
//declaracion de variables
Servo servo_azul;
int receptor = 11;
//IRrecv irrecv(receptor);
IRrecv irrecv(receptor);
decode_results resultados;
void setup()
{
servo_azul.attach(8, 500, 2500);
irrecv.enableIRIn(); //activa el receptor
}
void loop() {
if (irrecv.decode(&resultados)) { //irrecv.decode(&resultados) devuelve verdadero si algo esta sinedo recibido, y almacena esta informacion en la variable resultados
int value = resultados.value;
if (value==20655){ //boton de encendido en el control
servo_azul.write(0);
}
else if (value==4335){ //boton de apagado en el control
servo_azul.write(90);
}
irrecv.resume();
}
}
Hola. Soy nuevo en el foro y en arduino.
El código anterior me funciona bien en tinkercad (adjunto imagen) pero al llevarlo al arduino real no me funciona. ¿qué podría estar mal?
Cosas que verifiqué que están correctas:
El servomotor funciona con el código predeterminado de tinkercad.
Verifiqué mediante un serial con otro programa, el boton 7 y 8 de mi control remoto.
pd: Un detalle. En el tinkercad, al activar la simulación, el servomotor tirita. ¿Esto es normal? Sin saber mucho de arduino aún, me parece que el código que puse si bien funciona, está algo forzado...
Gracias.
Por lo general, un servo necesita más potencia de la que puede proporcionar un Arduino. Desafortunadamente, hay muchos ejemplos en la red que sugieren lo contrario, pero la energía es el problema más común que tienen las personas cuando intentan trabajar con servos.
El servo si funciona con los 5V del arduino. Ya lo probé con el programa predeterminado de tinkercad (el que lo hace girar de 0 a 90 grados y viceversa).
Con el control remoto no me funciona...
Lo que hagas en un simulador es un buen comienzo pero no deja de ser una situación donde las cuestiones físicas no siempre estan totalmente contempladas.
Hay muchos servos que requieren mas corriente de la que el Arduino puede proveer
Entonces usa una fuente de 5V externa que entregue 1.5A y con eso estarás cubierto. Alimenta el VCC del servo con esos 5V y comparte el GND con el Arduino. Une el gnd del Servo a ese GND común y comanda con el pin de arduino al servo.
Arduino solo hará el control y lo demas va por cuenta de la fuente adecuada.
Hola @hik999 he probado tu montaje y codigo con un servo sg90, que consume poco, y todo funciona correctamente.
Solo hay una cosa que no me cuadra de tu montaje. Estas alimentando el receptor IR con 3,3v yo lo alimennto con 5V, Revisa la hoja de datos del receptor. No estaria de mas que pusieras un enlace al sensor y al servo para saber exactamente con que datos estas trabajando.
Saludos.
PD: Obiamente en El if de comparacion he puesto los codigos que manda mi mando, comprueba que los tuyos son los correctos.
Este es mi circuito y el código que le cargo con el programa arduino.cc es
//libreria de control remoto
#include <IRremote.h>
#include <Servo.h>
//declaracion de variables
Servo servo_azul;
int receptor = 11;
//IRrecv irrecv(receptor);
IRrecv irrecv(receptor);
decode_results resultados;
void setup()
{
servo_azul.attach(8, 500, 2500);
irrecv.enableIRIn(); //activa el receptor
}
void loop() {
if (irrecv.decode(&resultados)) { //irrecv.decode(&resultados) devuelve verdadero si algo esta sinedo recibido, y almacena esta informacion en la variable resultados
int value = resultados.value;
if (value==16728765){ //boton de encendido en el control
servo_azul.write(0);
}
else if (value==16730805){ //boton de apagado en el control
servo_azul.write(90);
}
irrecv.resume();
}
}
para saber el boton 7 y 8 de mi control remoto use este código:
#include <IRremote.h>
int IRpin = 11;
IRrecv irrecv(IRpin);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, DEC); // Print the Serial 'results.value'
irrecv.resume(); // Receive the next value
}
}
adjunto imagen del codigo para saber el boton 7 y 8 mediante el monitor de serie (al apretar el boton 7 y 8 aparecen esos numeros)
pd: En el simulador le puse 3.5 V al Ir pero en la realidad siempre usé 5 V para el IR y 5 V para el servomotor como se puede ver en la imagen de mi circuito (mi arduino tiene dos fuentes de voltaje de 5V y una de 3.5 V)
¿Será porque mi arduino es al parecer falso? (lo digo por el color azul, los originales son de color verde al parecer) Aunque no creo que sea esto, ya que probé con otro código y logré que mi circuito funcionara (puedo mover el servomotor de -360 a 360 grados) pero me gustaría hacerlo con mi código (el cual me parece más simple del que encontré).
Consideren que estoy aprendiendo recién arduino, por eso me interesa hacer funcionar el código que escribí pues tiene lo mínimo necesario para poder entender esto de arduino. Por lo que vi a alguien ya le funcionó pero a mi no.
pd 2: La señal de servomotor en mi circuito real aparece en el pin9 pero en el código sale pin8. No considerar esto, pues en mi circuito el servomotor está en el pin8 (el correcto). (Lo había cambiado anteriormente)
Antes de mirar codigos me da miedo como has conectado el sensor ir, asi , sin mas al arduino. No se como no has quemado algo. debes utilizar un circuito como este
El patillaje del sensor es el siguiente:
Con este montaje te debería funcionar correctisimamente.
No obstante parece que asi "a pelo" te funciona, pero esos valores son altisimos obtenlos con el propio programa con que vas a manejar los servos.
//libreria de control remoto
#include <IRremote.h>
#include <Servo.h>
//declaracion de variables
Servo servo_azul;
int receptor = 11;
//IRrecv irrecv(receptor);
IRrecv irrecv(receptor);
decode_results resultados;
void setup()
{
servo_azul.attach(8, 500, 2500);
irrecv.enableIRIn(); //activa el receptor
Serial.begin (9600);
}
void loop() {
if (irrecv.decode(&resultados)) { //irrecv.decode(&resultados) devuelve verdadero si algo esta sinedo recibido, y almacena esta informacion en la variable resultados
int value = resultados.value;
Serial.println (value);
if (value == 4335) { //boton de encendido en el control
servo_azul.write(0);
}
else if (value == 14535) { //boton de apagado en el control
servo_azul.write(90);
}
irrecv.resume();
}
}
Este codigo funciona moviendo el servo correctamente y mostrandoel valor del boton en el monitor serial.
No me funcionó tu código. El problema debe ser de otra índole. Adjunto imagen de que tu código funciona bien en el monitor serie. Pero no logro mover el servomotor. (Arreglaré mi circuito para que no se queme) (Cambié el pin del servomotor al pin 0) El motivo del porque cambié al pin 0 es que el pin8 no funciona bien (quizás se dañó por lo mismo que dices) pues con el pin8 el monitor serie se vuelve loco y da números al azar. En el pin 0 todo bien pero sigue sin moverse el servomotor.
Tienes toda la razon @Surbyte y si use ese servo era porque no tenia otro a mano, y recomiendo a @hik999 tenga en cuenta lo dicho por ti en el post #4, ya que si pretende usar mas servos solo podra usar tres con 4 ya el arduino se vuelve loco.
Saludos.
El pin 0 no lo puedes usar ,primero porque esta ocupado por el chip de comunicaciones USB y segundo no es un pin PWM ,solo puedes usar para el servo motor los pines marcados con el simbolo " ~ ". Y me acabo de dar cuenta antes usabas el pin 8 que tampoco te sirve porque no es capaz de dar una señal PWM. Solo puedes usar los pines 3, 5, 6, 9, 10, y 11.
¿Y porque me funciono a mi en el 8?.debeser por la sentencia
servo_azul.attach(8, 500, 2500);
Mañana me estudiare que significan esos 500 y 2500 yo nunca los use.
Buenas noches.
Tienes razón. Acabo de cambiarlo al pin 3 y funciona!
Pero una duda. El monitor serie lanza numeros al azar en cada instante. Es esto normal?
Adjunto imagen
A mi no me ocurre, pero yo estoy usando el sensor en un modulo cuyo circuito te mostre antes, tal como lo tienes no me extrañaria que la señal que te esta dando sea inestable y el sensor este engañando a la libreria.
Efectivamente C1 y C2 son condensadores y sirven para filtrar interferencias en la alimentación del sensor.
Esa imagen te muestra el sensor de frente, de lado y de atras, sus dimensiones y disposición de pines.
VS1838 es el modelo del sensor que también lo puedes encontrar como TL1838. El que tienes, probablemente genérico, es también 1838 tal como está estampado en la cara superior (se ve en la foto que subiste).