Commit 7aac88bf authored by Gaspar Diaz Listur's avatar Gaspar Diaz Listur

Ver comentarios al comienzo del archivo!

parent 54a15c80
//////////////////////////////////////////////////////////////////////////////////////////
// SE DESCONECTARON LOS SENSORES IR DEL SEGUIDOR DE LINEA (PINES ANALOGICOS 0, 1, 2 Y 3 //
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
/////////////// NO FUNCIONA EN SERVO QUE EXPULSA LA CAJA DE LA PLATAFORMA ////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//////////////// DECIDIR QUE PINES SE USAN PARA LA COMUNICACION CON XBEE /////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// Librerias
#include <SoftwareSerial.h>
#include <Servo.h>
// Definiciones
#define LLEGOCARRO 'A'
#define CAJAENVIADA 'B'
#define CAJALISTA 'C'
#define CAJARECIBIDA 'D'
#define ACK 'O'
#define MOTOR_EU 12 //upwards
#define MOTOR_ED 13 //downwards
#define MOTOR_EP 11 //pulse
#define PB 3 //microswitch PB
#define negra 1
#define blanca 0
#define velSubida 220
#define velBajada 150
// Servo
Servo myservo;
// Definicion de funciones
void bajar();
void expulsar();
// Variables
int vel=0; // Variable velocidad para el acelerador
int PosicionY = 0; // variable POSICION
int A = 2; //variable de interrupcion a pin digital 2
int comando=0;
int busy;
int pisop;
int repisa[4];
unsigned long ultimaInterrupcion = 0;
boolean Actual,
Ultima,
ack=false;
// Comunicacion
SoftwareSerial mySerial = SoftwareSerial(9, 10); // Estos pines aparecen libres en el Shield
////////////////////////////////////////////////////////////////////////////////
/////////////////////// SETUP ///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
// Motor MODES
pinMode(MOTOR_EU,OUTPUT);
pinMode(MOTOR_ED,OUTPUT);
pinMode(MOTOR_EP,OUTPUT);
// Servo
myservo.attach(9);
// Interrupciones
Actual=digitalRead(A), Ultima=Actual; //estado inicial del encoder
attachInterrupt(digitalPinToInterrupt(A),altitud,CHANGE);
// Estantes vacios
repisa[0] = 0;
repisa[1] = 0;
repisa[2] = 0;
repisa[3] = 0;
// START
delay(100);
bajar();
}
////////////////////////////////////////////////////////////////////////////////
/////////////////////// LOOP ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
void loop() {
// Acelerador con potenciometro
// vel=analogRead(A4)/4;
// Serial.println(vel);
if(Serial.available()){
comando=Serial.read();
interpretarComando(comando);
}
while(ack==false){
// Esperando llegada de carro
if(mySerial.available()){
if(mySerial.read() == LLEGOCARRO){
Serial.println("Recibi LLEGOCARRO");
ack=true;
}
}
}
ack=false;
for(int i=0; i<10; i++){
// Confirmar aviso de llegada
Serial.println("mandoACK");
mySerial.write(ACK);
delay(50);
}
// Esperar que haya caja en la plataforma
while(true){
// Mirar sensor IR hasta que haya caja
}
// Establizar caja
delay(500);
// Despachar carro
while(ack==false){
// Notificar que llego la caja
mySerial.write(CAJARECIBIDA);
Serial.println("mandoCAJARECIBIDA");
delay(50);
if(mySerial.available()>0){
if(mySerial.read()== ACK){
Serial.println("recibiACK");
ack=true;
}
}
}
ack=false;
// Decidir que hacer con la caja
// Se puede usar la funcion interpretarComando(comando); para ubicar la caja en el piso deseado
}
////////////////////////////////////////////////////////////////////////////////
///////////////////// FUNCIONES //////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void altitud()
{
//cada 5 millisegundos pregunta si el boton cambio de estado, de ser asi actualiza la posicion
unsigned long tiempoInterrupcion = millis(); // variable almacena valor de func. millis
if (tiempoInterrupcion - ultimaInterrupcion > 5)
{ // rutina antirebote desestima
PosicionY++ ; // incrementa POSICION en 1
ultimaInterrupcion = tiempoInterrupcion;
}
}
////////////////////////////////////////////////////////////////////////////////////
void bajar(){ // Funcion para que baje
Serial.println("Bajando");
while (digitalRead(PB)==!LOW){
digitalWrite(MOTOR_EU,LOW);
digitalWrite(MOTOR_ED,HIGH);
analogWrite(MOTOR_EP,velBajada);
}
digitalWrite(MOTOR_ED,LOW);
Serial.println("Planta Baja");
PosicionY=0;
}
////////////////////////////////////////////////////////////////////////////////////
void expulsar(){
Serial.println("Expulsando");
for (int p=60;p>0;p--){
myservo.write(p);
delay(25);
}
delay(1000);
myservo.write(60);
busy=0;
Serial.println("Expulsado");
}
////////////////////////////////////////////////////////////////////////////////////
void Subir(int Coord_Piso, int vel){ //Funcion a la que le mandas el numero de "pasos" y va hasta ahi ;)
Serial.println("Subiendo");
while(PosicionY<Coord_Piso)
{
digitalWrite(MOTOR_EU,HIGH);
digitalWrite(MOTOR_ED,LOW);
analogWrite(MOTOR_EP,vel);
}
digitalWrite(MOTOR_EU,LOW);
digitalWrite(MOTOR_ED,LOW);
analogWrite(MOTOR_EP,vel);
Serial.print("En PISO:");
Serial.println(pisop);
}
////////////////////////////////////////////////////////////////////////////////////
void ir_a_piso(int piso, int vel){
switch(piso){
case 0:
bajar();
break;
case 1:
pisop=1;
Subir(21, vel); //Piso 1
break;
case 2:
pisop=2;
Subir(41, vel); //Piso 2
break;
case 3:
pisop=3;
Subir(61, vel); //Piso 3
break;
}
}
////////////////////////////////////////////////////////////////////////////////////
void guardar_caja(int color, int vel){
int piso;
switch (color){
case 'blanca':
piso= 1;
break;
case 'negra':
piso=3;
break;
}
if(repisa[piso]==1){ //si el lugar esta ocupado
piso = 2; //Voy al lugar alternativo
}
ir_a_piso(piso, vel);
expulsar();
repisa[piso]=1;
}
////////////////////////////////////////////////////////////////////////////////////
void interpretarComando(int comando){
if(comando==48){
expulsar();
}
if(comando==49){
ir_a_piso(1, velSubida);
expulsar();
bajar();
}
if(comando==50){
ir_a_piso(2, velSubida);
expulsar();
bajar();
}
if(comando==51){
ir_a_piso(3, velSubida);
expulsar();
bajar();
}
}
////////////////////////////////////////////////////////////////////////////////////
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment