BoneScript es un nodo.biblioteca js para computación física en Linux embebido, comenzando con soporte para BeagleBone.
la Información sobre el idioma está disponible en https://nodejs.org.
comprobar la versión y a ver si BoneScript en su camino, trate de funcionamiento:
node -pe "require('bonescript').getPlatform().bonescript"
documentación Adicional está disponible en https://beagleboard.org/bonescript.
El concepto es usar funciones similares a Arduino escritas en JavaScript para simplificar el aprendizaje de cómo realizar tareas de computación física bajo Linux incrustado y proporcionar soporte para crear rápidamente interfaces gráficas de usuario (GUI) para sus aplicaciones incrustadas a través del uso de páginas web HTML5/JavaScript.
Instalación global
BoneScript viene instalado en su BeagleBone. Para actualizar a la última revisión, utilice ‘ npm ‘en una versión reciente BeagleBoard.org Imagen de Debian de https://beagleboard.org/latest-imagesand realizar:
TERM=none sudo npm cache clearTERM=none sudo npm install -g --prefix /usr/local --unsafe-perm bonescriptsudo shutdown -r now
Las pruebas en otras distribuciones son limitadas.
Hay algunos pasos de instalación adicionales que se pueden realizar, pero que normalmente se instalan mediante otros mecanismos en el BeagleBoard.org Imágenes de Debian. Estos servicios setupbackground (servidor web bone101 con RPC de bonescript y servicio automático de bonescript), así como configurar variables de entorno para estos servicios y otros scripts de ejecución móvil.
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
Iniciar aplicaciones de forma persistente
Para que sus aplicaciones se inicien al iniciar, simplemente colóquelas en la carpeta/var/lib/cloud9 / autorun. Sacarlos de esa carpeta matará los procesos. Se espera que solo ingrese aplicaciones que ya están libres de errores en esta carpeta, ya que no hay una buena manera de realizar la depuración en ellas.
Nota sobre el estado del código
Todavía hay mucho desarrollo en curso, así que asegúrese de volver a comprobarlo con frecuencia. Muchos de los periféricos más sofisticados aún no son compatibles, excepto a través de la realización de E/S de archivos.
Diseño de directorio
- index.js: Código fuente principal de BoneScript
- autorun.js: Nodo.Aplicación JS para ejecutar aplicaciones caídas en la carpeta de ejecución automática paquete
- .json: NPM.Descriptor de paquete JS
- servidor.js: Servidor web BoneScript para servir llamadas a procedimientos remotos
- dts: Plantillas de árbol de dispositivos
- etc: Archivos de configuración que se colocarán en la distribución de destino
- src: Código fuente de la biblioteca
- systemd: Archivos de configuración para que systemd inicie servicios
- test: Código de prueba que se automatizará
Template
Para una aplicación BoneScript, la biblioteca de guiones. A continuación, se hace referencia a las funciones a través del objeto proporcionado desde require.
Comencé tratando de proporcionar funciones de configuración / bucle similares a Arduino, pero theidea realmente no es una buena combinación para JavaScript. El uso de nativeflow de JavaScript funciona mejor, pero las funciones familiares son suficientes para aumentar la productividad de su computación física.
Aquí hay un ejemplo:
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); }}
Los ‘P8_12’ y ‘P8_13’ son nombres de pin en la placa y el ejemplo anterior copiaría el valor de entrada en P8_12 a la salida P8_13 cada 100 ms.
API
Cuando se proporciona una devolución de llamada, las funciones se comportarán asincrónicamente.Sin una devolución de llamada proporcionada, las funciones se sincronizarán y completarán antes de regresar.
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 Robótica Cabo
- rcInitialize()
- rcState(, ) -> estado
- rcLED(led ) -> valor
- rcOn(evento )
- rcMotor(motor, valor )
- rcServo(opción, valor )
- rcBMP(, ) -> valor
- rcIMU(, ) -> valor
- rcEncoder(encoder , ) -> valor
Bits/Bytes, Matemáticas, Trigonometría y Números al Azar
- lowByte(valor)
- highByte(valor)
- bitRead(valor, bitnum)
- bitWrite(valor, bitnum, bitdata)
- bitSet(valor, bitnum)
- bitClear(valor, bitnum)
- bit(bitnum)
- min(x, y)
- max(x, y)
- abs(x)
- restringir(x, a, b)
- map(valor, fromLow, fromHigh, toLow, y alta)
- pow(x, y)
- sqrt(x)
- el pecado(radianes)
- cos(radianes)
- tan(radianes)
- randomSeed(x)
- random (max)
Nota en el rendimiento
Este código es totalmente unoptimized. La lista de posibles optimizaciones que recorren mi cabeza es asombrosa. La buena noticia es que creo que todo se puede hacer sin afectar la API, principalmente gracias a las capacidades de introspección de JavaScript.
Eventualmente, esto está planeado para habilitar el uso en tiempo real, directamente desde JavaScript. El plan es aprovechar la capacidad de usar este entorno de programación en tiempo real en varios frentes:
- Habilitar múltiples bucles y analizarlos para determinar si se pueden descargar a una PRU. Este será el mecanismo principal para proporcionar servicios en tiempo real de iOS.
- Proporcionar servicios de orden superior que utilizan los periféricos estándar para su uso previsto: Controladores serie
- para I2C, SPI,UARTs, etc.
- Escritura analógica para PWM utilizando PWM de hardware, temporizadores, controladores GPIO del núcleo, etc.
- Agregar parches en tiempo real al núcleo
El lenguaje JavaScript proporciona algunas características que creo que son realmente geniales para hacer programación incrustada y nodo.js hace algunas cosas para ayudar a habilitarlo. La principal es que las funciones de E/S son todas asíncronas. Para sistemas embebidos, esto es especialmente útil para realizar tareas de baja latencia que responden a eventos en el sistema. Lo que hace que JavaScript sea mucho más fácil que otros lenguajes para hacer esto es que mantiene el contexto completo alrededor del controlador, para que no tenga que preocuparse por ello.
0.7.4 actualizaciones de teclas
- Funciones BeagleBone AI GPIO habilitadas (digitalRead/digitalWrite/getPinMode)
0.7.3 actualizaciones de teclas
Gran velocidad de carga mediante la carga lenta de módulos utilizados con poca frecuencia
0.7.2 actualizaciones de clave
- https://github.com/beagleboard/bonescript/issues/52
- https://github.com/beagleboard/bonescript/issues/53
0.7.1 actualizaciones de clave
Muy pequeña actualización en el ámbito de la función
0.7.0 actualizaciones de teclas
La mayoría de estas correcciones provienen de un proyecto de Google Summer of Code 2018
- Correcciones en la salida PWM durante las actualizaciones de escritura analógica
- Llamadas a funciones agregadas para soporte de biblioteca de control de robots en BeagleBone Blue o Robotics Cape
- Soporte agregado para devoluciones de llamada de estilo nodo con errores y datos separados (opcional)
Planes
- Soporte SPI
- Soporte de PRU
- Manejo de matriz de pines en modo pin y modo getPinMode
- Guardar el dtbo creado y escribir la configuración en cape EEPROM