TODOPIC
Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: humberto 02 en 10 de Junio de 2021, 16:40:13
-
Buenas Tardes
Introducción:
Necesitaba enviar una señal inalámbrica y pensé en hacer dos interfaces para que me queden en futuras pruebas.
Además creí oportuno cambiar la librería Virtualwire.h por la RadioHead.h.
Todos los ejercicios (propuestos en la Web) tienen un pequeño error en el cual muchas personas expresaron que habían fracasado sus intentos con la librería de RadioHead.h .
Esto fue lo que me hizo intentar hacer el cambio de una librería por otra. Finalmente encontré el problema (y como siempre) quise dejar documentada la solución.
El problema radicaba en dos puntos.
1- Declarar en el Sketch previamente las variables: uint8_t delaycounts; y char message;
2- Remplazar la línea RH_ASK driver; por RH_ASK driver(2000, 11, 12); // 200bps, TX, RX
Conclusión:
Al compilar los Sketch’s existentes en la nube notaremos varios errores de compilación; pero si hacemos estos remplazos notaremos que la compilación será Exitosa; logrando Transmitir y Recibir sin ningún problema.
Link en los cuales obtener el material necesario para poder trabajar con la Librería RadioHead.
Apunte práctico de la librería:
https://www.gme.cz/data/attachments/dsh.772-146.1.pdf
Explicación detallada de la Librería:
https://www.airspayce.com/mikem/arduino/RadioHead/
Librería para Descargar:
https://electronoobs.com/eng_arduino_RadioHead.php
Resumen de los Sketch
EMISOR / TRANSMISOR
#include <RH_ASK.h>
#include <SPI.h> // No se usa pero es necesario compilarlo
uint8_t delaycounts;
char message;
//RH_ASK driver;
RH_ASK driver(200, 11, 12); // 200bps, TX en D3 (pin 2), RX en D4 (pin 3)
void setup() {
Serial.begin(9600);
pinMode(12,OUTPUT);
pinMode(11,INPUT);
pinMode(3,OUTPUT); digitalWrite(3,HIGH); // Activo nPn
if (!driver.init())
Serial.println("(init) Fallo la INICIALIZACION");
}
void loop() {
const char *msg = "Hola Tito!";
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
Serial.println(msg);
delay(2500);
}
RECEPTOR
#include <RH_ASK.h>
#include <SPI.h> // No se usa pero es necesario compilar
uint8_t delaycounts;
char message;
int k=0; // Contador de mensajes recibidos
//RH_ASK driver;
RH_ASK driver(200, 11, 12); // 200bps, TX en D3 (pin 2), RX en D4 (pin 3)
void setup(){
Serial.begin(9600); // Solo depuracion
pinMode(12,OUTPUT);
pinMode(11,INPUT);
if (!driver.init())
Serial.println("(init) Fallo la INICIALIZACION");
Serial.println("Comienzo Recepcion");
}
void loop() {
uint8_t buf[12];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen)) {
// Se recibe un mensaje con una buena suma de comprobacion, volcarlo.
Serial.print("Mensaje: ");
Serial.print((char*)buf);
Serial.println(k++);
}
}
Les deseo lo mejor y un cordial saludo desde Gualeguaychú.
-
Estoy empezando con Arduino y sus variantes. Me interesa sobretodo el tema de domotica, comunicación e interfaces de usuario.
Voy a jugar un poco con esa librería y ver de hacer algo practico.
¿Tu hiciste algo a nivel practico, que módulos de radio utilizaste?.
Saludos.
-
Hola AcoranTf un gusto conocerte.
Si (las comunicaciones inalambricas) desde muy pequeño han despertado muchisima curiosidad. Desde que entró en casa el Primer Televisor Zenith Blanco y Negro con Control Remoto (año 1969). Mi pasión era comprender como lograba apretar una tecla y ver como giraba el selector de canales.
Pero volviendo a tu pregunta. He trabajado con excelentes resultados con todos los módulos disponibles en nuestro mercado. (bluetooth HC05, nRF24L01, RF433MHz y el RF315MHz (con C. Remoto).
Solo puedo decirte que todos los arriba mencionados me han dejado EXCELENTES experiencias. Cada uno de ellos; son módulos Robustos y de muy buenos resultados.
Pero eso si; es fundamental aclararte. Que para estar satisfechos con cada uno. Es necesario trabajar muchas horas encima y conocerlos muy bien. Todo lo que veas y te cuenten en la Web se limitan a pura zanata basada en ejemplos básicos. Pero no profundos para lograr sacarles LO MEJOR de cada uno.
*Es necesario tomar un protoboard con buenos cables de conexión donde anules ruidos y malas conexiones.
*Es necesario alimentarlos con la correspondiente Tensión y Corriente buscando una "armonia" en su alimentación y apoyado de un Condensador (como el caso del nRF24L01).
Y yo te doy mi palabra que descubriras en cada uno de ellos una SORPRENDENTE respuesta. Y así comprobarás que nada de lo que muestra la Web lo dicen o mencionan.
Y por sobre todas las cosas. Ese módulo de "dos pesos" que todos "subestiman por su costo" He logrado atravesar 7, (siete). Si como lees. (SIETE) paredes de 0,30cm y 0,15cm de espesor recibiendo la trama de datos "PERFECTAMENTE" y sin perder señal. Me estoy refiriendo al RF433MHz. Los que dicen que no supera los 30cm entre emisor y receptor NO TIENEN idea alguna de como sacarle el mayor provecho al módulo.
Claro está; que cada uno de ellos, responderá de acuerdo a tus necesidades especificas. Pero si supiste interpretar mis comentarios verás que cada uno terminan siendo una maravilla.
En este momento estoy trabajando sobre una impresora "común" Tonner y un par de Bluetooth(s)
Aqui te dejo otros (por si te interesa) para que veas como hay que estudiarlos para sacarles todo lo mejor que tienen escondidos.
https://www.youtube.com/watch?v=l1GZb6zC_X4 (https://www.youtube.com/watch?v=l1GZb6zC_X4)
https://www.youtube.com/watch?v=iyvw7YN6SuU (https://www.youtube.com/watch?v=iyvw7YN6SuU)
https://www.youtube.com/watch?v=iRSJMm3EgR4&t=6s (https://www.youtube.com/watch?v=iRSJMm3EgR4&t=6s)
https://www.youtube.com/watch?v=CbpPXhU-4-A (https://www.youtube.com/watch?v=CbpPXhU-4-A)
Un cordial saludo y te deseo lo mejor con estos módulos.
-
Hola AcoranTf un gusto conocerte.
Si (las comunicaciones inalambricas) desde muy pequeño han despertado muchisima curiosidad. Desde que entró en casa el Primer Televisor Zenith Blanco y Negro con Control Remoto (año 1969). Mi pasión era comprender como lograba apretar una tecla y ver como giraba el selector de canales.
Ante todo gracias por tu detallada respuesta.
Me ocurre igual, soy curioso por naturaleza y no me basta poner en marcha algun cacharrito, porque lo describen en la web y ya. Necesito comprender que es lo que hice y porque y como funciona.
Pero volviendo a tu pregunta. He trabajado con excelentes resultados con todos los módulos disponibles en nuestro mercado. (bluetooth HC05, nRF24L01, RF433MHz y el RF315MHz (con C. Remoto).
Solo puedo decirte que todos los arriba mencionados me han dejado EXCELENTES experiencias. Cada uno de ellos; son módulos Robustos y de muy buenos resultados.
Totalmente de acuerdo, yo tambien he jugado con algunos y los resultados a poco que te esmeres, son muy alentadores.
Pero eso si; es fundamental aclararte. Que para estar satisfechos con cada uno. Es necesario trabajar muchas horas encima y conocerlos muy bien. Todo lo que veas y te cuenten en la Web se limitan a pura zanata basada en ejemplos básicos. Pero no profundos para lograr sacarles LO MEJOR de cada uno.
*Es necesario tomar un protoboard con buenos cables de conexión donde anules ruidos y malas conexiones.
*Es necesario alimentarlos con la correspondiente Tensión y Corriente buscando una "armonia" en su alimentación y apoyado de un Condensador (como el caso del nRF24L01).
Y yo te doy mi palabra que descubriras en cada uno de ellos una SORPRENDENTE respuesta. Y así comprobarás que nada de lo que muestra la Web lo dicen o mencionan.
Y por sobre todas las cosas. Ese módulo de "dos pesos" que todos "subestiman por su costo" He logrado atravesar 7, (siete). Si como lees. (SIETE) paredes de 0,30cm y 0,15cm de espesor recibiendo la trama de datos "PERFECTAMENTE" y sin perder señal. Me estoy refiriendo al RF433MHz. Los que dicen que no supera los 30cm entre emisor y receptor NO TIENEN idea alguna de como sacarle el mayor provecho al módulo.
Claro está; que cada uno de ellos, responderá de acuerdo a tus necesidades especificas. Pero si supiste interpretar mis comentarios verás que cada uno terminan siendo una maravilla.
Yo solo he realizado algunas pruebas con el modulo receptor, extraido de una alarma vieja y varios emisores de alarmas, coche, etc.
El resultado es bueno y funciona perfectamente.
El modulo receptor de RF tiene dos salidas, una digital pero con el inconveniente de no tener "squelch" o silenciador cuando no esta recibiendo, por lo que siempre hay ruido en la salida y vuelve loco al Arduino. La otra salida es analogica, de las llamadas "raw", o sea en bruto y al igual que la digital no tiene squelch, pero dado que tiene un nivel de continua muy bajo y sobre ella la modulacion digital, le hice un adaptador de niveles con un 74HC132, que es una cuadruple puerta NAND con disparador Smith y quedo perfecto.
En este momento estoy trabajando sobre una impresora "común" Tonner y un par de Bluetooth(s)
Aqui te dejo otros (por si te interesa) para que veas como hay que estudiarlos para sacarles todo lo mejor que tienen escondidos.
Gracias, le echare un vistazo a esos enlaces.
https://www.youtube.com/watch?v=l1GZb6zC_X4 (https://www.youtube.com/watch?v=l1GZb6zC_X4)
https://www.youtube.com/watch?v=iyvw7YN6SuU (https://www.youtube.com/watch?v=iyvw7YN6SuU)
https://www.youtube.com/watch?v=iRSJMm3EgR4&t=6s (https://www.youtube.com/watch?v=iRSJMm3EgR4&t=6s)
https://www.youtube.com/watch?v=CbpPXhU-4-A (https://www.youtube.com/watch?v=CbpPXhU-4-A)
Un cordial saludo y te deseo lo mejor con estos módulos.
Saludos.
-
Buenos Días Aco
El modulo receptor de RF tiene dos salidas, una digital pero con el inconveniente de no tener "squelch" o silenciador cuando no esta recibiendo, por lo que siempre hay ruido en la salida y vuelve loco al Arduino
Hablar de “comunicaciones” inalámbricas. Requieren y necesitan tomar una clara postura (con estos módulos).
Porque si no está claro este punto. Tendrán razón todos aquellos que dicen: “Ha él modulito chino ese… si, si anda bien para hacer alguna cosilla”.
Luego de alcanzar la experiencia y “sabiduría” en nuestro protoboard; debemos darle paso a nuestro “merecido por cierto” Datasheet y Osciloscopio; logrando (de este modo) la perfección de esa señal. Buscando así el equilibrio justo por medio de un simple condensador o resistencia. Llegando a revivir toda la sabiduría que Kirchooff nos legara. Pero claro eso significa MUCHAS horas sobre el “modulito chino ese”.
En mi opinión personal veo tres pautas que has obviado; pero me voy por la más rápida. Tu INPUT DATA debe ir “directamente” al pin D2, D3 de Interrupción de tu Arduino con una acabada y clara función que reciba tu trama. De este modo podrás comprobar que tu Arduino no se enloquece.
Te deseo lo mejor y un cordial saludo.
-
Creo que no me entendiste.
Tengo osciloscopio y por tanto lo primero que hice fue analizar ambas salidas.
La salida digital, que supongo incluye un integrador, en ausencia de señal en antena, presenta pulsos aleatoriamente, con niveles TTL. Por tanto no puedo hacer nada para evitar que disparen permanentemente la interrupción del Arduino y lo vuelvan loco. Quizas discriminando por software secuencias de impulsos no válidas, pero no lo veo la mejor opción, ya que mantendria ocupado el microcontrolador un tiempo que seguro necesitaré para otras tareas.
Por contra, con el integrador externo, (74HC132), solo se produce una interrupción cuando realmente se recibe un codigo y por tanto el funcionamiento es optimo.
Por cierto la entrada de datos a Arduino, está en el pin 2.
Saludos.
-
B. Días Aco
Emm. En esta no tengo argumentos, jamás sometí a estos módulos al Osciloscopio. Todos mis comentarios y referencias estan basados en los resultados obtenidos (de mis propias experiencias y resultados).
Probablemente aparezca otro lector que pueda intervenir en el hilo e intercambiar resultados desde los aparatos de medición.
Cordial saludo, buena semana para todos.
-
Hola buenas tardes a todos, un gusto de comunicarme con Uds.
No estoy seguro, por ser nuevo en el foro, si uso el camino correspondiente (si no es así disculpen) .
Soy nuevo en el tema de Arduino y todo su entorno, agradezco que me aclaren dudas que tengo y si es posibles ejemplos.
Intento mandar una señal digital (de un pulsador) y una analógica (de un potenciómetro) desde un arduino Mega (que estará el emisor), a un arduino Pro micro, (que estará el receptor) usando módulo receptor inalámbrico RF de 433 MHz. La distancia no superara los 6 metros.
Desde ya le agradezco.
Gracias.
Saludos.
-
Hola buenas tardes a todos, un gusto de comunicarme con Uds.
No estoy seguro, por ser nuevo en el foro, si uso el camino correspondiente (si no es así disculpen) .
Soy nuevo en el tema de Arduino y todo su entorno, agradezco que me aclaren dudas que tengo y si es posibles ejemplos.
Intento mandar una señal digital (de un pulsador) y una analógica (de un potenciómetro) desde un arduino Mega (que estará el emisor), a un arduino Pro micro, (que estará el receptor) usando módulo receptor inalámbrico RF de 433 MHz. La distancia no superara los 6 metros.
Desde ya le agradezco.
Gracias.
Saludos.
Que tal Miguel 55,
Bienvenido al foro. ¿cuál es tu duda? Solo mencionas lo que deseas hacer pero no eres puntual en la duda que tienes.
Me imagino que ya has resuelto la parte de la lectura del estado del botón y la conversión analógica-digital del potenciómetro. Si es así ya tienes una parte resuelta. O tienes alguna duda también para esto?
Si pudieras explicarnos un poco más los detalles de tu(s) duda(s), sería excelente.
Saludos,
elreypic.
-
Hola elreypic2 , un gusto, tengo duda de como hacer el sketch de arduino (si tuviera ej para hacerlo) para que se comunique con mis necesidades.
-
Miguel 55,
Hace ya algún tiempo expuseun tema para usar los módulos RF y cómo transmitir datos. Pero en ese caso estoy usando microcontroladores PIC y lenguaje C de CCS. Pero fácilmente puedes trasladarlo arduino.
http://www.todopic.com.ar/foros/index.php?topic=46977.msg393024#msg393024
Espero te sirva.
elreypic.
-
Hola elreypic2, muchas gracias por la cooperación, aclaraciones, recuerda, que soy novato en todo esto (estoy aprendiendo) discúlpame si me equivoco.
1º) leí (Utilizando módulos RF de bajo costo) que me adjuntaste (es una exposición de un técnico nivel alto la tuya) entiendo que para entenderla y razonarla totalmente mi nivel es muy bajo. 2º) Copie los códigos finales, para el transmisor (código C) en un sketch de arduino, y el código final, parte del receptor (código C) en otro sketch. 3º) La libreria que tengo que usar con RF433MHz es la que aparece en los código C, ??? si fuera así donde la descargo !!.
4º) No se como incluir en los sketch tanto la entrada, digital y analógica en el trasmisor (que ira con el Mega 2560) y las correspondiente en el receptor (que ira con el Pro micro).
Adjunto los archivos ino
Gracias.
Un Saludo.
TRANSMISOR.
#include <12F629.h>
#FUSES NOWDT //No Watch Dog Timer Sin temporizador de vigilancia
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT Oscilador RC interno, sin CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading Código no protegido contra lectura
#FUSES NOMCLR //Master Clear pin used for I/O Clavija maestra utilizada para E/S
#FUSES PUT //Power Up Timer Temporizador de encendido
#FUSES BROWNOUT //Reset when brownout detected Reiniciar cuando se detecta una caída de tensión
#FUSES RESERVED //Used to set the reserved FUSE bits Se utiliza para configurar los bits FUSIBLES reservados
#use delay(clock=4000000)
#use rs232(baud=2400,parity=N,xmit=PIN_A1,bits=8,invert,STREAM=RFPORT)
#use rs232(baud=9600,parity=N,xmit=PIN_A4,rcv=PIN_A2,bits=8,invert,STREAM=RS232)
#byte TMR0=0X01
#byte INTCON=0X0B
#bit T0IF=INTCON.2
void SEND_DATA(BYTE txbyte)
{
int i,j,b,me;
b = txbyte;
for (i=0; i<2; i++)
{
me = 0; // manchester encoded txbyte
for (j=0 ; j<4; j++)
{
me >>=2;
if (bit_test(b,0))
me |= 0b01000000; // 1->0
else
me |= 0b10000000; // 0->1
b >>=1;
}
fputc(me,RFPORT);
}
}
void main()
{
int8 i, data_tx[32], lenght;
setup_comparator(NC_NC);
setup_vref(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);
while (1)
{
lenght = 0; //Inicializa la longitud del frame
data_tx[lenght] = fgetc(RS232); //Recibe el primer dato
lenght++; //Incrementa el valor de la longitud del frame
T0IF = 0;
TMR0 = 0;
while (lenght<32 && !T0IF)
{
if (kbhit(RS232))
{
data_tx[lenght] = fgetc(RS232);
lenght++;
T0IF=0;
TMR0=0;
}
}
for (i=0; i<16; i++)
{
fputc(0xF0,RFPORT); //Envia 16 bytes de inicio
}
fputc(0xF8,RFPORT); //Envia bytes de reconocimiento
fputc(0xF8,RFPORT);
fputc(0xFA,RFPORT);
SEND_DATA(lenght); //Envia la longitud de frame
for (i=0; i<lenght; i++)
{
SEND_DATA(data_tx); //Envia los datos
}
}
}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
RESEPTOR.
#include <12F629.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES PUT //Power Up Timer
#FUSES BROWNOUT //Reset when brownout detected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=4000000)
#use rs232(baud=2400,parity=N,rcv=PIN_A1,bits=8,STREAM=RFPORT,invert)
#use rs232(baud=9600,parity=N,xmit=PIN_A0,bits=8,STREAM=RS232,invert)
int8 nib[2], i, dec1, rx_data, lenght, data_rx[32];
BYTE DECODE_DATA(int8 encoded) //decode function for manchester encoded data. This code is working fine. I checked it.
{
int8 enc, dec, pattern, i;
enc = encoded;
dec = 0;
for (i=0; i<4; i++) {
dec >>=1;
pattern = enc & 0b11;
if (pattern == 0b01) // 1
bit_set(dec,3);
else if (pattern == 0b10)
bit_clear(dec,3); // 0
else
return 0xff; // illegal code
enc >>=2;
}
return (dec);
}
void main()
{
setup_comparator(NC_NC);
setup_vref(FALSE);
fprintf(RS232,"RF Link\n\r"); //Envia el mensaje "RF Link"
while (1)
{
do
{
do
{
do
{
rx_data = fgetc(RFPORT); //Recibe el primer dato via RF
} while (rx_data!=0xF8); //Si el dato recibido no es 0XF8, continua recibiendo datos
rx_data = fgetc(RFPORT); //Recibe el segundo dato
} while (rx_data!=0xF8); //Si el dato recibido no es 0XF8, regresa al inicio y espera nuevo dato
rx_data = fgetc(RFPORT); //Recibe el tercer dato
} while (rx_data!= 0xFA); //Si el dato recibido no es 0XFA, regresa al inicio y espera nuevo dato
nib[0] = fgetc(RFPORT); //Recibe la primera parte baja de la longitud del frame a recibir
dec1 = DECODE_DATA(nib[0]); //Decodifica la parte baja de la longitud
nib[1] = fgetc(RFPORT); //Recibe la parte alta de la longitud
lenght = DECODE_DATA(nib[1]); //Decodifica la parte alta de la longitud del frame
lenght<<=4; //Posiciona la parte alta de la longitud
lenght |= dec1; //Ensambla la longitud del frame
for (i=0; i<lenght; i++) //Prepara para recibir los datos via RF
{
nib[0]=fgetc(RFPORT); //Recibe la parte baja del dato
dec1=DECODE_DATA(nib[0]); //Decodifica la parte baja del dato
nib[1]=fgetc(RFPORT); //Recibe la parte alta del dato
data_rx=DECODE_DATA(nib[1]); //Decodifica la parte alta del dato
data_rx<<=4; //Coloca el nible alto en su posicion correcta
data_rx|=dec1; //Ensambla el dato recibido
}
for (i=0;i<lenght;i++) //Prepara para enviar los datos recibidos
{
fputc(data_rx,RS232); //Envia el dato via RS232
}
}
}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
-
Que tal Miguel 55,
Por lo que puedo ver lo que tú requieres es que alguien te proporcione el código a tu medida para el arduino.
Eso no va a pasar aquí en el foro.
Tú necesitas tener algo y apuntar a tu duda en específico.
Mencionas que no sabes ni siquiera leer una entrada digital, por lo que te recomiendo que comiences con eso. Para ello hay multitud de tutoriales y ejemplos, eso es lo básico para un novato como tú lo mencionas. Y por lo tanto querer brincar a una transmisión serial sin tener conocimientos básicos del lenguaje C o del entorno ARDUINO no tiene sentido.
Mi recomendación es que comiences realizando un código sencillo de encender un led cuando presionas un pulsador. Luego puedes hacer una transmisión serial simple, luego realizar la lectura de un potenciómetro usando el ADC y enviar el valor al puerto serial.
Una vez entendido eso, puedes aplicar la técnica que te he compartido. Ahora lo que te he compartido no puede simplemente copiarlo al entorno ARDUINO, porque lo que te compartí es para un microcontrolador PIC y NO para un AVR que es el microcontrolador en un ARDUINO MEGA.
Espero puedas comprender el punto y hagas un pequeño esfuerzo para aprender lo básico desde tu parte.
elreypic.
-
Hola elreypic. comenzare por lo básico.
Gracias.
Saludos.