How to calibrate light sensor using nxc?

Discussion specific to NXT-G, NXC, NBC, RobotC, Lejos, and more.
felix2ch
Posts: 33
Joined: 11 Jun 2013, 16:46

Re: How to calibrate light sensor using nxc?

Post by felix2ch »

Let me turn this thread back to track. :D
It seem all light or sound sensor call "SysComputeCalibValue" any way.
if calibration block used, "SysUpdateCalibCacheInfo" be called.
And I saw "Todo figure out what this function is intended for",
Does this thread mean it will be remove from todo list?
afanofosc
Site Admin
Posts: 1256
Joined: 26 Sep 2010, 19:36
Location: Nashville, TN
Contact:

Re: How to calibrate light sensor using nxc?

Post by afanofosc »

I apologize for not working on this subject faster. I did decompile the RXE you posted and saw that it called those two system call functions. I haven't ever wrapped them up in higher level API routines, sadly. But they should work with their associated structures.

Code: Select all

a00E8	byte[]	'Light Sensor'
// ... 
	getin	[b]uw002D[/b], ub006D, NormalizedValue
	mov	c00BE.a00C0, a00E8
	mov	c00BE.uw00C2, [b]uw002D[/b]
	syscall	ComputeCalibValue, c00BE
	mov	[b]uw002D[/b], c00BE.uw00C2

Code: Select all

sw001D	sword	
sw001E	sword	1023
// ... 
a00D6	byte[]	'Light Sensor'
a00D8	byte[]	0x0
// ... 
	mov	c0086.a0088, a00D8
	mov	c0086.uw008A, sw001D
	mov	c0086.uw008B, sw001E
	syscall	UpdateCalibCacheInfo, c0086
I have no idea why it writes 0 and 1023 to the Light Sensor.cal calibration cache file. Perhaps there are uses of this block that result in different values being written to the cache.

John Hansen
Multi-platform LEGO MINDSTORMS programming
http://bricxcc.sourceforge.net/
felix2ch
Posts: 33
Joined: 11 Jun 2013, 16:46

Re: How to calibrate light sensor using nxc?

Post by felix2ch »

0 and 1023 is default calibration value(AKA no calibration). They are the min and max value of raw.
In calibration mode, the block will read the raw value of sensor, and set it to min or max position of calibration cache.
And the cache will be set to 0 and 1023 if calibration "delete" be selected.

PS:I known you working hard on EV3, and I expect it. :)
afanofosc
Site Admin
Posts: 1256
Joined: 26 Sep 2010, 19:36
Location: Nashville, TN
Contact:

Re: How to calibrate light sensor using nxc?

Post by afanofosc »

I would love to plug in some NXC light sensor calibration and read calibrated value functions into the official API headers and online documentation if anyone (hint, hint) wanted to provide me with some nice ones.

I am trying to focus pretty much exclusively on EV3 stuff so that I can get as much done as possible by launch, which is getting closer every day.

John Hansen
Multi-platform LEGO MINDSTORMS programming
http://bricxcc.sourceforge.net/
HaWe
Posts: 2500
Joined: 04 Nov 2014, 19:00

Re: How to calibrate light sensor using nxc?

Post by HaWe »

I'm actually not sure what this topic is about or where or what the problem is.
is it about getting the most bright sensor value and the most dark sensor value and the current sensor value in between in percent related to the difference?
Why would one need an API function for that?

v: current ADC_raw
low: min test-range ADC_raw
high: max test-range ADC_raw

vpercent=100*(v-low)/(high-low)

or what am I missing?


(ceterum censeo:
On the other hand, a API function that is really missing since many years, right from the start, is a
comfortable, easy + trouble-free network & remote control for rs485, Xbee, BT, USB

providing data traffic transmission control (and -correction) in order to daisy-chain NXTs, pass local variables of any data type (even different arrays[250] of float or integer!) to remote NXTs (and call them back) and being able to use all remote I/Os at any NXT as if they were local )
felix2ch
Posts: 33
Joined: 11 Jun 2013, 16:46

Re: How to calibrate light sensor using nxc?

Post by felix2ch »

v: current ADC_raw
low: min test-range ADC_raw
high: max test-range ADC_raw

vpercent=100*(v-low)/(high-low)
You are right. But.....

Lego firmware provided a "calibration mechanism", so user doesn't care the min or max raw value things when they using light or sound sensor.Just put a sensor block.Or put a calibrate block at the beginning if they want to calibrate. And NOTHING changes in code except adding calibrate block.

And you code is the SysComputeCalibValue doing exactly.

I would love to plug in some NXC light sensor calibration and read calibrated value functions into the official API headers and online documentation if anyone (hint, hint) wanted to provide me with some nice ones.
Let me explain the implementation of SysComputeCalibValue and SysUpdateCalibCacheInfo in lego firmware. Actually, I want to provide some words for document, but you guys known my english level :oops: .

1.Threre are two places to store calibration data. One is in the file system naming "Sound sensor.cal" or "Light sensor.cal", the other one in the memory loading from file when program start.
2.There are only two values for each calibration data -- min raw value and max.
3.SysUpdateCalibCacheInfo will update the calibration data in memory.
4.The SysComputeCalibValue, do something like doc-helmut 's code. Find the calibaration data, then calculate the scale value using the min or max raw value . The min and max will be 0 and 1023 if calibration data don't exist.
5.That's all almost.
6.In NXT-G, a calibration block changes only one value of calibration data, min or max. But SysUpdateCalibCacheInfo needs them two. How to get another one? There isn't a SysGetCalibCacheInfo.
So,NXT-G read it from file directly, then update the cache and write back the file.It's silly and slow.


User will get the same sensor value from NXC and NXT-G , if ScaleValue for light or sound is calibrated in NXC.
Post Reply

Who is online

Users browsing this forum: No registered users and 9 guests