Did you know that you can navigate the posts by swiping left and right?

비밀번호 입력 후 잠금장치 락&온

24 Jan 2018 . category: tech . Comments
#atmega 128 #mechatronics #science knowledge

어제 스위치를 이용해 비밀번호를 입력하여 lcd에 나타내도록 하는 코드를 만들었고 이제 입력이 완료되면 모터가 90도를 돌아 잠겼던 걸 풀도록 조절하는 코드를 만들어보았다. check문에서 correct가 나오고 다음으로 motor-on문으로가 motor가 도는 코드를 만들었는데 인터럽트 함수를 이용해서 모터의 각도를 조절하였다. 각도 조절하는 코드는 전에 배운 타이머, 서보모터 부문의 코드에서 얻어와 조금 변형하여 만들었다. 그 후에 motor-off문으로 가서 모터가 자동으로 꺼지게끔 하였고 따로 스위치 4번버튼을 납땜하여 reset()함수를 만들어서 다시 원래의 각도로 돌아와 잠금 해제를 하도록 하였다. 코드를 적어보면.

#include <mega128.h>
#include <delay.h>
#include <alcd.h>

#define Switch_1 (!PINE.4)
#define Switch_2 (!PINE.5)
#define Switch_3 (!PINE.6)
#define Switch_4 (!PINE.7)
#define Motor_off TCCR0 = 0x00;

unsigned char number = 1;
unsigned char x = 0;
unsigned char y = 1;
unsigned char record = 0b00000000;
unsigned char record2 = 0b00001111;
unsigned int tim0_cnt, mot_pos, change;
unsigned int rc_time[2] = {54, 155};

void reset(void)
{
    tim0_cnt = 0;
    mot_pos = 0;
    change = 0;
    TIMSK = 0x01;
    TCCR0 = 0x02;
    TCNT0 = 238;
    SREG = 0x80;
    
    tim0_cnt = 0;
    PORTC = 0xFF;
    
    while(1)
    {
        if(tim0_cnt >= 2000)
        {
            tim0_cnt = 0;
            PORTC = 0xFF;
            change++;
            
            if(change == 100)
            {
                change = 0;
                Motor_off;  
            }    
        }
        if(tim0_cnt >= rc_time[1]) PORTC = 0x0;
    }
    
}
void motor_off(void)
{
    Motor_off;
    TIMSK = 0x00;
    PORTC = 0x00;
    mot_pos++;
    while(1)
    {
        if(Switch_4)
        {
          reset();
        }
    }     
}

void motor_on(void)
{
    tim0_cnt = 0;
    change = 0;
    TIMSK = 0x01;
    TCCR0 = 0x02;
    TCNT0 = 238;
    SREG = 0x80;
    
    tim0_cnt = 0;
    PORTC = 0xFF;
    
    while(1)
    {   
        if(tim0_cnt >= 2000)
        {
            tim0_cnt = 0;
            PORTC = 0xFF; // 모터 HIGH 출력 
            change++;
            if(change == 100)
            {   
                mot_pos = (mot_pos + 1) % 2;
                change = 0;
                motor_off();
            }
        }
        if(tim0_cnt >= rc_time[0])
        {
            PORTC = 0x0;  // 모터 LOW 출력
        }
    } 
}

interrupt [TIM0_OVF] void tim_int0(void)
{
    tim0_cnt++;
    TCNT0 = 238;
}

void check(void)
{
    if(record == record2)
    {
        lcd_clear();
        lcd_gotoxy(0,1);
        lcd_putsf("correct");
        motor_on();
        delay_ms(100);
    }
}

void main(void)
{
    DDRC = 0xFF;
    DDRD = 0xFF;
    DDRE = 0x00;
    PORTE = 0x00;
    PORTD = 0x00;
           
    lcd_init(8);
    
    while(1)
    {      
        if(Switch_1)
        {
            number++;
            if(number >= 9)
            {
                number = 1;
            }
            delay_ms(100);
        }
        else if(Switch_2)
        {
            number--;
            if(number <= 0)
            {
                number = 8;
            }
            delay_ms(100);
        }
        switch(number)
        {
            case 1:
                lcd_gotoxy(0,0);
                lcd_putsf("1");
                delay_ms(100);
                if(Switch_3)
                {   
                    lcd_gotoxy(x,y);
                    lcd_putsf("1");
                    x++;
                    record ^= 0x01;
                    check(); 
                    delay_ms(100);
                }
                break;
            case 2:
                lcd_gotoxy(0,0);
                lcd_putsf("2");
                delay_ms(100);
                if(Switch_3)
                {   
                    lcd_gotoxy(x,y);
                    lcd_putsf("2");
                    x++;
                    record ^= 0x02;
                    check();
                    delay_ms(100);
                }
                break;
            case 3:
                lcd_gotoxy(0,0);
                lcd_putsf("3");
                delay_ms(100);
                if(Switch_3)
                {   
                    lcd_gotoxy(x,y);
                    lcd_putsf("3");
                    x++;
                    record ^= 0x04;
                    check();
                    delay_ms(100);
                }
                break;
            case 4:
                lcd_gotoxy(0,0);
                lcd_putsf("4");
                delay_ms(100);
                if(Switch_3)
                {        
                    lcd_gotoxy(x,y);
                    lcd_putsf("4");
                    x++;
                    record ^= 0x08;
                    check();
                    delay_ms(100);
                }
                break;
            case 5:
                lcd_gotoxy(0,0);
                lcd_putsf("5");
                delay_ms(100);
                if(Switch_3)
                {   
                    lcd_gotoxy(x,y);
                    lcd_putsf("5");
                    x++;
                    record ^= 0x10;
                    check(); 
                    delay_ms(100);
                }
                break;
            case 6:
                lcd_gotoxy(0,0);
                lcd_putsf("6");
                delay_ms(100);
                if(Switch_3)
                {   
                    lcd_gotoxy(x,y);
                    lcd_putsf("6");
                    x++;
                    record ^= 0x20;
                    check();
                    delay_ms(100);
                }
                break;
            case 7:
                lcd_gotoxy(0,0);
                lcd_putsf("7");
                delay_ms(100);
                if(Switch_3)
                {   
                    lcd_gotoxy(x,y);
                    lcd_putsf("7");
                    x++;
                    record ^= 0x40;
                    check();
                    delay_ms(100);
                }
                break;
            case 8:
                lcd_gotoxy(0,0);
                lcd_putsf("8");
                delay_ms(100);
                if(Switch_3)
                {   
                    lcd_gotoxy(x,y);
                    lcd_putsf("8");
                    x++;
                    record ^= 0x80;
                    check();
                    delay_ms(100);
                }
                break;          
        }
    }
}

아직 모터 회전에대한 개념이 부족해 일반모드를 쓰고 있는데 이후에는 fast pwm모드를 사용해보고 싶다. 더 많이 공부해야겠다.


Me

github를 이용해 만들어본 블로그입니다.