Se afișează postările cu eticheta receptor. Afișați toate postările
Se afișează postările cu eticheta receptor. Afișați toate postările

miercuri, 13 ianuarie 2016

Module radio NRF24L01

   Avand o pereche de tranceiver-e NRF24L01, adica emitatoare/receptoare, care lucreaza pe frecventa de 2,4GHz, am zis sa fac si eu niste probe de transmitere date si receptie a lor.
   Pinii modulului radio 24L01 vazut de sus sunt:
   Alimentarea maxima este de 3,6V, dar pentru alimentarea de pe placa Arduino se foloseste ramura de +3,3V (uneori pot apare erori de transmisie si trebuie conectat un condensator electrolitic de maxim 10uF catre masa sau mai bine se foloseste o sursa externa).
 Pinii de comanda permit nivele logice de 5V.
   Din multitudinea de informatii de pe net, m-am oprit la articolul Complete Guide for nRF24L01 – 2.4GHz RF Transceiver Module With Arduino scris de Rui Santos, care foloseste libraria RadioHead, despre care puteti citi mai multe la RadioHead Packet Radio library.
   In articol o placa Arduino, conectata la un modul radio NRF24L01, este pe post de client si transmitre un salut, iar alta placa Arduino, conectata la alt modul radio NRF24L01, pe post de server, primeste mesajul si ii raspunde clientului. Schema de conectare este simpla:
   
   Am redesenat si eu cu programul Eagle PCB schema emitatorului, care este aceeasi cu a receptprului:
   Sketch-urile se gasesc in articol, dar si in exemplele din librarie.
   Am facut si eu un filmulet numit trimitere si receptie date radio cu NRF24L01 si Arduino
   Daca apar erori in ecranele de monitorizare seriala a emitatorului sau a receptorului, trebuie pun un condensator de maxim 10uF si minim 6,3V intre pinul 3.3V si GND, pentru a atenua caderile de tensiune, care apar la variatii ale consumului modulului radio, cand emite. Daca nici asa nu se rezolva erori, trebuie sa folositi o sursa externa de alimentare de 3,3..3,6V/min. 0,5A pentru modulul radio.
   In articolul nRF24L01 2.4GHz Radio/Wireless Transceivers How-To se prezinta diverse librarii pentru acest modul radio si cum se conecteaza:
   In articolul RadioLink-Joystick-To-Servos se foloseste un joystick ale carui coordonate sunt transmise de un Arduino Uno conectat la un modul NRF24L01 catre un receptor tot cu NRF24L01 conectat la un Arduino Uno, care controleaza 2 servomotorase.
   Eu am "scos" partea de servomotoare, deoarece vreau sa verific cum sunt transmise datele pe ecranul de monitorizare seriala.
   Un joystick pentru Arduino, arata asa:

   Schema interna a unui joystick de genul asta este:
si consta in 2 semireglabile (potentiometre) conectate fiecare intre +5V si masa GND) si, astfel, pe cursoare VRX si VRY se citeste o tensiune proportionala cu deplasarea axului respectiv. In repau, pe cele 2 curseoare se gaseste jumatate din valoarea tensiunii de alimentare, adica 2,5V. Cand axul este impins maxim in stanga, rezistanta fata de masa (GND) este zero, deci si tensiunea pe cursorul VRX este 0V, daca axul este deplasat maxim la dreapta, rezistenta fata de masa este maxima, deci tensiunea pe cursorul VRX este maxima (5V); la fel, se intampla si pentru impingerea la maxim a axului in fata, tensiunea pe cursorul VRY este maxima (5V), iar daca axul este tras maxim, tensiunea pe cursorul VRY este 0V. In plus, acest joystick are si un buton fara retinere, care face contact la masa, cand este apasat.
   Conform sketch-urilor, schemele de conectare sunt:
- emitator:

- receptor:
   Sketch-urile pentru acest test se gasesc la https://github.com/tehniq3/NRF24L01/tree/master/joystick.
   Cateva çapturi de ecran (print screen-uri):
- joystick in repaus, pe ecranul de monitorizare seriala a emitatorului
joystick in repaus, pe ecranul de monitorizare seriala a receptorului
joystick in repaus, pe ecranul de monitorizare seriala a receptorului
- joystick in jos
 - joystick in sus
 - joystick spre stanga
 - joystick la dreapta:
 - joystick in jos, la dreapta:
 - joystick in jos, la stanga
 - joystick in sus si spre dreapta
 - joystick in sus si spre stanga
   Am facut si un filmulet numit trimitere si receptie date radio cu NRF24L01 si Arduino (2)
  Ulterior, am adaugat si ce incepuse Nouah King, adica starea butonului de pe joystick, iar sketch-urile se gasesc la https://github.com/tehniq3/NRF24L01/tree/master/joystick_switch.
  Schema emitatorului devine:
  In repaus, in ecranul de monitorizare al receptorului vedem:
iar la apasarea butonului de pe joystick:
  Am facut si un filmulet numit trimitere si receptie date radio cu NRF24L01 si Arduino (3)
  Montajul emitatorului meu cu NRF24L01 conectat la o placa Arduino Uno si un joystick, pentru ultima versiune arata asa:
iar receptorul:
14.01.2016
   In documentatia librariei RadioHead se explica cum putem pune canalul (0..125), puterea de emisie si viteza de transmisie a datelor. Am pus intr-un sketch ca note:
   Din testele mele, apar erori cand se foloseste si libraria RHReliableDatagram.h, cum a fost cazul pentru joystick, deci ramamn momentan la "setarea din fabrica".

joi, 10 octombrie 2013

Module de transmisie/receptie radio si... Arduino (V)

2 temperaturi citite cu LM335 transmise prin radio la un afisaj LCD cu 16 coloane si 2 randuri conectat clasic la Arduino


   Deoarece m-am gandit ca nu toata lumea foloseste comanda afisajului LCD pe 2 fire (i2c), adica nu are acea interfata, m-am apucat sa conectez afisajul clasic, cu 6 fire utile (si 2 alimentare):
   Schema de conectare a modulului de emisie si a celor 2 senzori de temperatura LM335Z la placa Arduino este aceeasi ca cea din articolul anterior:
   La partea de receptor, se schimba modul de conectare:


   Initial, am incercat sa folosesc configuratia din exemplele Arduino, adica asta:
