nRF24L01
& PIC18F4220 |
|||
-
página modificada en agosto del 2012 - (English version)
|
circuito para uso con multiples sensores. |
La idea del proyecto es tener un circuito pequeño de solo 5,2mm por 4,2mm a mano que permite enchufar varios sensores y que esta alimentada por una batería para su uso en un escenario, independiente de corriente y con la habilidad de envío de datos por aire, inalámbrico. La transmisión inalámbrico está solucionado con dos nRF24L01 de Nordic. Abajo de este página hay un link que permite bajar el código para el PIC. El proyecto está realizado con SourceBoost y MPLAB. El código escrito en SourceBoost para el PIC es casi ANSI C compatible, así fascil de adaptar para el uso con otros compiladores. |
visualizar el esquema electrónico del
circuito
"General_Nordic_V2" |
En comparación del precio de 45E por un módulo xBee ZNet 2,5, el precio del Nordic nRF24L01 es de 3,50E por unidad. Sobretodo por el tamaño de solo 4mm * 4mmm del Nordic y el reducio coste del mísmo he hecho el esfuerzo de escribir el código. En el prototipo he incorporado el nRF24L01 (foto abajo), pero por la batería que actúa como una especie de blindaje para las ondas inalámbricos el rango inalámbrico del circuito quedaba en solo algunos metros, así insuficiente para tener un sistema para actuaciones en directo. Por eso motivo la versión actual del circuito lleva un “break out board” de Sparkfun incorporado. |
Foto de la placa "General_Nordic_V1" con
el Nordic módulo inalámbrico, el nRF24L01 incorporado. Por la pila que está monatda abajo del circuito el rango del nRF24L01 es solo de algunos metros, insuficiente para actuar en escenarios en directo. (esquema General_Nordic_V1) |
visualizar el esquema
electrónico del circuito "General_Nordic_V1" |
receptor/transmisor |
visualizar el esquema
electrónico del circuito "18F2420_nRF24L01" |
visualizar el esquema
electrónico del circuito "Nordic_Receiver" |
código para manejar los datos con SC |
// first part
creates 6 sliders. ( var win= Window("ACCELOMETER", Rect(100, 100, 590, 420)); var sld0= Slider(win, Rect(20, 10, 50, 400)); var sld1= Slider(win, Rect(115, 10, 50, 400)); var sld2= Slider(win, Rect(215, 10, 50, 400)); var sld3= Slider(win, Rect(315, 10, 50, 400)); var sld4= Slider(win, Rect(415, 10, 50, 400)); var sld5= Slider(win, Rect(515, 10, 50, 400)); ~action_gui= {|chan, val| switch(chan, 0, {{sld0.value = val/1023}.defer}, // z (RA0) OLD version x, RA2 1, {{sld1.value = val/1023}.defer}, // y (RA1) 2, {{sld2.value = val/1023}.defer}, // x (RA2) OLD version z, RA0 3, {{sld3.value = val/1023}.defer}, // 4, {{sld4.value = val/1023}.defer}, // 5, {{sld5.value = val/1023}.defer} // ); }; win.front; ) SerialPort.listDevices // command to evaluate the USB port. // The next section is: // Incomming data with packages of 3bytes. 1.byte header 0x00, 2nd byte // hi data-byte, 3thd byte low data-byte. The 2nd byte incorporates also the // 6 address bites (64 addresses max) ( var port= SerialPort("/dev/ttyUSB0", 57600); //edit port here Routine({ var byte, loByte, hiByte, val, valsl, chan, index= 0; inf.do{ while({(byte= port.read).isNil}, {}); //wait for serial //byte.postln; //debug if(index==0 and:{byte==0}, { index= 1; }, { if(index==1, { hiByte= byte; index= 2; }, { if(index==2, { loByte= byte; //("received: hi:"+hiByte+" lo:"+loByte).postln; chan= (hiByte&2r11111100)>>2; // mask 2 lower data-bites val= ((hiByte&2r00000011)<<8)|loByte; //("chan:"+chan+"val:"+val).postln; ~action_gui.value(chan, val); ~action_synth.value(chan, val); index= 0; }); }); }); }; }).play; CmdPeriod.doOnce({port.close}); ) |
code written by Fredrik Olofsson |
|
|
descargar los ficheros del proyecto |