본문 바로가기
일상/일상

전동 블라인드 만들기

by Joseph.Lee 2019. 6. 6.

피곤해서 누웠는데 창문으로 밝은 빛이...★...ㅠㅠ

블라인드 내리기 귀찮아서 언제 전동블라인드 만들어야지... 생각만 하다가 휴일이 된 김에 만들었네요~

블라인드 제조사는 기억이 안납니다.. 뒤지면 나올텐데.. 뭐 다들 비슷할거라 생각해서 PASS하고..

사용한 부품은 아래와 같습니다.

  • 스테핑 모터 : 17HS4401 (토크 : 40N.cm 으로써 토크가 큰걸 골랐습니다. (블라인드 무거움..))

  • 모터 드라이버 : DRV8825 모듈 (vref=0.7V 으로써 current limit를 1.4A으로 정했습니다.)

  • 제어 : Arduino Pro mini

  • 릴레이모듈(필요없지만.. 혹시나 해서 보호회로 구현하려고 넣음.. FET가 없어서 그렇지 그냥 FET쓰거나

모터드라이브 Shutdown하는게 더 나아요...)

처음에는 줄이랑 모터랑 같이 쓰려고 했는데 그건 안되겠더라구요.. 줄이랑 벨트랑 엇갈릴수밖에 없는 구조라.. 일단 저 부분을 톱으로 잘랐습니다
쓱삭쓱삭...
대충 제어부는 이런데.. 뚜껑이 안덮힘...ㅠㅠ 땜질하는게 귀찮아서 가능한부분은 저..선으로 연결했습니다. 제어는 잘 찾아보면 있는 푸시스위치..
고정은 걍 고무줄...^^ 한 사람이면 패하겠거니와 두 사람이면 능히 당하나니 삼겹 줄은 쉽게 끊어지지 아니하느니라 (전도서 4:12) 처럼... 여러줄로 하니 꽤나 잘 고정되었습니다. 
설치 후... 음... 음.... 이걸 어떻게....ㅋㅋㅋㅋ 

누워서 블라인드 내리는것도 안되고.. (짦음..) 뭐 나중에 원격으로 제어할 수 있게 해야죠 뭐..

근데.. 언제할지...ㅋㅋ 걍 전선 길게 늘려서 스위치를 머리맡으로 할거같음..

소스... (원래 소스는 아니고 지금 수정중인건데 아직 적용은 못해봄.. 처음에는 낮은 속도(주파수)로써 높은 토크로 동작하고 서서히 속도를 올려갑니다.)

/*
 * BlindMotorController.c
 *
 * Created: 2019-06-05 오후 11:27:21
 * Author : jichan
 */ 

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000
#include <util/delay.h>

static volatile unsigned int pwm_step = 0;
static volatile unsigned char pwm_step_ms = 0;

static void updatePwm() {
    uint8_t icr_val = 249 - pwm_step;
    ICR1H = 0x00;
    ICR1L = icr_val;
    OCR1AH = 0x00;
    OCR1AL = icr_val / 2;
}

ISR(TIMER1_OVF_vect)
{
    if(pwm_step_ms < 16)
        pwm_step_ms++;
    else{
        pwm_step_ms = 0;
        if(pwm_step < 125)
        {
            pwm_step++;
            updatePwm();
        }
    }
}

int main()
{
    unsigned char sw_state = 0;

    // 1 PD0 : RXD
    // 0 PD1 : TXD
    // 1 PD2 : SW1
    // 1 PD3 : SW2
    // 1 PD4 : X
    // 0 PD5 : OUT
    // 0 PD6 : OUT (En, Active Low)
    // 0 PD7 : OUT (DIR)
    // PB1,PB2 : OUT
    DDRD = 0xF2;
    PORTD = 0xFF;
    DDRB = 0x02; // PB1 OUT
    PORTB = 0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
    TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: Fast PWM top=ICR1
    // OC1A output: Non-Inverted PWM
    // OC1B output: Disconnected
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer Period: 0.2 ms
    // Output Pulse(s):
    // OC1A Period: 0.2 ms Width: 0.1005 ms [199,100]
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0;
    ICR1L=0;
    OCR1AH=0;
    OCR1AL=0;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2A output: Disconnected
    // OC2B output: Disconnected
    ASSR=(0<<EXCLK) | (0<<AS2);
    TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
    TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);
    TCNT2=0x00;
    OCR2A=0x00;
    OCR2B=0x00;

    // Timer/Counter 0 Interrupt(s) initialization
    TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);

    // Timer/Counter 1 Interrupt(s) initialization
    TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);

    // Timer/Counter 2 Interrupt(s) initialization
    TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // Interrupt on any change on pins PCINT0-7: Off
    // Interrupt on any change on pins PCINT8-14: Off
    // Interrupt on any change on pins PCINT16-23: Off
    EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
    EIMSK=(0<<INT1) | (0<<INT0);
    PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);

    // USART initialization
    // USART disabled
    UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);

    // Analog Comparator initialization
    // Analog Comparator: Off
    // The Analog Comparator's positive input is
    // connected to the AIN0 pin
    // The Analog Comparator's negative input is
    // connected to the AIN1 pin
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
    ADCSRB=(0<<ACME);
    // Digital input buffer on AIN0: On
    // Digital input buffer on AIN1: On
    DIDR1=(0<<AIN0D) | (0<<AIN1D);

    // ADC initialization
    // ADC disabled
    ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

    // SPI initialization
    // SPI disabled
    SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

    // TWI initialization
    // TWI disabled
    TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

    sei();

    while(1) {
        unsigned char cur_sw_state;
        if((PIND & 0x04) == 0)
        {
            cur_sw_state = 1;
        }
        else if((PIND & 0x08) == 0)
        {
            cur_sw_state = 2;
        }else{
            cur_sw_state = 0;
        }
        if(cur_sw_state != sw_state)
        {
            pwm_step = 0;
            pwm_step_ms = 0;
            updatePwm();
            TCNT1H=0x00;
            TCNT1L=0x00;
            switch(cur_sw_state)
            {
            case 1:
                PORTD &= ~0x40;
                PORTD |= 0x80;
                break;
            case 2:
                PORTD &= ~0xC0;
                break;
            default:
                PORTD |= 0x40;
            }
            _delay_ms(125);
        }
        sw_state = cur_sw_state;
    }
}


반응형

댓글