Node.js on Raspberry PI

1,932 views

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,932
On SlideShare
0
From Embeds
0
Number of Embeds
32
Actions
Shares
0
Downloads
17
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Node.js on Raspberry PI

  1. 1. Node.JS y RaspBerry Pi Meetup NodeJS Argentina
  2. 2. 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. Lafundació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)
  3. 3. Node.js en RaspBerry PiLos 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 crosscompiling 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.
  4. 4. Interface entre señales 3V3 y 5V
  5. 5. Acceso al GPIO via SYSFS1. Exportar el pin 27 via IO via SYSFS sudo echo "27" > /sys/class/gpio/export al hacer esto aparece el directorio /sys/class/gpio/gpio272. Para definir el pin como entrada sudo echo "in" > /sys/class/gpio/gpio27/direction Para definir el pin como salida sudo echo "out" > /sys/class/gpio/gpio27/direction3. Para invertir la señal en el pin sudo echo "1" > /sys/class/gpio/gpio27/active_low4. Para establecer un estado en el pin sudo echo "1" > /sys/class/gpio/gpio27/value5. Para leer un estado del pin sudo cat /sys/class/gpio/gpio27/value6. Las interrupciones se manejan via poll() de value
  6. 6. WiringPiWiringPi 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● LCDSoporta 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
  7. 7. Modulos para acceder al GPIO via Node.jsGpiO https://github.com/EnotionZ/GpiOpi-gpio https://github.com/rakeshpai/pi-gpiorpi-gpio https://github.com/JamesBarwell/rpi-gpio.jsnode-wiringpi (wrapper de wiringPi incompleto) https://github.com/OhMeadhbh/node-wiringpirpi-gpiod (gpio via unix socket) https://blog.mayflower.de/2073-Using-GPIO-on-Raspberry-Pi.htmlNo se recomienda ejecutar como root si la RPi puede ser accedida desde internet. No serecomienda node-wiringpi ya que debe ser corrido como root dado que wiringPi utiliza /dev/mempara acceder al GPIO. Utilizar rpi-gpiod en su lugar.
  8. 8. Acceso al modulo 1wire via SYSFSCargar los modulos 1wire del kernel sudo modprobe w1-gpio sudo modprobe w1-thermEl 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_master1El archivo w1_slave dentro del directorio del dispositivo1wire 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=24437Si el CRC = YES la medición es correcta t = a latemperatura en °C / 1000
  9. 9. 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); });};

×