Austin Community College initial line follower program for Freescale car. This is based upon the FRDM-TFC code at mbed.org.

Dependencies:   mbed

Fork of FRDM-TFC by Eli Hughes

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.

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;
+            }
+    }
+    
+ 
+}
+