During a Physical Computing class here at the University of Jyväskylä, I made a small experiment with Blender and Arduino. I build a very simple prototype called CHEEX (Cheap Exhibition Expander).
The idea is that instead of traditional exhibition posters or information kiosks, one could use any part of the exhibition room as a display by using data projector and servo-controlled mirror. By using sensors it is possible to react visitors and show them more information when they get near objects.
The Blender part
Blender has a virtual camera which is pointing to a target object. This target object is then animated and the camera naturally follows it. The rotations of the camera are then sent to Arduino, which controls two axis servo system which has a mirror attached to it.
Inside Blender I have a normal scene with camera, the target object and some other objects. Blender scene can be modelled according the exhibition room so that virtual camera and mirror points to same spot. Then it is possible to combine physical space with virtual space.
Technically system is very simple. I used very simple protocol between Blender and Arduino. By sending sequences of three bytes, I could quite easily send rotations to Arduino. First Blender sends "255" and then angle for root servo and then angle for head servo. Arduino is reading serial port and when it receives 255, it knows that following two bytes are the angles for the servos.
System also has one ultrasonic sensor and value from that sensor is send back to Blender every time Blender sends the angle values for servos. This way everything stays in sync and there is no problems with serial port buffer overflows.
System has still one major problem. Servos are connected directly to Arduino and they are using too much power. This makes the readings from the ultrasonic sensor unreliable when servos are moving (at least I *think* that is causing this). I sort of resolved the problem by taking an average of several values but that can be considered a hack. I'll order a motorshield for Arduino and test if using it will resolve the problem.