si sa conectez receptorul la pinul 7.. am constatat ca se bloc ca activare apartii de receptor, am conectat si la alti pini si aceeasi eroare, asa ca m-am ami uitat pe documentatia librariei WirtualWre (vezi explicatiile de la skyduino.wordpress.com si mi-am dat seama ca foloseam pinul D11 (digital 11), asa ca am modificat configuratia cum e prezentat mai sus...
   Sketch-ul pentru receptor devine:
  
/*.............................................................
Sending Multiple Variables Using VirtualWire. Receiver
Author: Rodrigo Mompo Redoli
For http://controlrobotics.rodrigomompo.com
adapted sketch by niq_ro (Nicu FLORICA) from http://nicuflorica.blogspot.com
version 5.1
..............................................................*/

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
/*                                    -------------------
                                      |  LCD  | Arduino |
                                      -------------------
 LCD RS pin to digital pin 7          |  RS   |   D7    |
 LCD Enable pin to digital pin 6      |  E    |   D6    |
 LCD D4 pin to digital pin 5          |  D4   |   D5    |
 LCD D5 pin to digital pin 4          |  D5   |   D4    |
 LCD D6 pin to digital pin 3          |  D6   |   D3    |
 LCD D7 pin to digital pin 2          |  D7   |   D2    |
 LCD R/W pin to ground                |  R/W  |   GND   |
                                      -------------------
*/
#include <VirtualWire.h> // use Virtual library for decode signal from Rx module
#include <Time.h> // use Time library for control the time between data from receiver

// Sensors 
int Sensor1Data;
int Sensor2Data;
int t1, t2;
float t10, t20;
 
char StringReceived[21]; 

// other  
int led = 13; //pin for LED
int j=1; // count the messages
int timp1, timp2, dt; // times  

void setup() {

  lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
  
   // set the time for record time and value
   setTime(0,0,0,25,9,13); // set time to Saturday 8:29:00am Jan 1 2011

pinMode(led, OUTPUT); 
 lcd.print("Arduino is ready"); // print a text
// VirtualWire 
    // Bits per sec
    vw_setup(2000);
    // set pin for connect receiver module 
    vw_set_rx_pin(11);  
    // Start the receiver PLL running
    vw_rx_start();
    
 delay (500);
 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 2 and row 0 = left/up
 lcd.print("niq_ro's rx is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 0 = left/down
 lcd.print("ready on 433MHz"); // print a text
 delay (2000);
 lcd.clear(); // clear the screen
 lcd.setCursor(14, 0); 
 lcd.print("0/");
timp2 = 0; 
} // END void setup
  
void loop(){
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
      
//Taking the data from the control base
    if (vw_get_message(buf, &buflen)) 
    {
      digitalWrite(led, HIGH);
// put the data number from begin
   lcd.clear(); // clear the screen
if (j<10) lcd.setCursor(14, 0); // put cursor at colon 14 and row 1
if ((j>=10) and (j<100)) lcd.setCursor(13, 0); // put cursor at colon 13 and row 1
if ((j>=100) and (j<1000)) lcd.setCursor(12, 0); // put cursor at colon 12 and row 1
if ((j>=1000) and (j<10000)) lcd.setCursor(11, 0); // put cursor at colon 11 and row 1  
   lcd.print(j);
   lcd.print("/");
   
 int i;
        // Message with a good checksum received, dump it. 
        for (i = 0; i < buflen; i++)
 {            
          // Fill Sensor1CharMsg Char array with corresponding 
          // chars from buffer.   
          StringReceived[i] = char(buf[i]);
     //     Serial.print(StringReceived[i]);
 }
  
      sscanf(StringReceived, "%d,%d",&Sensor1Data, &Sensor2Data); // Converts a string to an array
digitalWrite(led, LOW);        
t1 = Sensor1Data;
t2 = Sensor2Data;

t10 = (100.0*(5.0*t1/1023.0-2.980)+25.0)-1.0;
t20 = (100.0*(5.0*t2/1023.0-2.980)+25.0);


    lcd.setCursor(0, 0);
    lcd.print("t1="); 
    if (t10<10) lcd.print(" "); 
    if (t10>0.0) lcd.print("+"); 
    lcd.print(t10,1);
    lcd.write(0b11011111);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("t2="); 
    if (t20<10) lcd.print(" "); 
    if (t20>0.0) lcd.print("+"); 
    lcd.print(t20,1);
    lcd.write(0b11011111);
    lcd.print("C");


timp2 = timp1; // new time replace olt time;
j=j++; // count the message         

 memset( StringReceived, 0, sizeof( StringReceived));// This line is for reset the StringReceived

}


// calculate time from last data received
timp1 = hour()*3600 + minute()*60 + second();
dt = timp1-timp2;

if (dt<10) lcd.setCursor(14, 1); // put cursor at colon 14 and row 1
if ((dt>=10) and (dt<100)) lcd.setCursor(13, 1); // put cursor at colon 13 and row 1
if ((dt>=100) and (dt<1000)) lcd.setCursor(12, 1); // put cursor at colon 12 and row 1
if ((dt>=1000) and (dt<10000)) lcd.setCursor(11, 1); // put cursor at colon 11 and row 1
  lcd.print(dt);
  lcd.print("s");
}
   
   Am facut is un mic filmulet, numit two LM335 temperature transmission to a display wirelessly using Arduino (II):


miercuri, 9 octombrie 2013

Module de transmisie/receptie radio si... Arduino (IV)

2 temperaturi citite cu LM335 transmise prin radio la un afisaj LCD cu 16 coloane si 2 randuri conectat prin adaptor i2c la Arduino

   Fata de precedentele articole, voi conecta 2 senzori de temperatura LM335 (pe care i-am prezentat aici) la o placa Arduino si sa transmit datele cu ajutorul unui modul de emisie pe frecventa de 433MHz, apoi voi receptiona datele cu ajutorul altei placi Arduino si voi afisa datele pe un ecran LCD cu 16 coloane si 2 randuri, conectat prin adaptor i2c. 
   Schema de conectare este:
   Un senzor este conectat la intrarea analogica 0, iar celalalt la intrarea analogica 1. Pentru a conecta usor si emitatorul si senzorii, am facut un mic montaj, un "brick":
   Poate parea ciudata schema asta, dar in mare are o bareta mama cu 8 pini, o bareta tata cu 2 pini pentru masa (gnd), o bareta tata cu 3 pini pentru +5V, 2 senzori LM335, unul conectat prin cablu de 1m, iar celalalt pus in bareta mama (pentru a putea testa si alte LM-uri 335)...
   Modulul conectat la placa Arduiono arata asa:
   Am scos un senzor pe fereastra si am alimentat placa Arduino cu un alimentator extern (nu apare in poza):
   Receptorul cu Arduino si afisaj LCD cu adaptor i2c:
   Am facut un filmulet explicativ, care se numeste two LM335 temperature transmission to a display wirelessly using Arduino (I):

   Programul (sketch-ul) pentru emitator este: 
/*.............................................................
Sending Multiple Variables Using VirtualWire. Transmitter
Author: Rodrigo Mompo Redoli
For controlrobotics.rodrigomompo.com
adapted sketch by niq_ro (Nicu FLORICA) from http://nicuflorica.blogspot.com  
..............................................................*/
#include <VirtualWire.h>

int t10 = 0; // initial temperature no.1 value;
int t20 = 0; // initial temperature no.2 value;
int t1 = 0.00; // initial calculated temperature no.1 value; 
int t2 = 0.00; // initial calculated temperature no.2 value; 

int temperaturePin1 = A0; // output from first LM335 is put at analog input no.0
int temperaturePin2 = A1; // output from second LM335 is put at analog input no.1

int ledPin = 13;
char Sensor1CharMsg[21];// The string that we are going to send trought rf 
 
void setup() {

 
 // LED 
 pinMode(ledPin,OUTPUT);
  
 
 // VirtualWire setup
 vw_setup(2000); // Bits per sec
 vw_set_tx_pin(12);// Set the Tx pin. Default is 12
 
}
 
void loop() {
  digitalWrite(ledPin, HIGH);  

  // Read and store Sensor Data

int t11 = 0;
int t21 = 0;
  for (int x=1; x <= 5; x++)
  {
// calculate the value  
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
// t10 = 100.0*(5.0*t1/1023.0-2.980)+25.0;
//t11 = t10 + t1;
t11 = t11 + t1;

t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
//t20 = 100.0*(5.0*t1/1023.0-2.980)+25.0;
//t21 = t20 + t2;
t21 = t21 + t2;

delay (200);
  }   

int Sensor1Data = t11/5.0 ; // average and corrected temperature  
int Sensor2Data = t21/5.0;  // average and corrected temperature  

   
  sprintf(Sensor1CharMsg, "%d,%d", Sensor1Data, Sensor2Data);
  
 // Turn on a light to show transmitting
 vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg));
 vw_wait_tx(); // Wait until the whole message is gone

 // Turn off a light after transmission
 delay(100);
 digitalWrite(ledPin, LOW); 
 delay(3000);
 }
