Manual EV3 Basic

Amablemente traducido por Angel Ivan Moreno, Frankfurt

Programar un robot para que obedezca tus órdenes es muy divertido. La manera más fácil de programar el bloque de Lego EV3 para tareas sencillas es utilizar el entorno de programación gráfica proporcionado por Lego. Pero para programas más grandes y complejos, este entorno se queda corto y se necesita algún lenguaje de programación textual para programarlo. Existen muchos proyectos diferentes que han creado entornos de programación para el EV3 justamente para esto (LeJOS, MonoBrick, RobotC, ev3dev, y muchos más). Pero todos ellos tienen una cosa en común: son tremendamente complicadados de configurar y utilizar, y es probable que necesites años de experiencia con ordenadores para conseguir hacer algo con cualquiera de ellos.

Para cubrir la brecha entre "fácil de usar, pero limitado" y "potente pero complicado", he inventado EV3Basic. Está dirigido a los usuarios que quieren ir más allá de las limitaciones de la programación gráfica, pero no son profesionales informáticos. EV3-Basic es bastante fácil de aprender, sin dejar de ofrecer toda la funcionalidad que necesitas para crear programas sorprendentes. Que aprendas a programar por el camino es, probablemente, un beneficio adicional.

EV3-Basic se basa en el lenguaje de programación "Small Basic", que fue desarrollado por Microsoft como introducción a la programación especialmente diseñado para niños pero también para todas las personas interesadas sin conocimientos previos en este tema. "Small Basic" fue  diseñado con el propósito de que su uso fuera sencillo y en mi extensión EV3 traté de hacer lo mismo. Mi intención es que este lenguaje sea útil para aprender a programar y así utilizar el bloque EV3 de manera más creativa.

Reinhard Grafl, reinhard.grafl@aon.at   

Empezando 

Lo primero que se necesitas es un PC con Microsoft Windows (cualquier versión a partir de Windows XP) y la versión actual de Microsoft Small Basic que puede ser descargada de forma gratuita. Si no posees ningún conocimiento previo de programación, es aconsejable  que primero conozcas sus principios. Esto no conlleva demasiado tiempo y es bastante divertido en sí mismo. Hay algunos tutoriales muy buenos en la página web de Small Basic que pueden servirte de ayuda.

El siguiente paso consiste en descargar e instalar la extensión EV3 de Small Basic para poder controlar el bloque EV3 con tu programa. Desde la última versión de EV3 Basic, descarga e instala el archivo "EV3BasicInstaller.msi". Esto debería instalar la extensión directamente en el directorio de instalación de Small Basic. Si has elegido previamente una ubicación no estándar para Small Basic, utiliza esa misma ubicación aquí. La próxima vez que inicies Small Basic (reinícialo si aún se estaba ejecutando), tendrás acceso a diferentes objetos para el control de las distintas funciones de las piezas así como algunos objetos polivalentes adicionales. Ahora procede a crear tu primer programa EV3 escribiendo

   LCD.Clear ()

   LCD.Write (40, 40, "Hola EV3")

   Program.Delay (10000)

en la ventana del programa. A continuación, conecta el bloque EV3 al ordenador mediante el cable USB, ponlo en marcha y cuando esté encendido, pulsa el botón azul grande "Ejecutar" de Small Basic. Esto compilará y comenzará a ejecutar el programa que controla remotamente el bloque desde su PC.

Al escribir tus propios programas, el sistema Intellisense de Small Basic te mostrará las posibles funciones de librería y documentación de uso que contiene la misma información disponible también en este documento en el capítulo "Documentación de la librería". Muchos más ejemplos de programación de EV3 están asimismo disponibles en la página de versiones (probablemente con el nombre 'examples.zip').

Controlar remotamente el bloque con un programa en el PC es algo genial, pero para muchos usos necesitarás un robot independiente con su propio programa que no necesite que el PC le diga cada paso.

Para incorporar el programa al bloque, necesitas el EV3Explorer, que ya ha sido instalado junto con la extensión EV3 y que está disponible en el menú de inicio de Windows (EV3Basic / EV3Explorer). La ejecución de este programa abre una ventana donde se pueden ver los archivos que se almacenan en el bloque EV3 (en la parte izquierda de la ventana) así como los archivos almacenados en tu PC (en la parte derecha de la ventana). Puedes compilar cualquiera de los ejemplos y tus propios programas seleccionando el archivo de código fuente (termina con .sb) y haciendo clic en "Compile and Run" (Compilar y Ejecutar). 

Esto compila el archivo de código fuente a un archivo que el bloque puede ejecutar (tienen la extensión de archivo .rbf), lo carga en el bloque e inmediatamente lo inicia. Si quieres empezar el programa desde el menú en el bloque, necesitas crear una subcarpeta en la la carpeta "prjs" -carpeta con un nombre que quieras y utilizarla como carpeta de destino para la compilación. (El EV3 sólo mostrará en su menu los programas que estén correctamente ubicados en su propia carpeta).

Referencia rápida de Small Basic

Para las personas que ya saben programar en otros lenguajes y no desean realizar los tutoriales completos de Small Basic, aquí hay un ejemplo corto que contiene la mayoría de las construcciones del lenguaje y una breve explicación de cada una. Este ejemplo no se ejecutará en el bloque EV3, ya que utiliza la ventana de texto de Small Basic.

 

'Programa de demostración que explica la mayor parte de Small Basic

'(Todos los comentarios comienzan con comillas simples)

'La ejecución comienza aquí

A = 5 'las variables se declaran implícitamente al primer uso

a = a + 1 'todo es insensible a las mayúsculas y minúsculas

B[a] = 55 'los arrays se definen implícitamente y crecen según sea necesario

X = "hola" 'las variables también pueden contener texto

Sub write 'define un sub-programa con este nombre (es posible sin parámetros)

    TextWindow.WriteLine (X) 'llamada a función de la librería, 

    'las variables de acceso se definen en otro lugar

EndSub         'el flujo de control del programa principal 

               'se ejecuta alrededor de las definiciones Sub.

TextWindow.WriteLine ("A =" +a) 'concatenación de cadenas con +

WRITE () 'llamada a subprograma. No se hace distinción 

'entre mayúsculas y minúsculas

write2 () 'puede llamar a subprogramas definidos más adelante en el código

TextWindow.WriteLine ("B [6] =" + B [6]) 'acceso a arrays

For i = 2 to 5 'un bucle de 2 a 5 (inclusive)

    TextWindow.WriteLine ("I:" + I)

EndFor

For i = 6.5 to 10.5 step 2 'un bucle con valores fraccionarios y pasos mayores

    TextWindow.WriteLine ("I:" + I)

EndFor

Sub write2

    write () 'un subprograma puede llamar a otros subprogramas

    write ()

EndSub        'El flujo de control del programa principal se ejecuta

'sobre las definiciones Sub.

I = 99 'insensible a mayúsculas y minúsculas - sobrescribe el i anterior

While i> 3 'bucle con condición

    i = i / 2

    TextWindow.WriteLine ("I:" + i)

EndWhile

TextWindow.WriteLine ("PI =" + Math.PI) 

'una propiedad de la librería (acceso sin paréntesis)

TextWindow.WriteLine ("SIN =" + Math.sin (0.5)) 

'la función de la librería devuelve un valor

A = 50

B = 20

If a <5  Then 'una estructura condicional con múltiples condiciones

    TextWindow.WriteLine ("primero")

elseif a <10 and b <100 then 'condiciones de lógica de AND 

    TextWindow.WriteLine ("segundo")

elseif a <20 or (b> 40 and b <60) Then 'lógica de OR y condiciones anidadas

    TextWindow.WriteLine ("tercero")

else

    TextWindow.WriteLine ("otros")

EndIf

Diferencias entre Small Basic y EV3Basic

Aunque he tratado de imitar en todo lo posible el comportamiento original de Small Basic en mi compilador EV3, hay algunas cosas que simplemente no se pueden realizar con el intérprete de código de bytes EV3.

Las variables tienen « tipo ».

Mientras Small Basic sólo tiene un tipo de datos que es una cadena Unicode para todos los valores posibles (incluso arrays), EV3Basic tiene cuatro tipos de datos diferentes para las variables:

Cada variable tiene uno de estos tipos (que se determina al ser usadas por primera vez en el código del programa) y no puede ser usado para almacenar ningún otro tipo de dato.

Los operadores y las funciones actúan según el tipo en tiempo de compilación;

Los operadores aritméticos o lógicos necesitan parámetros bien numéricos o bien de texto y también devuelven un resultado de tipo definido (por ejemplo, el "<" necesita dos números y devuelve un texto). Una excepción es el "=" que efectuará una comparación bien numérica o bien textual, según el tipo en tiempo de compilación de los operandos. Otra excepción es el "+" que efectuará una suma de números cuando se le proveen dos números, pero hará una concatenación de textos si uno de los operandos es texto. Requisitos similares existen para los parámetros de función, que también tienen un tipo en tiempo de compilación definido. Para facilitar las cosas, una conversión automática de número a texto se realiza si un parámetro necesita un texto (pero no a la inversa).

Matrices 

En Small Basic, las matrices funcionan como un diccionario y pueden utilizar cualquier texto como índice. EV3-Basic no puede hacer eso. Sólo se permiten números como índice y sólo números no negativos sin decimales proporcionan los resultados esperados (A [4.5] es lo mismo que A [4], A [-4] devolverá siempre 0 o ""). No existen las matrices multidimensionales. Mientras que las matrices se pueden pasar a funciones de la librería y ser devueltas, no se pueden crear matrices temporales que almacenen el resultado. Para todas las funciones que devuelven una matriz, este valor debe ser almacenado directamente en una variable de tipo matriz.

Limitación de texto

Cualquier variable de tipo texto sólo puede contener hasta 251 caracteres y no se admite la gama completa de Unicode, pero sólo los códigos 1-255 (son sólo sencillas cadenas de caracteres tipo C). Lo mismo ocurre para todos los elementos de las matrices de texto.

Soporte Bluetooth

Conectar EV3 a su PC directamente con un cable USB es la manera más fácil y segura de utilizar EV3 Basic. Sin embargo, tener que utilizar el cable puede ser bastante engorroso en algunas circunstancias, especialmente al desarrollar robots móviles.

Si tienes tiene bluetooth en tu PC (ya sea mediante un adaptador Bluetooth o integrado), puedes configurar el EV3 para comunicarse con el PC de forma inalámbrica. Si no lo has hecho aún, deberás emparejar el EV3 con tu PC para permitir la comunicación. Para ello, primero activa las funciones de Bluetooth en el EV3: En el menú de configuración, activa las opciones "Bluetooth" y  "Visibilidad". Luego, en el PC, abre el diálogo de sistema "Dispositivos Bluetooth". Allí puedes buscar el dispositivo y empezar a establecer una conexión con EV3. El proceso puede resultar un poco largo y requiere la confirmación de la acción en la EV3 así como en el PC, e incluso deberás introducir el código de acoplamiento correcto en algún lugar (debe ser "1234").

Una vez que la conexión se establece y la instalación automática de los controladores adecuados se termina, tu PC puede comunicarse con el EV3 a través de lo que se llama un "Serial Port", que se llamará "COM1", "COM3" o similares. Puedes comprobar qué nombre fue asignado de hecho al ver la página de propiedades del dispositivo bluetooth EV3.

Para utilizar la conexión recién establecida con EV3-Basic, simplemente ejecuta tu programa desde Small Basic o simplemente inicia el Explorador EV3. Si no puede encontrarse ningún EV3 directamente conectado a través de USB pero hay "Puertos serie" posiblemente disponibles, el PC te instará a seleccionar uno de estos puertos. Si este es de hecho el puerto para el EV3, la conexión será posible.

Soporte WiFi

Al igual que una conexión Bluetooth, una conexión WiFi te permite conectarte a tu modelo sin usar un cable. El WiFi tiene alguna ventaja sobre Bluetooth en cuanto a cobertura, velocidad y fiabilidad, aunque también posee inconvenientes como el mayor consumo de energía y la necesidad de añadir un adaptador WiFi al EV3. Y esta configuración sólo funciona dispones de un router WiFi. Se trata básicamente de una cuestión de gusto, si prefieres bluetooth o WiFi, o tal vez una cuestión de problemas técnicos con una de las posibilidades.

Para utilizar la opción de WiFi, necesitas un adaptador WiFi específico compatible con el bloque EV3. Actualmente sólo hay un modelo disponible que funcione con un EV3 no modificado: "Netgear WNA1100", que debe ser insertado en el conector USB grande en el lado izquierdo del EV3. La configuración de la conexión Wi-Fi se puede hacer desde el menú de configuración en el bloque. Debes activar la opción WiFi (esto lleva algo de tiempo para poner en marcha el dispositivo de seguridad) y después has de establecer una conexión hasta el router WiFi. Si has configurado el cifrado para la red Wi-Fi, es necesario introducir la clave WPA2 directamente en el bloque. Actualmente no se admite ningún otro método de cifrado WiFi.

Una vez que hayas establecido una conexión entre EV3 y el router, el EV3 debería haber recibido una dirección IP, que debería ser algo como "10.2.3.4". Puedes comprobar la dirección que fue asignado a tu EV3 en la sección "Brick Info" del menú de ajustes. Está en la parte inferior de la lista.

Cuando quieras finalmente conectarte al EV3 desde un programa de Small Basic o con el Explorador de EV3, utiliza el botón "Wi-Fi" en el cuadro de diálogo que pregunta por la conexión a usar. A continuación, introduce la dirección IP tal y como se mostraba en el bloque . Sólo tienes que escribir la dirección una vez. En el futuro, aparecerá directamente en la lista de selección.

Ten en cuenta que el bloque no se conecta automáticamente al wifi cuando se enciende. Siempre tienes que activar la conexión después de cada encendido.

El objeto Motor

Los comandos de control del motor en una matriz funcional:

