かなり前に購入して使わなかったnRF24L01(無線モジュール)の利用価値を確認するためテストした
Arduinoで直接nRF24L01ボードは扱いにくいので3.3V降圧付きのソケットを購入
(左)nRF24L01ボード(右)ソケットアダプタ
8ピンソケットに刺して利用すると感度も良くなるらしいがどうだろう?
接続方法など「無線モジュールnRF24L01を使いArduino間で無線通信をやってみる!」を参考にさせていただいた
使用するためのライブラリは(こちら),メソッドの仕様は「RF24 Class Reference」にある
LED点灯にて送受信確認
まずは参考サイトのとおりボタン押下を通信しLED点灯を行い動作を確認
(左)送信側(右)受信側
消費電力
UNO込み5Vで最大20mAのようだ(送受信で10~20mAを変動)
ループバックテスト
無線なんでどのくらいの距離を通信可能か確認したいこともありループバックでテストした
ループバックテストとはメインとスレーブとしたら,メインがスレーブに送信,スレーブが受信したデータをメインに送信(返送)してメインがデータが同じであることを確認する昔からある簡単かつ確実な通信確認(エコーバック,ピンポン手順として通信で利用されることも)
尚,Arduinoで送受信できることは問題ないようなので受信側はATtiny85を使用してみる
(送信側スケッチ)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define TIMEOUT 200
RF24 radio(7, 8); //CE,CSNピンの指定
const byte sendAddress[6] = "00001"; //送信アドレス
const byte backAddress[6] = "00002"; //受信アドレス
const byte sendData[] = "0123456789abcdef";
void setup() {
Serial.begin(9600);
Serial.println("loopback test begin");
radio.begin();
radio.setPALevel(RF24_PA_MAX); //出力(RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX)
radio.openWritingPipe(sendAddress); //データ送信先アドレスを指定
radio.openReadingPipe(1, backAddress); //(0-5), データ受信アドレスを指定
//0は書き込みパイプと共有となるのでなるべく受信パイプは1-5
}
void loop() {
byte data;
int n, tm;
boolean retry;
for(n = 0; n < sizeof(sendData) - 1; n++) {
retry = true;
do {
delay(5);
radio.stopListening(); // 送信側として動作
radio.write(&sendData[n], sizeof(byte));
delay(5);
radio.startListening(); // 受信側として動作
for(tm = 0; tm < TIMEOUT; tm++) {
if(radio.available()) {
radio.read(&data, sizeof(byte));
if(sendData[n] == data) {
Serial.print(" -> back: ");
Serial.println(data);
retry = false;
} else {
Serial.println(" -> error");
Serial.println("retry");
}
break;
}
delay(5);
}
if(tm >= TIMEOUT) {
Serial.println(" -> time out");
Serial.print("retry");
delay(200);
}
} while(retry);
delay(2000);
}
}
(受信側スケッチ)
// ATMEL ATTINY85 / ARDUINO
//
// +-\/-+
// RESET PB5 | |8 VCC
// ADC3 (D3) PB3 2| |7 PB2 (D2) ADC1
// ADC2 (D4) PB4 3| |6 PB1 (D1) PWM1
// GND 4| |5 PB0 (D0) PWM0
// +----+
//
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(3, 4); //CE,CSNピンの指定(D3, D4)
const byte sendAddress[6] = "00002"; //送信アドレス
const byte recvAddress[6] = "00001"; //受信アドレス
void setup() {
radio.begin();
radio.setPALevel(RF24_PA_HIGH); //出力(RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX)
radio.openWritingPipe(sendAddress); //データ送信先アドレスを指定
radio.openReadingPipe(1, recvAddress); //データ受信アドレスを指定
}
void loop() {
byte data;
delay(10); //これがないと正常に送受信しない
radio.startListening(); //受信側として動作
if(radio.available()) {
radio.read(&data, sizeof(byte));
delay(10); //これがないと正常に送受信しない
radio.stopListening(); //送信側として動作
radio.write(&data, sizeof(byte));
}
}
(結果)
ATtiny85側のsetPALevelを最高のRF24_PA_MAXにすると処理が追い付かないのか通信不良となるのでRF24_PA_HIGHにした(送信側はRF24_PA_MAX)
場所(受信側) |
距離 |
通信 |
結果画面
|
見通し |
3m |
良好 |
ー |
見通し |
7m |
良好 |
ー |
隣の部屋 |
5m |
良 |
|
2つ隣の部屋 |
10m |
不可 |
|
1F-2F |
5m(直線) |
良 |
|
外 |
10m以上 |
不可 |
|
備忘録
(ATtiny85のスケッチ書き込み)
IDE2.XだとArduinoISPで書き込む場合「→」では書き込めなくなっていた(嵌った)
「スケッチ」→「書き込み装置を使って書き込む」を実行
(ATtiny85との結線)
ATtiny85では全てのピンを使用してしまうため利用するのは厳しそうだ
(ArduinoUNOとの結線)