Este é o segundo artigo da série onde falaremos sobre a IDE (Integrated Development Environment ou Ambiente Integrado de Desenvolvimento) da Cloud9 para programação em JavaScript e execução on-time do software. A Cloud9 é uma empresa que fabrica IDE via browser com recursos de programação para execução e depuração via browser. O site da Cloud9 é http://www.c9.io A seguir, veremos alguns exemplos simples de operação da IDE através de scripts iniciais para melhor assimilação do conteúdo.
Colocando a Mão na Massa
Primeiramente com a BeagleBone ligada na porta USB client acesse o seguinte endereço no seu navegador: http://192.168.7.2:3000
Segundo as recomendações do site http://beagleboard.org você precisa executar os seguintes passos:
1. Fechar qualquer arquivo que estiver aberto.
2. Clicar no simbolo “+” no canto superior esquerdo para abrir um arquivo. Repare que ele abrirá um arquivo do tipo Untitled(active).
3. Colocar o seguinte código no corpo de editor.
var b = require('bonescript');
var state = b.LOW;
b.pinMode("USR0", b.OUTPUT);
b.pinMode("USR1", b.OUTPUT);
b.pinMode("USR2", b.OUTPUT);
b.pinMode("USR3", b.OUTPUT);
setInterval(toggle, 1000);
function toggle() {
if(state == b.LOW) state = b.HIGH;
else state = b.LOW;
b.digitalWrite("USR3", state);
}
4. Salve o Arquivo clicando no ícone de salvar conforme imagem abaixo:
5. Execute o código clicando no em “Run” ou debug conforme a imagem abaixo:
6. Observe o LED “USR3” piscar.
7. Clique em stop para párar a execução conforme a imagem abaixo:
8. Pronto!
Esses são os passos iniciais necessários para que você entenda como funciona a IDE do cloud9. Dentro da documentação inicial eu ressalto os seguinte item que é importante:
Se o leitor desejar colocar o script para que o mesmo seja executado ao inicializar o sistema é necessário copiar o script para a par /var/lib/cloud9/autorun/
Funcionalidades da Biblioteca BoneScript – Parte I
A biblioteca BoneScritpt é feita em nodejs. O BoneScript foi feito de forma a ser de simples programação no estilo Arduino-Like porém para programação em javascript. A IDE da Cloud9 tem o objetivo de facilitar o uso de javascript na BeagleBone, tornando mais simples a operação.
Aqui nós faremos um descritivo das funções para que você possa utilizar as funções da biblioteca BoneScript sem muitas complicações. Por opção, seguirei a sequencia que está disponível no site:
http://beagleboard.org/Support/BoneScript/
Algumas outras funções foram atualizadas no repositório github do BoneScript. Acesse o link abaixo para ver o conjunto de funções adicionadas na API:
https://github.com/jadonk/bonescript
A versão do bonescript que iremos documentar é 0.2.5
getPlataform([callback])
Argumentos
callback: retorno da função
Valores Retornados
name: nome da placa.
serialNumber: numero serial da placa.
version: versão da placa
bonescript: versão do bonescript
callback(x) (Callback – O termo callback, ou traduzido “chamada de retorno”, é uma chamada assíncrona, ou seja, que não necessita rodar em uma ordem temporal cronológica, executada imediatamente ao término de uma função. O termo callback será mantido porque em português já se utiliza esse termo para javascript há tempos. )
x: o mesmo do valor retornado.
Implementação de referência
// instancia o objeto bonescript em b
var b = require('bonescript');
b.getPlataform(printData);
function printData(x){
console.log( 'nome = ' + x.name);
console.log( 'versão = '+ x.version);
console.log( 'numero de série = '+ x.serialNumber);
console.log( 'versão bonescript = '+ s.bonescript);
}
pinMode(pin, direction, [mux],[pullup],[slew],[callback]) - (Apesar dessa função estar marcada como depreciada na documentação no site http://beagleboard.org ela consta na documentação do github do desenvolvedor.)
Argumentos
pin : pino na BeagleBone.
direction: direção do pino na placa. INPUT, INPUT_PULLUP (Opção não implementada segundo a documentação.) ou OUTPUT.
mux: indice para o mux (Opção não implementada segundo a documentação. )
pullup: 'pullup', 'pulldown' ou 'disable' (Opção não implementada segundo a documentação. )
slew(variação): 'fast' (rápido) ou 'slow' (lento) – (O termo “Slew” indica a variação de um estado para outro (0 ou 1) – Nota didática)
callback – retorno da função
Valores retornados
true – se verdadeiro
false – se falso
callback(x)
x.value – retorna o valor
x.err – status da mensagem de erro
Implementação de Referência
var b = require('bonescript')
b.pinMode(“P8_13”, b.OUTPUT, 7, 'pullup', 'fast', printStatus);
function printStatus(x){
console.log('value=' + x.value);
console.log('err=' + x.err);
}
getPinMode(pin,[callback])
Pega os dados do pino
Argumentos
pin: pino do qual se deseja pegar o status
callback: retorno da função.
Valores de Retorno
mux: índice do modo mux.
Options: array com nome dos modos (Modos: configuração que cada pino pode exercer. )
slew: 'fast' ou 'slow' (mesmo da função anterior)
rx: 'enabled' (habilitado) ou 'disabled' (desabilitado)
pullup: 'disabled', 'pullup' ou 'pulldown'
pin: string identificadora do pino.
name: nome do pino
err: status da mensagem de erro
callback(x)
x: valor de retorno
Implementação de Referência
var b = require('bonescript');
b.getPinMode("P8_13", printPinMux);
function printPinMux(x) {
console.log('mux = ' + x.mux);
console.log('pullup = ' + x.pullup);
console.log('variação = ' + x.slew);
if(x.options)
{
console.log('opções = ' + x.options.join(','));
}
console.log('pino = ' + x.pin);
console.log('nome = ' + x.name);
console.log('erro = ' + x.err);
}
digitalWrite(pin, value, [callback])
Configura um pino digital para nível HIGH(alto, 1) ou LOW(0, baixo).
Nota da Documentação: Os quatro LEDs USRx(leds que já vem na placa) podem ser habilitados para operar como pinos digitais, dando ao leitor a possibilidade de testar a saída do software.
Argumentos
pin: identificador do pino.
value: valor de saída: HIGH ou LOW.
callback: função de retorno.
Valores de Retorno
true se obtiver sucesso
false se falhar
callback(x)
x.err : status da mensagem de erro.
Implementação de Referência (O exemplo acima possui o callback implementado, porém ele nunca será executado por que esse pino não retornará erro. O leitor poderá colocar um pino diferente na linha 3 e testar o retorno. )
var b = require('bonescript');
b.pinMode('USR0', b.OUTPUT);
b.digitalWrite('USR0', b.HIGH, retorno);
function retorno(x){
console.log('erro'+x.err);
}
digitalRead(pin, [callback])
Lê o status de um pino digital.
Argumentos
pin: identificador do pino.
callback: função de retorno.
Valor de Retorno
HIGH para níveis lógicos 1, alto
LOW para níveis lógicos 0, baixo.
callback(x)
x.value: valor retornado
x.err: status da mensagem de erro (se houver)
Implementação de Referência
var b = require('bonescript');
b.pinMode('P8_19', b.INPUT);
b.digitalRead('P8_19', printStatus);
function printStatus(x) {
console.log('x.value = ' + x.value);
console.log('x.err = ' + x.err);
}
shiftOut(dataPin, clockPin, bitOrder, val, [callback])
Desloca um byte para um pino de Entrada/Saída digital sincronizando com outro pino de Entrada/Saída digital.
Argumentos
dataPin: pino para dados seriais.
clockPin: pino para o clock.
bitOrder: ordem do bit do byte. b.MSBFIRST ou b.LSBFIRST
val: valor do byte a ser escrito
callback: função de retorno
Valor de Retorno
true se obtiver sucesso
false em caso de falha.
callback(x)
x.err : status do erro da mensagem (se houver)
Implementação de Referência
//
// Demonstrate shiftOut with a 7 segment display
//
// read in the BoneScript library
var b = require('bonescript');
// define used pins
var sData = "P9_18";
var sClock = "P9_22";
var sLatch = "P9_17";
var sClear = "P9_15";
// define other global variables
var digit = 0;
var segments = [ 0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90 ];
// configure pins as outputs
b.pinMode(sData, b.OUTPUT);
b.pinMode(sClock, b.OUTPUT);
b.pinMode(sLatch, b.OUTPUT);
b.pinMode(sClear, b.OUTPUT);
// initial states
b.digitalWrite(sData, b.LOW);
b.digitalWrite(sClock, b.LOW);
b.digitalWrite(sLatch, b.LOW);
b.digitalWrite(sClear, b.HIGH);
// call function to start updating the LED shift register
doUpdate();
// function to update the LED shift register
function doUpdate() {
// shift out the character LED pattern
b.shiftOut(sData, sClock, b.MSBFIRST,
segments[digit], doLatch);
// update the digit for next time
digit = (digit + 1) % 10;
}
function doLatch() {
// latch in the value
b.digitalWrite(sLatch, b.HIGH, doLatchLow);
}
function doLatchLow() {
b.digitalWrite(sLatch, b.LOW, scheduleUpdate);
}
function scheduleUpdate() {
// update again in another 25ms
setTimeout(doUpdate, 25);
}
Essa implementação de referência foi retirada da documentação. Essa função é utilizada com um hardware adicional para visualização em um display de 7 segmentos.
Piscando um LED na BeagleBone
Para finalizar essa introdução, iremos piscar um LED interno da BeagleBone explicando passo a passo o programa para que o leitor possa entender o que ocorre.
Código de Referência
// Exemplo 01 – Piscando um led na beagle bone
var b = require('bonescript');
var led = “USR0”; // led que irá piscar
var estado = 0;
// configurando o pino como saída
b.pinMode(led, b.OUTPUT);
piscar = function(){
b.digitalWrite(led,estado);
console.log('o estado é: '+estado); // escrever o estado no console a cada 1 segundo
if (estado==0)
{
estado = 1;
}else{
estado = 0;
}
}
tempo = setInterval(piscar, 1000); // tempo em milisegundos
Não se esqueça de salvar o código antes de executar! Caso contrário não funcionará.
Conclusão
Nesta primeira parte vimos o modo de operação básico da IDE Cloud9, algumas funções e por fim um exemplo de como piscar um led interno da placa.