Los cuatro comandos resaltados son los más básicos, aquellos principiantes utilizarán la mayor parte del tiempo.

Para la mayoría de los usos las variantes con regulación de la velocidad de un solo motor serán la elección correcta. Así, estos comandos tienen nombres más cortos (sin sufijo "Power" o "Sync") cuando se comparan con sus equivalentes sincronizados.

Cuando tengas que cambiar la potencia o la velocidad de un motor que ya esté funcionando, simplemente vuelve a emitir una orden de arranque con el valor de velocidad o potencia apropiado. El motor cambiará directamente al nuevo modo de funcionamiento.

Documentación de la librería

La librería de tiempo de ejecución para el EV3 se organiza en partes individuales, llamadas "objetos". Cada objeto provee una funcionalidad para una parte diferente del sistema. Esta lista contiene todo lo que está disponible para tanto para Small Basic en el PC (con extensión EV3) como en el bloque una vez compilado con EV3Explorer. Cuando desarrolles programas que sólo tengan que ejecutarse en el PC, puedes utilizar todo lo que Small Basic proporciona adicionalmente y que no he  documentado aquí.

Assert (Asertar)

Una utilidad de pruebas para ayudar a verificar la corrección de una parte del código.

Un aserto hace explícitas suposiciones implícitas sobre el estado actual del programa. Al añadir asertos, se pueden encontrar errores en los programas con más facilidad. Por ejemplo, cuando una parte del programa depende de que la variable A tenga un valor positivo, se puede llamar a Assert.Greater (A, 0, "A debe ser> 0!").

En el caso de que el programa ejecute un aserto que no se cumpla, se muestra el mensaje de error indicando el problema.

Assert.Equal (a, b, mensaje)

Comprueba que los dos valores son iguales. Para esta prueba, incluso "True" y "tRue" no se consideran iguales.

a Primer valor

b Segundo valor

mensaje Mensaje que se mostrará si el aserto falla.

Assert.Failed (mensaje)

Escribe un mensaje de error en la pantalla. Esta función sólo se debe llamar si algo ha fallado en el programa.

mensaje Mensaje que se muestra

Assert.Greater (a, b, mensaje)

Comprueba que el primer número es mayor que el segundo.

a Primer valor

b Segundo valor

mensaje Mensaje que se mostrará si la afirmación falla.

Assert.GreaterEqual (a, b, mensaje)

Comprueba que el primer número es mayor que o igual que el segundo.

a Primer valor

b Segundo valor

mensaje Mensaje que se mostrará si la afirmación falla.

Assert.Less (a, b, mensaje)

Comprueba que el primer número es menor que el segundo.

a Primer valor

b Segundo valor

mensaje Mensaje que se mostrará si la afirmación falla.

Assert.LessEqual (a, b, mensaje)

Comprueba que el primer número es menor que o igual al segundo.

a Primer valor

b Segundo valor

mensaje Mensaje que se mostrará si la afirmación falla.

Assert.Near (a, b, mensaje)

Comprueba que los dos números son casi idénticos. Esto puede ser usado para los números fraccionarios con muchos decimales en los que el cómputo podría dar resultados ligeramente diferentes debido a problemas de redondeo.

a Primer valor

b Segundo valor

mensaje Mensaje que se mostrará si la afirmación falla.

Assert.NotEqual (a, b, mensaje)

Comprueba que dos valores no son iguales. Para esta prueba, incluso "True" y "tRue" no se consideran iguales.

a Primer valor

b Segundo valor

mensaje Mensaje que se mostrará si la afirmación falla.

Buttons

Lee los estados y los clics de los botones del bloque.Los botones se especifican con las siguientes letras:

U arriba (up)

D abajo (down)

L izquierda (left)

R derecha (right)

E introducir (enter)

Buttons.Current - Propiedad

Los botones que están presionados actualmente. Esta propiedad contiene un texto con las letras clave de todas las teclas que estén siendo pulsadas en ese momento.

Buttons.Flush ()

Elimina los estados de clic de todos los botones. Las llamadas subsiguientes a GetClicks sólo devolverán los botones en los que se ha hecho clic después de la llamada a Flush.

Buttons.GetClicks ()

Revisa los botones en los que se hizo clic desde la última llamada a GetClicks y devuelve un texto que contiene sus letras.. Luego se elimina el estado 'clic' de los botones. Además, se emite un sonido desde el bloque cuando se detectó un clic.

Devuelve Un texto que contiene las letras de los botones en los que se ha hecho clic (puede estar vacío)

Buttons.Wait ()

Espera hasta que se hace clic en al menos un botón. Si se había hecho clic en un botón antes de llamar a esta función, retorna inmediatamente.

EV3

Pequeñas funciones de utilidad que afectan al bloque EV3 en su conjunto.

EV3.BatteryLevel - Propiedad

El nivel actual de carga de la batería (rango de 0 a 100).

EV3.Time - Propiedad

La duración en milisegundos desde que se inició el programa.

EV3.QueueNextCommand ()

Aumenta el rendimiento cuando el programa se ejecuta en modo "PC": No envía al bloque el siguiente comando de inmediato, sino que espera hasta que se lleguen más comandos que luego serán enviado junto con el primero. Se pueden agrupar más comandos juntos mediante llamadas adicionales a QueueNextCommand antes de cualquier comando que deba ser colocado en la cola. En el "modo de bloque", este comando no tiene efecto.

EV3.SetLEDColor (color, efecto)

Ajusta el color de la luz LED de bloque y el efecto a utilizar para ello.

color Puede ser "OFF", " GREEN", "RED", "ORANGE"

efecto Puede ser "NORMAL", "FLASH", "PULSE"

EV3.SystemCall (línea_de_comando)

Ejecuta un comando de sistema a través del shell de comandos del sistema Linux EV3. Todos los hilos de la máquina virtual se detienen hasta que finalice el comando de sistema.

línea_de_comando El comando del sistema.

Devuelve Estado de salida del comando.

EV3File

Accede al sistema de archivos del bloque EV3 para leer o escribir datos.

Los nombres de archivo se puede dar tanto de manera absoluta (precedidos por '/') para llegar a cualquier archivo en el sistema, o de manera relativa con relación a la carpeta 'prjs'.

EV3File.Close (identificador)

Cierra un archivo abierto.

identificador El identificador del archivo (previamente obtenido de un Open ... llamada)

EV3File.ConvertToNumber (texto)

Función de utilidad para convertir un texto a número.

texto Un texto que contiene un número en notación decimal (con los dígitos fraccionarios opcionales)

Devuelve El número

EV3File.OpenAppend (nombre_del_archivo)

Abre un archivo para agregar datos. Cuando el archivo no existe, se creará.

nombre_del_archivo Nombre del archivo a crear / ampliar.

Devuelve Un número que identifica este archivo abierto (también conocido como identificador de archivo).

EV3File.OpenRead (nombre_del_archivo)

Abre un archivo para leer datos. Cuando el archivo no existe, devuelve un 0.

nombre_del_archivo Nombre del archivo a leer.

