domingo, 3 de julho de 2011

Pisca led com Arduino e Node.JS

Eu estava devendo a muito um post sobre Arduíno, já foram 3 Dojos e eu nao postei nada a respeito. Então vamos la...
O Arduino e um projeto de hardware livre, e tem muita coisa na internet (muita mesmo), e vários grupos como o ArduinoMS que promove encontros periódicos para troca de conhecimento, experiencia e um pouco de diversao tambem, afinal diversão e o carro chefe de quem "brinca" com Arduino.
Ja o Node.JS e um servidor de aplicacaoes em javascript orientado a eventos e assíncrono.

Esta aplicacao e bem simples, ascender e apagar um led por uma interface web, utilizando webSockets.

Presumindo que vc ja tenha instalado o Node.JS, vamos aos codigos.


Na interface....




var socket = new WebSocket("ws://localhost:8080/"); // abro a conecxao com o servidor

function acendeLuz(){
socket.send(1); // envio 1 para ascender
}
function apagaLuz(){
socket.send(0); // e 0 para apagar
}


e o html.....







no servidor....

var ws = require("./ws"); // blibioteca para trabalhar com webSocktes
var fs = require('fs'); // bliboteca para trabalhar com fileSystem

var server = ws.createServer(function(socket){
socket.on("connect", function(resource){
socket.write("conectou");
});

socket.on("data", function (data) {
console.log(data);
if(data == 1){acende();} // verifico a mensagem da interface
if(data == 0){apaga();}
});
});

function acende(){
// envia a string '1' para o arduino pela porta USB, dev/ttyUSB0 (no Ruwindows seria COM1 )
fs.open('/dev/ttyUSB0', 'a', 666, function( e, id ) {
fs.write( id, '1', null, null, null, null);
});
}

function apaga(){
fs.open('/dev/ttyUSB0', 'a', 666, function( e, id ) {
fs.write( id, '0', null, null, null, null);
});
}

server.listen(8080); // server na porta 8080...




e por fim no arduino.....

int incomingByte = 0; // for incoming serial data
int ledPin = 13;

void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // opens serial port, sets data rate to 9600 bps
}

void loop() {

// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();

// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte);
if(incomingByte == 49){ // o 49 representa a string '1' enviada pelo servidor
digitalWrite(ledPin, HIGH);
}

if(incomingByte == 48){ // e o 48 representa o '0'
digitalWrite(ledPin, LOW);
}



}
}



tem ai um video da aplicacao funcionando




Mais.....

o codigo completo ta no github https://github.com/eltonluc/ArduinoNode

sobre o ultimo Dojo do ArduinoMS tem um post do @jeffmor no blog da Jera

Dica...

se vc tem um modem 3g da Huawei, evite usar ele e a placa do arduino espetada ao mesmo tempo no computador, pode ser fatal (para o modem)....