// Sensors and Motors #define SunFollower OUT_A #define ShutterMotor OUT_C #define ShutterTouch SENSOR_3 #define RotAngle SENSOR_2 #define Angle0 SENSOR_1 // Time constants of the shutter release #define ShutterPressTime 30 #define ShutterUpTime 20 // Time needed by camera to save image (x 10ms) #define PhotoSavingTime 200 // Interval between two sky shots, expressed in minutes #define Interval 10 // Mechanical constants #define StepsPerHour 16 #define HideAngle -54 int InitialAngle, InitialTime; task main () { int i, Time, Angle; SetSensor (RotAngle, SENSOR_ROTATION); SetSensor (Angle0, SENSOR_TOUCH); SetSensor (ShutterTouch, SENSOR_TOUCH); // Read startup time and position of arm InitialTime = Watch(); Time = InitialTime; ClearSensor (RotAngle); OnFwd (SunFollower); // rotate arm till home position until (Angle0); Off (SunFollower); InitialAngle = -RotAngle; // Read angle Angle = InitialAngle; ClearSensor (RotAngle); OnRev (SunFollower); // and restore position until (RotAngle >= Angle); Off (SunFollower); while (Angle > 0) { while (Watch() < Time + Interval); // Wait interval Time = Watch(); Angle = InitialAngle - (Time - InitialTime) * StepsPerHour / 60; ReleaseShutter(); // Wake up camera Wait (200); // Wake for camera wake up OnFwd (SunFollower); // Hide sun mask until (Angle0); ClearSensor (RotAngle); until (RotAngle < HideAngle); Off (SunFollower); ReleaseShutter(); // Shoot a photo with sun OnRev (SunFollower); // Mask the sun until (RotAngle >= Angle); Off (SunFollower); Wait (100); // Wait for mask stabilisation ReleaseShutter(); // Shoot a photo with masked sun } } sub ReleaseShutter () { PlaySound (SOUND_DOUBLE_BEEP); OnRev (ShutterMotor); until (ShutterTouch); Float (ShutterMotor); Wait (ShutterPressTime); OnFwd (ShutterMotor); while (ShutterTouch); Wait (ShutterUpTime); Off (ShutterMotor); Wait (PhotoSavingTime); }