Devuelve Un número que identifica este archivo abierto (también conocido como identificador de archivo) o 0 si el archivo no existe.

EV3File.OpenWrite (nombre_del_archivo)

Abre un archivo para escritura. Cuando el archivo ya existe, será sobrescrito.

nombre_del_archivo Nombre del archivo a crear / sobreescribir.

Devuelve Un número que identifica este archivo abierto (también conocido como identificador de archivo).

EV3File.ReadByte (identificador)

Lee un byte de datos del archivo.

identificador El identificador del archivo (previamente obtenido de un Open ... llamada)

Devuelve El siguiente byte del archivo.

EV3File.ReadLine (identificador)

Lee una línea de texto del archivo. La línea se decodifica usando la codificación ISO-8859-1 y debe terminar con un carácter de nueva línea (código 10).

identificador El identificador del archivo (previamente obtenido de un Open ... llamada)

Devuelve El texto de la línea actual en el archivo.

EV3File.ReadNumberArray (identificador, tamaño)

Lee toda una serie de números en forma binaria del archivo. Los números están codificados en la representación IEEE de coma flotante de precisión simple.

identificador El identificador de archivo (previamente obtenido de un Open ... llamada)

tamaño Número de valores a leer

Devuelve Una matriz (array) de elementos del tamaño indicado que contiene los valores.

EV3File.TableLookup (nombre_del_archivo, bytes_por_fila, fila, columna)

Función de utilidad para leer bytes de archivos de datos potencialmente enormes que son demasiado grandes para ser transferido a la memoria en su conjunto.Debido a que el archivo podría ser tan grande que la precisión numérica de los números normales no fuese suficiente, es posible un direccionamiento de tipo fila / columna.

nombre_del_archivo El nombre del archivo.

bytes_por_fila Cuando el archivo tiene una estructura fila / columna, este es el número de bytes en una fila. Se usa 1 si no aplica.

fila Fila a acceder (comenzando por 0).

columna Qué columna a acceder (comenzando por 0).

Devuelve El byte de la posición indicada

EV3File.WriteByte (identificador, datos)

Escribe un solo byte de datos en el archivo.

identificador El identificador de archivo (previamente obtenido de un Open ... llamada)

datos Un byte a escribir (valor de 0 - 255).

EV3File.WriteLine (identificador, texto)

Escribe una línea de texto en el archivo. La línea se codifica con codificación ISO-8859-1 y se termina con un carácter de nueva línea (código 10).

identificador El identificador del archivo (previamente obtenido de un Open ... llamada)

texto El texto a escribir en el archivo.

LCD

Controla la pantalla LCD en el bloque. El EV3 tiene una pantalla en blanco y negro de 178x128 píxeles. Todos los píxeles se abordan con coordenadas X, Y, donde X = 0 es el borde izquierdo e Y = 0 es el borde superior.

LCD.BmpFile (color, x, y, nombre_del_archivo)

Muestra en la pantalla un archivo de mapa de bits en un color determinado. Sólo son compatibles los archivos en formato .rgf.

color 0 (blanco) o 1 (negro)

x Coordenada X del borde izquierdo

y Coordenada Y borde superior

nombre_del_archivo Nombre del archivo de mapa de bits sin la extensión .rgf. Este nombre de archivo puede ser relativo a la carpeta 'prjs' o una ruta absoluta (cuando empieza con '/').

LCD.Circle (color, x, y, radio)

Dibuja un círculo en el color dado.

color 0 (blanco) o 1 (negro)

x Coordenada X del punto central

y Coordenada Y del punto central

radio Radio del círculo

LCD.Clear ()

Establece todos los píxeles de la pantalla a blanco.

LCD.FillCircle (color, x, y, radio)

Dibuja un círculo relleno con un color determinado.

color 0 (blanco) o 1 (negro)

x Coordenada X del punto central

y Coordenada Y del punto central

radio Radio del círculo

LCD.FillRect (color, x, y, ancho, alto)

Rellena un rectángulo con un color.

color 0 (blanco) o 1 (negro)

x Borde izquierdo del rectángulo

y El borde superior del rectángulo

ancho Anchura del rectángulo

altura Altura del rectángulo

LCD.InverseRect (x, y, ancho, alto)

Invierte los colores de todos los píxeles dentro de un rectángulo

x Borde izquierdo del rectángulo

y Borde superior del rectángulo

ancho Anchura del rectángulo

altura Altura del rectángulo

LCD.Line (color, x1, y1, x2, y2)

Establece un color para una línea recta de píxeles.

color 0 (blanco) o 1 (negro)

x1 Coordenada X del punto de inicio

y1 Coordenada Y del punto de inicio

x2 Coordenada X del punto final

y2 Coordenada Y del punto final

LCD.Pixel (color, x, y)

Establece un color para un píxel de la pantalla.

color 0 (blanco) o 1 (negro)

x Coordenada X

y Coordenada Y

LCD.Rect (color, x, y, ancho, alto)

Dibuja con un color el borde de un rectángulo.

color 0 (blanco) o 1 (negro)

x Borde izquierdo del rectángulo

y Borde superior del rectángulo

ancho Anchura del rectángulo

altura Altura del rectángulo

LCD.StopUpdate ()

Memoriza todos los cambios posteriores en la pantalla en lugar de dibujarlos directamente. En la siguiente llamada a Update(), estos cambios serán finalmente dibujados. Se puede utilizar esta función para evitar el parpadeo o para acelerar el dibujado de elementos complejos en la pantalla LCD.

LCD.Text (color, x, y, fuente, texto)

Escribe de un color determinado un texto dado (o número) en la pantalla.

color 0 (blanco) o 1 (negro)

x Coordenada X donde comienza el texto

y Coordenada Y de la esquina superior

fuente Tamaño de las letras: 0 (pequeña), 1 (SMALL), 2 (BIG)

texto El texto (o número) a escribir en la pantalla

LCD.Update ()

Dibuja todos los cambios en la pantalla que han sucedido desde la última llamada a StopUpdate(). Después de Update() todo se dibujará directamente de nuevo a menos que se utilice la instrucción StopUpdate() una vez más.

LCD.Write (x, y, texto)

Escribe en la pantalla un texto dado (o número) de color negro. Cuando se necesite un mayor control sobre el aspecto visual, se puede utilizar la función "Texto" en su lugar.

x Coordenada X donde comienza el texto

y Coordenada Y de la esquina superior

texto El texto (o número) a escribir en la pantalla

Mailbox

Facilidad de comunicación para enviar mensajes a través de Bluetooth de bloque a bloque

Mailbox.Connect (nombre_de_bloque)

Trata de establecer una conexión Bluetooth con otro bloque si no está conectado.

Sólo después de que una conexión se haya hecho (ya sea con este comando o manualmente desde el menú del bloque), se pueden intercambiar mensajes en ambas direcciones.

nombre_de_bloque Nombre del bloque remoto.

Mailbox.Create (nombre_del_buzón)

Crea un buzón en el bloque local que puede recibir mensajes de otros bloques.

Sólo después de la creación del buzón pueden almacenarse los mensajes entrantes para su recuperación. El límite total de buzones de correo que se pueden crear es de 30.

