Cinta Transportadora Arduino
Cinta Transportadora Arduino
Cinta Transportadora Arduino
Proyecto Final
1
INDICE:
Pagina 3: Etapa I: Definición del proyecto
Pagina 4: Etapa II: Disposición de dispositivos de campo
Pagina 5: Etapa III: Especificación y selección del controlador
Pagina 7: Etapa IV: Especificación y selección de dispositivos de campo
Pagina 12: Etapa V: Programación de software y firmware
Pagina 34: Etapa VI: Montaje y documentación del prototipo
2
1) Etapa I: Definición del proyecto
Problemas y necesidades:
3
Esquema del proceso:
4
1 salida digital modulo sensor infrarrojo A
1 salida digital modulo sensor infrarrojo B
1 salida digital servo TowerPro sg90
Esta interfaz será una ventana interactiva e informativa, la cual nos dará
como opción encender o apagar la cinta transportadora, y además nos dará
los datos del conteo de productos almacenados o en su defecto nos indicara
en el caso de que un producto fuese rechazado.
-Microprocesador ATmega2560
-Tensión de alimentación (recomendado) 7-12V
-Integra regulación y estabilización de +5Vcc
-54 líneas de Entradas/Salidas Digitales (14 de ellas se pueden utilizar
como salidas PWM)
5
-16 Entradas Analógicas
-Máxima corriente continúa para las entradas: 40 mA
-Salida de alimentación a 3.3V con 50 mA
-Memoria de programa de 256Kb (el bootloader ocupa 8Kb)
-Memoria SRAM de 8Kb para datos y variables del programa
-Memoria EEPROM para datos y variables no volátiles
-Velocidad del reloj de trabajo de 16MHz
-Reducidas dimensiones de 100 x 50 mm
Documentación de compra:
6
Arduino Mega 2560 R3 16au Domótica Y Robótica Mejor Precio
Cantidad: 1
$ 333,00 c/u
Envío
Acuérdalo con el vendedor.
Pago
Pagar en efectivo con Rapipago
Producto $ 333,00
Total: $ 333,00
Datasheet:
-45 mm de largo (sin contar el eje)
-15 mm de largo ( lo que sobresale del eje )
-30 mm de diámetro
-21 mm de distancia entre los tornillos de anclaje.
-Potencia: DC 12V
-Static current: = 10mA
-Current:50~200mA
-Frequency: 315MHz
-Channels: 2
-Contact current: 5A 220VAC/10A 12VDC
-Dimensiones: 70 × 50 × 20mm
7
-Operating temperature: -10 ¿ ~ +50 ¿3)
- 6v – 28v
- 3A
-Especificaciones técnicas
-Número de modelo: FC-51
8
-Ángulo de detección: 35 °
-Voltaje de funcionamiento: 3.0V - 6.0V
-Alcance de detección: 2cm - 30cm (ajustable usando el potenciómetro)
- Pcb tamaño: 3.1 cm (L) x 1.4 cm (W)
-Dimensión total: 4.5cm (L) x 1.4 cm (W), 0.7cm (H)
-Nivel de salida activa: Salidas Nivel lógico bajo cuando se detecta un
obstáculo
-Nivel de salida activo: Salidas Nivel lógico alto cuando no se detecta
obstáculo
-Consumo actual:
a 3,3 V: ~ 23 mA
a 5,0 V: ~ 43 mA
Pinouts:
Características
9
-Micro Servo Tower-pro
-Velocidad: 0.10 sec/60° a 4.8V
-Torque: 1.8 Kg-cm @ 4.8V
-Voltaje de funcionamiento: 3.0-7.2V
-Temperatura de funcionamiento: -30 ℃ ~ 60 ℃
-Ángulo de rotación: 180°
-Ancho de pulso: 500-2400 µs
-Longitud de cable de conector: 24.5cm
- 5v a 12v
10
Documento de compra
Pack 50 Leds 3mm Rojos Amarillos Verdes Azul Blanco Arduino × 1 $49,00
Display Lcd Arduino Pic Arm Nokia 5110 Spi 84x48 Monocromo × 1 $94,00
11
Envió de productos $200
SUBTOTAL: $752
Programación en ARDUINO:
Diagrama de flujos:
12
Programa en plataforma de ARDUINO:
#include <Servo.h>
int i;
int sensor=9;
int Contador=8;
int conta;
int conta2;
int contat;
int lote;
int control=7;
int dato = 0;
Servo servoMotor;
void setup() {
Serial.begin (9600);
pinMode(control, OUTPUT);
pinMode(Contador,INPUT);
servoMotor.attach(13);
}
void loop() {
if(Serial.available())
{
dato = Serial.read();
if((dato) == '1')
{
//Serial.println("Motor encendido");
digitalWrite(control, HIGH);
}
if((dato) == '0')
{
//Serial.println("Motor apagado");
digitalWrite(control, LOW);
}
if(dato == '1'){
13
if ( digitalRead(Contador) == LOW )
{
//delay(100);
conta ++;
if(conta==5)
{
lote++;
conta=0;
}
contat=conta+conta2+lote*5;
if ( digitalRead(Contador) == HIGH ){
//Incrementa el contador
delay(1000);
}
Serial.print("C");
Serial.println(conta);
Serial.print("T");
Serial.println(contat);
Serial.print("L");
Serial.println(lote);
if(digitalRead(sensor) == LOW)
{
delay(500);
servoMotor.write(0);
conta2++;
contat=conta2+conta+lote*5;
delay(200);
}
if(digitalRead(sensor) == HIGH)
{
delay(1000);
servoMotor.write(180);
14
}
Serial.print("G");
Serial.println(conta2);
Serial.print("T");
Serial.println(contat);
}
}
Diagrama de flujos:
15
#include <string>
#include <Windows.h>
#include <winbgim.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
DCB dcb;
DWORD dwEventMask,n;
HANDLE h=CreateFile("COM3",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
int ReadByte();
int BorrCad(char*);
int RecCad(char*);
int cajac=0,total,lote=0,cajag=0,entrada1=0,entrada2=0,ent_old=0;
char A1[50],A2[50],A3[50],A4[50];
FILE *fp;
char T_Fecha[20],T_Hora[10],T_Hoy[25],T_Dia[10],T_Mes[5],T_Anio[5];
int dia_sem,dia,old_dia,mes,anio,hora,min,old_min;
char* dM[13] =
{"","ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUB
RE","NOVIEMBRE","DICIEMBRE"};
16
struct tm* tmP;
void update_time(){
tmP = localtime(&tSac);
dia=(tmP->tm_mday);
dia_sem=(tmP->tm_wday);
mes=(tmP->tm_mon)+1;
anio=(tmP->tm_year + 1900);
hora=tmP->tm_hour;
min=tmP->tm_min;
sprintf(T_Dia,"%s", dS[dia_sem]);
sprintf(T_Mes,"%02d", mes);
sprintf(T_Anio,"%d", anio);
void bienvenida()
setfillstyle(1,0);
bar(0,0,800,600);
setfillstyle(1,COLOR(200,100,5));
bar(1,1,799,599);
delay(1000);
setfillstyle(1,0);
17
bar(0,0,800,600);
setfillstyle(1,COLOR(200,100,5));
bar(1,1,799,599);
setfillstyle(1,0);
setbkcolor(COLOR(200,100,5));
settextstyle(1,0,5);
setcolor(0);
outtextxy(220,75,"Bienvenido");
delay(1000);
setfillstyle(1,0);
setbkcolor(COLOR(200,100,5));
settextstyle(1,0,5);
setcolor(0);
outtextxy(360,200,"a");
delay(1000);
setfillstyle(1,0);
setbkcolor(COLOR(200,100,5));
settextstyle(1,0,4);
setcolor(0);
outtextxy(80,350,"S");
delay(200);
outtextxy(115,350,"0");
delay(200);
outtextxy(150,350,"R");
delay(200);
outtextxy(190,350,"T");
18
delay(200);
outtextxy(225,350,"I");
delay(200);
outtextxy(255,350,"N");
delay(200);
outtextxy(300,350,"G");
delay(200);
outtextxy(405,350,"C");
delay(200);
outtextxy(447,350,"O");
delay(200);
outtextxy(487,350,"N");
delay(200);
outtextxy(527,350,"V");
delay(200);
outtextxy(567,350,"E");
delay(200);
outtextxy(607,350,"Y");
delay(200);
outtextxy(647,350,"O");
delay(200);
outtextxy(687,350,"R");
delay(200);
19
void menu()
{ setfillstyle(1,0);
bar(0,0,800,600);
setfillstyle(1,COLOR(200,100,5));
bar(1,1,799,599);
setfillstyle(1,0);
setbkcolor(COLOR(200,100,5));
settextstyle(1,0,3);
setcolor(0);
outtextxy(200,75,"SORTING CONVEYOR");
setfillstyle(1,0);
bar(220,260,600,330);
setfillstyle(1,COLOR(0,120,0));
bar(221,261,599,329);
setbkcolor(COLOR(0,120,0));
settextstyle(8,0,4);
setcolor(0);
outtextxy(240,280,"INGRESO AL SISTEMA");
setfillstyle(1,0);
bar(640,50,740,96);
setfillstyle(1,4);
bar(641,51,739,95);
setbkcolor(4);
settextstyle(8,0,3);
outtextxy(653,60,"SALIR");
20
mouse();
void ingreso()
setfillstyle(1,0);
bar(220,260,600,330);
setfillstyle(1,COLOR(0,102,0));
bar(220,260,600,330);
setbkcolor(COLOR(0,102,0));
settextstyle(8,0,4);
setcolor(0);
outtextxy(240,280,"INGRESO AL SISTEMA");
delay(200);
setfillstyle(1,0);
bar(220,260,600,330);
setfillstyle(1,COLOR(0,120,65));
bar(220,260,600,330);
setbkcolor(COLOR(0,120,65));
settextstyle(8,0,4);
setcolor(0);
outtextxy(240,280,"INGRESO AL SISTEMA");
delay(100);
21
setfillstyle(1,0);
bar(40,40,750,550);
setfillstyle(1,COLOR(200,190,5));
bar(41,41,749,549);
setfillstyle(1,0);
setbkcolor(COLOR(200,190,5));
settextstyle(1,0,2);
setcolor(0);
outtextxy(225,64,"CONTROL CONVEYOR");
setfillstyle(1,0);
bar(50,130,400,200);
setfillstyle(1,COLOR(0,102,0));
bar(51,131,399,199);
setbkcolor(COLOR(0,102,0));
settextstyle(8,0,4);
setcolor(0);
outtextxy(90,150,"ENCENDER CINTA");
setfillstyle(1,0);
bar(410,130,740,200);
setfillstyle(1,COLOR(0,102,0));
bar(411,131,739,199);
setbkcolor(COLOR(0,102,0));
settextstyle(8,0,4);
setcolor(0);
outtextxy(460,150,"APAGAR CINTA");
22
setfillstyle(1,0);
bar(400,279,475,317);
setfillstyle(1,COLOR(0,102,0));
bar(401,280,474,316);
setfillstyle(1,0);
setbkcolor(COLOR(200,190,5));
settextstyle(3,0,4);
setcolor(0);
outtextxy(50,280,"Cajas Erroneas:");
setfillstyle(1,0);
bar(400,339,475,377);
setfillstyle(1,COLOR(0,102,0));
bar(401,340,474,376);
setfillstyle(1,0);
setbkcolor(COLOR(200,190,5));
settextstyle(3,0,4);
setcolor(0);
outtextxy(50,340,"Cajas OK:");
setfillstyle(1,0);
bar(400,399,475,437);
setfillstyle(1,COLOR(0,102,0));
bar(401,400,474,436);
setfillstyle(1,0);
setbkcolor(COLOR(200,190,5));
settextstyle(3,0,4);
23
setcolor(0);
outtextxy(50,400,"Total de Cajas:");
setfillstyle(1,0);
bar(400,459,475,497);
setfillstyle(1,COLOR(0,102,0));
bar(401,460,474,496);
setfillstyle(1,0);
setbkcolor(COLOR(200,190,5));
settextstyle(3,0,4);
setcolor(0);
outtextxy(50,460,"Total de Lotes:");
setfillstyle(1,0);
bar(50,50,165,96);
setfillstyle(1,COLOR(0,102,0));
bar(51,51,164,95);
settextstyle(8,0,4);
setbkcolor(COLOR(0,102,0));
outtextxy(66,58,"Atrás");
setfillstyle(1,0);
bar(640,50,740,96);
setfillstyle(1,4);
bar(641,51,739,95);
setbkcolor(4);
settextstyle(8,0,3);
outtextxy(653,60,"SALIR");
24
mouse2();
void volver()
setfillstyle(1,0);
bar(50,50,165,96);
setfillstyle(1,COLOR(0,102,0));
bar(51,51,164,95);
settextstyle(8,0,4);
setbkcolor(COLOR(0,102,0));
outtextxy(66,58,"Atrás");
delay(200);
setfillstyle(1,0);
bar(50,50,165,96);
setfillstyle(1,COLOR(0,120,65));
bar(51,51,164,95);
settextstyle(8,0,4);
setbkcolor(COLOR(0,120,65));
outtextxy(66,58,"Atrás");
menu();
void salir()
25
WriteFile(h,"0", 1, &n, NULL);
update_time();
fp = fopen("Historial.csv","a+");
fprintf(fp,"%s;%s;%i;%i;%i;%i;\n",T_Hoy,T_Hora,cajag,cajac,lote,total);
fclose(fp);
closegraph();
exit(0);
do
do
getmouseclick(WM_LBUTTONDOWN,cordx,cordy);
if(cordx>640&&cordy>50&&cordx<740&&cordy<96)
salir();
if(cordx>220&&cordy>260&&cordx<600&&cordy<330)
ingreso();
if(kbhit())
x++;
while(x!=100999990);
26
}
while(1);
closegraph();
do
{ do{
data=ReadByte();
setfillstyle(1,0);
setbkcolor(COLOR(0,102,0));
settextstyle(8,0,4);
setcolor(0);
if(data=='C'){
RecCad(texto);
cajac=atoi(texto);
BorrCad(texto);
sprintf(A1,"%i",cajac);
outtextxy(427,340,A1);
if(data=='G'){
RecCad(texto);
cajag=atoi(texto);
BorrCad(texto);
sprintf(A2,"%i",cajag);
outtextxy(427,280,A2);
27
}
if(data=='T'){
RecCad(texto);
total=atoi(texto);
BorrCad(texto);
sprintf(A3,"%i",total);
outtextxy(427,400,A3);
if(data=='L'){
RecCad(texto);
lote=atoi(texto);
BorrCad(texto);
sprintf(A4,"%i",lote);
outtextxy(427,460,A4);
getmouseclick(WM_LBUTTONDOWN,cordx,cordy);
if(cordx>640&&cordy>50&&cordx<740&&cordy<96)
salir();
if(cordx>50&&cordy>130&&cordx<400&&cordy<200)
oncinta();
if(cordx>410&&cordy>130&&cordx<740&&cordy<200)
offcinta();
if(cordx>50&&cordy>50&&cordx<165&&cordy<96)
volver();
if(kbhit())
28
x++;
while(x!=100999990);
while(1);
closegraph();
void oncinta()
setfillstyle(1,0);
bar(50,130,400,200);
setfillstyle(1,COLOR(0,102,0));
bar(51,131,399,199);
setbkcolor(COLOR(0,102,0));
settextstyle(8,0,4);
setcolor(0);
outtextxy(90,150,"ENCENDER CINTA");
delay(200);
setfillstyle(1,0);
bar(50,130,400,200);
setfillstyle(1,COLOR(0,120,65));
bar(51,131,399,199);
setbkcolor(COLOR(0,120,65));
settextstyle(8,0,4);
setcolor(0);
outtextxy(90,150,"ENCENDER CINTA");
29
WriteFile(h,"1", 1, &n, NULL);
void offcinta()
setfillstyle(1,0);
bar(410,130,740,200);
setfillstyle(1,COLOR(0,102,0));
bar(411,131,739,199);
setbkcolor(COLOR(0,102,0));
settextstyle(8,0,4);
setcolor(0);
outtextxy(460,150,"APAGAR CINTA");
delay(200);
setfillstyle(1,0);
bar(410,130,740,200);
setfillstyle(1,COLOR(0,120,65));
bar(411,131,739,199);
setbkcolor(COLOR(0,120,65));
settextstyle(8,0,4);
setcolor(0);
outtextxy(460,150,"APAGAR CINTA");
mouse2();
30
main()
initwindow(800,600);
bienvenida();
delay(2000);
if(h==INVALID_HANDLE_VALUE)
*/
*/
/* Configuramos el puerto */
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutMultiplier = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 50;
31
timeouts.WriteTotalTimeoutConstant = 10;
if(!SetCommState(h, &dcb))
SetCommMask(h, EV_RXCHAR);
menu();}
for(j=0;j<strlen(text);j++){
text[j]='\0';
k=0;
do{
data=ReadByte();
texto[k]=data;
k++;
}while(data!=13);
int ReadByte(){
int Val;
BYTE Byte;
DWORD dwBytesTransferred;
32
DWORD dwCommModemStatus;
if (!GetCommState(h,&dcb))
return 0;
Val = Byte;
return Val;
Listado de materiales:
Perfiles C x 2 de 50 cm
Perfil L x 4 de 5 cm
Eje de 5 mm de diámetro x 3, de 10 cm cada uno.
Rodamiento HCH 658 zz X 6
Banda de goma eva de 6 cm de ancho por 80 cm de largo
Materiales electrónicos especificados en la etapa IV
33
34
35