![](/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.
Diff: main.cpp
- Revision:
- 3:23cce037011f
- Parent:
- 2:ce4a273be708
- Child:
- 4:8a4a3fc59e57
--- a/main.cpp Wed Jul 17 19:31:32 2013 +0000 +++ b/main.cpp Thu Aug 15 23:26:19 2013 +0000 @@ -1,79 +1,183 @@ -#include "mbed.h" -#include "TFC.h" - -DigitalOut myled(LED1); -Ticker TFC_TickerObj; -Serial PC(USBTX,USBRX); - -#define NUM_TFC_TICKERS 4 - -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[0]++; - } - } -} - - - - -int main() -{ - // int i; - - - PC.baud(9600); - TFC_TickerObj.attach_us(&TFC_TickerUpdate,1000); - __disable_irq(); - - TFC_Init(); - __enable_irq(); -// TFC_Init(); - while(1) - { - - if(TFC_ServoTicker >0) - { - TFC_ServoTicker = 0; - - TFC_SetBatteryLED(TFC_GetDIP_Switch()); - - if(TFC_DIP_SWITCH_0_ON) { - if(TFC_PUSH_BUTTON_0_PRESSED) - TFC_SetServo(0,0.2); - else if(TFC_PUSH_BUTTON_1_PRESSED) - TFC_SetServo(0,-0.2); - else - TFC_SetServo(0,TFC_ReadPot(0)); - } - - - if(TFC_DIP_SWITCH_1_ON) { - TFC_HBRIDGE_ENABLE; - TFC_SetMotorPWM(TFC_ReadPot(1) ,TFC_ReadPot(1)); - } else { - TFC_HBRIDGE_DISABLE; - } - - - } - - - if(TFC_Ticker[0]>500) - { - TFC_Ticker[0] = 0; - PC.printf("Servo Ticker %i",TFC_ServoTicker); - } - - - - } - -} - \ No newline at end of file +#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 : + + //Demo Mode 3 will be in Freescale Garage Mode. It will beam data from the Camera to the + //Labview Application + + //note that there are some issues + 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); + + for(i=0;i<8;i++) + { + for(j=0;j<16;j++) + { + TERMINAL_PRINTF("%X,",TFC_LineScanImage0[(i*8)+j]); + + } + wait_ms(10); + } + + for(i=0;i<8;i++) + { + for(j=0;j<16;j++) + { + TERMINAL_PRINTF("%X",TFC_LineScanImage1[(i*8)+j]); + + if((i*8)+j==127) + TERMINAL_PRINTF("\r\n",TFC_LineScanImage1[(i*8)+j]); + else + TERMINAL_PRINTF(",",TFC_LineScanImage1[(i*8)+j]); + } + + wait_ms(10); + } + + } + + + + break; + } + } + + +} +