nombre_del_buzón Nombre del buzón de mensajes que se creará.

Devuelve Un identificador numérico del buzón. Es necesario para recuperar los mensajes del buzón.

Mailbox.IsAvailable (id)

Comprueba si hay un mensaje en el buzón de correo especificado.

id Identificador del buzón local

Devuelve "True" si hay un mensaje en espera. "False" en caso contrario.

Mailbox.Receive (id)

Recibe el último mensaje de un buzón local. Cuando no hay ningún mensaje disponible, el comando se bloqueará hasta que llegue algún mensaje. El mensaje será consumido y la siguiente llamada a Receive esperará al siguiente mensaje. Para evitar el bloqueo, se puede comprobar con IsAvailable() si hay un mensaje en el buzón. Cuando no exista un buzón de mensajes con ese nombre, el comando devolverá "" inmediatamente.

id Identificador del buzón local

Devuelve El mensaje como texto. Actualmente sólo se admiten mensajes de texto.

Mailbox.Send (nombre_de_bloque, nombre_de_buzón, mensaje)

Enviar un mensaje a un buzón en otro bloque.

nombre_de_bloque El nombre del bloque que recibirá el mensaje. Tiene que estar ya abierta una conexión con este bloque para que este comando funcione. Se puede especificar un texto vacío aquí, en cuyo caso se enviará el mensaje a todos los bloques conectados.

nombre_de_buzón Nombre del buzón de voz en el bloque receptor.

mensaje El mensaje en forma de texto. Actualmente sólo se admiten mensajes de texto.

Motor

Controlar los motores conectados al bloque. Para todas las funciones del motor es necesario especificar uno o más puertos de motor que deben ser afectados (por ejemplo, "A", "BC", "ABD"). Cuando se encadenan bloques adicionales al bloque maestro, indica el puerto correcto añadiendo el número de capa a la especificador (por ejemplo, "3BC", "2A"). En este caso sólo los motores de un bloque se pueden acceder con un único comando. Velocidad vs Potencia: Al solicitar accionar un motor con una cierta velocidad, la potencia eléctrica se ajustará de forma permanente para mantener el motor a esta velocidad independientemente de la fuerza motriz necesaria (siempre y cuando pueda ser proporcionada la energía suficiente). Al solicitar una cierta potencia en cambio, se proporcionará sólo esta cantidad de energía eléctrica al motor y la velocidad real dependerá entonces la resistencia que encuentre.

Motor.GetCount (puerto)

Consulta el recuento actual de rotación de un solo motor. Mientras el contador no se restablece medirá con precisión todos los movimientos de un motor, incluso si el motor es accionado por una fuerza externa, sin estar girando activamente.

puerto Nombre del puerto motor 

Devuelve El recuento de rotación actual en grados.

Motor.GetSpeed (puerto)

Consultar la velocidad actual de un solo motor.

puerto Nombre del puerto motor 

Devuelve Velocidad actual en el rango de -100 a 100

Motor.IsBusy (puertos)

Comprueba si uno o más motores están activos actualmente.

puertos Nombre(s) de los puertos de los motores

Devuelve "True" si al menos uno de los motores está activo, "False" en caso contrario.

Motor.Invert (ports)

This command is available only in versions 1.2 and later of the EV3 extension. Invert the polarity (direction) of one or more motors. This will affect all future commands that move this motors and also the tacho and speed readings will deliver inverted values. 

This operation makes it easy to change the way a motor is built into a robot without altering the rest of the program. You just need to add a single Motor.Invert() command at the very start of the program. Note that there is intentionally no way to disable the inversion later on.

ports  Motor port name(s)

Motor.Move (puertos, velocidad, grados, freno)

Mueve uno o más motores el ángulo especificado (en grados) a la velocidad especificada. Este comando bloquea la ejecución hasta que el motor ha alcanzado su destino. Cuando se necesite un mayor control sobre el movimiento (aceleración suave o deceleración), es recomendable utilizar el comando Motor.Schedule en su lugar.

puertos Nombre(s) de los puertos de los motores

velocidad Nivel de velocidad de -100 (velocidad máxima hacia atrás) a 100 (velocidad máxima hacia adelante)

grados El ángulo a girar

freno "True", si el(los) motor(es) debe(n) activar el freno después del movimiento

Motor.MovePower (puertos, energía, grados, freno)

Mueve uno o más motores el ángulo especificado (en grados) con la potencia especificada. Este comando bloquea la ejecución hasta que el motor ha alcanzado su destino. Cuando se necesite un mayor control sobre el movimiento (aceleración suave o deceleración), es recomendable utilizar el comando Motor.SchedulePower en su lugar.

puertos Nombre(s) de los puertos de los motores

potencia Nivel de potencia de -100 (potencia máxima hacia atrás) a 100 (potencia máxima hacia adelante)

grados El ángulo a girar

freno "True", si el(los) motor(es) debe(n) activar el freno después del movimiento

Motor.MoveSteer (ports, speed, turn, degrees, brake)

This command is available only in versions 1.2 and later of the EV3 extension. Move 2 motors a defined number of degrees with a specified speed and relative ratio. This ratio is determined by the 'turn' parameter which basically determines into which direction a vehicle with a simple two-wheel drive would make its turn (given that the motor with the lower port letter is mounted on the left side). The two motors are synchronized which means that when one motor experiences some resistance and cannot keep up its speed, the other motor will also slow down or stop altogether. This is especially useful for vehicles with two independently driven wheels which still need to go straight or make a specified turn. The angle to move is for the motor with the higher speed.

ports  Names of 2 motor ports (for example "AB" or "CD"

speed  Speed value from -100 (full reverse) to 100 (full forward) of the faster motor.

turn  Turn ratio from -100 (rotating left on the spot) to 100 (rotating right on the spot).

degrees  The angle of the faster motor to rotate

brake  "True", if the motors should switch on the brake after movement

Motor.MoveSync (puertos, velocidad1, velocidad2, grados, freno)

Mueve 2 motores de manera síncrona un número determinado de grados.

Los dos motores están sincronizados, lo que que significa que cuando un motor experimenta cierta resistencia y no puede mantener su velocidad, el otro motor también irá más lento o se detendrá por completo. Esto es especialmente útil en los vehículos con dos ruedas motrices independientes, ya que también tienen que ir en línea recta o hacer un giro especificado. El ángulo a mover es relativo al motor con la velocidad más alta.

puertos Los nombres de los 2 puertos motores (por ejemplo "AB" o "CD")

velocidad1 Valor de la velocidad de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante) del motor con la letra de puerto más baja.

velocidad2 Valor de la velocidad de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante) del motor con la letra de puerto más alta.

grados El ángulo a girar asociado al motor más rápido

freno "True", si el(los) motor(es) debe(n) activar el freno después del movimiento

Motor.ResetCount (puertos)

Fija a 0 el recuento de rotación de uno o más motores.

puertos Nombre(s) de los puertos de los motores

Motor.Schedule (puertos, velocidad, grados1, grados2, grados3, freno)

