muy buenas, tengo un modulo de 8 reles, un arduino uno y un pcf8574n, la cuestion es que necesito que el integrado se deje controlar por el arduino para controlar los reles, pero no hay manera, estoy totalmente perdido en cuanto al codigo, direccion i2c (a0, a1 y a2 estan conectadas a gnd) creo que las conexiones estan bien hechas, pero como solo encuentro ejemplos de como controlar leds con ese integrado pues no se si lo estoy haciendo bien o no.
estoy haciendo pruebas con dos botones y (creo que he invocado a satan al teclear ese codigo) he "adaptado" el ejemplo button para que me active, o eso quiero, dos de los reles (uno cada boton) por cosas de probar e ir aprendiendo que instrucciones necesito para hacer que arduino mueva estos reles... unos iran temporizados, otros controlados por boyas de nivel (que no deja de ser un boton) y otros por temperatura, pero claro, si no me aclaro con esto como narices voy a hacer que haga lo demas.....
espero que me podais ayudar.... que estoy mas perdio que la martirios....
debo ponerle alguna resistencia pull up, pull down, alguna de 10k, algun condensador... en alguna patilla o parte del circuito??? es que, como repito, no he visto que haya que hacer nada por el estilo en los ejemplos que google o esta pagina me han mostrado, pero aun asi hay veces que, viendo algun datasheet del mismo, si que he visto que se le ponen cosas de este tipo....
hay que poner resistencias pull up (4,7k ohm) en sca y scl??? pues lo probare esta tarde.... porque eso puede que sea el motivo por el que mi reloj rtc i2c me da una fecha y hora tal que 2165/165/165 165:165:84..... desde luego el no ya lo tengo.....
probare eso y me leere atentamente el enlace que me has puesto.
El PCF8574 y PCF8574A son versiones que difieren sólo en su dirección Slave, como se
muestra más abajo, en la Fig. 9. la única diferencia es la dirección del dispositivo.
El PCF8574P tiene una dirección a partir de b0100 0000 (0x20h), el PCF8574AP tiene una
dirección a partir de b0111 0000 (0x38h). No obstante, esto no afecta en absoluto al modo en que
funciona el dispositivo, a menos que tenga más de 8 de estos dispositivos.
El I2C utiliza las direcciones de 7 bits + 1 bit de control que corresponden a los 7 bits (MSB) más
significativos, el bit 0 lo genera la misma orden de lectura/escritura. La dirección b0100
0000, en realidad es 0x40h y para la versión PCF8574AP, la dirección b0111 0000 es en realidad
0x70h.
aqui tienes un ejemplo con una tabla de valores segun los bit direccionados.
si con ponerlos a GND o +5 cambias la direcion base, todos a GND es la direcion base, si tenes mas de 1 dispositivo u otro dispositivo que comunique con I2C, que tenga la misma direccion debes cambiar la direcion de alguno para que no escuche/transmita a la vez.
Los puertos SPI en cambio tienen una linea CS (chip select) que les dice cuando debe escuchar/transmitir en cambio en I2C todos escuchan y uno solo responde
vale, entonces cuando leo que la direccion en hexadecimal es 20, le pongo 0x20 y listo.... (para alcararme yo....)
ahora, aunque no deberia ponerlo aqui.... ahorro tiempo ya que esta el hilo abierto:
que pongo en Wire.beginTransmission(); ? se que tengo que ponerle algo (supongo que algun numero decimal que luego arduino traducira a binario para pasarlo al pcf por i2c.... pero no estoy seguro)
cuando le damos la orden Wire.write (o send) (); que valor pongo? (0 y 1 para dar encendido o apagado?);
y en Wire.endTransmission(); eso lo dejo tal cual porque es para que el pcf sepa que ya se ha terminado la transmision no?
para volver el pin que he querido cambiar de estado, pongamos que con las instrucciones de antes he querido excitar el pin p3 pero que ya ha hecho lo que se supone debia hacer, es necesario otras tres lineas de codigo para modificar su estado o con el endtransmission eso ya se da el por aludido y cambia el estado a como estaba???
buf.... a ver si por lo menos desenredo con esto y ya (salvo porque no atino a hacerle un scrolldown al lcd) medio controlaria dos cosas del arduino, el lcd y los reles... ya es algo mira...
revisa el ejemplo y la documentacion que te pase, debes empezar la transmision, enviar el dato y terminar para que sea valido, y si lo desea verificar si se cumplio
bueno... ya he avanzado algo.... el pcf8574n resulta que si obedece por i2c (con sus respectivas pullups) al ardunio, toma fiesta!
el tema es que en las patillas de salida cuando tengo puesta la masa comun (y si la quito no van los reles....) da un voltio y poco y si le quito esa masa comun da los 5.32v que es capaz de sumisntrar el cargador de movil sony ericsson que da hasta 700ma.... debo revisar algun cable desde el pcf al modulo de reles??? ahora mismo van los 8 hilos de los reles, un pisitivo y una masa.... y los dos pines unidos por un jumper que puedo quitar entre com y gnd.....
probando he visto que los cables estan todos bien, si quito la masa comun y "puenteo" la masa de un solo circuito de rele me pasa lo mismo, se enciende debilmente el led de dicho rele (lo que indica que esta activado si hubiera bastante potencia) pero el voltaje de la patilla del pcf solo da voltio y pico... ahora bien a circuito abierto si da los 5 voltios.....
que transistor o cosa de la manera me aconsejais para poder mandar los 5 voltios y activar los reles asi bien?????
espera un poco, antes de quemar todo.
el pcf no maneja corriente para activar un rele, debes poner un transistor y diodos para no quemar todo.
haz un diagrama de como tienes conectado y pasalo por aqui
el jumper verde es para la masa comun, y esta conectado pues vcc y gnd a 5v y masa respectivamente y las ootras 8 patillas van una a cada salida del pcf y cuando le digo a este que active un rele pues el led del rele en cuestion se enciende debilmente y ya esta, yo lo miro, el me mira y ahi se queda todo....
bien ahora entiendo, el modulo va a necesitar otra fuente de energia un poco mas potente, si usas el usb para alimentar está limitado, por eso el tema de la masa comun o no.
prueba alimentar x usb arduino y el pcf, poner en masa no comun con otra fuente de 5v pero de al menos 1A.
Si usas en modo comun despues de programar arduino retiras el cable y alimentas todo con la misma fuente externa. Puedes usar una fuente de PC o un 7805 montado en el protoboard.
ahora mismo, esta asi, quiero decir, el arduino uno esta pinchado al usb y ademas alimentado por un cargador de movil de 700ma al que tengo pinchada la placa de reles y el pcf, (vamos todo), bueno, como entra dentro de mis planes pues me adelantare y preparare la fuente de pc que tengo para alimentar todo.... total en stand by ya me da 5v a 2a...... a ver si por ahi pita la cosa....
el pcf debe estar alimentado por la misma fuente si no unes gnd de todas las fuentes no vas a tener una referencia comun para que la señal de arduino la entienda el pcf.
Programa el arduino y alimenta todo el circuito y arduino con una sola fuente.
a lo mejor llega un poco tarde, pero estube en la misma situacion, mi problema al principio fue la masa que no era comun con el arduino, me di cuenta rapido, pero depues iba cuando queria, eso fue por no poner a masa las patillas de la direccion, una vez solucionado y funcionando me hice una libreria, aun falta algunos retoques para mejorar, pero funciona perfectamente.
si a alguien le interesa me gustaria que otros la probasen para eliminar posibles problemas, asi que podeis pedirmela por privado sin ningun problema.
en teoria se puede configurar si los reles se activan a nivel alto o bajo, y la direccion del pcf, lo de la direccion realmente no lo probo porque tal como hice la placa esta algo dificil cambiarla comodamente.
un ejemplo de uso por si alguien le interesa
#include "Wire.h" #include "relay.h"
relay rele(0, 0x20);
void setup()
{
rele.on(0); // 0 es la direccion para todos los reles
delay(500);
rele.off(0);
rele.on(1);
}