node.js on raspberry pi

9

Click here to load reader

Upload: juan-pablo-kutianski

Post on 04-Jul-2015

1.475 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: Node.js on Raspberry PI

Node.JS y RaspBerry PiMeetup NodeJS Argentina

Page 2: Node.js on Raspberry PI

RaspBerry PiArquitectura ARMv6 (Broadcom BCM2835, ARM1176JZF-S @700 Mhz) 256 (modelo A o B v1) / 512 Mb de RAM (modelo B v2)Filesystem en tarjeta SDEthernet 10/100 Mbps (solo modelo B, el EC esta conectado via USB 2.0)2 x USB 2.0 (1x USB 2.0 en el modelo A)Video HD 1920 x 1080p @ > 30fps (Broadcom VideoCore IV)Salidas de video HDMI, DSI (no existen displays soportados) y video compuestoConector CSI para camaras tipo celular. No existen cámaras soportadas por CSI. La fundación está desarrollando una de 14 megapixels con lente fijo.Salidas de audio digital via HDMI y analogica via PWM en conector jack stereoSoporta protocolo CEC via HDMI8 GPIO (4 GPIO extras en el Bv2), SPI (2 x multiplexado), I2C, UART (3V3)

Page 3: Node.js on Raspberry PI

Node.js en RaspBerry Pi

Los binarios de la última versión se pueden bajar de http://nodejs.org/dist/latest/ en formato .tar.gzLa recomendación es localizarlos en /usr/local/En el caso de necesitar compilar Node.js se recomienda seguir la guia de Nathan Rajlich para cross compiling http://n8.io/cross-compiling-nodejs-v0.8/

Algunos módulos necesitan tener instalado node-gyp.Por lo cual es recomendable instalarlo con "sudo npm install node-gyp -g"

Existen módulos para acceder al GPIO.

Page 4: Node.js on Raspberry PI

Interface entre señales 3V3 y 5V

Page 5: Node.js on Raspberry PI

Acceso al GPIO via SYSFS

1. Exportar el pin 27 via IO via SYSFSsudo echo "27" > /sys/class/gpio/exportal hacer esto aparece el directorio /sys/class/gpio/gpio27

2. Para definir el pin como entradasudo echo "in" > /sys/class/gpio/gpio27/directionPara definir el pin como salidasudo echo "out" > /sys/class/gpio/gpio27/direction

3. Para invertir la señal en el pinsudo echo "1" > /sys/class/gpio/gpio27/active_low

4. Para establecer un estado en el pinsudo echo "1" > /sys/class/gpio/gpio27/value

5. Para leer un estado del pinsudo cat /sys/class/gpio/gpio27/value

6. Las interrupciones se manejan via poll() de value

Page 6: Node.js on Raspberry PI

WiringPi

WiringPi es similar al lenguaje Wiring de ArduinoSoporta los modulos GertBoard y PiFace.Tiene mapeo de pins (BCM name, wiring like, pinout)Tiene librerías para manejo de:

● I2C● SPI● SoftPWM● Shift()● Serial Port● Interrupciones● LCD

Soporta multi-threading y mutex (mutual exclusions)Utiliza /dev/mem (que es mas rapido) en lugar de SYSFS.

Dado que el código tiene que correr como root es potencialmente más inseguro

Page 7: Node.js on Raspberry PI

Modulos para acceder al GPIO via Node.js

GpiOhttps://github.com/EnotionZ/GpiO

pi-gpiohttps://github.com/rakeshpai/pi-gpio

rpi-gpiohttps://github.com/JamesBarwell/rpi-gpio.js

node-wiringpi (wrapper de wiringPi incompleto)https://github.com/OhMeadhbh/node-wiringpi

rpi-gpiod (gpio via unix socket)https://blog.mayflower.de/2073-Using-GPIO-on-Raspberry-Pi.html

No se recomienda ejecutar como root si la RPi puede ser accedida desde internet. No se recomienda node-wiringpi ya que debe ser corrido como root dado que wiringPi utiliza /dev/mem para acceder al GPIO. Utilizar rpi-gpiod en su lugar.

Page 8: Node.js on Raspberry PI

Acceso al modulo 1wire via SYSFSCargar los modulos 1wire del kernel

sudo modprobe w1-gpio

sudo modprobe w1-therm

El sensor aparece en ls /sys/bus/w1/devices/ls -l /sys/bus/w1/devices

28-000003b0d431 -> ../../../devices/w1_bus_master1/28-000003b0d431

w1_bus_master1 -> ../../../devices/w1_bus_master1

El archivo w1_slave dentro del directorio del dispositivo 1wire contiene la información de la medición

cat w1_slave

87 01 4b 46 7f ff 09 10 48 : crc=48 YES

87 01 4b 46 7f ff 09 10 48 t=24437

Si el CRC = YES la medición es correcta t = a la temperatura en °C / 1000

Page 9: Node.js on Raspberry PI

Acceso al modulo 1wire desde Node.js// Tom Holderness 03/01/2013// Ref: www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/temperaturevar fs = requiere('fs');

function readTemp(id,callback){ fs.readFile(''/sys/bus/w1/devices/' + id + '/w1_slave'', function(err, buffer)

{ if (err){ console.error(err); process.exit(1); }

// Read data from file (using fast node ASCII encoding). var data = buffer.toString('ascii').split(" "); // Split by space

// Extract temperature from string and divide by 1000 to give celsius var temp = parseFloat(data[data.length-1].split("=")[1])/1000.0;

// Round to one decimal place temp = Math.round(temp * 10) / 10;

// Add date/time to temperature var data = { temperature_record:[{ unix_time: Date.now(), celsius: temp }]};

// Execute call back with data callback(data); });};