2. RaspBerry Pi
Arquitectura ARMv6 (Broadcom BCM2835, ARM1176JZF-S @700 Mhz)
256 (modelo A o B v1) / 512 Mb de RAM (modelo B v2)
Filesystem en tarjeta SD
Ethernet 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 compuesto
Conector 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 stereo
Soporta protocolo CEC via HDMI
8 GPIO (4 GPIO extras en el Bv2), SPI (2 x multiplexado), I2C, UART (3V3)
3. Node.js en RaspBerry Pi
Los binarios de la última versión se pueden bajar de http:
//nodejs.org/dist/latest/ en formato .tar.gz
La 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.
5. Acceso al GPIO via SYSFS
1. Exportar el pin 27 via IO via SYSFS
sudo echo "27" > /sys/class/gpio/export
al hacer esto aparece el directorio /sys/class/gpio/gpio27
2. 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/direction
3. Para invertir la señal en el pin
sudo echo "1" > /sys/class/gpio/gpio27/active_low
4. Para establecer un estado en el pin
sudo echo "1" > /sys/class/gpio/gpio27/value
5. Para leer un estado del pin
sudo cat /sys/class/gpio/gpio27/value
6. Las interrupciones se manejan via poll() de value
6. WiringPi
WiringPi es similar al lenguaje Wiring de Arduino
Soporta 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
7. Modulos para acceder al GPIO via Node.js
GpiO
https://github.com/EnotionZ/GpiO
pi-gpio
https://github.com/rakeshpai/pi-gpio
rpi-gpio
https://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.
8. Acceso al modulo 1wire via SYSFS
Cargar 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
9. Acceso al modulo 1wire desde Node.js
// Tom Holderness 03/01/2013
// Ref: www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/temperature
var 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);
});
};