node.js on raspberry pi
TRANSCRIPT
Node.JS y RaspBerry PiMeetup NodeJS Argentina
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)
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.
Interface entre señales 3V3 y 5V
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
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
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.
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
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); });};