BoneScript ist ein Knoten.js-Bibliothek für Physical Computing unter Embedded Linux, beginnend mit Unterstützung für BeagleBone.
Informationen zur Sprache finden Sie unter https://nodejs.org.
Um die Version zu überprüfen und festzustellen, ob sich BoneScript in Ihrem Pfad befindet, versuchen Sie Folgendes auszuführen:
node -pe "require('bonescript').getPlatform().bonescript"
Zusätzliche Dokumentation finden Sie unter https://beagleboard.org/bonescript.
Das Konzept besteht darin, Arduino-ähnliche Funktionen zu verwenden, die in JavaScript geschrieben sind, um das Erlernen von Physical Computing-Aufgaben unter eingebettetem Linux zu vereinfachen und durch die Verwendung von HTML5 / JavaScript-Webseiten die schnelle Erstellung von GUIs für Ihre eingebetteten Anwendungen zu unterstützen.
Globale Installation
BoneScript wird auf Ihrem BeagleBone installiert. Um auf die neueste Version zu aktualisieren, verwenden Sie ’npm‘ BeagleBoard.org Debian-Image von https://beagleboard.org/latest-imagesand Ausführen:
TERM=none sudo npm cache clearTERM=none sudo npm install -g --prefix /usr/local --unsafe-perm bonescriptsudo shutdown -r now
Das Testen auf anderen Distributionen ist begrenzt.
Es gibt einige zusätzliche Installationsschritte, die ausgeführt werden können, aber normalerweise von anderen Mechanismen auf dem BeagleBoard.org Debian-Bilder. Diese Setupbackground-Dienste (bone101-Webserver mit Bonescript RPC und Bonescript autorunservice) sowie Umgebungsvariablen für diese Dienste und andere global ausgeführte Skripte konfigurieren.
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
Anwendungen dauerhaft starten
Damit Ihre Anwendungen beim Start gestartet werden, legen Sie sie einfach im Ordner/var/lib/cloud9/autorun ab. Wenn Sie sie aus diesem Ordner verschieben, werden alle Prozesse beendet. Es wird erwartet, dass Sie nur bereits fehlerfreie Apps in diesen Ordner einfügen, da es keine gute Möglichkeit gibt, sie zu debuggen.
Hinweis zum Codezustand
Es gibt noch eine Menge Entwicklung, also schauen Sie regelmäßig vorbei. Viele der ausgefalleneren Peripheriegeräte werden noch nicht unterstützt, außer durch Ausführen von Datei-E/ A.
Verzeichnislayout
- Index.js: Haupt BoneScript Quellcode
- autorun.js: Knoten.JS App zum Ausführen von Apps, die im Autorun-Ordner abgelegt wurden
- Paket.json: NPM.JS Paketdeskriptor
- Server.js: BoneScript-Webserver zum Bereitstellen von Remote-Prozeduraufrufen
- dts: Devicetree-Vorlagen
- etc: Konfigurationsdateien, die in der Zieldistribution abgelegt werden sollen
- src: Bibliotheksquellcode
- systemd: Konfigurationsdateien für systemd zum Starten von Diensten
- test: Zu automatisierender Testcode
Vorlage
Für eine BoneScript-Anwendung müssen Sie derzeit manuell thebonescript-Bibliothek. Funktionen werden dann über das von require zurückgegebene objectprovided referenziert.
Ich habe versucht, Arduino-ähnliche Setup- / Loop-Funktionen bereitzustellen, aber theidea passt wirklich nicht gut zu JavaScript. Die Verwendung von JavaScript Nativeflow funktioniert am besten, aber die bekannten Funktionen reichen aus, um Ihre physische Computerproduktivität zu steigern.
Hier ist ein Beispiel:
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); }}
Die ‚P8_12‘ und ‚P8_13‘ sind Pin-Namen auf der Platine und das obige Beispielwürde den Eingangswert bei P8_12 alle 100 ms auf den Ausgang P8_13 kopieren.
API
Wenn ein Rückruf bereitgestellt wird, verhalten sich die Funktionen asynchron.Ohne einen Rückruf werden die Funktionen synchronisiert und abgeschlossen, bevor sie zurückkehren.
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 Robotics Cape
- rcInitialize()
- rcState(, ) -> Zustand
- rcLED(led, , ) -> Wert
- rcOn(Ereignis, )
- rcMotor(motor, Wert, )
- rcServo(option, Wert )
- rcBMP(, ) -> Wert
- rcIMU(, ) -> Wert
- rcEncoder(encoder, , ) -> Wert
Bits/Bytes, Mathematik, Trigonometrie und Zufallszahlen
- lowByte(Wert)
- highByte(Wert)
- bitRead(Wert, bitnum)
- bitWrite(Wert, bitnum, bitdata)
- bitSet(Wert, bitnum)
- bitClear(Wert, bitnum)
- Bit(bitnum)
- min(x, y)
- max(x, y)
- abs(x)
- Einschränkung(x, a, b)
- Karte(Wert , fromLow, fromHigh, toLow, toHigh)
- pow(x, y)
- sqrt(x)
- sin(Bogenmaß)
- cos(Bogenmaß)
- tan(Bogenmaß)
- RandomSeed(x)
- random(, max)
Hinweis zur Leistung
der Code ist völlig unoptimiert. Die Liste der möglichen Optimierungen, die mir durch den Kopf gehen, ist atemberaubend. Die gute Nachricht ist, dass ich denke, dass alles ohne Auswirkungen auf die API erledigt werden kann, vor allem dank der Introspektionsfähigkeiten von JavaScript.
Schließlich ist dies geplant, um die Echtzeitnutzung direkt aus JavaScript zu ermöglichen. Es ist geplant, diese Programmierumgebung in Echtzeit an mehreren Fronten zu verwenden:
- Aktivieren mehrerer Schleifen und Analysieren dieser Schleifen, um festzustellen, ob sie in eine PRU ausgelagert werden können. Dies wird der primäre Mechanismus für die Bereitstellung von Echtzeit Seinservicing des iOS.
- Bereitstellung von Diensten höherer Ordnung, die die Standardperipheriegeräte für ihren Verwendungszweck verwenden:
- Serielle Treiber für I2C, SPI, UARTs usw.
- analogWrite für PWMs mit Hardware-PWMs, Timern, Kernel-GPIO-Treibern usw.
- Hinzufügen von Echtzeit-Patches zum Kernel
Die JavaScript-Sprache bietet einige Funktionen, die ich für eingebettete Programmierung und Knoten für wirklich cool halte.js macht einige Dinge, um das zu ermöglichen. Die primäre ist, dass die E / A-Funktionen alle asynchron sind. Für eingebettete Systeme ist dies besonders nützlich, um Aufgaben mit niedriger Latenz auszuführen, die auf Ereignisse im System reagieren. Was JavaScript so viel einfacher macht als andere Sprachen, ist, dass es den vollständigen Kontext um den Handler herum beibehält, sodass Sie sich keine Sorgen machen müssen.
0.7.4 Schlüsselaktualisierungen
- Aktivierte BeagleBone AI GPIO-Funktionen (digitalRead /digitalWrite/getPinMode)
0.7.3 Schlüsselaktualisierungen
Große Beschleunigung beim Laden durch verzögertes Laden selten verwendeter Module
0.7.2 schlüsselaktualisierungen
- https://github.com/beagleboard/bonescript/issues/52
- https://github.com/beagleboard/bonescript/issues/53
0.7.1 Schlüsselaktualisierungen
Sehr kleine Aktualisierung eines Funktionsbereichs
0.7.0 Schlüsselaktualisierungen
Die meisten dieser Korrekturen stammten aus einem Google Summer of Code 2018-Projekt
- Korrekturen am PWM-Ausgang während analogWrite-Updates
- Funktionsaufrufe für die Unterstützung der Robotersteuerungsbibliothek auf BeagleBone Blue oder Robotics Cape hinzugefügt
- Unterstützung für Rückrufe im Knotenstil mit getrennten Fehlern und Daten hinzugefügt (optional)
Pläne
- SPI-Unterstützung
- PRU unterstützung
- Handhabung array von pins in pinMode und getPinMode
- Speichern off erstellt dtbo und schreiben konfiguration zu cape EEPROM