// ServoOverdone.ino // // Example for multiple Servo objects in a array. // // Version 1, 28 July 2021, by Koepel. // Version 2, 15 August 2021, by Koepel. // changed timing, a little slower // diagram.json has servos in reverse order (I think it is visually better) // Added fourth sequence: "compass" // // Public Domain // #include #define NUM_SERVOS 32 Servo myServo[NUM_SERVOS]; void setup() { // Attach pins from the Arduino Mega board to the Servo objects. // Starting from pin 22, there happen to be exactly 32 pins on the double row pins. for( int i=0; i=0; r--) { for( int i=0; i (NUM_SERVOS / 2)) d = NUM_SERVOS - d; int angle = 90 - (10 * d); if( angle < 0) angle = 0; myServo[j].write( angle); } delay(40); } } // Sequence four. // A "compass" // Start by pointing upwards int pointer = NUM_SERVOS * 3 / 4; showPointer( pointer); delay( 1000); // let the viewer get used to new pattern for( int i=0; i<5; i++) { showPointer( --pointer); delay( 150); } delay( 200); for( int i=0; i<9; i++) { showPointer( ++pointer); delay( 150); } delay( 200); for( int i=0; i<5; i++) { showPointer( --pointer); delay( 150); } delay( 200); for( int i=0; i<4; i++) { showPointer( ++pointer); delay( 150); } delay( 160); for( int i=0; i<2; i++) { showPointer( --pointer); delay( 150); } delay( 80); for( int i=0; i<1; i++) { showPointer( ++pointer); delay( 150); } delay( 2000); } // This function makes a "pointer" with the servos. // It is used to create the "compass". // The parameter 's' is the servo motor that has the pointer. // It is allowed that 's' is below zero or larger than the numbers of servo motors. void showPointer( int s) { int pointerA = s % NUM_SERVOS; // Using the '%' (remainder) for valid number int pointerB = (s + 1) % NUM_SERVOS; // pointer is made with the next servo motor int tailA = (s + 16) % NUM_SERVOS; int tailB = (s + 17) % NUM_SERVOS; // make pointer with servo motor s and s+1. myServo[pointerA].write(180-56); myServo[pointerB].write(56); // make tail with servo motor s+16 and s+17. myServo[tailA].write(95); myServo[tailB].write(85); // Set servos right of pointer int n = (NUM_SERVOS / 2) - 2; int start = pointerB + 1; for( int i=0; i=0; i--) { float rotate = float( i) * (360.0 / float( NUM_SERVOS)); float rad = rotate / 360.0 * 2.0 * M_PI; float top = (300.0 * sin( rad)) + 300.0; float left = (300.0 * cos( rad)) + 300.0; Serial.print( " {\n"); Serial.print( " \"type\": \"wokwi-servo\",\n"); Serial.print( " \"id\": \"servo"); Serial.print( i); Serial.print( "\",\n"); Serial.print( " \"top\": "); Serial.print( top); Serial.print( ",\n"); Serial.print( " \"left\": "); Serial.print( left); Serial.print( ",\n"); Serial.print( " \"rotate\": "); Serial.print( rotate); Serial.print( ",\n"); Serial.print( " \"attrs\": { \"hornColor\": \"Red\" }\n"); Serial.print( " }"); if( i != 0) Serial.print( ","); Serial.print( "\n"); } Serial.print( " ],\n"); Serial.print( " \"connections\": [\n"); for( int i=0; i