#include <Servo.h>
#include <LiquidCrystal.h>
// Define stepper motor control pins
int stepperC1P1=9;
int stepperC1P2=8;
int stepperC2P1=11;
int stepperC2P2=10;
// Define servo control pins
int flapleft=3;
int flapright=4;
int aileronleft=5;
int aileronright=6;
int rudder=7;
// Initialize servos
Servo sflapleft;//s represents servo
Servo sflapright;
Servo saileronleft;
Servo saileronright;
Servo srudder;
// Initialize LCD
LiquidCrystal lcd(12, 13, 22, 23, 24, 25);
// Define joystick
int joystick1x=A0;
int joystick1y=A1;
int joystick2x=A2;
int joystick2y=A3;
// Define button pins
int button1=2;
int button2=26;
void setup() {
// Set motor control pins as output
pinMode(stepperC1P1, OUTPUT);
pinMode(stepperC1P2, OUTPUT);
pinMode(stepperC2P1, OUTPUT);
pinMode(stepperC2P2, OUTPUT);
// Attach servos
sflapleft.attach(flapleft);
sflapright.attach(flapright);
saileronleft.attach(aileronleft);
saileronright.attach(aileronright);
srudder.attach(rudder);
// Initialize LCD
lcd.begin(16, 2);
lcd.setCursor(0, 0);
// Initialize buttons
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
}
void loop() {
int joystick1X = analogRead(joystick1x);
int joystick1Y = analogRead(joystick1y);
int joystick2X = analogRead(joystick2x);
int joystick2Y = analogRead(joystick2y);
// Control Stepper Motor
// int steps = map(joystick1Y, 0, 1023, -100, 100); // Example conversion to steps,, this is the alternative way of mapping the joystick to the servo movement
// stepperControl(steps, joystick1X > 512);
int steps = (joystick1Y - 512) * 100 / 512;
int speed = (joystick1Y - 512) / 2; // Scale joystick value to speed range (-255 to 255) by performing math and linear equation comes out as given
stepperControl(speed, joystick1X > 512);// calling the user(us) defined function
// Control Servos with Joystick
int aileronPosition = joystick2X / 6; // Scale joystick value to servo position range (0 to 180)
int flapPosition = joystick2Y / 6; // Scale joystick value to servo position range (0 to 1a.write(aileronPosition);
saileronright.write(aileronPosition);
saileronleft.write(aileronPosition);
sflapleft.write(flapPosition);
sflapright.write(flapPosition);
// Control Rudder with Joysticl
//int rudderPosition = (joystick1X - 512) / 6 +90; // Scale and center joystick var.write(rudderPosition);
int rudderPosition = (joystick1X) / 6; // Scale and center joystick var.write(rudderPosition);
srudder.write(rudderPosition);
// Update LCD Display
//lcd.clear();//this is commented bcz this is creating the blinking effect over lcd ,,, for this to work uncomment this and increase the delay int the line 111 of this code
lcd.setCursor(0, 1);
if (abs(joystick1X-512)>50) {
lcd.print("Rudder Displaced");
} else if (abs(joystick1Y-512)>50) {
lcd.print("Propulsion Variation");
} else if (abs(joystick2X-512)>50) {
lcd.print("Aierons Displaced");
} else if (abs(joystick2Y-512)>50) {
lcd.print("Flaps Displaced");
} else {
lcd.print("No disturbance ");
}
lcd.setCursor(0, 0);
lcd.print("Speed:");
lcd.print(speed);
lcd.print(" Dir:");
if(joystick1X==512)
{
lcd.print("STR ");//extra spaces so that its not gonna leave any extra character over the ledd display
}
else if(joystick1X>512){
lcd.print("LEF ");
}
else if(joystick1X<512){
lcd.print("RIG ");
}
if (digitalRead(button1)==LOW) {
// Takeoff logic if any we have but here we are not gonna have any such logic
lcd.setCursor(0, 1);
lcd.print("Takeoff ");
delay(1100);
}
if (digitalRead(button2) == LOW) {
// Landing logic if any we have but here we are not gonna have any such logic
lcd.setCursor(0, 1);
lcd.print("Landing ");
delay(1100);
}
delay(100);
}
void stepperControl(int steps, int direction) {
for (int i = 0; i < abs(steps); i++) {
if (direction==1) {
// Clockwise rotation
digitalWrite(stepperC1P1, HIGH);
digitalWrite(stepperC1P2, LOW);
digitalWrite(stepperC2P1, LOW);
digitalWrite(stepperC2P2, LOW);
delay(1);
digitalWrite(stepperC1P1, LOW);
digitalWrite(stepperC1P2, HIGH);
digitalWrite(stepperC2P1, LOW);
digitalWrite(stepperC2P2, LOW);
delay(1);
digitalWrite(stepperC1P1, LOW);
digitalWrite(stepperC1P2, LOW);
digitalWrite(stepperC2P1, HIGH);
digitalWrite(stepperC2P2, LOW);
delay(1);
digitalWrite(stepperC1P1, LOW);
digitalWrite(stepperC1P2, LOW);
digitalWrite(stepperC2P1, LOW);
digitalWrite(stepperC2P2, HIGH);
delay(1);
} else {
// Counter-clockwise rotation
digitalWrite(stepperC1P1, LOW);
digitalWrite(stepperC1P2, LOW);
digitalWrite(stepperC2P1, LOW);
digitalWrite(stepperC2P2, HIGH);
delay(1);
digitalWrite(stepperC1P1, LOW);
digitalWrite(stepperC1P2, LOW);
digitalWrite(stepperC2P1, HIGH);
digitalWrite(stepperC2P2, LOW);
delay(1);
digitalWrite(stepperC1P1, LOW);
digitalWrite(stepperC1P2, HIGH);
digitalWrite(stepperC2P1, LOW);
digitalWrite(stepperC2P2, LOW);
delay(1);
digitalWrite(stepperC1P1, HIGH);
digitalWrite(stepperC1P2, LOW);
digitalWrite(stepperC2P1, LOW);
digitalWrite(stepperC2P2, LOW);
delay(1);
}
}
}