Minibil med begränsad AI

Ett projekt som skapades som en avslutande del i en CAD-kurs vid Växjö Universitet 2001.

Målet var att bilen ska kunna köra utan mänsklig inblandning. Dock är AI-delen väldigt begränsad, den kan på sin höjd att märka när den kört in i ett föremål och då backa en bit (med sväng) för att sedan köra tills den träffar något igen...

Hur ska då detta gå till? Hjärnan i projektet är en PIC16F84 som styr de båda motorerna som redan finns monterade i bilen. Omgivningssensorer är realiserade i form av två känselspröt monterade fram på bilen. Vidare finns där två stycken lysdioder som indikera var i programmet han befinner sig, för att det ska bli lättare att felsöka.

Mer information finns i rapporten (pdf).

schema

styrprogramvara (se nedan)

(prog allt)

Bild på ripper

Bild på ripper

Styrprogrammet

Koden är enkel men uppfyllde mitt syfte :-)

Filnamn: kod/nikko.c


#include <NIKKO.H>

#int_rb

int i;

rb_isr() { /* OBS AVKOMMENTERAT.... */
   // Change on port B
}

void RAKTFRAM() {
   output_low(PIN_B2); /* Sväng INTE */
   output_low(PIN_B3);
   output_low(PIN_B1); /* Kör framåt */
   output_high(PIN_B0);
}

void BACKA_H() { /* Backa och sväng åt höger */
   output_low(PIN_B2); /* Sväng */
   output_high(PIN_B3);
   output_high(PIN_B1); /* Backa */
   output_low(PIN_B0);
}

void BACKA_V() { /* Backa och sväng åt vänster */
   output_high(PIN_B2); /* Sväng */
   output_low(PIN_B3);
   output_high(PIN_B1); /* Backa */
   output_low(PIN_B0);
}

void SW_B4() { /* Gå hit om någon tryckte på kontakten.... */
   output_low(PIN_A0); /* Släck Grön */
   BACKA_H();        
   for(i=0;i<25;i++) {
      /* 1MHz 25??? -> 4MHz 25*4 för samma tid.... */
      delay_ms(50);
   }
}

void SW_B5() { /* Gå hit om någon tryckte på kontakten.... */
   output_low(PIN_A1); /* Släck Grön */
   BACKA_V();         
   for(i=0;i<25;i++) {
      delay_ms(50);
   }
}

main() {
	setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
	/*enable_interrupts(RB_CHANGE);*/
	enable_interrupts(GLOBAL);

   do {
      output_high(PIN_A0); /*LED_GREEN=1;*/
      output_high(PIN_A1); /*LED RED=1*/

      RAKTFRAM();     
      
      if(input(PIN_B4)==1) {
         SW_B4();
      }
      if(input(PIN_B5)==1) {
         SW_B5();
      }
   } while(true);
}