Skip to content

[Doc BBBlue] BoneScript & Roboticscape

Renato Avellar Nobre edited this page Jul 15, 2019 · 2 revisions

Integração BeagleBone Blue com Javascript

Para a competição da TRUFES a linguagem de programação escolhida foi o JavaScript, devido a sua versatilidade e curva de aprendizado. Para suportar funções do BeagleBone, utiliza-se duas bliblotecas. BoneScript e RoboticsCape.

A biblioteca RoboticsCape será usada para controle de motores e seus respectivos encoders, já a BoneScript será utilizada para GPIO e outras abordagens.

Para baixar essa biblioteca é necessário instalar o npm primeiro, e isso pode ser feito digitando:

sudo apt install npm

Com isso instalado, podemos baixar a biblioteca:

sudo npm install --global bonescript
sudo npm install --global roboticscape

Mas a instalação do RoboticsCape não vai funcionar, porque a versão disponível no GitHub não funciona para o quarto encoder, foi necessário realizar uma alteração na biblioteca.

BoneScript

O BoneScript possui um conjunto de funções uteis e suas delcarações podem ser encontradas no Github da Biblioteca, bem como no ip de suporte do seu BeagleBone, geralmente 192.168.7.2.

Exemplo de Leitura de Sinal Digital

var b = require('bonescript');
b.pinMode('P8_19', b.INPUT);
b.digitalRead('P8_19', printStatus);
function printStatus(err,value) {
    console.log('value = ' + value);
    console.log('err = ' + err);
}

RoboticsCape

Initialize

rc.initialize()

Essa função inicializa as funções de hardware e retorna um inteiro. Esse número pode ser:

  • -2 : O conteúdo presente em PID_FILE não é válido.
  • -1 : Existia um programa rodando e não foi possível fecha-lo normalmente, então foi necessário dar um "kill".
  • 0 : Nenhum programa estava rodando.
  • 1 : Existia um programa rodando e foi possível fecha-lo normalmente.

Essa função é necessária no início do código para utilizar as outras funções aqui presentes.

Motor

rc.motor(motor, valor)

É responsável pelo funcionamento dos motores. Recebe como argumento 'motor' e 'valor', porém pode só receber 'valor'. Motor pode receber 1, 2, 3 ou 4, referente ao motor que você está utilizando na função.

Valor pode receber tanto strings quanto números, e eles podem ser:

  • "ENABLE", habilita TODOS os motores. Caso você não especifique qual motor quer rodar, após um enable, todos motores vão girar.
  • "DISABLE", Desabilita TODOS os motores.
  • "FREE_SPIN", Coloca um motor em um estado de aceleração zero permitindo que ele gire livremente.
  • "BREAK", Conecta os pares de terminais do motor juntos, o que faz com que o motor lute contra ele mesmo. Isso o torna resistente à rotação.
  • Um número de 0 a 1 correspondente à potência do motor, sendo 1 = 100% e 0 = 0%.

Encoder

rc.encoder(ação, valor)

Essa função é a responsável pelos encoders, porém só três deles, aqueles que são categorizados como EQEP que são os encoder 1 a 3. O quarto encoder é categorizado como PRU, e tem sua função específica.

Ação pode receber 2 valores

  • 0, Um é pra leitura e outro pra escrita
  • 1, Um é pra leitura e outro pra escrita

Valor varia sua funcionalidade de acordo com a ação escolhida. Caso a ação seja de escrita, valor será escrito naquela posição do encoder. Esse método é geralmente usado pra zerar o encoder.

Caso a ação seja leitura, valor é o encoder no qual será lido o valor do encoder. No caso da leitura, valor so vai de 1 a 3.

Vale ressaltar que quando só é passado 1 argumento pra função, por padrão esse argumento será o numero do encoder e a ação escolhida é a leitura.

Exemplo

var rc = require('roboticscape');

/* Allocate the userspace usage of the robotics cape features */
rc.initialize();

/* Set the state to RUNNING */
rc.state("RUNNING");

/* Exercise the robotics cape hardware */
rc.led("GREEN", true);
rc.on("PAUSE_PRESSED", function() { 
    console.log("PAUSE pressed");
    
    /* Set the state to EXITING */
    rc.state("EXITING");
});
rc.motor("ENABLE");
rc.motor(1, 0.3);
rc.motor(2, 0.3);
rc.motor(3, 0.3);
rc.motor(4, 0.3);

/* Read encoder every second until PAUSE button pressed */
setInterval(function() {
    if(rc.state() == "RUNNING") {
        var enc1 = rc.encoder(1);
        var enc2 = rc.encoder(2);
        var enc3 = rc.encoder(3);
        var enc4 = rc.encoder(1);
        console.log("encoder 1 = " + enc1);
        console.log("encoder 2 = " + enc2);
        console.log("encoder 3 = " + enc3);
        console.log("encoder 4 = " + enc4);
    } else {
        /* The robotics cape userspace interface is automatically freed on exit */
        process.exit();
    }
}, 1000);

Clone this wiki locally