Harap diperhatikan jenis motor yang digunakan dan sesuaikan driver motor yang tepat.
/* Pintu Kereta Api Otomatis Dengan motor stepper by: ahocool@gmail.com SURABAYA - 2012 1 arah saja */ #define F_CPU 100000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define SPEED _delay_ms(10) // ubah nilai delay sesuai kecepatan yang diinginkan //stepper FULL STEP, bisa dirubah sesuai keinginan void puter_kanan(void) { PORTB |=_BV(PB0); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB1); PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB2); PORTB &= ~_BV(PB1) & ~_BV(PB0) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB3); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0); SPEED; PORTB |=_BV(PB0) | _BV(PB2); PORTB &= ~_BV(PB1) & ~_BV(PB3) ; } void puter_kiri(void) { PORTB |=_BV(PB3); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0) ; SPEED; PORTB |=_BV(PB2); PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB1); PORTB &= ~_BV(PB2) & ~_BV(PB0) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB0); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB0) | _BV(PB2); PORTB &= ~_BV(PB1) & ~_BV(PB3) ; } SIGNAL (SIG_INT0) { int a; //ubah nilai max looping berikut sampai posisi berhenti yg pas for(a=0;a<3;a++) puter_kanan(); } SIGNAL (SIG_INT1) { int a; //ubah nilai max looping berikut sampai posisi berhenti yg pas for(a=0;a<3;a++) puter_kiri(); } int main(void) { PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) ; //OUTPUT Stepper pin A,B,C,D PORTD &= ~_BV(PD4); //sensor posisi awal //aktifkan interupt MCUCR |= (1<<ISC01) | (0<<ISC00) |(1<<ISC11) | (1<<ISC10); // interupt 0 (datang) falling edge, interupt 1 (pergi) rising edge GIMSK |= (1<<INT0) |(1<<INT1); sei(); //inisialisasi awal saat dihidupkan , pintu membuka sampai sensor posisi OFF while (bit_is_set(PIND, PIND4) ) { puter_kiri(); //steper naik sampe sensor awal terhalang } while(1) { } return 0; }
/* Pintu Kereta Api Otomatis Dengan motor stepper by: ahocool@gmail.com SURABAYA - 2012 versi timer -- 2 arah */ #define F_CPU 100000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define SPEED _delay_ms(10) // ubah nilai delay sesuai kecepatan yang diinginkan #define TIMER 5 // timer dari gerbong terakhir menlewati sensor dan membuka palang pintu int detik, posisi, depan; void init_timer(void) { TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode TIMSK |= (1 << OCIE1A); // Enable CTC interrupt OCR1A = 7812; //compare the CTC A TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64 TCNT1 = 0; detik=0; sei(); } void init_sensor_fall(void) { cli(); //aktifkan interupt MCUCR |= (1<<ISC01) | (0<<ISC00) |(1<<ISC11) | (0<<ISC10); // interupt 0 & 1 falling edge , untuk deteksi 2 arah GIMSK |= (1<<INT0) |(1<<INT1); sei(); posisi = 0 ; // sebagai penanda kalo posisi pintu terbuka } void init_sensor_rise(void) { cli(); //aktifkan interupt MCUCR |= (1<<ISC01) | (1<<ISC00) |(1<<ISC11) | (1<<ISC10); // interupt 0 & 1 rising edge , untuk deteksi akhir gerbong GIMSK |= (1<<INT0) |(1<<INT1); sei(); posisi = 1 ; // sebagai penanda kalo posisi pintu tertutup } void puter_kanan(void) { PORTB |=_BV(PB0); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB1); PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB2); PORTB &= ~_BV(PB1) & ~_BV(PB0) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB3); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0); SPEED; PORTB |=_BV(PB0) | _BV(PB2); PORTB &= ~_BV(PB1) & ~_BV(PB3) ; } void puter_kiri(void) { PORTB |=_BV(PB3); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0) ; SPEED; PORTB |=_BV(PB2); PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB1); PORTB &= ~_BV(PB2) & ~_BV(PB0) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB0); PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ; SPEED; PORTB |=_BV(PB0) | _BV(PB2); PORTB &= ~_BV(PB1) & ~_BV(PB3) ; } SIGNAL (SIG_INT0) { int a; //jika pintu terbuka dan kereta lewat if( posisi == 0) { depan = 1; //berarti sensor 1 jadi yg didepan init_sensor_rise(); //mode interupt berubah //ubah nilai max looping berikut sampai posisi berhenti yg pas for(a=0;a<3;a++) puter_kanan(); } else { //jika ada kondisi celah gerbong (0 -> 1) maka reset timer if(depan == 1)init_timer(); } } SIGNAL (SIG_INT1) { int a; //jika pintu terbuka dan kereta lewat if( posisi == 0) { depan = 2; //berarti sensor 2 jadi yg didepan init_sensor_rise();//mode interupt berubah //ubah nilai max looping berikut sampai posisi berhenti yg pas for(a=0;a<3;a++) puter_kanan(); } else { //jika ada kondisi celah gerbong (0 -> 1) maka reset timer if(depan == 2)init_timer(); } } ISR(TIMER1_COMPA_vect) // interupt timer detik { int a; detik++; if(detik >= TIMER ) // jika lebih dari timer yg ditentukan maka pintu terbuka { init_sensor_fall(); //kembalikan sensor sebagai interupt fall edge TIMSK=0; //matikan timer //ubah nilai max looping berikut sampai posisi berhenti yg pas for(a=0;a<3;a++) puter_kiri(); } } int main(void) { PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) ; //OUTPUT Stepper pin A,B,C,D PORTD &= ~_BV(PD2) & ~_BV(PD3) & ~_BV(PD4); //sensor sebagai input init_sensor_fall(); //awal sebagai interupt fall //inisialisasi awal saat dihidupkan , pintu membuka sampai sensor posisi OFF while (bit_is_set(PIND, PIND4) ) { puter_kiri(); //steper naik sampe sensor awal terhalang } while(1) { } return 0; }
SELAMAT MENCOBA !