A small project I built in 2015 to test an acceleration sensor with my Arduino Mega 2560. The pitch, roll, and yaw of the gun are controlled with the ADXL335 sensor.
Parts
- Arduino Mega 2560
- Acceleration Sensor ADXL335
- Motordriver L293D
- Lego Technic Power functions M-Motor
- Two Servos
Circuit
In the following picture you can see the electrical circuit of the ball gun.

Code for Arduino
// import the servo library #include <Servo.h> // Outputs Servo servoPlattform; // servo for vertical tilt Servo servoRot; // servo for rotation int moShot_a = 10; int moShot_b = 11; // Inputs int zAccPin = 2; int yAccPin = 1; int xAccPin = 0; // Variables int posServoPlatt = 1500; int posServoRot = 1500; int zAcc = 0; int yAcc = 0; int xAcc = 0; void setup() { // Outputs pinMode(10,OUTPUT); pinMode(11,OUTPUT); // Attach servo variables to pins servoPlattform.attach(2); servoRot.attach(6); // servos to middle position servoPlattform.write(posServoPlatt); servoRot.write(posServoRot); Serial.begin(9600); } void loop() { analogWrite(moShot_a,0); analogWrite(moShot_b,0); while(true){ // Check values of the acceleration sensor zAcc = analogRead(zAccPin); yAcc = analogRead(yAccPin); xAcc = analogRead(xAccPin); zAcc = zAcc * 0.1; yAcc = yAcc * 0.1; xAcc = xAcc * 0.1; // print values Serial.print(" z: "); Serial.print(zAcc); Serial.print(" y: "); Serial.print(yAcc); Serial.print(" x: "); Serial.print(xAcc); Serial.println(); // control the vertical tilt if(yAcc < 28 && posServoPlatt <= 2200){ posServoPlatt = posServoPlatt + 10; Serial.println(posServoPlatt); } else if(yAcc > 34 && posServoPlatt >= 1000){ posServoPlatt = posServoPlatt - 10; Serial.print(posServoPlatt); } servoPlattform.writeMicroseconds(posServoPlatt); // control the rotation if(zAcc > 34 && posServoRot <= 2400){ posServoRot = posServoRot + 10; Serial.println(posServoRot); } else if(zAcc < 28 && posServoRot >= 700){ posServoRot = posServoRot - 10; Serial.print(posServoRot); } servoRot.writeMicroseconds(posServoRot); // shot ball if(xAcc > 50){ analogWrite(moShot_a,255); analogWrite(moShot_b,0); delay(650); analogWrite(moShot_a,0); analogWrite(moShot_b,0); } delay(5); } }