Библиотека VirtualWire Arduino 4

VirtualWire является библиотекой . Предназначена для отправки и приема коротких сообщений по широковещательной беспроводной связи, используя ASK(Амплитудная модуляция (англ. amplitude shift keying (ASK) — изменение сигнала, при котором скачкообразно меняется амплитуда несущего колебания.).

Ссылка на библиотеку http://www.airspayce.com/mikem/arduino/VirtualWire/VirtualWire-1.20.zip

Описание библиотеки http://www.airspayce.com/mikem/arduino/VirtualWire.pdf

Пример использования:

Описание работы библиотеки:

Максимальный размер сообщения, которое может быт отправлено VW_MAX_PAYLOAD (27)27 байт

Каждое сообщение передается как:

  • 36 бит преамбула состоящая из 0-1 битовых пар(101010101010101010101010101010101010)
  • 12 бит(000111001101) начальный символ 0xb38
  • 1 байт — длина сообщения(4-30), это количество включает количество байтов и контрольную сумму
  • n — размер сообщения, максимум задается VW_MAX_PAYLOAD (27)
  • 2 байта контрольная сумма, посылается младший байт и старший байт

Все после начального символа кодируется от 4 до 6 битов, каждый байт сообщения кодируется как два шести битовых символа, посылается старшая группа битов и младшая группа битов.

Тактовая частота Arduino UNO 16MHz =1/16000000=0.0000000625 = 62.5нс/такт

Необходимое время для передачи одного бита данных на скорости 2000бит/с = 1/2000=0.0005=500 микросекунд

Время для передачи максимального размера сообщения на скорости 2000 бит/с равно (6 + 2 + VW_MAX_MESSAGE_LEN*2) * 6 = 408 бит*500микросекунд = 0.204 секундыгде VW_MAX_MESSAGE_LEN это VW_MAX_PAYLOAD + 3 = 30

Библиотека использует в Ардуино Timer1, и это сказывается на работе PWM выводов 9 и 10.

Скорость передачи и дальность передачи:

Тесты проводились с TX-C1, RX-B1, сообщение 5 байт, 17 см антенна, без заземления, 1м над землей, прямая видимость

  • На скорости 10000 бит/с трансмиттер работает не корректно.
  • На скорости 9000 бит/с асимметрия в приемнике не обеспечивает надежную связь на любой дальности
  • На скорости 7000 бит/с, дальность связи около 90м
  • На скорости 5000 бит/с, дальность связи около 100м
  • На скорости 2000 бит/с, дальность связи около 150м
  • На скорости 1000 бит/с, дальность связи около 150м

В соответствии с документацией по RFM, качество приема зависит от нахождения человека на пути сигнала и от ориентации модуля

Потребление тока:

  • Arduino и TX-C1 передатчик 27mA на 9V.
  • Arduino и RX-B1 приемник 31mA на 9V.
  • Arduino и DR3100 приемник 28mA на 9V

 

Схемы подключения:

Подключение устройств приема-передачи к Ардуино
Пин подключения к Ардуино может быть изменен при помощи:

1
2
vw_set_tx_pin(uint8_t pin);
vw_set_rx_pin(uint8_t pin);
vw_set_tx_pin(uint8_t pin);
vw_set_rx_pin(uint8_t pin);

Схема подключения RX-B1 receiver(приемник) к Ардуино
1.png

Схема подключения TX-C1 transmitter(передатчик) к Ардуино
2.png

Схема подключения DR3100 transceiver(приемопередатчик) к Ардуино
3.png

Потребление 1 mW при скорости передачи 2400бит/с.

При использовании высоких скоростей передачи данных, для контроля выходной мощности, необходимо последовательно установить резистор номиналом 12к между землей и 8 пином DR3100.

Если вы используете AGC («Automatic Gain Control» – Автоматическая регулировка усиления) необходим конденсатор между первым пином DR3100 и землей.

Примеры:

Библиотека содержит примеры для приемника, передатчика и использования передачи по принципу клиент-сервер:

Приемник:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $
 
#include <VirtualWire.h>
 
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
 
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
 
vw_rx_start(); // Start the receiver PLL running
}
 
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
 
digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");
 
for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
}
}
// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

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

// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec

vw_rx_start(); // Start the receiver PLL running
}

void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;

digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
digitalWrite(13, false);
}
}

Передатчик:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $
 
#include <VirtualWire.h>
 
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
 
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
}
 
void loop()
{
const char *msg = "hello";
 
digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false);
delay(200);
}
// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

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

// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
}

void loop()
{
const char *msg = "hello";

digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false);
delay(200);
}

Клиент:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// client.pde
//
// Simple example of how to use VirtualWire to send and receive messages
// with a DR3100 module.
// Send a message to another arduino running the 'server' example, which
// should send a reply, which we will check
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: client.pde,v 1.1 2008/04/20 09:24:17 mikem Exp $
 
#include <VirtualWire.h>
 
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
 
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}
 
void loop()
{
const char *msg = "hello";
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Wait until the whole message is gone
Serial.println("Sent");
digitalWrite(13, false);
 
// Wait at most 200ms for a reply
if (vw_wait_rx_max(200))
{
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
 
// Message with a good checksum received, dump it.
Serial.print("Got: ");
 
for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
}
}
else
Serial.println("Timout");
 
}
// client.pde
//
// Simple example of how to use VirtualWire to send and receive messages
// with a DR3100 module.
// Send a message to another arduino running the 'server' example, which
// should send a reply, which we will check
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: client.pde,v 1.1 2008/04/20 09:24:17 mikem Exp $

#include <VirtualWire.h>

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

// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}

void loop()
{
const char *msg = "hello";
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Wait until the whole message is gone
Serial.println("Sent");
digitalWrite(13, false);

// Wait at most 200ms for a reply
if (vw_wait_rx_max(200))
{
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;

// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
}
}
else
Serial.println("Timout");

}

Сервер:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// server.pde
//
// Simple example of how to use VirtualWire to send and receive messages
// with a DR3100 module.
// Wait for a message from another arduino running the 'client' example,
// and send a reply.
// You can use this as the basis of a remote control/remote sensing system
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: server.pde,v 1.1 2008/04/20 09:24:17 mikem Exp $
 
#include <VirtualWire.h>
 
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
 
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}
 
void loop()
{
const char *msg = "hello";
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
// Wait for a message
vw_wait_rx();
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
const char *msg = "goodbye";
 
digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");
 
for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
 
// Send a reply
vw_send((uint8_t *)msg, strlen(msg));
digitalWrite(13, false);
}
}
// server.pde
//
// Simple example of how to use VirtualWire to send and receive messages
// with a DR3100 module.
// Wait for a message from another arduino running the 'client' example,
// and send a reply.
// You can use this as the basis of a remote control/remote sensing system
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: server.pde,v 1.1 2008/04/20 09:24:17 mikem Exp $

#include <VirtualWire.h>

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

// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}

void loop()
{
const char *msg = "hello";
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

// Wait for a message
vw_wait_rx();
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
const char *msg = "goodbye";

digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");

// Send a reply
vw_send((uint8_t *)msg, strlen(msg));
digitalWrite(13, false);
}
}

Список поддерживаемых контроллеров:

  • ATmega8
  • ATmega168
  • ATmega328
  • ATtiny85
  • MSP430G2553
  • MSP430G2452

Передатчик

  • TX-C1 (433.92MHz)

Приемник

  • RX-B1 (433.92MHz)

Приемопередатчик

  • DR3100 (433.92MHz)

4 комментс для “Библиотека VirtualWire Arduino

  1. Ответить Александр Апр 20, 2016 14:18

    Пробую на Arduino Nano, не работает. По стандартному скетчу не работает, диоды мигают, когда на приемнике открываешь монитор порта, диод перестает мигать, в консоль ничего не выводится, кроме setup

  2. Ответить Владимир Июн 12, 2016 23:31

    Александр, возможно вы не подключили антены.

  3. Ответить Ivan Июн 19, 2016 02:28

    Есть важная особенность, при использовании функциий
    vw_set_tx_pin(uint8_t pin);
    vw_set_rx_pin(uint8_t pin);

    нужно дополнительно перед их вызовом указать тип работы пина (pinMode(rxpin,INPUT)), сам спотыкался, почему приемник не принимает…

Добавить комментарий