kanno.so

安い無線モジュール

SeeedStudioで見つけた315MHz RF link kitが$4.9ととても安かったので、とりあえず買ってみたところ、意外とさくっと使えたので、arduinoでの使い方をメモしておこうと思います。

似たようなのがaitendoで売ってので買って試してみたら、さくっと動きました。

受信モジュールRF315-RXB12が¥900、送信モジュールRF315-TX5が¥350。セットで¥1,250。安い。

Xbeeと違って双方向通信じゃなくて、送る方は送ることしかできないし、受信する方は受信するだけです。

でもわりとそういう用途って多い気がします。

まず、ドライバはVirtualWireをここからダウンロードして、書類のArduinoフォルダのlibrariesにコピーします。pdfはここから

サイトにはteensy用にいろいろと書いてありますが僕はteensy持ってないのでarduinoで動かします。

Xbeeと違ってRX, TXに接続するわけではないので2台arduinoが必要です。(それじゃあんま安くないかもしれない)

サンプルプログラムにtransmitterとreceiverというサンプルがあるのでそれぞれを二台のarduinoにアップロードし、下記の図のように接続すると、通信できます。

receiverをアップロードした方のarduinoのシリアルモニタを開くとこんな感じで受信できます。

センサーの値を送ったりするのにサンプルを下記のようにちょっと書き換えれば無線で送ることができました。

送信側(transmitter)

なんか基本、配列でBYTEを送るっぽいので配列にセンサの値(1024段階)を1/4にして送るようにしました。

#include <VirtualWire.h>

const int led_pin = 11;
const int transmit_pin = 12;
const int receive_pin = 2;
const int transmit_en_pin = 3;

void setup()
{
//  // Initialise the IO and ISR
vw_set_tx_pin(transmit_pin);
vw_set_rx_pin(receive_pin);
vw_set_ptt_pin(transmit_en_pin);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
}

byte count = 1;

void loop()
{ char count[2] = {' ',' '  };
count[1] = analogRead(1) /4;
count[0] = analogRead(0)/4;
vw_send((uint8_t *)count, 2);
vw_wait_tx(); // Wait until the whole message is gone

}

受信側(receiver)
特に変えていませんが、Serial.print(buf[i], DEC);はサンプルでHEXだったのがDECになってます。

#include <VirtualWire.h>

const int led_pin = 6;
const int transmit_pin = 12;
const int receive_pin = 11;
const int transmit_en_pin = 3;

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

// Initialise the IO and ISR
vw_set_tx_pin(transmit_pin);
vw_set_rx_pin(receive_pin);
vw_set_ptt_pin(transmit_en_pin);
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(led_pin, HIGH); // Flash a light to show received good message
// Message with a good checksum received, print it.
//Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
Serial.print(buf[i], DEC);
Serial.print(' ');
}
Serial.println();
digitalWrite(led_pin, LOW);
}
}

しかし、けっこうスピードが出なくて秒間16~20しか出ません。

setup内のvw_setup(2000);のところを7000にしたら秒間60ほどのスピードが出ました。

ドキュメントによると9000以上にすると通信おかしくなり始めるようなことが書いてありました。

試しに実験すると9000で秒間80弱、10000で秒間10くらいにがくっと落ちました。

7000くらいが安心そうです。