Mueve uno o más motores con los valores de velocidad especificados. La velocidad se puede ajustar a lo largo de la toda la rotación para conseguir un arranque suave y una parada suave si fuese necesario. El ángulo total a girar el motor es grados1 + grados2 + grados3. Al final del movimiento, el motor se detiene automáticamente (con o sin usar el freno). Esta función retorna inmediatamente. Se puede utilizar IsBusy() para detectar el final del movimiento o llamar a Wait() para esperar hasta que termine el movimiento.

puertos Nombre(s) de los puertos de los motores

velocidad Nivel de velocidad de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante) 

grados1 La parte de la rotación durante la que acelerar

grados2 La parte de la rotación con movimiento uniforme

grados3 La parte de la rotación durante la que desacelerar

freno "True", si el motor(es) debe activar el freno después del movimiento

Motor.SchedulePower (puertos, potencia, grados1, grados2, grados3, freno)

Mueve uno o más motores con la potencia especificada. La potencia se puede ajustar a lo largo de la toda la rotación para conseguir un arranque suave y una parada suave si fuese necesario. El ángulo total a girar el motor es grados1 + grados2 + grados3. Al final del movimiento, el motor se detiene automáticamente (con o sin usar el freno).

Esta función retorna inmediatamente. Se puede utilizar IsBusy() para detectar el final del movimiento o llamar a Wait() para esperar hasta que termine el movimiento

puertos Nombre(s) de los puertos de los motores

potencia Nivel de potencia de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante) 

grados1 La parte de la rotación durante la que acelerar

grados2 La parte de la rotación con movimiento uniforme

grados3 La parte de la rotación durante la que desacelerar

freno "True", si el motor(es) debe activar el freno después del movimiento

Motor.ScheduleSteer (ports, speed, turn, degrees, brake)

This command is available only in versions 1.2 and later of the EV3 extension. Move 2 motors a defined number of degrees with a specified speed and relative ratio. This ratio is determined by the 'turn' parameter which basically determines into which direction a vehicle with a simple two-wheel drive would make its turn (given that the motor with the lower port letter is mounted on the left side). The two motors are synchronized which means that when one motor experiences some resistance and cannot keep up its speed, the other motor will also slow down or stop altogether. This is especially useful for vehicles with two independently driven wheels which still need to go straight or make a specified turn. The distance to move is for the motor with the higher speed. This function returns immediately. You can use IsBusy() to detect the end of the movement or call Wait() to wait until movement is finished.

ports  Names of 2 motor ports (for example "AB" or "CD"

speed  Speed value from -100 (full reverse) to 100 (full forward) of the faster motor.

turn  Turn ratio from -100 (rotating left on the spot) to 100 (rotating right on the spot).

degrees  The angle through which the faster motor should rotate.

brake  "True", if the motors should switch on the brake after movement.

Motor.ScheduleSync (puertos, velocidad1, velocidad2, grados, freno)

Los dos motores están sincronizados, lo que significa que cuando un motor experimenta cierta resistencia y no puede mantener su velocidad, el otro motor también irá más lento o se detendrá por completo. Esto es especialmente útil en los vehículos con dos ruedas motrices independientes, ya que también tienen que ir en línea recta o hacer un giro especificado. La distancia a mover es relativa al motor con la velocidad más alta.

Esta función retorna inmediatamente. Se puede utilizar IsBusy() para detectar el final del movimiento o llamar Wait() para esperar hasta que termine el movimiento.

puertos Los nombres de los 2 puertos motores (por ejemplo "AB" o "CD"

velocidad1 Valor de velocidad de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante) del motor con la letra de puerto más baja.

velocidad2 Valor de la velocidad de -100 (inverso completo) a 100 (completamente hacia adelante) del motor con la letra de puerto más alta.

grados El ángulo que debe girar el motor más rápido.

freno "True", si los motores deben activar el freno después del movimiento.

Motor.Start (puertos, velocidad)

Inicia uno o más motores con la velocidad requerida o establecer esta velocidad para un motor que ya está funcionando.

puertos Nombre(s) de los puertos de los motores

velocidad Valor de velocidad de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante).

Motor.StartPower (puertos, potencia)

Inicia uno o más motores con la potencia requerida o establece esta potencia para un motor que ya está funcionando.

puertos Nombre(s) de los puertos de los motores

potencia Valor de potencia de -100 (máxima potencia hacia atrás) a 100 (máxima potencia hacia adelante).

Motor.StartSteer (ports, speed, turn)

This command is available only in versions 1.2 and later of the EV3 extension. Set two motors to run with a specified speed and relative ratio. This ratio is determined by the 'turn' parameter which basically determines into which direction a vehicle with a simple two-wheel drive would make its turn (given that the motor with the lower port letter is mounted on the left side). The two motors will be synchronized which means that when one motor experiences some resistance and cannot keep up its speed, the other motor will also slow down or stop altogether. This is especially useful for vehicles with two independently driven wheels which still need to go straight or make a specified turn. The motors will keep running until stopped by another command.

ports  Name of two motor ports (for example "AB" or "CD").

speed  Speed value from -100 (full reverse) to 100 (full forward) for the faster motor.

turn  Turn ratio from -100 (rotating left on the spot) to 100 (rotating right on the spot).

Motor.StartSync (puertos, velocidad1, velocidad2)

Establece dos motores para que funcionen de manera sincronizada a las velocidad elegidas para cada uno. Los dos motores están sincronizados, lo que significa que cuando un motor experimenta cierta resistencia y no puede mantener su velocidad, el otro motor también irá más lento o se detendrá por completo. Esto es especialmente útil en los vehículos con dos ruedas motrices independientes, ya que también tienen que ir en línea recta o hacer un giro especificado. Los motores se mantendrán en funcionamiento hasta que sean detenidos por otro comando.

puertos Nombre de los dos puertos de motor (por ejemplo, "AB" o "CD").

velocidad1 Valor de velocidad de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante) del motor con la letra de puerto más baja.

velocidad2 Valor de velocidad de -100 (máxima velocidad hacia atrás) a 100 (máxima velocidad hacia adelante) del motor con la letra de puerto más alta.

Motor.Stop (puertos, freno)

Para uno o varios motores. Esto también cancela cualquier movimiento programado para este motor.

puertos Nombre(s) de los puertos de los motores

freno "True", si el motor debe usar el freno.

Motor.Wait (puertos)

Espera hasta que el motor(es) especificado ha terminado una operación de "Schedule" o "Move". El uso de este método es normalmente mejor que ir llamando a IsBusy () en un bucle continuo.

puertos Nombre(s) de los puertos de los motores

Sensor

Accede a los sensores conectados al bloque. Para especificar el sensor se debe utilizar el número de puerto impreso debajo del conector en el bloque (por ejemplo 1). Para acceder a los sensores de otros bloques que estén conectados en cadena, se deben utilizar en su lugar los siguientes números consecutivos superiores (5-8 accederá a los sensores del primer bloque encadenado, 9-12 los sensores del siguiente y así sucesivamente).

