드디어 LT를 완성했다. 모터 속도만 약간씩 바꿔 가면서 지정된 코스에 맞도록 조정해 주는 작업만 하면 된다. (현재 전시할 때 쓰려고 만든 코스에서는 딱 한 군데만 빼고 모두 잘 돌아간다)
공부하는 분들을 위해 소스를 공개한다. (사실 뭐 별로 볼 것도 없다)
[CODE]<font style="color:white">/*
* Daybreaker's Line Tracer Program
* --------------------------------
*
* Date : 2005/05/24
* Author : Daybreaker (Kim Joon-gi); MR 05
* License : GNU General Public License
*
* MCU : at90 2313
*/
#define AVREDIT
#ifdef AVREDIT
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#else
#include <io.h>
#include <signal.h>
#include <interrupt.h>
#enduf
#define F_CPU 7372800 /* 7.3728Mhz */
#define true 1
#define false 0
#define LEFT_MOTOR 0
#define RIGHT_MOTOR 1
#define MAX_SPEED_STEP 100
volatile int speed_left, speed_right;
char stop_all = 0;
volatile static int cnt_left = 0, cnt_right = 0;
SIGNAL (SIG_OVERFLOW0) {
if(stop_all) return;
if (cnt_left < MAX_SPEED_STEP - speed_left) {
cbi(PORTB, 1); sbi(PORTB, 2);
} else {
sbi(PORTB, 1); cbi(PORTB, 2);
}
if (cnt_right < MAX_SPEED_STEP - speed_right) {
cbi(PORTB, 3); sbi(PORTB, 4);
} else {
sbi(PORTB, 3); cbi(PORTB, 4);
}
cnt_left++; cnt_right++;
if (cnt_left > MAX_SPEED_STEP) cnt_left = 0;
if (cnt_right > MAX_SPEED_STEP) cnt_right = 0;
outp(0x00, TCNT0);
}
int main() {
/*
port D6, B0 = Enable A, B
port B1, B2 = Left Motor
port B3, B4 = Right Motor
port D5 = Left Sensor
port D4 = Center Sensor
port D3 = Right Sensor
*/
// Initialize Ports
outp(0x1F, DDRB); // xxx11111
outp(0x40, DDRD); // x1000xxx
char pd = 0;
// Enable Motor Driver's Ports
sbi(PORTB, 0);
sbi(PORTD, 6);
// Initialize Interrupts
outp(0x00, TCNT0); // set the counter 0
outp(0x01, TCCR0); // increase TCNT0 at every 256 clock
outp(0x03, TIMSK); // enable timer
sei();
cbi(PORTB, 1); cbi(PORTB, 2);
cbi(PORTB, 3); cbi(PORTB, 4);
// Main Loop
while(1) {
pd = inp(PIND) & 0x38;
// Check Sensor States and Control Motors
if (pd == 0x20) {
speed_right = 50;
stop_all = false;
} else if (pd == 0x08) {
speed_left = 50;
stop_all = false;
} else if (pd == 0x38) { // stop
cbi(PORTB, 1); cbi(PORTB, 2);
cbi(PORTB, 3); cbi(PORTB, 4);
stop_all = true;
} else {
speed_left = 30;
speed_right = 30;
stop_all = false;
}
}
return 0;
}
[/CODE]