iar sketch-ul de receptor este:
/*.............................................................
Sending Multiple Variables Using VirtualWire. Receiver
Author: Rodrigo Mompo Redoli
For http://controlrobotics.rodrigomompo.com
adapted sketch by niq_ro (Nicu FLORICA) from http://nicuflorica.blogspot.com
..............................................................*/

#include <Wire.h> // use Wire library for protocol i2c (A4 = SDA & A5 = SCL)
#include <LiquidCrystal_I2C.h> // use LiquidCrystal_I2C library for control LCD on i2c protocol
LiquidCrystal_I2C lcd(0x20,16,2); // 0x20 is adresss for LCC 16x2

#include <VirtualWire.h> // use Virtual library for decode signal from Rx module
#include <Time.h> // use Time library for control the time between data from receiver

// Sensors 
int Sensor1Data;
int Sensor2Data;
int t1, t2;
float t10, t20;
 
char StringReceived[21]; 

// other  
int led = 13; //pin for LED
int j=1; // count the messages
int timp1, timp2, dt; // times  

void setup() {
  lcd.init(); // initialing the LCD display
  lcd.backlight(); //backlight is now ON
  lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
  
   // set the time for record time and value
   setTime(0,0,0,25,9,13); // set time to Saturday 8:29:00am Jan 1 2011

pinMode(led, OUTPUT); 

// VirtualWire 
    // Bits per sec
    vw_setup(2000);
    // set pin for connect receiver module 
    vw_set_rx_pin(7);  
    // Start the receiver PLL running
    vw_rx_start();       

 lcd.setCursor(1, 0); // put cursor at colon 2 and row 0 = left/up
 lcd.print("niq_ro's rx is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 0 = left/down
 lcd.print("ready on 433MHz"); // print a text
 delay (2000);
 lcd.clear(); // clear the screen
 lcd.setCursor(14, 0); 
 lcd.print("0/");
timp2 = 0; 
} // END void setup
  
void loop(){
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
      
//Taking the data from the control base
    if (vw_get_message(buf, &buflen)) 
    {
      digitalWrite(led, HIGH);
// put the data number from begin
   lcd.clear(); // clear the screen
if (j<10) lcd.setCursor(14, 0); // put cursor at colon 14 and row 1
if ((j>=10) and (j<100)) lcd.setCursor(13, 0); // put cursor at colon 13 and row 1
if ((j>=100) and (j<1000)) lcd.setCursor(12, 0); // put cursor at colon 12 and row 1
if ((j>=1000) and (j<10000)) lcd.setCursor(11, 0); // put cursor at colon 11 and row 1  
   lcd.print(j);
   lcd.print("/");
   
 int i;
        // Message with a good checksum received, dump it. 
        for (i = 0; i < buflen; i++)
 {            
          // Fill Sensor1CharMsg Char array with corresponding 
          // chars from buffer.   
          StringReceived[i] = char(buf[i]);
     //     Serial.print(StringReceived[i]);
 }
  
      sscanf(StringReceived, "%d,%d",&Sensor1Data, &Sensor2Data); // Converts a string to an array
digitalWrite(led, LOW);        
t1 = Sensor1Data;
t2 = Sensor2Data;

t10 = (100.0*(5.0*t1/1023.0-2.980)+25.0)-1.0;
t20 = (100.0*(5.0*t2/1023.0-2.980)+25.0);


    lcd.setCursor(0, 0);
    lcd.print("t1="); 
    if (t10<10) lcd.print(" "); 
    if (t10>0.0) lcd.print("+"); 
    lcd.print(t10,1);
    lcd.write(0b11011111);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("t2="); 
    if (t20<10) lcd.print(" "); 
    if (t20>0.0) lcd.print("+"); 
    lcd.print(t20,1);
    lcd.write(0b11011111);
    lcd.print("C");


timp2 = timp1; // new time replace olt time;
j=j++; // count the message         

 memset( StringReceived, 0, sizeof( StringReceived));// This line is for reset the StringReceived

}


// calculate time from last data received
timp1 = hour()*3600 + minute()*60 + second();
dt = timp1-timp2;

if (dt<10) lcd.setCursor(14, 1); // put cursor at colon 14 and row 1
if ((dt>=10) and (dt<100)) lcd.setCursor(13, 1); // put cursor at colon 13 and row 1
if ((dt>=100) and (dt<1000)) lcd.setCursor(12, 1); // put cursor at colon 12 and row 1
if ((dt>=1000) and (dt<10000)) lcd.setCursor(11, 1); // put cursor at colon 11 and row 1
  lcd.print(dt);
  lcd.print("s");
}

   - va urma -