이 기계는 스코페 기계공학부에서 Construction & CAD 과목의 학생 프로젝트로 5인 팀이 제작했습니다. 두 종류의 접시를 분류하는 기계입니다. 한 종류는 구멍이 있고 다른 종류는 구멍이 없습니다. 과제는 이 접시들을 자동으로 분류하는 기계를 개발하는 것이었습니다. 25개 다른 기계 중 1등을 차지한 해결책을 제시했습니다.
작동 원리
자동 분류 기계 작동 방식:
접시를 손으로 기계에 투입합니다.
롤러가 접시를 정렬해 접시 매거진으로 하나씩 떨어뜨립니다.
접시가 분류기 바닥에 도달하면 마이크로 스위치를 트리거합니다.
스위치가 켜지면 LED가 켜집니다.
접시에 구멍이 있으면 광전지가 더 많은 빛을 받고 모터가 한쪽으로 회전합니다.
접시에 구멍이 없으면 광전지가 덜 빛을 받고 모터가 반대쪽으로 회전합니다.
회로도
이 기계는 PIC16F628A 마이크로컨트롤러를 사용하며 MikroElektronika로 프로그래밍했습니다.
소스 코드
/********************************************************************************/
/* Mechatronic Design Team */
/* Proekt po Konstruiranje i CAD */
/* "Dizajn i razvoj na nov ured za razdeluvanje na dva tipa plocki" */
/* */
/* */
/* */
/* Mikrokontroler: PIC16F628A */
/* Oscilator: Interen na 4MHz */
/* */
/* Dekemvri, 2012, Skopje */
/********************************************************************************/
void left() {
RB2_bit = 1; // 모터가 왼쪽으로 회전 시작
delay_ms(500); // 모터가 맨 왼쪽 위치까지 이동
delay_ms(500);
delay_ms(500);
PORTB = 0x00; // 맨 왼쪽 위치 도달 시 정지
delay_ms(200); // 모터 제동 시간
RB3_bit = 1; // 방향 변경을 위한 릴레이 활성화
delay_ms(20);
RB2_bit = 1; // 모터가 오른쪽으로 회전 시작
delay_ms(500); // 모터 중간 위치
delay_ms(500);
delay_ms(500);
PORTB = 0x00; // 중간 위치 도달 시 모터 정지
delay_ms(150); // 모터 제동 시간
}
// //////////////////////////////////////////////////////////////////////////////
void right() {
RB3_bit = 1; // 모터 방향 변경을 위한 릴레이 켜기
delay_ms(30);
RB2_bit = 1; // 모터가 오른쪽으로 회전 시작
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500); // 모터가 맨 오른쪽 위치까지 이동
PORTB = 0x00; // 맨 오른쪽 위치 도달 시 정지
delay_ms(200); // 모터 제동 시간
RB2_bit = 1; // 모터가 왼쪽으로 회전 시작
delay_ms(500); // 중간 위치
delay_ms(500);
delay_ms(500); // 중간 위치
PORTB = 0x00; // 중간 위치 도달 시 모터 정지
delay_ms(150); // 모터 제동 시간
}
// //////////////////////////////////////////////////////////////////////////////
void main() {
// 메인 프로그램 시작
TRISB = 0x00; // PORTB 출력
TRISA = 0xff; // PORTA 입력
CMCON = 0x07; // 비교기 끄기
do {
delay_ms(50);
PORTB = 0x00;
if (PORTA.b0 == 1) { // 접시가 있는가?
delay_ms(100);
if (PORTA.b1 == 0) { // 구멍이 있는가?
left(); // 구멍 있으면 왼쪽으로 이동
} else {
right(); // 없으면 오른쪽으로 이동
}
}
} while (1);
}