BoneScript est un nœud.bibliothèque js pour l’informatique physique sous Linux embarqué, à commencer par le support de BeagleBone.
Des informations sur la langue sont disponibles à https://nodejs.org.
Pour vérifier la version et voir si BoneScript est dans votre chemin, essayez d’exécuter :
node -pe "require('bonescript').getPlatform().bonescript"
Une documentation supplémentaire est disponible à https://beagleboard.org/bonescript.
Le concept consiste à utiliser des fonctions de type Arduino écrites en JavaScript pour simplifier l’apprentissage des tâches de calcul physique sous Linuxet pour fournir un support supplémentaire pour créer rapidement des interfaces graphiques pour vos applications intégrées grâce à l’utilisation de pages Web HTML5 / JavaScript.
Installation globale
BoneScript est installé sur votre BeagleBone. Pour mettre à jour la dernière révision, utilisez ‘npm’ sur une version récente BeagleBoard.org Image Debian de https://beagleboard.org/latest-imagesandeffectuer :
TERM=none sudo npm cache clearTERM=none sudo npm install -g --prefix /usr/local --unsafe-perm bonescriptsudo shutdown -r now
Les tests sur d’autres distributions sont limités.
Il y a quelques étapes d’installation supplémentaires qui peuvent être effectuées, mais qui sont généralement installées par d’autres mécanismes sur le BeagleBoard.org Images Debian. Ces services setupbackground (serveur Web bone101 avec bonescript RPC et bonescript autorunservice) ainsi que les variables d’environnement de configuration pour ces services et d’autres scripts exécutés de manière globale.
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
Lancement persistant d’applications
Pour lancer vos applications au démarrage, déposez-les simplement dans le dossier /var/lib/cloud9/autorun. Les déplacer hors de ce dossier tuera les processus. On s’attend à ce que vous ne déposiez que des applications déjà sans bogues dans ce dossier car il n’y a pas de bon moyen d’effectuer un débogage sur elles.
Note sur l’état du code
Il y a encore beaucoup de développement en cours, alors assurez-vous de revenir fréquemment. De nombreux périphériques plus sophistiqués ne sont pas encore pris en charge, sauf en effectuant des E /S de fichiers.
Mise en page du répertoire
- index.js : Code source BoneScript principal
- exécution automatique.js: Noeud.Application JS pour exécuter des applications abandonnées dans le package autorun folder
- .json: NPM.Descripteur de paquet JS
- serveur.js: Serveur web BoneScript pour servir les appels de procédures distantes
- dts:Modèles Devicetree
- etc : Fichiers de configuration à placer dans la distribution cible
- src :Code source de la bibliothèque
- systemd : Fichiers de configuration pour que systemd démarre les services
- test :Code de test à automatiser
Template
Pour une application BoneScript, vous devez actuellement » exiger » manuellement thebonescript library. Les fonctions sont ensuite référencées via l’objectfourni de require.
J’ai commencé à essayer de fournir des fonctions de configuration / boucle de type Arduino, mais theidea n’est vraiment pas un bon match pour JavaScript. L’utilisation de nativeflow de JavaScript fonctionne mieux, mais les fonctions familières sont suffisantes pour vous donner un coup de fouet à votre productivité informatique physique.
Voici un exemple:
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); }}
Les ‘P8_12’ et ‘P8_13’ sont des noms de broches sur la carte et l’exemple ci-dessusdevrait copier la valeur d’entrée à P8_12 sur la sortie P8_13 toutes les 100 ms.
API
Lorsqu’un rappel est fourni, les fonctions se comporteront de manière asynchrone .Sans rappel fourni, les fonctions se synchroniseront et se termineront avant de revenir.
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.cap robotique d’org
- rcInitialize()
- rcState(,) – >état
- rcLED(led,,) – >valeur
- rcOn(événement,)
- rcMotor(moteur, valeur,)
- rcServo(option, valeur)
- rcBMP(,) – >valeur
- rcIMU(,) – >valeur
- rcEncoder(encodeur,,) – >valeur
Bits/Octets, Mathématiques, Trigonométrie et Nombres aléatoires
- lowByte(valeur)
- highByte(valeur)
- bitRead(valeur, bitnum)
- bitWrite(valeur, bitnum, bitdata)
- bitSet(valeur, bitnum)
- bitClear(valeur, bitnum)
- bit(bitnum)
- min(x, y)
- max(x, y)
- abs(x)
- contrainte(x, a, b)
- map(valeur, De bas, de haut, de bas, de haut)
- pow(x, y)
- sqrt(x)
- sin(radians)
- cos(radians)
- tan(radians)
- RandomSeed(x)
- random(, max)
Note sur les performances
Ce code est totalement non optimisé. La liste des optimisations possibles qui passent dans ma tête est stupéfiante. La bonne nouvelle est que je pense que tout peut se passer sans impacter l’API, principalement grâce aux capacités d’introspection de JavaScript.
À terme, ceci est prévu pour permettre une utilisation en temps réel, directement à partir dejavascript. Le plan est d’atteindre la capacité d’utiliser cet environnement de programmation en temps réel sur plusieurs fronts:
- Activer plusieurs boucles et les analyser pour déterminer si elles peuvent être déchargées sur une PRU. Ce sera le principal mécanisme pour fournir un service en temps réel de l’iOS.
- Fournir des services d’ordre supérieur qui utilisent les périphériques standard pour leur utilisation prévue:
- Pilotes série pour I2C, SPI, UARTs, etc.
- analogWrite pour les PWM utilisant des PWM matériels, des minuteries, des pilotes GPIO du noyau, etc.
- Ajout de correctifs en temps réel au noyau
Le langage JavaScript fournit des fonctionnalités que je pense vraiment cool pour faire de la programmation intégrée et des nœuds.js fait certaines choses pour aider à le rendre possible. La principale est que les fonctions d’E / S sont toutes asynchrones. Pour les systèmes intégrés, cela est particulièrement utile pour effectuer des tâches à faible latence qui répondent aux événements du système. Ce qui rend JavaScript tellement plus facile que d’autres langages pour le faire, c’est qu’il garde le contexte complet autour du gestionnaire, vous n’avez donc pas à vous en soucier.
0.7.4mises à jour des clés
- Fonctions GPIO BeagleBone AI activées (digitalRead/digitalWrite /getPinMode)
0.7.3 mises à jour des clés
Grande accélération du chargement par chargement paresseux de modules peu utilisés
0.7.2 mises à jour clés
- https://github.com/beagleboard/bonescript/issues/52
- https://github.com/beagleboard/bonescript/issues/53
0.7.1 mises à jour clés
Mise à jour très mineure sur une portée de fonction
0.7.0 mises à jour clés
La plupart de ces correctifs proviennent d’un projet Google Summer of Code 2018
- Correctifs dans la sortie PWM pendant les mises à jour analogWrite
- Ajout d’appels de fonction pour la prise en charge de la bibliothèque de contrôle de robot sur BeagleBone Blue ou Robotics Cape
- Ajout de la prise en charge des rappels de style nœud avec erreur et données séparées (facultatif)
Plans
- Support SPI
- > Prise en charge de la PRU
- Gestion du tableau de broches en mode PIN et getPinMode
- Sauvegarde du dtbo créé et écriture de la configuration sur cape EEPROM