-
Notifications
You must be signed in to change notification settings - Fork 4
/
nr-rf24radio.html
254 lines (248 loc) · 12.1 KB
/
nr-rf24radio.html
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
<script type="text/x-red" data-template-name="RF24radio">
<div class="form-row">
<label for="node-config-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-config-input-name" />
</div>
<div class="form-row">
<label for="node-config-input-board"><i class="fa fa-microchip"></i> Board profile</label>
<select id="node-config-input-board" style="width: 60%;">
<option value="" selected> ... </option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-cs"><i class="fa fa-microchip"></i> CS Pin</label>
<input type="text" id="node-config-input-cs" style="width: 60%;"/>
</div>
<div class="form-row">
<label for="node-config-input-ce"><i class="fa fa-microchip"></i> CE Pin</label>
<input type="text" id="node-config-input-ce" style="width: 60%;"/>
</div>
<div class="form-row">
<label for="node-config-input-irq"><i class="fa fa-microchip"></i> IRQ Pin</label>
<input type="text" id="node-config-input-irq" style="width: 60%;"/>
</div>
<div class="form-row">
<label for="node-config-input-spispeed"><i class="fa fa-microchip"></i> SPI Freq(Hz)</label>
<input type="text" id="node-config-input-spispeed" style="width: 60%;"/>
</div>
<div class="form-row">
<label for="node-config-input-palevel"><i class="fa fa-plug"></i> PA Level</label>
<select id="node-config-input-palevel" style="width: 60%;">
<option value="0">Minimun</option>
<option value="1">Low</option>
<option value="2">High</option>
<option value="3" selected >Maximun</option>
<!-- <option value="4">Ultra - Si24R1</option> -->
</select>
</div>
<div class="form-row">
<label for="node-config-input-enablelna"><i class="fa fa-wifi"></i> Enable Lna Gain</label>
<input type="checkbox" id="node-config-input-enablelna" style="width: 60%;" />
</div>
<div class="form-row">
<label for="node-config-input-datarate"><i class="fa fa-rocket"></i> Data Rate</label>
<select id="node-config-input-datarate" style="width: 60%;">
<option value="0" selected >1 Mbps</option>
<option value="1">2 Mbps</option>
<option value="2">250 Kbps</option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-payloadsize"><i class="fa fa-compress"></i> Payload Size</label>
<input type="text" id="node-config-input-payloadsize" style="width: 60%;"/>
</div>
<div class="form-row">
<label for="node-config-input-channel"><i class="fa fa-exchange"></i> Channel</label>
<input type="text" id="node-config-input-channel" style="width: 60%;" />
</div>
<div class="form-row">
<label for="node-config-input-retraisdelay"><i class="fa fa-clock-o"></i> Retry Delay</label>
<input type="text" id="node-config-input-retriesdelay" style="width: 60%;" />
</div>
<div class="form-row">
<label for="node-config-input-retraiscount"><i class="fa fa-clock-o"></i> Retry Count</label>
<input type="text" id="node-config-input-retriescount" style="width: 60%;" />
</div>
<div class="form-row">
<label for="node-config-input-crclength"><i class="fa fa-barcode"></i> CRC Length</label>
<select id="node-config-input-crclength" style="width: 60%;">
<option value="0">No CRC(disabled)</option>
<option value="1">8-bit CRC</option>
<option value="2" selected>16-bit CRC</option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-basepoll"><i class="fa fa-clock-o"></i> Polling(us)</label>
<input type="text" id="node-config-input-basepoll" style="width: 60%;" />
</div>
<div class="form-row">
<label for="node-config-input-txdelay"><i class="fa fa-clock-o"></i> TX delay(us)</label>
<input type="text" id="node-config-input-txdelay" style="width: 60%;" />
</div>
<div class="form-row">
<label for="node-config-input-autorecover"><i class="fa fa-tools"></i> Auto Failure recover</label>
<input type="checkbox" id="node-config-input-autorecover" style="width: 60%;" />
</div>
<div class="form-tips">
<p><b>Tip:</b></p>
<p>On RPI CS: 0=SPI 0 / 1=SPI 1.</p>
<p>If spidev is used /dev/spideva.b CS= 10* a + b.</p>
<p>If supported board adaptors is used you can select board profile and
<p>CS/CE/IRQ pins will be filled with propper values.</p>
<p>IRQ: <0 IRQ line is disabled. Polling will be used.</p>
<p>Polling: Time in microseconds of polling time (>4000us)</p>
<p>Failure auto recover is experimental.</p>
</div>
</script>
<script type="text/javascript">
RED.nodes.registerType("RF24radio", {
category: "config",
icon:"radio.png",
defaults: {
name: { value:"", required: false},
ce: { value:"24", required: true,validate:RED.validators.number()},
cs: { value:"0", required: true,validate:RED.validators.number()},
irq: { value:"-1", required: true, validate:RED.validators.number()},
spispeed: { value:"10000000", required: true, validate:RED.validators.number() },
autorecover: { value: true, required:true },
palevel: {value:"3", required: true, validate:function(v) {
var n=parseInt(v);
return !isNaN(n) && n>=0 && n<=4;
}},
enablelna: { value: false, required: true},
datarate: {value:"0", required: true, validate:function(v) {
var n=parseInt(v);
return !isNaN(n) && n>=0 && n<=2;
}},
channel: {value:76, required: true, validate:function(v) {
var n=parseInt(v);
return !isNaN(n) && n>=0 && n<=126;
}},
crclength: {value:2, required: true, validate:function(v){
var n=parseInt(v);
return !isNaN(n) && n>=0 && n<=2;
}},
retriesdelay: {value:15, required:true, validate:function(v){
var n=parseInt(v);
return !isNaN(n) && n>=0 && n<=15;
}},
retriescount: {value:15, required:true, validate:function(v) {
var n=parseInt(v);
return !isNaN(n) && n>=0 && n<=15;
}},
payloadsize: {value:32, required:true, validate:function(v){
var n=parseInt(v);
return !isNaN(n) && n>=1 && n<=32;
}},
basepoll: {value: 40000, required:true, validate:function(v) {
var n=parseInt(v);
return !isNaN(n) && n> 4000;
}},
txdelay: {value: 250, required:true, validate:function(v) {
var n=parseInt(v);
return !isNaN(v) && n < 5000;
}}
},
label: function() {
return this.name ? this.name : "nrf24l01";
},
oneditprepare: function() {
let boards=[];
$.getJSON('nrf24-boards',function(data) {
if(Array.isArray(data)) {
boards=data;
for(i=0;i<data.length;i++) {
if('board' in data[i]) $('#node-config-input-board').append(`<option value="${i}">${boards[i].board}</option>`);
}
}
});
$("#node-config-input-board").change(function() {
let i=$(this).val();
if(i !="" && confirm(`Do you want to use radio configuration for "${boards[i].board}"?`)) {
for(const key in boards[i]) {
$(`#${key}`).val(boards[i][key]);
}
}
$(this).val("");
});
}
/*
oneditprepare: function() {
function toggleSelect() {
var current = $('#node-config-input-bridge').val();
$('#node-config-input-bridge').replaceWith('<input type="text" id="node-config-input-bridge" style="width: 60%;"/>');
$('#node-config-input-bridge').val(current);
}
function toggleInput() {
var current = $('#node-config-input-bridge').val();
$('#node-config-input-bridge').replaceWith('<select id="node-config-input-bridge" style="width: 60%;"></select>');
$.get( 'philipshue/server')
.done( function(data) {
var bridges = JSON.parse(data);
if(bridges.length <= 0) {
RED.notify("No bridge found.", "error");
}
bridges.forEach(function(bridge) {
$('#node-config-input-bridge').append('<option value="' + bridge.ipaddress + '">' + bridge.name + '</option>');
});
$('#node-config-input-bridge').val(current);
})
.fail(function() {
RED.notify("Something went wrong.", "error");
});
}
$('#node-config-input-scan').click(function() {
if ($('#node-config-input-bridge').prop("tagName") === "INPUT") {
toggleInput();
} else {
toggleSelect();
}
});
$('#node-config-input-register').click(function() {
if(!$('#node-config-input-bridge').val()) {
RED.notify("Select your bridge before register", "error");
} else {
$.get('philipshue/register', { host: $('#node-config-input-bridge').val() } )
.done( function(data) {
$('#node-config-input-key').val(JSON.parse(data));
}).fail(function(err) {
RED.notify("Something went wrong: "+err.responseText, "error");
});
}
});
}*/
});
</script>
<script type="text/x-red" data-help-name="RF24radio">
<p>Configuration node nRF24 radios</p>
<p> This node represents the physical radio attached to the SBC and it's configuration</p>
<h3>Configuration</h3>
<p> All parameters are mandatory </p>
<ul>
<li><code>Board profile</code> - Helper with board profile to assing CS/CE/IRQ and SPI speed to standard hats.</li>
<li><code>CS Pin</code> - SPI interface to use. On RPI 0=SPI0,1=SPI1. Using default SPIDEV the CS value is computed using this formula <code>/dev/spideva.b CS= 10* a + b</code></li>
<li><code>CE Pin</code> - SBC Pin number (GPIO##) to which Radio CE pin is connected.</li>
<li><code>IRQ Pin</code> - SBC Pin number(GPIO##) to which Radio IRQ pin is connected. If IRQ is not used set -1.</li>
<li><code>SPI Freq(Hz)</code> - SPI frequency in Hertzs. Default value should work in most setups.</li>
<li><code>PA Level</code> - Radio output power. Range is improved with higher output power. (Min,Low,High,Max)</li>
<li><code>Enable Lna Gain</code> - For radio moudles with LNA amplifier or SiR24 clones enable power amplifier.</li>
<li><code>Data Rate</code> - Select bit rate (250kbps,1Mbps,2Mbps). 250kbps only avaiable in nrlf240+ versions.</li>
<li><code>Payload Size</code> - Size in bytes of the payload (1-32). Payloads are fixed in size, therefore a buffer of this size will be allways emitted by input nodes</li>
<li><code>Channel</code> - Channel number to use 0-126.</li>
<li><code>Retry Delay</code> - Time (n+1)*250us to wait between transmission retries (0-15)</li>
<li><code>Retry Count</code> - 0-15 If ACK is used this is max retry attempts the radio will try to resend a frame.if 0 no retries will be sent</li>
<li><code>CRC Length</code> - No CRC, 8bit CRC or 16bit CRC </li>
<li><code>Polling(us)</code> - if IRQ is not used this will define the polling interval in us. Must be > 4000us.</li>
<li><code>TX Delay(us)</code> - Delay to switch between radio listening mode and transmitting mode.</li>
<li><code>Auto failure recovery</code> - The radio will be reset if a failure is detected.</li>
</ul>
<h3>Details</h3>
<p> Please have in mind the following elements to configure & troubleshoot radio configuration </p>
<ul>
<li> All nodes using a radio will share the configurartion of the radio.</li>
<li> Check node-red's log to validate the correct initialization of the radio module.</li>
<li> Check __nrf24__ [here](https://github.com/ludiazv/node-nrf24) documentation about CS/CE wiring. </li>
<li> Two devices are able to communicate via radio if they use the __same channel, payload size, CRC and data rate__. </li>
<li> IRQ line is recommended for better performance and litmit CPU usage. IRQ is not used and Polling time will be used to poll the status of the radio. Poll time need to be >4ms (4,000us) to avoid CPU congestion. Chosing a short poll time will consume CPU cycles polling, converselly long polling time could represent the loss o radio packets.</li>
</p>
</script>