Arduino web tutorijali

Ovaj modul ima široku uporabu zbog odnosa cijene i dobivenog te je česta opcija u daljinskim upravljačima različite namjene.

RF 433 moduli

Moduli odašiljača i prijemnika su različiti i podržavaju samo jednosmjernu komunikaciju (od odašiljača ka prijemniku).

ODAŠILJAČ

Karakterisitke:

  • Napajanje : 3-12V
  • Radna frekvencija: 433.92MHz
  • Struja u mirovanju: 0mA
  • Struja pri slanju :20-28mA
  • Domet: 5-200m (ovisno o naponu i prostoru) 
  • Izlazna snaga: 16dBm (40mW)
  • Brzina prijenosa: <10Kbps
  • Modulatcija: OOK (Amplitudna Modulacija)
  • Radna temperatura: -10 ℃ ~ +70 ℃
  • Veličina: 19×19×8mm

PRIJEMNIK

Karakteristike:

  • Radni napon: DC5V
  • Potrošnja: 4mA
  • Radna frekvencija: 433.92MHz
  • Osjetljivost:-105DB
  • Dimenzije:30x14x7mm

 

PRVI PRIMJER - SLANJE TEKSTUALNE PORUKE PREKO RF 433 MODULA

Za ovaj primjer nam trebaju dva mikrokontrolera, u našem primjeru će to biti Arduino Uno, odašiljački modul, prijemni modul i 6 spojnih žica (Dupont M/F).

 

Spajanje odašiljača:

Spajanje odašiljača

 

Programski kod za odašiljač:

#include <VirtualWire.h>
// Ukoliko nemate VirtualWire library preuzmite ga s http://rik-popovaca.hr/arduino/libraries/VirtualWire.zip
void setup()
{ 
    // Inicijalizacija
    vw_set_ptt_inverted(true);
    vw_setup(2000);	 // Brzina (Bitova u sekundi)
}
 
void loop()
{

  const char *msg = "Poruka poslana"; // Poruka koju saljemo prijemniku
    digitalWrite(13, true); // LED na pinu D13 je ukljucen prilikom slanja
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();
    digitalWrite(13, false);
    delay(200);
}

 

Spajanje prijemnika:

Spajanje prijemnika

 

Programski kod za prijemnik:

#include <VirtualWire.h>
// Ukoliko nemate VirtualWire library preuzmite ga s http://rik-popovaca.hr/arduino/libraries/VirtualWire.zip

void setup()
{
    Serial.begin(9600);
    Serial.println("setup");

    // Inicijalizacija
    vw_set_ptt_inverted(true);
    vw_setup(2000);	 // Brzina (Bitova u sekundi)
    vw_rx_start();       // Pokreni prijemnik
}

void loop()
{

    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Ukoliko smo primili poruku
    {
	int i;

        digitalWrite(13, true); // LED na pinu D13 je ukljucen prilikom prijema
	Serial.print("Primljeno: ");
	
	for (i = 0; i < buflen; i++) // Petlja za primanje poslanih podataka
	{
            char c = (buf[i]);
            Serial.print(c); // Ispis znak po znak 
	}
	Serial.println("");
        digitalWrite(13, false);
    }
}

 

DRUGI PRIMJER - DALJINSKO PALJENJE LED

 

Spajanje odašiljača:

Spajanje odašiljača

 

Programski kod za odašiljač:

#define NETWORK_SIG_SIZE 3
#define VAL_SIZE         2
#define CHECKSUM_SIZE    1
#define PACKET_SIZE      (NETWORK_SIG_SIZE + VAL_SIZE + CHECKSUM_SIZE)
#define NET_ADDR 5
#define CRVENA 5
#define ZUTA 6
#define ZELENA 7
const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};

int broj;

void setup(){
  pinMode(CRVENA, INPUT_PULLUP);
  pinMode(ZUTA, INPUT_PULLUP);
  pinMode(ZELENA, INPUT_PULLUP);
  Serial.begin(1200);  // Brzina 1200 bps
}

void loop(){
  int cr = digitalRead(CRVENA);
  int zu = digitalRead(ZUTA);
  int ze = digitalRead(ZELENA);
  
  if (cr == LOW) broj = 5;
  if (zu == LOW) broj = 6;
  if (ze == LOW) broj = 7;
  
  writeUInt(broj); 

  broj = 0;
}

void writeUInt(unsigned int val){
  byte checksum = (val/256) ^ (val&0xFF);
  Serial.write(0xF0);
  Serial.write(g_network_sig, NETWORK_SIG_SIZE);
  Serial.write((byte*)&val, VAL_SIZE);
  Serial.write(checksum); //CHECKSUM_SIZE
}

 

Spajanje prijemnika:

Spajanje prijemnika

 

Programski kod za prijemnik:

#define NETWORK_SIG_SIZE 3
#define VAL_SIZE         2
#define CHECKSUM_SIZE    1
#define PACKET_SIZE      (NETWORK_SIG_SIZE + VAL_SIZE + CHECKSUM_SIZE)
#define NET_ADDR 5
#define CRVENA 5
#define ZUTA 6
#define ZELENA 7
const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};

int broj;

void setup(){
  pinMode(CRVENA, OUTPUT);
  pinMode(ZUTA, OUTPUT);
  pinMode(ZELENA, OUTPUT);
  Serial.begin(1200);  // Brzina 1200 bps
}

void loop(){
  
  broj = readUInt(true);

  digitalWrite(CRVENA, (broj == 5));
  digitalWrite(ZUTA, (broj == 6));
  digitalWrite(ZELENA, (broj == 7));
}

unsigned int readUInt(bool wait){
  int pos = 0;
  unsigned int val;
  byte c = 0; 

  if((Serial.available() < PACKET_SIZE) && (wait == false)){
    return 0xFFFF;
  }

  while(pos < NETWORK_SIG_SIZE){
    while(Serial.available() == 0);
    c = Serial.read();

    if (c == g_network_sig[pos]){
      if (pos == NETWORK_SIG_SIZE-1){
        byte checksum;

        while(Serial.available() < VAL_SIZE + CHECKSUM_SIZE);
        val      =  Serial.read();
        val      += ((unsigned int)Serial.read())*256;
        checksum =  Serial.read();

        if (checksum != ((val/256) ^ (val&0xFF))){
          // Checksum failed
          pos = -1;
        }
      }
      ++pos;
    }
    else if (c == g_network_sig[0]){
      pos = 1;
    }
    else{
      pos = 0;
      if (!wait){
        return 0xFFFF;
      }
    }
  }
  return val;
}