/////////PROGRAMA DEL PROYECTO LLAMADO BRACINTONIC CREADO POR HÉCTOR VICARIO ALUMNO DE CIFP SANTA CATALINA
//Librerias del infrarrojo, servos y lcd
#include <infrarrojo.h>
#include <Servo.h>
#include <LiquidCrystal.h>
//Definicion las variables del display de 7 segmentos
#define h 22
#define i 23
#define j 24
#define k 25
#define l 26
#define m 27
#define n 28
//Definicion los pines de la lcd
const int rs = 37, en = 36, d4 = 41, d5 = 40, d6 = 39, d7 = 38;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//Definicion de los 4 servomotores del robot
Servo servo_base;
Servo servo_rosa;
Servo servo_blanco;
Servo servo_pinza;
//Definición pin infrarrojo
infrarrojo estado(5);
//Definición variable que recibe el dato del infrarrojo
int VALOR;
//Variable del cambio de estado infrarrojo
int led_estado;
//Variable del contador para el display de 7 segmentos
int lee;
int contador=0;
int s=1;
//Variable para pasar de 4 piezas a 0
int c=0;
const int pin = 4;
//Definición pin RGB
int led_verde_G = 12;
int led_rojo_R = 13;
//Variable para colocar en un pallet o en otro
int b=0;
//Variables para el motor nema
const int dirPin = 10;
const int stepPin = 11;
volatile int a=0;
const int steps = 200;
int stepDelay=1000;
//Variables para evitar rebotes
const int timeThreshold = 150;
long timeCounter = 0;
void setup() {
//Función cero que nos muestra un 0 en el display nada mas empezar
cero();
//Definir pin como salida buzzer
pinMode(pin, OUTPUT);
//Definir pin como salida led RGB
pinMode(led_verde_G, OUTPUT);
pinMode(led_rojo_R, OUTPUT);
//Definir pin como salida Display 7 segmentos
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
//Definir pin como salida driver nema
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
//Definir pines de entrada para los pulsadores de marcha y paro
pinMode(2,INPUT_PULLUP); //paro del motor
pinMode(3,INPUT_PULLUP); //puesta en marcha del motor
//Mostramos en la lcd un mensaje de bienvenida
lcd.begin(16, 2);
lcd.setCursor(3,0);
lcd.print("BRACINTONIC");
lcd.setCursor(3,1);
lcd.print("SE PRESENTA");
//Definir pines de entrada para los servos del robot
servo_base.attach(9);
servo_rosa.attach(8);
servo_blanco.attach(7);
servo_pinza.attach(6);
//Realizamos unos movimientos al robot de presentación
servo_base.write(155);
delay(1000);
servo_base.write(45);
delay(1000);
servo_base.write(155);
delay(1000);
servo_blanco.write(20);
delay(1000);
servo_rosa.write(15);
delay(1000);
//Mostramos en la lcd un mensaje para colocar la primera pieza
lcd.setCursor(1,0);
lcd.print("Coloca la pieza");
lcd.setCursor(2,1);
lcd.print("Pulsa verde");
//DEFINIMOS LAS INTERUPCIONES DE MARCHA Y PARO QUE ES DE LO MAS IMPORTANTE DEL PROGRAMA
attachInterrupt(digitalPinToInterrupt(3), marcha, CHANGE);
attachInterrupt(digitalPinToInterrupt(2), paro, CHANGE);
//Establecemos una condicion de marcha
while(digitalRead(3)==1){}
// Limpiamos pantalla
lcd.clear();
}
void loop() {
//Recoge el estado del sensor infrarrojo
led_estado = estado.lectura(VALOR);
//Etapa de compraciónpara activar el movimiento de la cinta,la cinta se mueve hasta que el sensor detecta la pieza
if(led_estado == 1) {
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
else{
//Se realiza el contado de las piezas y dependiendo de la función se muestra un numero
contador = contador + s;
if (contador == 0) { cero();}
if (contador == 1) { uno();}
if (contador == 2) { dos();}
if (contador == 3) { tres();}
if (contador == 4) {
cuatro();
contador=0;
c=1;
}
digitalWrite(dirPin, LOW);
stepDelay = 1000;
//Mostramos mensaje en la lcd
lcd.setCursor(0,0);
lcd.print("OBJETO DETECTADO");
//Una vez detectada la pieza la cinta avanza otro poco para que el robot pueda cogerla
for (int x = 0; x < 365; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
delay(1000);
//Mostramos mensaje en la lcd
lcd.setCursor(0,0);
lcd.print("ROBOT COGE PIEZA");
//Realiza los movimientos el robot para coger la pieza
servo_base.write(155);
delay(1000);
servo_pinza.write(160);
delay(1000);
servo_blanco.write(47);
delay(1000);
servo_pinza.write(20);
delay(1000);
//Mostramos mensaje en la lcd
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ROBOT DEJA PIEZA");
//Etapa en la que con una condicion establecemos el posicionamiento de la pieza en un pallet o en otro.
if(b==0){
servo_base.write(70);
delay(1000);
servo_blanco.write(80);
delay(1500);
b=1;
}
else{
servo_base.write(30);
delay(1000);
servo_blanco.write(80);
delay(1500);
b=0;
}
//Movimientos de posicionamiento del robot una vez dejada la pieza
servo_pinza.write(160);
delay(1000);
servo_blanco.write(20);
delay(1000);
servo_rosa.write(15);
//Condicion una vez el contador este en 4, vuelva a 0 y haya que pulsar marchar para seguir
if (contador == 0) { cero();}
if(c==1){
//Mostramos mensaje en la lcd
lcd.clear();
lcd.setCursor(2,1);
lcd.print("Pulsa verde");
//Hacemos sonar el buzzer para avisar de que hemos llegado a 4 piezas
analogWrite(pin, 150);
delay(200);
analogWrite(pin,0);
delay(100);
analogWrite(pin, 150);
delay(200);
analogWrite(pin,0);
delay(100);
analogWrite(pin, 150);
delay(200);
analogWrite(pin,0);
delay(100);
//Condicion de pulsar marcha para seguir
while(digitalRead(3)==1){ };
// Iniciamos la variable del contador a 0
c=0;
}
//Mostramos mensaje en la lcd
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TIENES 5 SEGUNDOS");
lcd.setCursor(0,1);
lcd.print("COLOCA LA PIEZA DE NUEVO");
// Esperamos 5 segundo
delay(5000);
//Limpiamos la pantalla lcd
lcd.clear();
}
}
//FUNCION MARCHA
void marcha(){
//Ponemos el led RGB en verde y apagamos el rojo
digitalWrite(led_rojo_R, LOW);
delay(100);
digitalWrite(led_verde_G, HIGH);
//Evitamos rebotes
if (millis() > timeCounter + timeThreshold) {
timeCounter = millis();
}
}
//FUNCION PARO
void paro(){
//Ponemos el led RGB en rojo y apagamos el verde
digitalWrite(led_verde_G, LOW);
delay(100);
digitalWrite(led_rojo_R, HIGH);
//Evitamos rebotes
if (millis() > timeCounter + timeThreshold){
//Condicion de pulsar la marcha para seguir
while(digitalRead(3)==1){}
timeCounter = millis();
}
}
//FUNCION BORRADO PARA EL DISPLAY DE 7 SEGMENTOS
void borrado(){
digitalWrite(h,HIGH);
digitalWrite(i,HIGH);
digitalWrite(j,HIGH);
digitalWrite(k,HIGH);
digitalWrite(l,HIGH);
digitalWrite(m,HIGH);
digitalWrite(n,HIGH);
}
//FUNCION UNO,ACTIVAMOS LOS BIT
void uno(){
borrado();
digitalWrite(h,LOW);
digitalWrite(k,LOW);
digitalWrite(l,LOW);
digitalWrite(m,LOW);
digitalWrite(n,LOW);
}
//FUNCION DOS,ACTIVAMOS LOS BIT
void dos(){
borrado();
digitalWrite(j,LOW);
digitalWrite(m,LOW);
}
//FUNCION TRES,ACTIVAMOS LOS BIT
void tres(){
borrado();
digitalWrite(l,LOW);
digitalWrite(m,LOW);
}
//FUNCION CUATRO,ACTIVAMOS LOS BIT
void cuatro(){
borrado();
digitalWrite(h,LOW);
digitalWrite(k,LOW);
digitalWrite(l,LOW);
}
//FUNCION CERO,ACTIVAMOS LOS BIT
void cero(){
borrado();
digitalWrite(n,LOW);
}