Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Name: Robot.ino
- Created: 29-08-2018 13:51:56
- Author: Adam Tallouzi, Christoffer Lyholm & Nicolai Lyholm
- */
- #include <MeMegaPi.h>
- #include <Wire.h>
- #include <SoftwareSerial.h>
- #include <math.h>
- MeEncoderOnBoard Encoder_1(SLOT2);
- MeEncoderOnBoard Encoder_2(SLOT1);
- MeMegaPiDCMotor Motor_1(PORT2B);
- MeMegaPiDCMotor Motor_2(PORT1B);
- MeMegaPiDCMotor Clamp(PORT4B);
- MeMegaPiDCMotor Arm(PORT3B);
- MeLineFollower LineFollower(PORT_6);
- MeGyro Gyro;
- byte ReceiveDataBuffer[16];
- byte TransmitBuffer[16];
- byte cnt = 0;
- int motorSpeedLimit = 200;
- int timer = 0;
- void isr_process_encoder1(void)
- {
- if (digitalRead(Encoder_1.getPortB()) == 0)
- {
- Encoder_1.pulsePosMinus();
- }
- else
- {
- Encoder_1.pulsePosPlus();
- }
- }
- void isr_process_encoder2(void)
- {
- if (digitalRead(Encoder_2.getPortB()) == 0)
- {
- Encoder_2.pulsePosMinus();
- }
- else
- {
- Encoder_2.pulsePosPlus();
- }
- }
- void setup()
- {
- attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING);
- attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING);
- Serial.begin(115200);
- Serial3.begin(115200);
- Gyro.begin();
- TCCR1A = _BV(WGM10);
- TCCR1B = _BV(CS11) | _BV(WGM12);
- TCCR2A = _BV(WGM21) | _BV(WGM20);
- TCCR2B = _BV(CS21);
- Encoder_1.setPulse(7);
- Encoder_2.setPulse(7);
- Encoder_1.setRatio(26.9);
- Encoder_2.setRatio(26.9);
- Encoder_1.setPosPid(1.8, 0, 1.2);
- Encoder_2.setPosPid(1.8, 0, 1.2);
- Encoder_1.setSpeedPid(0.18, 0, 0);
- Encoder_2.setSpeedPid(0.18, 0, 0);
- }
- void loop()
- {
- controlArm(100, 3000);
- delay(1000);
- driveEncoder(62 - 18, motorSpeedLimit, 1);
- controlArm(-100, 3000 - 500);
- delay(1000);
- controlClamp(100);
- controlArm(100, 1500); //Armen kører ca. halv-vejs op med dåsen (Lav eventuelt et timer for-loop for controlArm)
- delay(1000);
- turn(-90);
- driveEncoder(136, motorSpeedLimit, 1);
- turn(-90);
- driveEncoder(23, motorSpeedLimit, 1);
- turn(90);
- driveEncoder(58, motorSpeedLimit, 1); //Eventuelt mindre afstand
- controlArm(-100, 1500 - 500);
- controlClamp(-100);
- controlArm(100, 3000); //Løft arm til øverst mulige position
- while (true);
- }
- //En negativ vinkel er med uret, positiv er mod uret, skal være mellem -180 - 180
- void turn(int Angle)
- {
- Gyro.begin();
- int tidTurn = 10 * Angle;
- for (timer = 0; timer < tidTurn; timer++);
- {
- if (Angle < 0)
- {
- Motor_1.run(180);
- Motor_2.run(180);
- }
- else
- {
- Motor_1.run(-180);
- Motor_2.run(-180);
- }
- while (abs(Gyro.getAngleZ()) <= abs(Angle) - 1)
- {
- Gyro.update();
- if (abs(Gyro.getAngleZ()) >= abs(Angle) - 1)
- {
- Motor_1.stop();
- Motor_2.stop();
- }
- delay(5);
- }
- }
- timer = 0;
- }
- void LineFollow()
- /* Værdi Sensor1 Sensor2
- 0 Sort Sort
- 1 Sort Hvid
- 2 Hvid Sort
- 3 Hvid Hvid */
- {
- if (LineFollower.readSensors() == 3)
- {
- Motor_1.run(40);
- Motor_2.run(-150);
- }
- if (LineFollower.readSensors() == 1)
- {
- Motor_1.run(100);
- Motor_2.run(100);
- }
- if (LineFollower.readSensors() == 0)
- {
- Motor_1.run(150);
- Motor_2.run(-40);
- }
- }
- void controlArm(int speed, int duration)
- {
- Arm.run(speed);
- delay(duration);
- Arm.stop();
- }
- //åbner ved negativ værdi, lukker ved positiv værdi
- void controlClamp(int speed)
- {
- Clamp.run(speed);
- delay(2500);
- Clamp.stop();
- }
- void driveEncoder(float distance, float speed, int sign)
- {
- Encoder_1.reset(SLOT2);
- Encoder_2.reset(SLOT1);
- Encoder_1.moveTo(sign*(-((distance * 1.1 * 180) / (3.15*PI))), speed);
- Encoder_2.moveTo(sign*(distance * 1.1 * 180) / (3.15*PI), speed);
- int tidDrive = 0;
- if (distance > 100)
- {
- tidDrive = distance / speed * 200;
- }
- tidDrive = 200 * distance / speed;
- for (timer = 0; timer < tidDrive; timer++)
- {
- Encoder_1.loop();
- Encoder_2.loop();
- delay(100);
- }
- timer = 0;
- }
- void isDataRecieved()
- {
- byte readData = 0;
- byte nof_data = 0;
- cnt = 0;
- if (Serial3.available() != (int)0)
- {
- Serial.println("Data recieved");
- while (Serial3.available() != (int)0)
- {
- Serial.println(Serial3.available());
- readData = Serial3.read();
- ReceiveDataBuffer[cnt] = readData;
- cnt++;
- nof_data++;
- delay(1);
- }
- DecodeData(nof_data);
- }
- }
- void DecodeData(byte nofData)
- {
- for (int cnt = 0; cnt < nofData; cnt++)
- {
- TransmitBuffer[cnt] = ReceiveDataBuffer[cnt];
- }
- SendData(nofData);
- switch (ReceiveDataBuffer[0])
- {
- //manual
- case 1:
- switch (ReceiveDataBuffer[1])
- {
- //motorer
- case 1:
- switch (ReceiveDataBuffer[2])
- {
- case 1:
- int motorSpeed1;
- int motorSpeed2;
- //for at undgå fejl i kompilering, ændres variablerne seperat
- if (ReceiveDataBuffer[3] > 127)
- {
- motorSpeed1 = round((ReceiveDataBuffer[3] - 256) / 100 * motorSpeedLimit);
- }
- else
- {
- motorSpeed1 = round(ReceiveDataBuffer[3] / 100 * motorSpeedLimit);
- }
- if (ReceiveDataBuffer[4] > 127)
- {
- motorSpeed2 = round((ReceiveDataBuffer[4] - 256) / 100 * motorSpeedLimit);
- }
- else
- {
- motorSpeed2 = round(ReceiveDataBuffer[4] / 100 * motorSpeedLimit);
- }
- Motor_1.run(motorSpeed1);
- Motor_2.run(motorSpeed2);
- break;
- case 2:
- Motor_1.stop();
- Motor_2.stop();
- break;
- }
- break;
- case 2:
- switch (ReceiveDataBuffer[2])
- {
- case 1:
- Arm.run(100);
- break;
- case 2:
- Arm.run(-100);
- break;
- case 3:
- Arm.stop();
- break;
- }
- break;
- //clamp
- case 3:
- switch (ReceiveDataBuffer[2])
- {
- case 1:
- Clamp.run(100);
- break;
- case 2:
- Clamp.run(-100);
- break;
- case 3:
- Clamp.stop();
- break;
- }
- break;
- }
- //auto
- case 2:
- switch (ReceiveDataBuffer[1])
- {
- /*case 1:
- controlArm(100, 3000);
- driveEncoder(57, motorSpeedLimit);
- controlArm(-100, 3000 - 500);
- //controlClamp();
- controlArm(100, 1500); //Armen kører ca. halv-vejs op med dåsen (Lav eventuelt et timer for-loop for controlArm)
- //Drive encoder bagudover (Mangler mål)
- turn(-90);
- driveEncoder(136, motorSpeedLimit);
- turn(-90);
- driveEncoder(28, motorSpeedLimit);
- turn(90);
- driveEncoder(56, motorSpeedLimit); //Eventuelt mindre afstand
- controlArm(-100, 1500 - 500);
- //controlClamp (åben clamp for at slippe dåse)
- controlArm(100, 3000); //Løft arm til øverst mulige position
- break;
- case 2:
- controlArm(100, 3000);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(86, motorSpeedLimit);
- turn(-90);
- driveEncoder(23, 150); //Træk afstand fra for at opsamle tønde
- controlArm(-100, 3000 - 500); //Arm kører helt ned
- //clampControl() Holder om dåse
- controlArm(100, 1500); //Arm kører halvt op med dåse
- driveEncoder(-23, 150); //Træk samme afstand fra som forrige drive funktion
- turn(90);
- driveEncoder(55, motorSpeedLimit);
- turn(-90);
- driveEncoder(28, motorSpeedLimit);
- turn(90);
- driveEncoder(56, motorSpeedLimit); //Træk afstand fra for at placere dåse
- controlArm(-100, 1500 - 500);
- //controlClamp() Åben clamp for at slippe dåse
- controlArm(100, 3000); //Kør arm til højeste position
- break;
- case 3:
- controlArm(100, 3000);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(80, motorSpeedLimit);
- turn(-90);
- driveEncoder(74, motorSpeedLimit);
- turn(90);
- driveEncoder(28, 150); // Træk afstand fra for opsamling af dåse
- controlArm(-100, 3000 - 500);
- //controlClamp()
- controlArm(100, 1500);
- turn(90);
- driveEncoder(9, 250);
- turn(-90);
- driveEncoder(18, 150);
- turn(90);
- driveEncoder(65, motorSpeedLimit);
- turn(-90);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(28, motorSpeedLimit);
- turn(90);
- driveEncoder(56, motorSpeedLimit); //træk afstand fra for placering af dåse
- controlArm(-100, 1500 - 500);
- //controlClamp()
- controlArm(100, 3000);
- break;
- case 4:
- controlArm(100, 3000);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(80, motorSpeedLimit);
- turn(-90);
- driveEncoder(68, motorSpeedLimit);
- turn(90);
- driveEncoder(36, motorSpeedLimit);
- turn(-90);
- driveEncoder(5, 150);
- turn(90);
- driveEncoder(38, motorSpeedLimit); //Træk afstand fra for opsamling af dåse
- controlArm(-100, 3000 - 500);
- //controlClamp()
- controlArm(100, 1500);
- turn(90);
- driveEncoder(28, motorSpeedLimit);
- turn(-90);
- driveEncoder(70, motorSpeedLimit); //træk afstand fra for placering af dåse
- controlArm(-100, 1500 - 500);
- //controlClamp()
- controlArm(100, 3000);
- break;
- case 5: //øverste tønde
- controlArm(100, 3000);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(162, motorSpeedLimit);
- turn(90);
- driveEncoder(11, motorSpeedLimit); //Træk afstand fra for opsamling af dåse
- controlArm(-100, 2000 - 500);
- //controlClamp()
- controlArm(100, 1500);
- driveEncoder(-47, motorSpeedLimit); //Træk samme afstand fra som forrige drive funktion
- turn(-90);
- driveEncoder(30, motorSpeedLimit); //Træk afstand fra for placering af dåse
- controlArm(-100, 1500 - 500);
- //controlClamp()
- controlArm(100, 3000);
- break;
- case 6: //nederste tønde
- controlArm(100, 3000);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(162, motorSpeedLimit);
- turn(90);
- driveEncoder(11, motorSpeedLimit); //Træk afstand fra for opsamling af dåse
- controlArm(-100, 3000 - 500);
- //controlClamp()
- controlArm(100, 1500);
- driveEncoder(-47, motorSpeedLimit); //Træk samme afstand fra som forrige drive funktion
- turn(-90);
- driveEncoder(30, motorSpeedLimit); //Træk afstand fra for placering af dåse
- controlArm(-100, 1500 - 500);
- //controlClamp()
- controlArm(100, 3000);
- break;
- case 7: //øverste tønde
- break;
- case 8: //nederste tønde
- controlArm(100, 3000);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(173, motorSpeedLimit);
- turn(90);
- driveEncoder(11, motorSpeedLimit); //Træk afstand fra for opsamling af dåse
- controlArm(-100, 3000 - 500);
- //controlClamp()
- controlArm(100, 1500);
- driveEncoder(-47, motorSpeedLimit); //Træk samme afstand fra som forrige drive funktion
- turn(-90);
- driveEncoder(19, motorSpeedLimit); //Træk afstand fra for placering af dåse
- controlArm(-100, 1500 - 500);
- //controlClamp()
- controlArm(100, 3000);
- break;
- case 9:
- controlArm(100, 3000);
- driveEncoder(42, motorSpeedLimit);
- turn(-90);
- driveEncoder(136, motorSpeedLimit);
- turn(-90);
- //driveEncoder(?,motorSpeedLimit); (kender ikke afstand)
- turn(90);
- driveEncoder(30, motorSpeedLimit);
- turn(-90);
- driveEncoder(25, motorSpeedLimit);
- turn(90);
- driveEncoder(24, motorSpeedLimit);
- turn(-45);
- //driveEncoder(?, motorSpeedLimit); (Kender ikke afstand, træk afstand fra for opsamling af dåse)
- controlArm(-100, 3000 - 500);
- //controlClamp
- controlArm(100, 1500);
- //driveEncoder(?, motorSpeedLimit); (Modsat afstand af forrige drive funktion)
- turn(45);
- driveEncoder(27, motorSpeedLimit);
- turn(-90);
- driveEncoder(6, 150); //Træk afstand fra for placering af dåse
- controlArm(-100, 1500 - 500);
- //controlClamp()
- controlArm(100, 3000);
- break;
- case 10: //cancel
- break;
- break;
- */
- }
- }
- }
- void SendData(byte nofData) {
- for (int cnt = 0; cnt < nofData; cnt++)
- {
- Serial3.write(TransmitBuffer[cnt]);
- delay(1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement