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.

 

Figura 1 – Nota dos Leds USRx
Figura 1 – Nota dos Leds USRx

 

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.

 

 

 

 mic0114 0005

 

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.