How nao-rs reads the CPU temperature and sets the head fan through the CPU module's board controller.
The NAO6's head computer is a Congatec conga-QA3 module (board name QA32).
Its board controller reads the CPU temperature and drives the head fan's PWM.
Linux reaches it through Congatec's cgosdrv kernel driver at /dev/cgos,
which HULKs-OS loads at boot. Aldebaran's fan daemon alfand used it; on
HULKs-OS alfand doesn't run, so nothing controls the fan there.
The fan crate talks to /dev/cgos directly, with the same requests as
Aldebaran's fan library. The policy that decides the speed is on Temperatures,
fan and thermal protection.
Setting the speed
Setting a speed of 0 to 100 % sends, in this order:
- the fan limits, with the new speed as the maximum output;
- a board info request. When the board is not a
QA32, it stops here and counts as success; - a speed above 100 is an error;
- the board controller command "set PWM frequency";
- the board controller command "set duty cycle" with the speed.
Reading the speed returns the maximum output from the fan info.
Reading the temperature
The CPU temperature comes from the board controller in thousandths of a
degree. Each reading is written to /var/run/alfand/cputemp (six digits), as
Aldebaran's library does, so tools that read that file keep working.
Checked live
On the robot (2026-11-06): board QA32, CPU at 52 °C, speed set to 70 and to
60 and read back. The control law is identical to Aldebaran's library on
300,000 random configurations.
The fanspeed and faninfo tools are described on Temperatures, fan and
thermal protection.
LEDs
Every LED group of the NAO6, every single LED's index from the robot API down to the driver chip's channel, the colour order, the value conversion and how to set them.
Verification and parity
How each part of nao-rs is proven to behave like the software it replaces - differential tests against the original libraries, replays of real recordings, and live checks on the robot.