Sensor.CommunicateI2C (puerto, dirección, bytes_de_escritura, bytes_de_lectura, datos_de_escritura)

Se comunica con los dispositivos que utilicen el protocolo I2C en uno de los puertos de sensores. Este comando se dirige a un dispositivo en el bus I2C y puede enviar y recibir múltiples bytes. Esta característica podría ser utilizada para conectar un sensor personalizado o para comunicarse con cualquier dispositivo que sea capaz de ser conectado al bus I2C como esclavo. Hay que tener en cuenta que este comando no funciona durante la conexión en cadena.

puerto Número de puerto del sensor

dirección Dirección (0 - 127) del esclavo I2C en el bus I2C

bytes_de_escritura Número de bytes a escribir al esclavo (máximo 31).

bytes_de_lectura Número de bytes a solicitar del esclavo (máximo 32, mínimo 1).

datos_de_escritura Matriz que contiene los bytes de datos a enviar (comenzando en 0).

Devuelve Una matriz que contiene el número solicitado de valores. El índice comienza en 0.

Sensor.GetMode (puerto)

Obtiene el modo de funcionamiento actual de un sensor. Muchos sensores pueden trabajar en modos sustancialmente diferentes. Por ejemplo, el sensor de color puede detectar la luz ambiente, la luz reflejada o el color. Cuando el sensor está conectado, normalmente se iniciará con el modo 0, pero este se puede cambiar después por programa.

puerto Número de puerto del sensor

Devuelve Modo de funcionamiento actual (0 es siempre el modo por defecto)

Sensor.GetName (puerto)

Obtiene el nombre y el modo de un sensor conectado actualmente. Esta función está pensada principalmente para uso como diagnóstico, ya que normalmente sabes qué sensor está conectado a qué puerto en el modelo.

puerto Número de puerto del sensor

Devuelve Texto descriptivo (por ejemplo, "TOUCH")

Sensor.GetType (puerto)

Obtiene el identificador de tipo numérico de un sensor conectado actualmente.

puerto Número de puerto del sensor

Devuelve Identificador de tipo de sensor (por ejemplo, 16 para un sensor de contacto)

Sensor.IsBusy (puerto)

Comprueba si el sensor es actualmente ocupado cambiando de modo o en proceso de inicialización. Después de cambiar el modo, un sensor puede tardar algún tiempo para estar listo de nuevo.

puerto Número de puerto del sensor

Devuelve "True" si el sensor está actualmente ocupado

Sensor.ReadI2CRegister (port, address, registernumber)

This command is available only in versions 1.2 and later of the EV3 extension. This command addresses one device on the I2C-bus and tries to receive the value of a single register of a connected I2C slave. Note that this command does not work over daisy-chaining.

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of register in the slave to read data from.

Returns  The content of the register

Sensor.ReadI2CRegisters (port, address, registernumber, readbytes)

This command is available only in versions 1.2 and later of the EV3 extension. This command addresses one device on the I2C-bus and tries to receive the values of multiple registers of a connected I2C slave. Note that this command does not work over daisy-chaining.

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of the first register in the slave to read data from.

readbytes  How many register to read (maximum 32).

Returns  An array holding the requested number of values. Index starts at 0.

Sensor.ReadPercent (puerto)

Lee el valor de sensor de corriente y le aplica un escalado apropiado de porcentaje. La mayoría de los sensores pueden traducir la lectura actual a un valor porcentual como la intensidad de la luz o estado de un botón.

puerto Número de puerto del sensor

Devuelve El valor porcentaje (por ejemplo, el sensor de contacto devuelve 100 para presionado y 0 para no presionado)

Sensor.ReadRaw (puerto, valores)

Lee el valor actual del sensor, donde el resultado de ReadPercent () no es lo suficientemente específico. Algunos modos de sensor entregan valores que no se pueden traducir a un porcentaje (por ejemplo, un índice de color) o que contienen varios valores a la vez (por ejemplo las intensidades individuales de luz el roja, verde y azul que conforman RGB).

puerto Número de puerto del sensor

valores Tamaño solicitado de la matriz resultado

Devuelve Una matriz que contiene el número solicitado de valores. El índice empieza en 0. Los elementos que no obtuvieron datos se fijan a 0.

Sensor.ReadRawValue (puerto, índice)

Similar a ReadRaw, pero devuelve un solo valor en lugar de una matriz de valores.

puerto Número de puerto del sensor

índice Índice del valor que debe ser recogido de la matriz resultado (comenzando por el índice 0).

Devuelve Un elemento de una lectura del sensor

Sensor.SendUARTData (puerto, bytes_a_escribir, datos_a_escribir)

Envía datos a dispositivos que están conectados a la UART (transmisor receptor asíncrono universal) de uno de las puertos de los sensores. Esto puede ser útil para enviar comandos personalizados a sensores / actuadores hechos por uno mismo.

puerto Número de puerto del sensor

bytes_a_escribir  Número de bytes a escribir en el dispositivo (máximo 32).

datos_a_escribir Matriz que contiene los bytes de datos a enviar (comenzando en 0).

Sensor.SetMode (puerto, modo)

Cambia el modo de un sensor. Muchos sensores pueden trabajar en diferentes modos que dan lecturas muy diferentes. El significado de cada número de modo depende del tipo de sensor específico. Para más información, consultar la lista de sensores en el apéndice. Hay que tener en cuenta que un sensor permanecerá en el modo seleccionado incluso después de que el programa se detenga y se inicie otro programa (o el mismo). Para evitar confusiones, la mejor práctica es fijar siempre al principio del programa el modo de todos los sensores usados. Este comando bloquea la ejecución hasta que el cambio de modo finaliza el primero de los datos del sensor está disponible.

puerto Número de puerto del sensor

modo Nuevo modo al que cambiar. Esto sólo tendrá éxito cuando el modo está realmente soportado por el sensor.

Sensor.Wait (puerto)

Espera hasta que un sensor ha terminado su reconfiguración. Cuando no hay ningún sensor conectado al puerto, esta función retorna inmediatamente. Normalmente no se necesita llamar a este comando, porque de todos modos SetMode() bloquea hasta que el sensor está listo. Puede ser útil en circunstancias especiales, como cuando el modo se cambió en un hilo diferente, o cuando se conecta un sensor al bloque en tiempo de ejecución.

puerto Número de puerto del sensor

Sensor.WriteI2CRegister (port, address, registernumber, value)

This command is available only in versions 1.2 and later of the EV3 extension. This command addresses one device on the I2C-bus and tries to write the value of a single register of a connected I2C slave. Note that this command does not work over daisy-chaining.

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of the register in the slave to write data to.

value  Value to write into the register.

Sensor.WriteI2CRegisters (port, address, registernumber, writebytes, writedata)

This command is available only in versions 1.2 and later of the EV3 extension. This command addresses one device on the I2C-bus and tries to write the values of multiple registers of a connected I2C slave. Note that this command does not work over daisy-chaining.

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of the first register in the slave to write data to.

writebytes  How many bytes to write into the registers (maximum 30).

writedata  Array holding the data bytes to be written (starting at 0).

Speaker

Utiliza el altavoz integrado del bloque para reproducir tonos o archivos de sonido.

Speaker.IsBusy ()

Comprueba si el altavoz está ocupado reproduciendo un sonido anterior.

Devuelve "True", si todavía se está reproduciendo un sonido, "False" en caso contrario.

Speaker.Note (volumen, nota, duración)

Empieza a reproducir un tono sencillo definido por su representación de texto.

volumen El volumen puede ser 0 - 100

Nota Texto que define una nota "C4" a "B7" (C equivale a Do y B equivale a Si) o medios tonos (sostenidos) como "C#5"

duración Duración del tono en milisegundos

Speaker.Play (volumen, nombre_del_archivo)

Empieza a ejecutar un sonido de un archivo de sonido almacenado en el bloque. Sólo los archivos en formato .rsf son compatibles.

volumen El volumen puede ser 0 - 100

nombre_del_archivo Nombre del archivo de sonido sin la extensión .rsf. Este nombre de archivo puede ser relativo a la carpeta 'prjs' o una ruta absoluta (cuando empiezan con '/').

Speaker.Stop ()

Detiene cualquier sonido o tono que se esté reproduciendo.

Speaker.Tone (volumen, frecuencia, duración)

Empieza a reproducir un tono sencillo de frecuencia definida.

volumen El volumen puede ser 0 - 100

frecuencia Frecuencia en Hz, puede ser 250-10000

duración Duración del tono en milisegundos

Speaker.Wait ()

Espera hasta que el sonido actual ha terminado de reproducirse. Cuando no se está reproduciendo ningún sonido, esta función retorna inmediatamente.

Thread

This object supports the use of threads in a program. A thread is a part of program code that can run independently and at the same time as other parts of the program. For example, you could create a thread that controls the motors, while a different thread can watch sensors or user input. Generally speaking, multi-threading is quite a complex topic. To really understand it, some extra study is recommended.

Este objeto es compatible con el uso de hilos en un programa. Un hilo es una parte de código de programa que puede funcionar de forma independiente y, al mismo tiempo que otras partes del programa. Por ejemplo, podría crear un hilo que controla los motores, mientras que un hilo diferente puede ver sensores o la entrada del usuario. En términos generales, multi-threading es un tema bastante complejo. Para realmente entender, se recomienda algún estudio adicional.

Thread.Run - Propiedad

Con esta propiedad, se crean nuevos hilos. Basta con asignar un subprograma a esta y el subprograma comenzará a funcionar como un hilo independiente (por ejemplo, Thread.Run = MYSUB). Cualquier subprograma se puede utilizar para crear un hilo independiente, pero el mismo subprograma sólo se puede iniciar como un hilo. Una segunda llamada de Thread.Run, mientras el subprograma especificado sigue en funcionamiento, simplemente añadirá la llamada a una cola que se procesará después de que termine la ejecución anterior. No se perderán ejecuciones en este caso, pero probablemente serán programadas para un momento posterior. Hay que tener en cuenta que incluso cuando se ejecuten hilos, todo el programa se detiene tan pronto como el programa principal se ejecuta hasta el final.

Thread.CreateMutex ()

Crea un mutex (abreviatura de identificador de "mutua exclusión") que se puede utilizar para la sincronizar hilos. Sólo se permite la creación de objetos mutex, pero no su eliminación. La mejor práctica es crear todos los mutex necesarios al inicio del programa y mantener sus números en variables globales.

Devuelve Un número que especifica el nuevo mutex. Utiliza este para llamadas para bloquear y desbloquear

Thread.Lock (mutex)

Intenta bloquear el mutex dado de manera exclusiva por lo que ningún otro hilo puede adquirir un bloqueo sobre él. Cuando otro hilo ya mantiene un bloqueo sobre el mutex, el subproceso actual esperará hasta que se libere el bloqueo y luego adquirirá el bloqueo él mismo (una vez que la función retorna, el mutex se ha bloqueado con éxito).

Este mecanismo de bloqueo se utiliza normalmente para proteger algunas estructuras de datos u otros recursos del acceso de dos hilos al mismo tiempo. Cada llamada a Lock debe estar emparejada con una llamada subsiguiente a Unlock.

mutex El número mutex (tal como fue devuelto por CreateMutex ())

Thread.Unlock (mutex)

Libera un bloqueo sobre un mutex. Esta función sólo se debe llamar cuando se haya hecho una llamada anterior a Lock.

mutex El número de mutex (tal como fue devuelto por CreateMutex ())

Thread.Yield ()

Explícitamente cede el control de la CPU para que otros hilos puedan hacer su trabajo.

Los hilos a menudo no están realmente funcionando en paralelo, porque puede que no haya suficientes CPUs hacer en exclusiva el trabajo para cada hilo. En lugar de ello, la CPU hará un poco de trabajo en un hilo y luego saltará al siguiente hilo y así rápida y sucesivamente, para que parezca como si todo estuviese funcionando en paralelo.

Cada vez que un hilo no tenga nada que hacer en un determinado momento, pero tenga que esperar a que se cumpla alguna condición, puede ceder el control de la CPU con la función Yield(), para que otros hilos tengan la oportunidad de hacer su trabajo.

Vector

Este objeto permite la manipulación directa de grandes cantidades de números. Estos se llaman vectores y se almacenarán utilizando matrices con índices consecutivos (comenzando en 0). Cuando se pasen a las operaciones matrices con diferente tamaño, cada elemento que falte será tratado como 0.

Vector.Add (tamaño, A, B)

Añade dos vectores sumando los elementos individuales (C [0] = A [0] + B [0], C [1] = A [1] + B [1] ...)

tamaño Tantos números que se deban tomar para el cálculo

A El primer vector

B El segundo vector

Devuelve Un vector del tamaño dado que contiene valores de suma.

Vector.Init (tamaño, valor)

Establece un vector de un tamaño dado con todos los elementos fijados a un mismo valor.

tamaño Tamaño del vector

valor El valor que se utilizará para todos los elementos

Devuelve El vector creado

Vector.Multiply (filas, columnas, k, A, B)

Operación de multiplicación de matrices. Los vectores de entrada son tratados como matrices de dos dimensiones de anchura y altura dada. Las filas individuales de la matriz se almacenan dentro de los vectores directamente uno después del otro. Para obtener más información sobre esta operación matemática ver https://es.wikipedia.org/wiki/Multiplicaci%C3%B3n_de_matrices

filas Número de filas en la matriz de salida resultante

columnas Número de columnas en la matriz de salida resultante

k Número de columnas en la matriz de entrada A y el número de filas de la matriz de entrada B

A Una matriz tamaño filas * k

B Una matriz de tamaño k * columnas

Devuelve Una matriz que contiene el resultado de la multiplicación

Vector.Sort (tamaño, A)

Clasifica los elementos de un vector en orden creciente.

tamaño Número de elementos a ordenar

A La matriz que contiene los elementos

Devuelve Un nuevo vector con los elementos en el orden correcto