32 servo control
// 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 // // This example is made with Wokwi. #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


Comments
Post a Comment