Lab_interaccio/2010/xavi_mochila_interrupt/xavi_mochila_interrupt.pde
2025-02-25 21:29:42 +01:00

334 lines
5.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <avr/interrupt.h>
#include <avr/io.h>
#include <Wire.h>
#include <SoftwareServo.h>
#define INIT_TIMER_COUNT 6
#define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT
int int_counter = 0;
volatile int second = 0;
SoftwareServo servo1; //
SoftwareServo servo2; //
SoftwareServo servo3; //Carril
SoftwareServo servo4; //abrir mochila
//Finales de carrera
#define s1 17 //delante
#define s2 16 //detras
#define s3 15
#define s4 14
//Dispositivos
#define mp3 8
#define lampara 9
#define pir 6
#define stop3 36
#define stop1 33
int Command_ok=0;
unsigned long time=0;
ISR(TIMER2_OVF_vect)
{
RESET_TIMER2;
int_counter += 1;
if (int_counter == 15)
{
SoftwareServo::refresh();
int_counter = 0;
}
};
void setup()
{
//Timer2 Settings: Timer Prescaler /64,
TCCR2A |= ((1<<CS22) | (0<<CS21) | (0<<CS20));
// Use normal mode
TCCR2A |= (0<<WGM21) | (0<<WGM20);
// Use internal clock external clock not used in Arduino
ASSR |= (0<<AS2);
TIMSK2 |= (1<<TOIE2) | (0<<OCIE2A); //Timer2 Overflow Interrupt Enable
RESET_TIMER2;
sei();
pinMode(mp3, OUTPUT);
pinMode(pir, INPUT);
pinMode(s1, INPUT);
pinMode(s2, INPUT);
pinMode(s3, INPUT);
pinMode(s4, INPUT);
servo1.attach(3);
servo2.attach(5);
servo3.attach(4);
servo4.attach(10);
servo1.setMinimumPulse(700);
servo1.setMaximumPulse(2000);
servo2.setMinimumPulse(700);
servo2.setMaximumPulse(2000);
servo3.setMinimumPulse(700);
servo3.setMaximumPulse(2000);
servo4.setMinimumPulse(700);
servo4.setMaximumPulse(2000);
analogWrite(lampara, 0);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
digitalWrite(s4, HIGH);
digitalWrite(mp3,LOW);
servo1.write(stop1); //stop
servo2.write(90); //reposo
servo3.write(stop3); //stop
servo4.write(90); //stop
delay(15);
servo_ver(90);
ini();
}
void loop()
{
if (digitalRead(pir))
{
//Secuencia 1
servo4.write(160);
servo_ver(60);
avanza();
giro_cero();
mp3_on();
on_lamp_dif();
off_lamp();
giro();
delay(1000);
on_lamp();
delay(5000);
off_lamp_dif();
giro();
delay(1000);
on_lamp_dif();
delay(5000);
off_lamp();
giro();
delay(1000);
on_lamp();
delay(3000);
servo_ver(40);
delay(2000);
servo_ver(90);
retrocede();
avanza();
off_lamp();
servo_ver(60);
giro();
delay(1000);
on_lamp();
delay(5000);
off_lamp_dif();
giro();
delay(1000);
parpadeo_led(9);
retrocede();
avanza();
delay(1000);
off_lamp();
giro();
on_lamp_dif();
delay(4000);
off_lamp_dif();
//Secuencia 2
giro();
delay(1000);
on_lamp_dif();
delay(4000);
off_lamp();
giro();
delay(1000);
on_lamp();
delay(3000);
servo_ver(40);
delay(3000);
servo_ver(90);
retrocede();
avanza();
off_lamp();
servo_ver(60);
giro();
parpadeo_led(13);
off_lamp();
giro();
delay(1000);
on_lamp();
delay(3000);
servo_ver(90);
retrocede_dif();
ini();
servo4.write(90);
delay(10000);
}
else
{
ini();
}
}
void off_lamp()
{
analogWrite(lampara,0);
}
void on_lamp()
{
analogWrite(lampara,255);
}
void parpadeo_led(int fin)
{
for (int i = 0; i <= fin; i++)
{
delay(300);
analogWrite(lampara,128);
delay(300);
analogWrite(lampara,255);
}
}
void mp3_on()
{
digitalWrite(mp3,HIGH);
}
void mp3_off()
{
digitalWrite(mp3,LOW);
}
void retrocede()
{
while (digitalRead(s2))
{
servo3.write(180);
SoftwareServo::refresh();
}
servo3.write(stop3);
}
void retrocede_dif()
{
int e=255;
while (digitalRead(s2))
{
servo3.write(180);
if (e>=8)
{
e=e-8;
analogWrite(lampara,e);
}
SoftwareServo::refresh();
delay(50);
}
servo3.write(stop3);
analogWrite(lampara,0);
}
void avanza()
{
while (digitalRead(s1))
{
servo3.write(0);
SoftwareServo::refresh();
}
servo3.write(stop3);
}
void giro_cero()
{
unsigned long time_servo=0;
time_servo=millis();
servo1.write(20);
while ((millis()-time_servo)<=300)
{
SoftwareServo::refresh();
}
while (digitalRead(s3))
{
servo1.write(20);
SoftwareServo::refresh();
}
servo1.write(stop1);
}
void giro()
{
unsigned long time_servo=0;
time_servo=millis();
servo1.write(20);
while ((millis()-time_servo)<=300)
{
SoftwareServo::refresh();
}
while (digitalRead(s4))
{
servo1.write(20);
SoftwareServo::refresh();
}
servo1.write(stop1);
}
void servo_ver(int angulo)
{
unsigned long time_servo2=0;
time_servo2=millis();
servo2.write(angulo);
while ((millis()-time_servo2)<=1000)
{
SoftwareServo::refresh();
}
}
void on_lamp_dif()
{
for (int i = 5; i <= 255; i=i+5)
{
analogWrite(lampara,i);
if (i<50) delay(200);
else if (i<140) delay(100);
else if (i<180) delay(50);
else if (i<200) delay(25);
else delay(10);
}
}
void off_lamp_dif()
{
for (int i = 255; i >= 0; i=i-5)
{
analogWrite(lampara,i);
if (i<50) delay(200);
else if (i<140) delay(100);
else if (i<180) delay(50);
else if (i<200) delay(25);
else delay(10);
}
}
void ini()
{
retrocede();
mp3_off();
analogWrite(lampara,0);
}