-
Notifications
You must be signed in to change notification settings - Fork 0
Referencia
En este apartado se realiza una explicación de cada uno de los bloques disponibles en el modo de programación gráfica.
Los bloques disponibles son los siguientes:
- Bloques nativos:
- Lógicos
- Bucles
- Matemáticas
- Cadenas
- Listas
- Variables
- Funciones y procedimientos
- Bloques propios
- Matemáticos
- Movimiento de avance
- Movimiento de retroceso
- Funciones de lectura de infrarrojos
- Otras funciones de control de Charlie
Ejecuta una sentencia condicional, el parámetro recibido debe ser de tipo booleano. Es decir, no admite un 0
, pero sí valores true
y false
, bloques condicionales y cualquier otro bloque que devuelva un valor de este tipo.
Por defecto, la sentencia if únicamente tiene asociadas acciones para el valor cierto. Para añadir acciones al resultado negativo de la condición es necesario añadir el modificador else
. Esto es posible pulsando el icono con forma de estrella, y añadiendo a la sentencia if los modificadores deseados. También es posible añadir uno o más bloques else if
, de forma que si la primera sentencia ejecutada no es cierta, evaluará la segunda condición, y así sucesivamente.
El siguiente ejemplo utiliza un bloque if.
El código realiza lo siguiente: si el sonar detecta un objeto a menos de 20 centímetros enciente el primer led. En otro caso (>= 20), enciende el segundo led.
Este bloque ejecuta una sentencia de comparación y devuelve true
o false
.
Las comparaciones admitidas son:
-
=
: Igual -
≠
: Distinto -
<
: Menor -
≤
: Menor o igual -
>
: Mayor -
≥
: Mayor o igual
Realiza una comparación lógica, y devuelve true
o false
.
Las comparaciones lógicas que se pueden realizar con este bloque son:
-
and
: Comparador lógico ^. -
or
: Comparador lógico v.
Negador lógico. Invierte el resultado de la entrada. Es decir, si recibe true
, devuelve false
y viceversa.
Devuelve un valor booleano, true
o false
.
Permite escoger el valor booleano a devolver.
Devuelve el valor nulo.
Realiza una comparación (necesita ser asociado a un bloque booleano). Si es cierto, devuelve el valor especificado en if true
. En caso de ser falsa la condición, devuelve el valor asociado a if false
.
El valor de la variable sonar
es "¡Objeto cerca!" si el sonar detecta un objeto a menos de 20 centímetros. En caso de detectar un objeto a 20 centímetros o más, su valor será "Despejado."
Repine N veces las acciones que contiene.
Si se especifica while
repite las acciones que contiene mientras la condición sea cierta.
until
repite las acciones siempre y cuando la condición no se cumple.
La condición se especifica mediante un bloque booleano, ya sea un bloque condicional, o cualquier otro bloque con un valor de este tipo.
Se pueden especificar 2 modalidades en este bloque:
-
while
repite las acciones que contiene mientras la condición sea cierta. -
until
repite las acciones que contiene mientras la condición sea falsa.
Ejecuta un bucle for con contador, o sentencia para. Ejecuta las acciones que contiene desde el rango inferior hasta el superior en incrementos también especificados como parámetros. Se almacena en una variable el número de iteración en el que se encuentra el bucle. En el ejemplo se ejecuta el bucle 10 veces, desde 1 hasta 10 en incrementos de 1, y la variable de la iteración es i
.
Sentecia foreach, o para cada. Dada una lista de N elementos, ejecuta las acciones contenidas en el bloque N veces, almacenando en una variable (j en el ejemplo) el elemento número N de la lista.
Es posible realizar rupturas de secuencia dentro de las acciones de un bucle, ya sea a nivel de bucle (break), o de iteración (continue). Si se especifica break out
, cuando se ejecute esta acción finalizará el bucle. Si se ecoge la acción continue
, cuando se ejecute saltará a la siguiente iteración del bucle (si existe).
Existen dos posibles rupturas de secuencia:
-
break out
Finaliza la ejecución del bucle. -
continue
Finaliza la ejecución de la iteración.
Especifica un número. Puede ser entero o con decimales (separados por punto).
Devuelve el resultado de una operación matemática.
Las operaciones que se pueden realizar con este bloque son las siguientes:
- Suma
- Resta
- Multiplicación
- División
- Exponencial
Devuelve el resultado de una operación matemática de 1 operando.
Es posible realizar las siguientes operaciones:
-
square root
: Raíz cuadrada -
absolute
: Valor absoluto -
-
: Valor negativo -
ln
: Logaritmo neperiano -
log10
: Logaritmo en base 10 -
e^
: e elevado a X (siendo X el parámetro recibido) -
10^
: 10 elevado a X (siendo X el parámetro recibido)
Devuelve el resultado de una función trigonométrica realizada sobre el valor de entrada.
Es posible realizar las siguientes operaciones:
-
sin
: seno -
cos
: coseno -
tan
: tangente -
acos
: arcoseno -
asin
: arcocoseno -
atan
: arcotangente
Define una serie de valores matemáticos comunes, tales como pi, e, to, o infinito.
Los distintos valores que devuelve son:
- Pi
- E
- Ro
- Raíz cuadrada de dos.
- Raíz cuadrada de un medio.
- Infinito.
Realiza un incremento (equivalente a una suma) a una variable. Si tenemos change item by 1
, la operación que hará será item := item + 1.
Devuelve el valor redondeado del elemto de entrada con el mismo tipo de dato. Es decir, si recibe un float
, el valor resultante será también float.
Es posible redondear de 3 maneras:
-
round
Redondeo estándar. -
round up
Redondeo al alza. -
round down
Redondeo a la baja.
Este bloque devuelve el resultado de operaciones sobre un conjunto numérico definido en la lista recibida como parámetro.
Las operaciones sobre listas definidas en este bloque son:
-
sum
: Devuelve la suma del conjunto. -
min
: Devuelve el valor mínimo del conjunto. -
max
: Devuelve el valor máximo del conjunto. -
average
: Devuelve la media del conjuno. -
median
: Devuelve la mediana del conjunto. -
modes
: Devuelve la moda, es decir, el valor repetido más veces. -
standard deviation
: Realiza la desviación estándar del conjunto. -
random
: Devuelve un elemento del conjunto al azar.
Devuelve el resto de los dos valores recibidos.
Realiza la función de restricción dado un valor y un rango.
Si el mínimo es N, el máximo M y el valor X, la operación que realiza es min[ max(x,n), m ]. Por ejemplo, si establecemos el valor 3 y rango [0,5], el valor resultante será 3. Sin embargo, para el valor 10 y el rango [2,5], el valor resultante será 5 ya que 10 supera el rango restringido. De igual forma, para el valor 2 y rango [3,4], el valor resultante será 3 ya que 2 no está dentro del rango.
Devuelve un valor aleatorio dentro del rango establecido.
Crea una cadena con el valor escrito.
Concatena dos o más cadenas.
Por defecto, esta instrucción concatena dos cadenas. Para aumentar (o disminuir) este número se insertan tantos bloques item
al bloque descriptivo join
como cadenas se quieran concatenar.
Añade a una cadena almacenada en una variable el valor de entrada (definido a la derecha).
Por ejemplo, dada una variable v = "Hola"
Tras ejecutar instrucción to v append text " mundo"
, el valor de v será "Hola mundo".
El parámetro de entrada puede ser cualquier bloque que devuelva una cadena, incluyendo variables, literales, y otras muchas funciones.
Devuelve un entero que indica la longitud de la cadena
Devuelve un valor booleano (true
o false
) que indica si la cadena contiene algún elemento.
Dada una cadena y una subcadena, devuelve la posición en la que comienza que se encuentra la subcadena en la cadena. Es posible recorrer esta lista desde el principio o desde el final. En caso de no encontrar la ocurrencia, devuelve -1
.
Por ejemplo, si a = "hola" y b = "la", la ejecuión in text a find first occurrence of text b
devolverá 2.
Es posible recorrer la cadena de dos maneras:
-
first
Recorre la cadena desde el principio y devuelve la posición donde comienza la primera subcadena encontrada. -
last
Recorre la cadena desde el final y devuelve la posición donde comienza la primera subcadena encontrada, empezando por la derecha.
Dada una cadena, obtiene un carácter de ésta según el criterio especificado.
Por ejemplo, para la cadena c = "Hola mundo", el bloque in text c get letter # 2
devuelve 'o', que es el segundo carácter de la cadena.
Se puede obtener el carácter mediante los siguientes criterios.
-
letter #
: Especifica la posición. -
letter # from end
: Especifica la posición comenzando desde el final. -
first letter
: Primer carácter. -
letter # from end
: Último carácter. -
random letter
: Carácter al azar.
Dada una cadena y un rango, devuelve una subcadena.
Para establecer el rango de extracción de la cadena, se emplean dos modificadores.
Para establecer el mínimo:
-
letter #
indica la posición en la que se comienza a extraer. -
letter # from end
indica la posición comenzando a contar desde el final de la cadena. -
first letter
indica la primera posición de la cadena.
Para el máximo:
-
letter #
indica la posición hasta la que se va a extraer. -
letter # from end
indica la posición comenzando a contar desde el final de la cadena. -
last letter
indica la última posición de la cadena.
Dada una entrada de tipo cadena, devuelve esta cadena convertida a mayúsculas, minúsculas, o primeras letras mayúsculas.
-
UPPER CASE
Convierte la cadena a mayúsculas. -
lower case
Convierte la cadena a minúsculas. -
Title case
Convierte la cadena con primeras letras a mayúscula y el resto minúscula.
Elimina espacios y saltos de linea al comienzo y/o final de una cadena.
Los modificadores disponibles para este bloque son:
-
both sides
Elimina los espacios del principio y final de la cadena. -
left side
Elimina los espacios del principio la cadena. -
right side
Elimina los espacios del final de la cadena.
Escribe un mensaje en la terminal de Raspberry (visible a través de SSH). Esta función resulta de especial utilidad en el modo de depuración.
Lee un valor por flujo de entrada de terminal. El uso de este bloque se comenta en el apartado depuración.
Es posible establecer un mensaje que se escribirá antes de la lectura de terminal.
Es posible leer dos tipos de valores:
-
text
Recibe una cadena como entrada -
number
Recibe un valor numérico como entrada. Puede ser decimal.
Crea un vector sin elementos.
Crea un vector con los elementos deseados.
Mediante el icono estrella (situado en la parte superior izquierda del bloque) se pueden realizar mutaciones del bloque para añadir o eliminar elementos del vector a crear. Para añadir un nuevo elemento, basta con incluir otro bloque item
dentro de list. Para eliminarlo, basta con separarlo del flujo de acciones que contiene el bloque list.
Crea una lista con un elemento X repetido N veces.
Devuelve un valor entero que indica el número de elementos que contiene el vector.
Devuelve un valor booleano (true
o false
) que indica si el vector está vacío.
Dada una lista y un elemento, devuelve la posición en la que se encuentra la primera (o última) ocurrencia del elemento. Es posible recorrer esta lista desde el principio o desde el final. En caso de no encontrar la ocurrencia, devuelve -1
.
Por ejemplo, si a = "hola" y b = "la", la ejecuión in text a find first occurrence of text b
devolverá 2.
Es posible recorrer la cadena de dos maneras:
-
first
Recorre la lista desde el principio y devuelve la posición donde comienza la primera subcadena encontrada. -
last
Recorre la lista desde el final y devuelve la posición donde comienza la primera subcadena encontrada, empezando por la derecha.
Lee, extrae o elimina un elemento de la lista.
Este bloque tiene dos modificadores.
El primer modificador indica la acción a realizar sobre un elemento de la lista. Pueden ser las siguientes:
-
get
Devuelve el elemento del vector. -
get and remove
Extrae el elemento del vector. Es decir, devuelve el elemento y lo elimina de la lista. -
remove
Elimina el elemento vector. No devuelve nada.
El segundo modificador indica el criterio de selección del elemento de la lista. Son estos:
-
#
: Especifica la posición de la lista en la que se encuentra el elemento a obtener. -
# from end
: Especifica la posición comenzando desde el final. -
first
: Primer elemento. -
last
: Último elemento. -
random letter
: Elemento al azar.
Dada una lista y un rango, devuelve una sublista.
Para establecer el rango de extracción de la cadena, se emplean dos modificadores.
Para establecer el mínimo (valor a partir del cual se empieza a crear la sublista):
-
#
indica la posición del elemento en el vector. -
# from end
indica la posición comenzando a contar desde el final de la lista. -
first
indica la primera posición de la lista, es decir, el primer elemento.
Para el máximo (último valor a obtener):
-
letter #
indica la posición del elemento en el vector.. -
letter # from end
indica la posición comenzando a contar desde el final de la lista. -
last
indica el último elemento de la lista.
Crea o modifica una variable, y le asocia un valor. El tipo del dato de la variable se asigna de forma automática en la primera asignación, propagando el tipo de dato del valor asociado.
Para eliminar una variable, basta con que ningún bloque le haga referencia. Si una variable no se define ni se emplea, se elimina.
En el desplegable aparecen todas las variables creadas en el espacio de trabajo. También es posible ejecutar dos acciones:
-
Rename variable
Renombra una variable existente, y cambia el nombre de todos los bloques que la mencionan. -
New variable
Crea una nueva variable.
Cuando se crea una variable, se crea a su vez un nuevo bloque en el apartado Variables
. Este bloque devuelve el valor de la variable.
En el desplegable aparecen todas las variables creadas en el espacio de trabajo. También es posible ejecutar dos acciones:
-
Rename variable
Renombra una variable existente, y cambia el nombre de todos los bloques que la mencionan. -
New variable
Crea una nueva variable.
Crea una función que no devuelve ningún valor.
Para cada función o procedimiento que se cree, se añadirá un nuevo bloque en el apartado Procedures
, para poder realizar llamadas a la función.
Es posible añadirle valores de entrada (parámetros) a la función, mediante el icono con forma de estrella. Para añadir un parámetro, se ha de colocar un bloque de tipo input
en el contenido de las acciones de inputs
.
Crea una función que devuelve un valor.
Para cada función o procedimiento que se cree, se añadirá un nuevo bloque en el apartado Procedures
, para poder realizar llamadas a la función.
Es posible añadirle valores de entrada (parámetros) a la función, mediante el icono con forma de estrella. Para añadir un parámetro, se ha de colocar un bloque de tipo input
en el contenido de las acciones de inputs
.
Es posible añadir una condición de retorno, tanto a procedimientos como a funciones. Si la condición es cierta, finalizará la ejecución de la función, devolviendo un valor en caso de tratarse de una función. En los procedimientos únicamente finaliza la ejecución ya que no devuelven ningún valor.
Para cada función o procedimiento que se cree, se añadirá un nuevo bloque en el apartado Procedures
, para poder realizar llamadas a la función.
Esta función recibe un valor numérico de cualquier tipo (es decir, int, unsigned int, float, long, ...) y devuelve este valor como un entero redondeado.
La diferencia con el bloque round
, es que este último mantiene el tipo de datos de origen, es decir, round 3.5
devuelve 4.0 (float), mientras que este round to Integer 3.5
devuelve 3 (entero).
Re-mapea o escala un número desde un rango hacia otro. Ésto significa que, un valor (value) con respecto al rango fromLow-fromHight será escalado al rango toLow-toHigh.
No se limitan los valores dentro del rango, ya que los valores fuera de rango son a veces objetivos y útiles. El bloque matemático constrain x min max
puede ser usada tanto antes como después de ésta función, si los límites de los rangos son deseados.
Ten en cuenta que los límites "inferiores" de algún rango pueden ser mayores o menores que el límite "superior" por lo que map() puede utilizarse para revertir una serie de números, por ejemplo:
y = map(x, 1, 50, 50, 1);
La función maneja correctamente también los números negativos, por ejemplo:
y = map(x, 1, 50, 50, -100);
también es válido y funciona correctamente.
La función trata los elementos como tipos decimales (float)
La operación que realiza esta función (escrita en python) es realiza es el siguiente:
y = (x - in_min * out_max - out_min) / (in_max - in_min) + out_min
Establece la velocidad de avance de ambos motores, pudiendo escoger entre tres niveles de velocidad.
-
slow
Velocidad baja. -
medium
Velocidad normal. -
fast
Velocidad alta.
Realiza un giro a la izquierda, estableciendo el motor derecho a velocidad 0 (detenido) y el izquierdo a la velocidad indicada (despacio, normal o rápido).
-
slow
Velocidad baja. -
medium
Velocidad normal. -
fast
Velocidad alta.
Realiza un giro a la derecha, estableciendo el motor izquierdo a velocidad 0 (detenido) y el derecho a la velocidad indicada (despacio, normal o rápido).
-
slow
Velocidad baja. -
medium
Velocidad normal. -
fast
Velocidad alta.
Realiza un frenado por bloqueo, deteniendo bruscamente el robot.
Para realizar un frenado suave (también llamado freno al aire, o freno por descarga) es posible establecer la velocidad de avance a 0 mediante algún comando que realice esta función (por ejemplo set both motor speed a 0
.
Establece la velocidad de avance un motor (o ambos).
El valor recibido debe estar en el rango [0,255]. En caso de introducir un número fuera del rango, se tomará como valor el máximo si el valor introducido es mayor que 255, o bien 0 si se introduce un número negativo.
-
left
Motor izquierdo. -
right
Motor derecho. -
both
Ambos motores.
Establece la velocidad de avance y el balance del robot.
El balance es la diferencia de velocidad entre los motores. El rango de valores es[0, 255] donde
-
0
indica giro brusco a la izquierda (el motor izquierdo no recibe velocidad y el derecho velocidad máxima). -
255
giro brusco a la derecha (ocurre al revés, el motor derecho se establece a velocidad 0 y el izquierdo a la máxima indicada en el parámetro de velocidad). -
123
indica avance frontal (ambos motores reciben la misma velocidad).
Los valores recibidos deben estar en el rango [0,255]. En caso de introducir un número fuera del rango, se tomará como valor el máximo si el valor introducido es mayor que 255, o bien 0 si se introduce un número negativo.
Establece la velocidad de retroceso de ambos motores.
Los valores recibidos deben estar en el rango [0,255]. En caso de introducir un número fuera del rango, se tomará como valor el máximo si el valor introducido es mayor que 255, o bien 0 si se introduce un número negativo.
0 indica detenido y 255 indica velocidad máxima.
Establece la velocidad de retroceso del motor izquierdo.
Los valores recibidos deben estar en el rango [0,255]. En caso de introducir un número fuera del rango, se tomará como valor el máximo si el valor introducido es mayor que 255, o bien 0 si se introduce un número negativo.
0 indica detenido y 255 indica velocidad máxima.
Establece la velocidad de retroceso del motor derecho.
Los valores recibidos deben estar en el rango [0,255]. En caso de introducir un número fuera del rango, se tomará como valor el máximo si el valor introducido es mayor que 255, o bien 0 si se introduce un número negativo.
0 indica detenido y 255 indica velocidad máxima.
Establece la velocidad de retroceso y el balance del robot.
El balance es la diferencia de velocidad entre los motores. El rango de valores es[0, 255] donde
-
0
indica giro brusco a la izquierda (el motor izquierdo no recibe velocidad y el derecho velocidad máxima). -
255
giro brusco a la derecha (ocurre al revés, el motor derecho se establece a velocidad 0 y el izquierdo a la máxima indicada en el parámetro de velocidad). -
123
indica avance frontal (ambos motores reciben la misma velocidad).
Los valores recibidos deben estar en el rango [0,255]. En caso de introducir un número fuera del rango, se tomará como valor el máximo si el valor introducido es mayor que 255, o bien 0 si se introduce un número negativo.
Realiza un frenado por bloqueo, deteniendo bruscamente el robot.
Para realizar un frenado suave (también llamado freno al aire, o freno por descarga) es posible establecer la velocidad de avance a 0 mediante algún comando que realice esta función (por ejemplo set both motor speed a 0
.
Devuelve la lectura de los 12 sensores de suelo situados en la parte frontal del robot.
El formato es de salida es una cadena de 12 elementos, donde cada carácter de la cadena puede valer:
-
1
: Indica que el sensor ha detectado una marca negra. -
0
: El sensor no ha detectado marca negra, y se interpreta como blanco.
Se ha escogido emplear una cadena como dato devuelto (y no su valor decimal) para poder aprovechar las funciones sobre cadenas disponibles, y así facilitar la programación.
Una posible valor devuelto por esta función sería la cadena 000001100000
que indica que los dos sensores situados en la posición central han detectado una marca negra y el resto han leído marca blanca.
Devuelve la lectura de los 9 sensores de suelo situados en la parte central del robot.
El formato es de salida es una cadena de 9 elementos, donde cada carácter de la cadena puede valer:
-
1
: Indica que el sensor ha detectado una marca negra. -
0
: El sensor no ha detectado marca negra, y se interpreta como blanco.
Se ha escogido emplear una cadena como dato devuelto (y no su valor decimal) para poder aprovechar las funciones sobre cadenas disponibles, y así facilitar la programación.
Una posible valor devuelto por esta función sería la cadena 000010000
que indica que el sensor situado en el centro ha detectado una marca negra y el resto han leído marca blanca.
Devuelve la lectura de los 21 sensores de suelo situados. Los 12 primeros caracteres se corresponden con cada uno de los sensores frontales. Los 9 últimos indican el estado leído de los sensores centrales.
El formato es de salida es una cadena de 21 elementos, donde cada carácter de la cadena puede valer:
-
1
: Indica que el sensor ha detectado una marca negra. -
0
: El sensor no ha detectado marca negra, y se interpreta como blanco.
Se ha escogido emplear una cadena como dato devuelto (y no su valor decimal) para poder aprovechar las funciones sobre cadenas disponibles, y así facilitar la programación.
Recibe una cadena y devuelve la posición del primer 1
leído.
Por ejemplo, supongamos que previamente realizamos una lectura frontal mediante el bloque Read front sensors
y este devuelve la cadena "010000000000". Si introducimos este valor, la función devolverá 2
, indicando que en el segundo sensor ha detectado una marca negra.
Esta función puede ser de gran utilidad para la realización de siguelineas, en combinacion con los bloques map
y set speed and balance
. Hay disponible una posible implementación de un siguelineas en el subapartado Ejemplos, dentro de la descripción del modo de programación gráfica.
Los sensores frontales pueden realizar una lectura analógica de los infrarrojos.
El valor devuelto es una lista de 12 elementos, donde cada elemento de este vector indica el valor leído del sensor, dentro del rango [0,2000].
-
O
indica blanco absoluto. -
2000
indica negro absoluto.
Por defecto, se considera como negro un valor mayor que 30.
Función de ruptura de flujo. Detiene la ejecución del código durante un periodo de tiempo establecido como parámetro. En otras palabras, si recibe el valor 1000 (milisegundos), espera 1 segundo hasta ejecutar la siguiente instrucción.
Devuelve el valor del sonar, que indica la distancia en centímetros a la que se ha detectado el objeto más cercano.
Establece el estado (encendido o apagado) de alguno de los 14 leds disponibles.
- El led
0
está situado en el extremo izquierdo de la parte frontal del robot, coincidiendo con el sensor de suelo situado más a la izquierda. - El led
11
está situado en el extremo derecho de la parte frontal del robot, coincidiendo con el sensor de suelo situado más a la derecha. - Los leds
12
y13
están situados en la parte central del robot.
Valores fuera de rango:
- Si se introduce un valor negativo, el led que se encenderá será el número
0
. - Si se introduce un valor mayor que 13, el led que se encenderá será el número
13
.
En el siguiente ejemplo se hace parpadear 10 veces el primer led (situado en el extremo izquierdo del robot) en intervalos de cambio de estado de 1 segundo:
-
on
: Indica estado encendido. -
off
: Indica estado apagado.
Establece la posición del servo, indicada en grados sobre la horizontal. Es decir:
-
-35º
Es el valor mínimo. El robot apunta hacia abajo. -
0º
El robot apunta hacia el frente. -
90º
El robot apunta hacia arriba. -
150º
El robot apunta hacia atrás (la cámara se ve invertida en este ángulo).
Valores fuera de rango:
- Si se introduce menor que
-35
, el servo se posicionará en su mínimo posible, es decir, -35º sobre la horizontal.. - Si se introduce un valor mayor que
150
, el servo se posicionará en su máximoposible, es decir, 150º sobre la horizontal..
Establece el estado del claxon, también llamado zumbador, piezoeléctrico o buzzer.
El siguiente ejemplo emite un pitido durante un segundo:
-
on
: Indica estado encendido. -
off
: Indica estado apagado.
- Introducción
- Qué es Charlie
- Objetivos
- Alcance
- Proyectos similares
- Cómo controlar el robot
- Aspectos generales
- Modo de conducción libre
- Modo de programación gráfica 1. Ejemplos 2. Referencia de instrucciones
- Depuración
- Instalación
- Hardware
- Software
- Configuración de red
- Funcionamiento
- Comunicaciones
- Blockly
- Motores
- Cámara
- Comandos
- Explicación del código fuente
- Código de Arduino
- Aplicación Android
- Página web
- Servidor de comandos
- Script de arranque
- Resultados
- Evolución del proyecto
- Trabajo descartado
- Futuras ampliaciones
- Resultado final
- Agradecimientos
- Referencias
- Fuentes consultadas
- Datasheets