![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Austin Community College initial line follower program for Freescale car. This is based upon the FRDM-TFC code at mbed.org.
Fork of FRDM-TFC by
Austin Community College - Initial Specs for FRDM-TFC line following car.
This uses the fine library by ELI HUGHES.
Our goal here is to provide the simplest line-follower as a quick car checkout.
First, we limit the run duration for the car, so that you can catch it, if necessary. Right DIP switch (4) sets run time. 0 => 5 sec, 1 => 10 sec.
We provide simple speed selection with the other three DIP switches. I recommend 001 as the slowest real speed, (000 is stop, of course). DIP switches 1 2 3 make a 3 bit speed. 1 is msb, 3 is lsb
The car won't start until you press and release the driver's side PB. Left PB (TFC_PUSH_BUTTON_1) is permissive GO on release using left 3 DIPs for speed 0-7.
The car will stop when the passenger side PB is pressed. Right PB is STOP - TFC_PUSH_BUTTON_0
TFC_Ticker[3] is our run time counter. Like the Code Warrior edition, we use msec tickers.
Left (Driver side) trim pot 1 can be used to trim static steering servo Right trim pot 0 can be used to offset line camera
Back LED reflects drive motor status. The top three are not currently used.
main.cpp
- Committer:
- redxeth
- Date:
- 2013-09-04
- Revision:
- 4:8a4a3fc59e57
- Parent:
- 3:23cce037011f
- Child:
- 5:9d36b4c896e1
File content as of revision 4:8a4a3fc59e57:
#include "mbed.h" #include "TFC.h" //This macro is to maintain compatibility with Codewarrior version of the sample. This version uses the MBED libraries for serial port access Serial PC(USBTX,USBRX); #define TERMINAL_PRINTF PC.printf //This ticker code is used to maintain compability with the Codewarrior version of the sample. This code uses an MBED Ticker for background timing. #define NUM_TFC_TICKERS 4 Ticker TFC_TickerObj; volatile uint32_t TFC_Ticker[NUM_TFC_TICKERS]; void TFC_TickerUpdate() { int i; for(i=0; i<NUM_TFC_TICKERS; i++) { if(TFC_Ticker[i]<0xFFFFFFFF) { TFC_Ticker[i]++; } } } int main() { uint32_t i,j,t = 0; PC.baud(115200); TFC_TickerObj.attach_us(&TFC_TickerUpdate,2000); TFC_Init(); for(;;) { //TFC_Task must be called in your main loop. This keeps certain processing happy (I.E. Serial port queue check) // TFC_Task(); //This Demo program will look at the middle 2 switch to select one of 4 demo modes. //Let's look at the middle 2 switches switch((TFC_GetDIP_Switch()>>1)&0x03) { default: case 0 : //Demo mode 0 just tests the switches and LED's if(TFC_PUSH_BUTTON_0_PRESSED) TFC_BAT_LED0_ON; else TFC_BAT_LED0_OFF; if(TFC_PUSH_BUTTON_1_PRESSED) TFC_BAT_LED3_ON; else TFC_BAT_LED3_OFF; if(TFC_GetDIP_Switch()&0x01) TFC_BAT_LED1_ON; else TFC_BAT_LED1_OFF; if(TFC_GetDIP_Switch()&0x08) TFC_BAT_LED2_ON; else TFC_BAT_LED2_OFF; break; case 1: //Demo mode 1 will just move the servos with the on-board potentiometers if(TFC_Ticker[0]>=20) { TFC_Ticker[0] = 0; //reset the Ticker //Every 20 mSeconds, update the Servos TFC_SetServo(0,TFC_ReadPot(0)); TFC_SetServo(1,TFC_ReadPot(1)); } //Let's put a pattern on the LEDs if(TFC_Ticker[1] >= 125) { TFC_Ticker[1] = 0; t++; if(t>4) { t=0; } TFC_SetBatteryLED_Level(t); } TFC_SetMotorPWM(0,0); //Make sure motors are off TFC_HBRIDGE_DISABLE; break; case 2 : //Demo Mode 2 will use the Pots to make the motors move TFC_HBRIDGE_ENABLE; TFC_SetMotorPWM(TFC_ReadPot(0),TFC_ReadPot(1)); //Let's put a pattern on the LEDs if(TFC_Ticker[1] >= 125) { TFC_Ticker[1] = 0; t++; if(t>4) { t=0; } TFC_SetBatteryLED_Level(t); } break; case 3 : uint32_t NumCameras = 1; // Enter here how many line scan cameras hooked up //Demo Mode 3 will be in Freescale Garage Mode. It will beam data from the Camera to the //Labview Application if(TFC_Ticker[0]>1000 && TFC_LineScanImageReady>0) { TFC_Ticker[0] = 0; TFC_LineScanImageReady=0; TERMINAL_PRINTF("\r\n"); TERMINAL_PRINTF("L:"); if(t==0) t=4; else t--; TFC_SetBatteryLED_Level(t); // camera 1 for(i=0;i<8;i++) { for(j=0;j<16;j++) { TERMINAL_PRINTF("%X",TFC_LineScanImage0[(i*16)+j]); if (NumCameras == 1) { if((i==7)&&(j==15)) TERMINAL_PRINTF("\r\n",TFC_LineScanImage0[(i*16)+j]); else TERMINAL_PRINTF(",",TFC_LineScanImage0[(i*16)+j]); } } wait_ms(10); } // camera 2 if (NumCameras == 2) { for(i=0;i<8;i++) { for(j=0;j<16;j++) { TERMINAL_PRINTF("%X",TFC_LineScanImage1[(i*16)+j]); if((i==7)&&(j==15)) TERMINAL_PRINTF("\r\n",TFC_LineScanImage1[(i*16)+j]); else TERMINAL_PRINTF(",",TFC_LineScanImage1[(i*16)+j]); } wait_ms(10); } } } break; } } }