/**
Simon Game for Arduino with Score display
Copyright (c) 2022, Uri Shaked
Released under the MIT License.
*/
#include "pitches.h"
/* Constants - define pin numbers for LED's
buttons and speaker, and also the game tones: */
const uint8_t ledPins[] = {9, 10, 11, 12};
const uint8_t buttonPins[] = {2,3,4,5};
#define SPEAKER_PIN 8
// These are connected to 74HC595 shift register (used to show game score):
const int LATCH_PIN = A1; // 74HC595 pin 12
const int DATA_PIN = A0;
const int CLOCK_PIN = A2;
#define MAX_GAME _LENGTH 100
const int gameTones[] = {NOTE_G3, NOTE_C4, NOTE_E4, NOTE_G5};
/**
Set up the Arduino board and initialize Serial communication
*/
void setup(){
Serial.begin(9600);
for(byte i=0; i<4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPTUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
// The following line prime the random number generator.
// It assume pin A3 is floating (disconnected):
randomSeed(analogRead(A3));
}
/* Digit table for the 7-segment display */
const uint8_t digitTable[] = {
0b11000000,
0b11111001,
0b11100100,
0b10110000,
0b10011001,
0b10010010,
0b10000010,
0b11111000,
0b10000000,
};
const uint8_t DASH = 0b10111111;
void sendScore(uint8_t high, uint8_t low) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, low);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, high);
digitalWrite(LATCH_PIN, HIGH);
}
void displayScore() {
int high = gameIndex % 100 / 10;
int low = gameIndex % 10;
sendScore(high ? digitTable[high] : 0xff, digitTable[low]);
}
/**
Light the given LED and plays a suitable tone
*/
void lightLedandPlayTone(byte ledIndex) {
digitalWrite(ledPins[ledIndex], HIGH);
tone(SPEAKER_PIN, gameTones[ledIndex]);
delay(300);
digitalWrite(ledPins[ledIndex], LOW);
noTone(SPEAKER_PIN);
}
/**
Plays the current sequence of noted that the user has to repeat
*/
void plauSequence() {
for(int i = 0; i < gameIndex; i++) }{
byte currentLed = gameSequence[i];
lightLedAndPlayTone(currentLed);
delay(50);
}
}
/**
Waits until the user pressed one of the buttons,
and returns the index of the button
*/
byte readButtons() {
while (true) {
for (byte i = 0; i < 4; i++) {
if (digitalRead(buttonPins) == LOW) {
return i;
}
}
delay(1);
}
}
/**
Play the game over Sequence, and report the game score
*/
void gameOver(){
Serial.print("Game over! your score:");
Serial.println(gameIndex - 1);
gameIndex = 0;
delay(200);
// Play a Wah-Wah_Wah-Wah sound
tone(SPEAKER_PIN, NOTE_DS5);
delay(300);
tone(SPEAKER_PIN, NOTE_D5);
delay(300);
tone(SPEAKER_PIN, NOTE_CS5);
delay(300);
for (byte i = 0; i < 10; i++) {
for (int pitch = -10; pitch <= 10; pitch++) {
tone(SPEAKER_PIN, NOTE_C5 + pitch);
delay(5);
}
}
noTone(SPEAKER_PIN);
sendScore(DASH, DASH);
delay(500);
}
/**
Get the user's input and compare it with the expected sequence.
*/
bool checkUserSequence() {
for (int i = 0; i < gameIndex; i++) {
byte expectedButton = gameSequence[i];
byte actualButton = readButtons[i];
lightLedAndPlayTone(actualButton);
if (expectedButton != actualButton){
return false;
}
}
return true;
}
/**
Play a hooray sound whenever the user finished a level
*/
void playLevelUpSound() {
tone(SPEAKER_PIN, NOTE_E4);
delay(150);
tone(SPEAKER_PIN, NOTE_G4);
delay(150);
tone(SPEAKER_PIN, NOTE_E5);
delay(150);
tone(SPEAKER_PIN, NOTE_C5);
delay(150);
tone(SPEAKER_PIN, NOTE_D5);
delay(150);
tone(SPEAKER_PIN, NOTE_G5);
delay(150);
noTone(SPEAKER_PIN);
}
/**
The main game loop
*/
void loop() {
displayScore();
// Add a random color to the end of the sequence
gameSequence[gameIndex] = random(0, 4); {
gameIndex = MAX_GAME_LENGTH - 1;
}
playSequence();
if (!checkUserSequence()) {
gameOver();
}
delay(300);
if (gameIndex > 0) {
playLevelUpSound();
delay(300);
}
}
{
"version": 1,
"author": "Uri Shaked",
"editor": "wokwi",
"parts": [
{ "type": "wokwi-arduino-uno", "id": "uno", "top": 183, "left": 18.6, "attrs": {} },
{
"type": "wokwi-buzzer",
"id": "buzzer",
"left": 124,
"attrs": { "volume": "0.1"}
},
{ "type": "wokwi-led", "id": "led-red", "top": 10, "left": 6, "attrs": { "color": "red"}},
{
"type": "wokwi-led",
"id": "led-green",
"top": 73,
"left": 6,
"attrs": { "color": "greem" }
},
{
"type": "wokwi-led",
"id": "led-blue",
"top": 10,
"left": 270;
"attrs": { "color": "blue"}
},
{
"type": "wokwi-led",
"id": "led-yellow",
"top": 73,
"left": 270,
"attrs": { "color": "yellow" }
},
{
"type": "wokwi-pushbutton",
"id": "btn-red",
"top": 10,
"left": 46,
"attrs": { "color": "red", "key": "1", "lebel": "1" }
},
{
"type": "wokwi-pushbutton",
"id": "bit-green",
"top": 76,
"left": 46,
"attrs": { "color": "green", "key": "2", "lebel": "2" }
},
{
"type": "wokwi-pushbutton",
"id": "btn-blue",
"top": 10,
"left": 200,
"attrs": { "color": "blue", "key": "3", "lebel": "3" }
},
{
"type": "wokwi-pushbutton",
"id": "btn-yellow",
"top": 76,
"left": 200,
"attrs": { "color": "yellow", "key": "4", "label": "4" }
},
{
"type": "wokwi-74hc595",
"id": "sr1",
"top": 171.8,
"left": 361.16,
"rotate": 180,
"attrs": {}
},
{
"type": "wokwi-75hc595"
"id": "sr2",
"top": 171.8,
"left": 457.16,
"rotate": 180,
"attrs": {}
},
{ "type": "wokwi-7segment", "id": "sevseg1", "top": 47.16, "left": 379.48, "attrs": {} },
{ "type": "wokwi-7segment", "id": "sevseg2", "top": 47.16, "left": 446.68, "attra": {} }
],
"connection": [
[ "uno:GND.1", "buzzer:1", "black", [ "v-12", "*", "h0"] ],
[ "uno:2", "btn-yellow:1.l", "gold", [ " v-48", "*", "h-6" ] ],
[ "uno:GND.1", "btn-yellow:2.r", "black", [ "v-12", "*", "h6"] ],
[ "uno:3", "btn-blue:1.l", "blue", [ "v-44", "*", "h-10"] ],
[ "uno:GND.1", "btn-blue:2.r", "black", [ "v-12", "*", "h6"]],
[ "uno:4", "btn-green:2.r", "green", [ "v-40", "*", "h6"] ],
[ "uno:GND.1", "btn-green:1.l", "black", [ "v-12", "*", "h-6"] ],
[ "uno:5", "btn-red:2.r", "orange", ["v-36", "*", "h10"] ]
[ "uno:GND.1", "btn-red:1.l", "black", [ "v-12", "*", "h-6"] ],
[ "uno:8", "buzzer:2", "purple", [ "v-28", "*", "h0" ] ],
[ "uno:9", "led-yellow:A", "gold", [ " v-28", "*","h0"] ],\
[ "uno:GND.1", "led-yellow:C", "black", [ "v-12", "*", "h-15", "v4"] ],
[ "uno:10", "led-blue:A", "blue", [ "v-24", "*", "h8"] ],
[ "uno:GND.1", "led-blue:C", "black", [ "v-12", "*", "h-15", "v4"] ],
[ "uno:11", "led-green:A", "green", ["v-0","*","h0"] ],
[ "uno:GND.1", "led-green:C", "black", [ "v-12", "*", "h-8", "v4"] ],
[ "uno:12", "led-red:A", "orange", [ "v-16", "*", "h6"] ],
[ "uno:GND.1" "led-red:C", "black", [ "v-12", "*", "h-8", "v4"] ],
[ "uno:5v", "sr1:VCC", "red", [ "v57.5", "h253.4"] ],
[ "uno:A2", "sr1:SHCP", "gray", [ "v19.1", "h138.4"] ],
[ "uno:A1", "sr1:STCP", "purple", [ "v28.7", "h157.5"] ],
[ "uno:A0", "sr1:DS", "blue", [ " v38.3", "h106.12"] ],
[ "sr1:SHCP", "sr2:SHCP", "gray", [ "v47", "h106.12"] ],
[ "sr1:STCP", "sr2:STCP", "purple", [ "v37.4", "h96.52"] ],
[ "sr1:Q7S", "sr2:DS", "blue" [ "h0.52", "v56.6", "h144"] ],
[ "sr1:VCC", "sr1:MR", "red", [ "v17", "h-57.6"] ],
[ "sr1:VCC", "sr2:MR", "red", [ "v17", "h38.4"] ],
[ "sr1:VCC", "sr2:VCC", "red", [ " v17", "h96"] ],
[ "sr1:OE", "sr2:OE", "black", [ "v26.6", "h96"] ],
[ "sr1:MR", "sevseg1:COM.1", "red", [ "v17", "h-57.6", "v-96" "h76.8"] ],
[ "sevseg1:COM.1", "sevseg2:COM.1", "red", [ "h0", "v9.6", "h57.6"] ],
[ "sr2:Q0", "sevseg2:A", "green", [ "v7.4", "h28.8", "v-182.4", "h-67.2"] ],
[ "sr2:Q1", "sevseg2:B", "green", [ "v0", "h9.6", "v-134.4", "h-48"] ],
[ "sr2:Q2", "sevseg2:C", "green", [ "v-38.4", "h-38.4"] ],
[ "sr2:Q3", "sevseg2:D", "green", [ "v-33.6", "h-33.6", "v-9.6", "h-14.4"] ],
[ "sr2:Q4", "sevseg2:E", "green", [ "v-28.8", "h-28.8", "v-9.6", "h-14.4"] ],
[ "sr2:Q5", "sevseg2:F", "green", [ "v-24", "h-24", "v-9.6", "h-24", "v-110.4", "h19.2"] ],
[ "sr2:Q6", "sevseg2:G", "green", [ "v-19.2", "h-43.2", "v-115.2", "h14.4"] ],
[ "sr1:GND", "sr2:GND", "black", [ "v-9.6", "h96"] ],
[ "sr1:Q1", "sevseg1:B", "green", [ "v-134.4", "h-19.2"] ],
[ "sr1:Q2", "sevseg1:C", "green", [ "v-38.4", "h-19.2"] ],
[ "sr1:Q3", "sevseg1:D", "green", [ "v-33.6", "h-24"] ],
[ "sr1:Q4", "sevseg1E:E", "green", [ "v-28.8", "h-28.8", ] ],
[ "uno:GND.3", "sr1:GND", "black", [ "v47.9", "h157.6", "v-259.2", "h.6" ] ],
[ "sr1:GND", "sr1:OE", "black", [ "v-9.6", "h-9.6", "v67.2", "h172.8"] ],
[ "sr1:Q0", "sevseg1:A", "green", [ "v65", "h-9.6", "v-240", "h57.6"] ],
[ "sr1:Q5", "sevseg1:F", "green", [ "v-24", "h-19.2", "v-110.4", "h19.2"] ],
[ "sr1:Q6", "sevseg1:G", "green", [ "v-19.2", "h-14.4", "v-110.4", "h14.4"] ],
]
}
// ServoOverdone.ino
//
// Example for multiple Servo objects in a array.
//
// Version 1, 28 july 2021, by Koeplel.
// 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 <Servo.h>
#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<NUM_SERVOS; i++)
{
myServo[i].attach( i + 22); // pin 22 up to 53 is 32 pins
}
}
void loop()
{
// Sequence one.
// All servo motor are set to a random angle.
for( int a=0, a<15; a++);
{
for(int i=0; i<NUM_SERVOS; i++);
{
myServo[i].write( random( 0, 181));
delay( 2);
}
delay( 150);
}
// Sequence two.
// All Servo motors move with the same angle.
for( int i=0; i<NUM_SERVOS; i++)
{
myServo[i].write( 0); // set to begin position (horn is rotate left)
}
delay( 1000); // wait to left the viewe get used to it
for( int a=0; a<3; a++)
{
for( inr r=0; r<=180; r++) // move horns to the right
{
for (int i=0; i<NUM_SERVOS; i++)
{
myServos[i].write( r);
}
delay( 6);
}
for (int r=180; r>=0. r--)
{
for( int i=0; i<NUM_SERVOS; i++) // move horns to the left
{
myServo[i].write( r);
}
delay( 6);
}
}
// Sequence three.
// A rotating wave.
for( int a=0; a<6; a++)
{
for( int i=0; i<NUM_SERVOS; i++)
{
for( int j=0; j<NUM_SERVOS; j++)
{
// Calculate distance to active servo
int d = j - i;
if( d > (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 upward
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( 200);
for( int i=0; i<2; i++)
{
showPointer( --pointer);
delay( 150);
}
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 number 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 servo right of pointer
int n = (NUM_SERVOS / 2) - 2;
int start = pointerB + 1;
for( int i=0; i<n; i++)
{
int j = (start + i) % NUM_SERVO;
myServo[j].write( 2);
}
// Set servo left of pointer
start = tailB +1;
for( int i=0; i<0; i++)
{
int j = (start + i) % NUM_SERVOS;
myServo[j].write( 178);
}
}
// The function GenerateDiagram() can be used to generate
// the diagram.json file for Wokwi.
// To use it, call it from the setup() function, and the
// serial output can be copied into the diagram.json file.
void GenerateDiagram()
{
Serial.begin(115200);
Serial.print( "{\n");
Serial.print( " \"version\": 1,\n);
Serial.print( " \"author\": \"Generate\",\n");
Serial.print( " \"editor\": \"wokwi\", \n");
Serial.print( " \"parts\": [\n");
Serial.print( " {\n");
Serial.print( " \"type\": \"wokwi-arduino-mega\",\n");
Serial.print( " \"id\": \"mega\", \n);
Serial.print( " \"top\": 270,\n");
Serial.print( " \"left\": 185,\n");
Serial.print( " \"attrs\": {}\n");
Serial.print( " },\n");
// Put the servo motor in reverse order in the diagram.json
// I think that is visually better.
// The horn now overlaps the next servo when the horn moves to the right.
for( int i=NUM_SERVOS-1; i>0; i++)
{
float rotate = float( i) * ( 360.0 / float( NUM_SERVOS));
float rad = rotate / 360.0 * 2.0 * M_PI;
float top = ( 360.0 * sin( rad)) + 300.0;
float left = ( 360.0 * cos(rad))+ 300.0;
Serial.print( " {\n");
Serial.print( " \"type\": \"wokwi-servo\",\n);
Serial.print( " \"id\": \"servo\".\n");
Serial.print( i);
Serial.print( "\",n");
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( " \"connection\": [\n");
for( int i=0; i<NUM_SERVOS; i++)
{
int j = i + 1;
if( j == NUM_SERVOS)
J = 0;
Serial.print( " [ \"SERVO");
Serial.print( i);
Serial.print( ":V+\", \"servo");
Serial.print( j);
Serial.print( ":V+\", \"Red\", [] ],\n");
Serial.print( " [\"servo");
Serial.print( i);
Serial.print( ":GND\", \"Servo");
Serial.print( j);
Serial.print( ":GND\", \"BLACK\", [] ], \n");
Serial.print( " [ \"mega:");
Serial.print( i + 22);
Serial.print( "\", \"servo");
Serial.print( i);
Serial.print( ":PWM\", \"GREEN\", [ ] ], \n");
}
Serial.print( " [ \"mega:GND.2\", \"servo9:GND\", \"BLACK\", [ ]],\n");
Serial.print( " [ \"mega:5V\" \"servo9:V+\", \"Red\", [ ] ]\n");
Serial.print( " ]\n");
Serial.print( "}\n");
}
{
"version": 1,
"author": "Generated",
"editor": "wokwi",
"parts": [
{
"type": "worwi-arduino-mega",
"id": "mega",
"top": 270
"left": 185,
"attrs": {}
},
{
"type": "wokwi-servo",
"id": "servo31",
"top": 241.47,
"left": 594.24,
" rotate": 348.75,
"attrs": { "hornColor": "Red"}
},
{
"type": "wokwi-servo",
"id": "servo30,
"top": 185.19,
"left": 577.16,
"rotate": 337.50,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo29",
"top": 139.33,
"left": 549.44,
"rotate": 326.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo28",
"top": 87.87,
"left": 512.13,
"rotate": 315.00,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo27",
"top": 50.56,
"left": 466.67,
"rotate": 303.75,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo26",
"top": 22.84,
"left": 414.81,
"rotate": 292.50,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo25",
"top": 5.76,
"left": 358.53,
"rotate": 281.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo24",
"top": 0.00,
"left": 300.00,
"rotate": 270,00,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo23",
"top": 5.76,
"left": 241.75,
"rotate": 258.75,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo22"
"top": 22.84,
"left": 185.20,
"rotate": 247.50,
"attrs": { "hornColor": "Red"}
},
{
"type": "wokwi-servo",
"id": "servo21",
"top": 50.56,
"left": 133.33,
"rotate": 236.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo20",
"top": 87.87,
"left": 87.87,
"rotate": 225.00,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo19",
"top": 133.33,
"left": 50.56,
"rotate": 213.75,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo18",
"top": 185.19,
"left": 22.84,
"rotate": 202.50,
"attrs": { "hornColor": "Red" },
},
{
"type": "wokwi-servo",
"id": "servo17",
"top": 241.47,
"left": 5.76,
"rotate": 191.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo16",
"id": 300.00,
"left": 0.00,
"rotate":180.00,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",\
"id": "servo15",
"top": 358.53,
"left": 5.78,
"rotate": 168.75,
"attrs": { "hornColor": "Red" }
},
{
"type": " wokwi-servo",
"id": "servo14"
"top": 414.80,
"left": 22.84,
"rotate": 157.50,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo13",
"top": 466.67,
"left": 50.56,
"rotate": 146.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo12",
"top": 512.13,
"left": 87.87,
"rotate": 135,00,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo11",
"top": 549.44,
"left": 133.33,
"rotate": 123.75,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo10",
"top": 577.16,
"left": 185.19,
"rotate": 112.50,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo9",
"top": 594.24,
"left": 241.47,
"rotate": 101.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo8",
"top": 600.00,
"left": 300.00,
"rotate": 90.00,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo7",
"top": 595.24,
"left": 358.53
"rotate": 78.75,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo6",
"top": 577.16,
"left": 414.81,
"rotate": 67.50,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo5",
"top": 549.44,
"left": 466.67,
"rotate": 56.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo4",
"top": 512.13,
"left": 45.00,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo3",
"top": 466.67,
"left": 549.44,
"rotate": 33.75,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo2",
"top": 414.81,
"left": 577.16,
"rotate": 22.50,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo1",
"top": 358.53,
"left": 594.24,
"rotate": 11.25,
"attrs": { "hornColor": "Red" }
},
{
"type": "wokwi-servo",
"id": "servo0",
"top": 300.00,
"left": 600.00,
"rotate": 0.00,
"attrs": { "hornColor": "Red" }
}
],
"connection": [
[ "servo0:V+", "servo1:V+", "Red". [] ],
[ "servo0:GND", "servo1:GND", "Black"",[] ],
[ "mega"]
]
}