BoneScript è un nodo.libreria js per il calcolo fisico su Linux embedded, a partire dal supporto per BeagleBone.
Informazioni sulla lingua sono disponibili all’indirizzo https://nodejs.org.
Per controllare la versione e vedere se BoneScript è nel tuo percorso, prova a eseguire:
node -pe "require('bonescript').getPlatform().bonescript"
La documentazione aggiuntiva è disponibile su https://beagleboard.org/bonescript.
Il concetto è quello di utilizzare funzioni simili ad Arduino scritte in JavaScript per semplificare l’apprendimento come eseguire attività di calcolo fisico sotto Linux incorporato e fornire ulteriore supporto per la creazione rapida di GUI per le applicazioni incorporate attraverso l’uso di pagine Web HTML5/JavaScript.
Installazione globale
BoneScript viene installato sul BeagleBone. Per aggiornare alla revisione più recente, utilizzare ‘ npm ‘ su un recente BeagleBoard.org Immagine Debian dahttps://beagleboard.org/latest-imagesand perform:
TERM=none sudo npm cache clearTERM=none sudo npm install -g --prefix /usr/local --unsafe-perm bonescriptsudo shutdown -r now
Il test su altre distribuzioni è limitato.
Ci sono alcuni passaggi di installazione aggiuntivi che possono essere eseguiti, ma sono tipicamente installati da altri meccanismi sul BeagleBoard.org Immagini Debian. Questi servizi setupbackground (server web bone101 con RPC bonescript e bonescript autorunservice) nonché configurare le variabili di ambiente per questi servizi e altri script eseguiti globalmente.
sudo cp bonescript/etc/default/node /etc/default/nodesudo cp bonescript/etc/profile.d/node.sh /etc/profile.d/node.shsudo cp bonescript/systemd/\* /lib/systemd/systemsudo systemctl enable bonescript.socketsudo systemctl enable bonescript-autorun.service
Avvio persistente delle applicazioni
Per avviare le applicazioni all’avvio, è sufficiente rilasciarle nella cartella/var/lib/cloud9 / autorun. Spostarli fuori da quella cartella ucciderài processi. Ci si aspetta di rilasciare solo app già prive di bug in questa cartella in quanto non esiste un buon modo per eseguire il debug su di esse.
Nota sullo stato del codice
C’è ancora molto sviluppo in corso, quindi assicurati di controllare su base frequente. Molte delle periferiche più elaborate non sono ancora supportateeccezione attraverso l’esecuzione di file I/O.
Layout di directory
- indice.js: Codice sorgente BoneScript principale
- autorun.js: Nodo.JS app per eseguire applicazioni caduto nella cartella autorun
- pacchetto.npm.Descrizione del pacchetto JS
- server.js: BoneScript web server per servire le chiamate di procedura remota
- dts: Devicetree modelli
- ecc: file di Configurazione per essere inserito nella destinazione distro
- src: Biblioteca codice sorgente
- systemd: file di Configurazione per systemd per l’avvio di servizi
- prova: Per-essere-test automatizzato codice
Modello
Per un BoneScript applicazione, è necessario attualmente manualmente ‘richiedono’ thebonescript biblioteca. Le funzioni vengono quindi referenziate attraverso l’oggettofornito da require.
Ho iniziato a provare a fornire funzioni di setup/loop simili ad Arduino, ma theidea non è davvero una buona partita per JavaScript. L’utilizzo di nativeflow di JavaScript funziona al meglio, ma le funzioni familiari sono sufficienti per darti un vantaggio nella tua produttività di calcolo fisico.
Ecco un esempio:
var b = require('bonescript');b.pinMode('P8_12', b.INPUT);b.pinMode('P8_13', b.OUTPUT);setInterval(copyInputToOutput, 100);function copyInputToOutput() { b.digitalRead('P8_12', writeToOutput); function writeToOutput(x) { b.digitalWrite('P8_13', x.value); }}
‘P8_12’ e ‘P8_13’ sono nomi di pin sulla scheda e l’esempio di cui sopra copierebbe il valore di input in P8_12 nell’output P8_13 ogni 100 ms.
API
Quando viene fornita una richiamata, le funzioni si comportano in modo asincrono.Senza una richiamata fornita, le funzioni si sincronizzeranno e completeranno prima di tornare.
System
- getPlatform() -> platform
- getEeproms() -> eeproms
- echo(data, ) -> data
- readTextFile(filename, ) -> data
- writeTextFile(filename, data, )
- setDate(date, )
Digital and Analog I/O
- analogRead(pin, ) -> value
- analogWrite(pin, value, , )
- attachInterrupt(pin, handler, mode, )
- detachInterrupt(pin, )
- digitalRead(pin, ) -> value
- digitalWrite(pin, value, )
- pinMode(pin, direction, , , , )
- getPinMode(pin, ) -> pinMode
- shiftOut(dataPin, clockPin, bitOrder, val, )
Serial
Uses https://github.com/voodootikigod/node-serialport
- serialOpen(port, options, )
- serialWrite(port, data, )
- serialParsers is serialport.parsers
I2C
Uses https://github.com/korevec/node-i2c
- i2cOpen(port, address, options, )
- i2cScan(port, )
- i2cWriteByte(port, byte, )
- i2cWriteBytes(port, command, bytes, )
- i2cReadByte(port, )
- i2cReadBytes(port, command, length, )
- i2cStream(port, command, length, )
Robot Control
new in 0.7.0 Runs on BeagleBone Blue; or BeagleBone Black or BeagleBone Black Wireless with BeagleBoard.org Robotica del Capo
- rcInitialize()
- rcState(, ) -> stato
- rcLED a led (, , ) – > valore
- rcOn(evento )
- rcMotor(motore, valore )
- rcServo(opzione, valore )
- rcBMP(, ) -> valore
- rcIMU(, ) -> valore
- rcEncoder(encoder , ) -> valore
Bit/Byte, Matematica, Trigonometria e Numeri Casuali
- lowByte(valore)
- highByte(valore)
- bitRead(valore, bitnum)
- bitWrite(valore, bitnum, bitdata)
- bitSet(valore, bitnum)
- bitClear(valore, bitnum)
- bit(bitnum)
- min(x, y)
- max(x, y)
- abs(x)
- vincolare(x, a, b)
- mappa(valore, fromLow, fromHigh, toLow, alta)
- pow(x, y)
- sqrt(x)
- peccato(radianti)
- cos(radianti)
- tan(radianti)
- randomSeed(x)
- casuale (max)
Nota sulle prestazioni
Questo codice è totalmente non ottimizzata. L’elenco delle possibili ottimizzazioni che mi vengono in mente è sconcertante. La buona notizia è che penso che possa essere tutto bedone senza influire sull’API, principalmente grazie all’introspectioncapabilities di JavaScript.
Alla fine, questo è pianificato per abilitare l’utilizzo in tempo reale, direttamente dajavascript. Il piano è quello di attact la possibilità di utilizzare questo ambiente di programmazione in tempo reale su più fronti:
- Abilitando più loop e analizzandoli per determinare se possono essere scaricati su un PRU. Questo sarà il meccanismo principale per fornire in tempo realeservicing di iOS.
- Fornire servizi di ordine superiore che utilizzano le periferiche standard per l’uso previsto:
- Driver seriali per I2C,SPI, UART, ecc.
- analogWrite per PWM utilizzando PWM hardware, timer, driver GPIO del kernel, ecc.
- Aggiunta di patch in tempo reale al kernel
Il linguaggio JavaScript fornisce alcune funzionalità che penso siano davvero coolfor fare programmazione embedded e nodo.js fa alcune cose per aiutare enablethat. Il principale è che le funzioni I / O sono tutte asincrone. Forembedded sistemi, questo è particolarmente utile per l’esecuzione di tasksthat bassa latenza rispondono agli eventi nel sistema. Ciò che rende JavaScript molto più facile rispetto ad altri linguaggi per farlo è che mantiene il contesto completo intorno al gestore, quindi non devi preoccuparti di questo.
0.7.4 aggiornamenti chiave
- Abilitato BeagleBone AI funzioni GPIO (digitalRead/digitalWrite/getPinMode)
0.7.3 aggiornamenti chiave
Grande velocità di caricamento da lazy-loading moduli raramente utilizzati
0.7.2 aggiornamenti chiave
- https://github.com/beagleboard/bonescript/issues/52
- https://github.com/beagleboard/bonescript/issues/53
0.7.1 aggiornamenti chiave
Aggiornamento molto minore su un ambito di funzione
0.7.0 tasto aggiornamenti
la Maggior parte di queste correzioni è venuto da Google Summer of Code 2018 progetto
- consente di risolvere in PWM in uscita durante analogWrite aggiornamenti
- Aggiunto chiamate di funzione per il Controllo di Robot e il supporto della libreria su BeagleBone Blu o Robotica del Capo
- Aggiunto il supporto per il nodo stile di callback con errore e dati separati (opzionale)
Piani
- SPI supporto
- PRU di supporto
- Gestione di array di pin pinMode e getPinMode
- Risparmio off creato dtbo e la scrittura di configurazione del capo EEPROM