Sensor de color con NXC

sensor de color con nxcLa versión comercial NXT 2.0, es decir 8547, incorpora un nuevo sensor de color que es exclusivo de este conjunto hasta junio, fecha en la que podrá ser adquirido como producto de LEGO Education. La programación de este sensor se realiza mediante su propio icono gráfico cuando trabajamos en NXT-G y requiere que el firmware del ladrillo inteligente sea el de versión 1.28 (diferente al 1.26 de la versión NXT 2.0 del software educativo).

Sensor de color con NXC: cómo emplearlo

Aunque todavía como versión de prueba, NXC y BricxCC acaban de presentar una nueva versión que incluye soporte para este nuevo sensor de color. Pueden descargarse a través de las siguientes URLs:

http://bricxcc.sourceforge.net/test_release.zip
http://bricxcc.sourceforge.net/nbc/beta/nbc-1.0.1.b36.tgz
http://bricxcc.sourceforge.net/nbc/beta/nbc-1.0.1.b36.osx.tgz

Antes de empezar a controlar el nuevo sensor de color mediante NXC o BricxCC es necesario decirle al compilador de que trabajamos con el firmware adecuado del NXT 2.0. Podemos indicarle esto al compilador mediante línea de comandos:

nbc -v=128 myprogram.nxc

El valor 128 indica la versión 1.28, que se corresponde con el firmware de la versión comercial NXT 2.0.

Si trabajamos con BricxCC necesitamos tan solo activar la opción “NXT 2.0 compatible firmware” en la pestaña
Compiler|NBC/NXC del diálogo de “Preferences”.

Se pueden emplear 5 nuevos tipos de sensores con este nuevo sensor:

  • SENSOR_TYPE_COLORFULL,
  • SENSOR_TYPE_COLORRED,
  • SENSOR_TYPE_COLORGREEN,
  • SENSOR_TYPE_COLORBLUE, y
  • SENSOR_TYPE_COLORNONE.

Estos tipos pueden emplearse mediante la función SetSensorType para configurar el puerto de sensor como sensor de color. Mientras que para detectar colores emplearemos el tipo SENSOR_TYPE_COLORFULL, los tipos restantes los emplearemos para detectar niveles de luz ambiental (con el tipo COLORNONE). Si deseamos usar el sensor de color como si fuera el antiguo sensor de luminosidad, emplearemos entonces el tipo COLORRED para activar la lámpara roja.

El API de NXC dispone también de funciones específicas de configuración para cada uno de los tipos anteriores: SetSensorColorFull, SetSensorColorRed, SetSensorColorGreen, SetSensorColorBlue, y SetSensorColorNone. Cada una de estas funciones llama a SetSensorType con la constante de tipo de sensor apropiada, hace una llamada a SetSensorMode con SENSOR_MODE_RAW, y finalmente llama a ResetSensor para esperar a que el firmware finalice de inicializar el sensor con los datos correctos de tipo y modo.

Una vez realizado lo anterior ya hemos configurado correctamente el puerto para poder emplearlo con el nuevo sensor de color, por lo que podemos leer los datos del sensor de varias maneras. La forma más sencilla de hacerlo es empleando los valores SENSOR_1, SENSOR_2, SENSOR_3, y SENSOR_4. Estos devuelven el número de color cuando el sensor está configurado en modo a todo color. También puedes leer los valores del sensor directos, de forma similar a lo que haríamos para obtener los valores del sensor de luminosidad con SensorRaw si configuramos el sensor como un tipo “non-full color”.

El acceso directo a los campos del sensor de color en el módulo IOMAP se realiza a través de las siguientes funciones de bajo nivel de NXC:

unsigned long ColorCalibration(const byte port, const byte pointNum, const byte colorNum);
unsigned int ColorCalLimits(const byte port, const byte pointNum);
unsigned int ColorADRaw(const byte port, const byte colorNum);
unsigned int ColorSensorRaw(const byte port, const byte colorNum);
int ColorSensorValue(const byte port, const byte colorNum);
byte ColorBoolean(const byte port, const byte colorNum);
byte ColorCalibrationState(const byte port);

Existe también una función de bajo nivel denominada SysColorSensorRead que hace uso de una estructura como argumento del tipo ColorSensorReadType. Esta estructura tiene la siguiente definición:

struct ColorSensorReadType {
char Result;
byte Port;
int ColorValue;
unsigned int RawArray[4];
unsigned int NormalizedArray[4];
int ScaledArray[4];
bool Invalid;
};

Como entrada a la llamada a la función SysColorSensorRead escribes el campo de Port con los valores S1, S2, S3 o S4. Después de la llamada puedes leer el campo Result para comprobar si se han producido errores y, en caso negativo, acceder al valor de ColorValue o leer los datos de los 3 arrays. Cada array se indexa mediante INPUT_RED (0), INPUT_GREEN (1), INPUT_BLUE (2), or INPUT_BLANK (3).

También es posible realizar una lectura de alto nivel de los valores directos del sensor haciendo uso de ReadSensorColorRaw(byte port, unsigned int & rawValues[]). Para leer los datos del sensor de color podemos emplear ReadSensorColorEx(byte port, int & colorValue, unsigned int & rawValues[], unsigned int & normValues[], int & scaledValues[]).

El valor ColorValue devuelto por estas funciones será una de las siguientes constantes:

  • INPUT_BLACKCOLOR,
  • INPUT_BLUECOLOR,
  • INPUT_GREENCOLOR,
  • INPUT_YELLOWCOLOR,
  • INPUT_REDCOLOR, y
  • INPUT_WHITECOLOR

(1..6, respectivamente).

Fuente: nxtasy.org

Comments are closed.