que interfaz puedo construir para conectar un sensor que tiene salida entre 0 y 5v a un arduino stalker, cuyas entradas soportan 3.3v, tratando de no perder sensibilidad.
Alguien ha trabajado con el Stalker???, para poder compratir información??...yo estoy comenzando un proyecto que incluye el Stalker y nodos de sensores inalambricos.
En el caso del dispositivo ofrecido por pololu, me serviria en el caso que necesitara elevar el nivel del voltaje, creo que por ahora la solución más eficiente y eficaz es la sugerida por SrDonGato.
El Stalker trae incluidos en la placa un RTC y un sensor de temperatura TMP102, entre otras caracteristicas / defectos....estoy comenzando a trabajar con él, ire posteando los avances, y si alguien puede ayudarme a superar las dificultades, mejor aun.
Hago esto porque la información referente a esta placa esta demasiado dispersa en la web.
Si alguien tiene un Stalker, y el programa que dan de ejemplo no les modifica la fecha....
Así lo solucioné mientras esperaba que me respondieran de Seeedstudio, no sé si será una solución definitiva...pero funciona:
#include <avr/sleep.h>
#include "tmp102.h"
#include "TF.h"
#include "Battery.h"
#include "RX8025.h"
#include <Wire.h>
#include <Fat16.h>
#include <Fat16util.h> // use functions to print strings from flash memory
//**************************************
float convertedtemp; /* We then need to multiply our two bytes by a scaling factor, mentioned in the datasheet. */
int tmp102_val; /* an int is capable of storing two bytes, this is where we "chuck" the two bytes together. */
char name[] = "data.log";/* file name in TF card root dir */
unsigned int bat_read;//analog read battery voltage
float bat_voltage;//battery voltage
unsigned char charge_status;//battery charge status
unsigned char hour=0;
unsigned char minute=0;
unsigned char second=0;
unsigned char week=0;
unsigned char year=0;
unsigned char month=0;
unsigned char date=0;
unsigned char RX8025_time[7]={0x00,0x54,0x09,0x03,0x10,0x11,0x10} //ESTA LÍNEA ESTABA MAL DEFINIDA.
};
//======================================
void setup(void)
{
Serial.begin(38400);
RX8025_init();
setRtcTime();// AGREGAN ESTA LÍNEA SÓLO UNA VEZ, PARA SETEAR LA FECHA, LUEGO LA COMENTAN, DE LO CONTRARIO CADA VEZ QUE HAGAN EL SETUP(), LES VA A CARGAR LA FECHA DEFINIDA EN "RX8025_time[7]".
TF_card_init();
tmp102_init();
Battery_init();
pinMode(8,OUTPUT);//LED pin set to OUTPUT
pinMode(5,OUTPUT);//Bee power control pin
}
//======================================
void loop(void)
{
digitalWrite(8,HIGH);//LED pin set to OUTPUT
getTemp102();
Battery_charge_status();
Battery_voltage_read();
getRtcTime();
write_data_to_TF();
digitalWrite(8,LOW);
//debug data
print_RX8025_time();
print_tmp102_data();
print_Battery_data();
Serial.println("--------------next--data---------------");
Serial_Command();
Serial.println();
delay(2000);
}
//=================================
void print_tmp102_data(void)
{
Serial.print("tep102_temperature = ");
Serial.println(convertedtemp);
}
//==================================
void print_Battery_data(void)
{
switch (charge_status)
{
case 0x01:
{
Serial.print("CH_sleeping");
break;
}
case 0x02:
{
Serial.print("CH_complete");
break;
}
case 0x04:
{
Serial.print("CH_charging");
break;
}
case 0x08:
{
Serial.print("CH_bat_not_exist");
break;
}
}
Serial.print(" battery voltage = ");
Serial.println(bat_voltage);
}
//==============================================
void print_RX8025_time(void)
{
Serial.print(year,DEC);
Serial.print("/");
Serial.print(month,DEC);
Serial.print("/");
Serial.print(date,DEC);
switch(week)
{
case 0x00:
{
Serial.print("/Sunday ");
break;
}
case 0x01:
{
Serial.print("/Monday ");
break;
}
case 0x02:
{
Serial.print("/Tuesday ");
break;
}
case 0x03:
{
Serial.print("/Wednesday ");
break;
}
case 0x04:
{
Serial.print("/Thursday ");
break;
}
case 0x05:
{
Serial.print("/Friday ");
break;
}
case 0x06:
{
Serial.print("/Saturday ");
break;
}
}
Serial.print(hour,DEC);
Serial.print(":");
Serial.print(minute,DEC);
Serial.print(":");
Serial.println(second,DEC);
}
//======================================
void Serial_Command(void)
{
if(Serial.available()==3)
{
if(Serial.read()=='c')
{
if(Serial.read()=='c')
{
if(Serial.read()=='c')
{
Serial.println("Got Serial data");
}
}
}
}
else
{
Serial.flush();
}
}
Lo de la línea del setRtcTime();, tambíen se puede hacer en el RX8025.cpp.
La respuesta depende de como tengas alimentados los dos dispositivos. Se alimentan ambos de la misma fuente? Tiene cada uno una fuente separada, e.d. 3.3V y 5V? Y también depende de si son bidireccionales o unidireccionales.
La solución al problema. Depende de si son unidireccionales, bidireccionales... Por ejemplo, el I2C tendría una solución mientras que si la salida es de 3.3v y la entrada es de 5V tiene otra. Por otro lado esta como se alimenta, puedes derivar la fuente de 3.3V con una de 5V o viceversa.
Claro, entiendo.
Uno de los casos es: comunicación unidireccional desde el sensor hacie el micro. El sensor tiene una salida análoga que va desde los 0v a 5v.
Al parecer la forma más económica y eficiente es un divisor de tensión.
Para ser exhaustivos voy a intentar resumir algunas ideas:
Todas estas hipótesis parte de que tienes una fuente que te suministra 5V a un bloque del circuito y una de 3.3V a otra. Porque lo que está claro es que alimentar un dispositivo de 3,3V a 5V es muy, muy probable que se "chamusque".
Entrada 5V - Salida 3.3V:
La mayor parte de los ICs toleran tranquilamente estos niveles e interpretan correctamente un nivel lógico inferior en sus entradas. En este caso, no habría ningún problema.
Entrada de 3.3V - Salida 5V:
Este es el caso más interesante en el sentido que "depende" (una respuesta muy gallega) de los diodos de protección que pueda tener el IC en la entrada. La mayor parte de los ICs soportan en sus entrada tensiones por encima de su alimentación. Simplemente añadiendo una resistencia en serie (limitar la corriente) sería suficiente para que funcionasen (habría que leer el "datasheet" del componente y ver su tolerancias). Alternativamente, siempre está el socorrido divisor de tensión. Por ejemplo, yo he enchufado una linea de 240V AC a un PIC con una resistencia de 2MOhms en serie para hacer un detector de paso por cero (ojo, con una fuente que no estaba separada galvánicamente) y los diodos han hecho bien su trabajo.
Bidireccional segura:
Usar un IC que haga estas conversiones por tí - HCF40109, SN741VC425, MAX3000 - por nombrar alguno y no son extremadamente baratos.
El esquema de la imagen es un circuito muy curioso, no me lo he inventado yo es de Herman Schutte de Philips y la ventaja que tiene es que; al usar un MOSFET puede funcionar con un rango muy amplio de voltajes y tienes resuelto el problema por unos cuantos céntimos.
Las resistencias sólo te harán falta si las líneas tienen el colector abierto.
Muchas gracias por la explicación fm, veré si encuentro ese mosfet por estos lados.
Por otro lado, estuve viendo en el foro que trabajaste en una librería para Arduino, y te queria preguntar si alguna vez has trabajado con librerias para RTC???, esta placa tiene integrado el RX8025, pero la libreria con la que trabajo no cuenta con herramientas para establecer una alarma en el RTC, para despertar al arduino en un dia/mes/año hora específico.
Hola Alcafuz,
Un solo comentario con respecto a mi respuesta, solo es valida para entradas salidas digitales, para entradas analógicas utiliza un divisor de tensión.
Con RTCs no he hecho nada para Arduino. Siento mucho no poder ayudarte. Puedes preguntar en el foro, es muy seguro que hay gente que ha trabajado con ello. Un saludo.
Ok fm, muchas gracias por la ayuda...seguiré buscando info.
Para los que usen el Stalker V2.b, la versión con el supercap,(si es que hay alguien :D), antes de que el RTC comience a darles problemas, como por ejemplo espontáneamente poner en la hora y fecha sólo ceros....hay un error de diseño y se soluciona conectando dos resistencias de 10k entre 3.3v y SDA y SCL respectivamente.
Subo también las librerías actualizadas, que por alguna razón que desconozco, no estan en la página en que se vende el producto, si no que solamente en el foro.