/***********************************************************************/ /** @name SensorsOmni.c This program makes an Eyebot omnidirectional robot vehicle react to input given through sensors at the analog ports @author Birgit Graf, UWA, 2000 @version 1 */ /***********************************************************************/ /*@{*/ #include "eyebot.h" #include "libomni/omni.h" #include #include #define FALSE 0 #define TRUE 1 #define RIGHT 0 #define LEFT 1 /** Handle for motors */ VWHandle m_vw; /* \D to terminate transmission */ char term = 4; /** control input? */ int m_bUseControl = 0; /** array to save last sensor values */ #define MAX_ARRAY 100 int m_lastValues[MAX_ARRAY][2]; /* currently used maximum number of elements */ int m_arrayMaxElements = 10; /* pointer to current element (elements 0 to m_currentValue are used) */ int m_currentValue = 0; /* values currently in array:0 to m_currentMaxElementNo */ int m_currentMaxElementNo = 0; int m_actValsPerSec = 16; int m_nomValsPerSec = 20; double MaxVelLin = 0.8; /* m/s */ double MaxVelRot = M_PI/4.0; /* rad/s */ /***********************************************************************/ /** Init VW/OMNI interface. Called by main(). @see main() */ /***********************************************************************/ int InitDrive() { /** values for RoBIOS PI controller (used in vw interface) */ #define v_lin 7.0 #define t_lin 0.3 #define v_rot 10.0 #define t_rot 0.1 LCDPutString("InitDrive\n"); m_vw = OMNI_Init(VW_DRIVE, 1); if (!m_vw) LCDPutString("Error: OMNI_Init!\n"); /* if (OMNI_StartControl(m_vw, 0.09 , 0.3, 1.0, 0.1) != 0) LCDPutString("Error: VWStart!\n"); */ OMNI_SetPosition(m_vw, 0.0, 0.0, 0.0); return 0; } void set_ctrl_params() { int boc[] = {0, 0, 0, 0}; int ind = 0; int end_proc = FALSE; LCDClear(); LCDMenu(" + "," - ","Nxt","END"); LCDPrintf("Set parameters:\n"); boc[0] = m_bUseControl; boc[1] = m_arrayMaxElements; while (!end_proc) { LCDSetPos(2, 0); LCDPrintf("Filter: "); if (boc[0] == 0) LCDPrintf("OFF\n"); else LCDPrintf(" ON \n"); if (boc[0]) /* control activated */ LCDPrintf("No. elem. :%3.d\n", boc[1]); else LCDPrintf(" \n"); /* clear */ LCDSetChar(2 + ind, 15, '*'); switch (KEYRead()) { case KEY1: boc[ind] ++; if (ind == 0) if (boc[ind] > 1) boc[ind] = 0; if (ind == 1) if (boc[0]) /* control activated */ if (boc[1] > MAX_ARRAY) boc[1] = MAX_ARRAY; break; case KEY2: boc[ind] --; if (ind == 0) if (boc[ind] < 0) boc[ind] = 1; if (ind == 1) if (boc[0]) /* control activated */ if (boc[1] < 1) boc[1] = 1; break; case KEY3: if (boc[0]) /* control activated */ { LCDSetChar(2 + ind, 15, ' '); ind ++; if (ind > 1) ind = 0; } break; case KEY4: m_bUseControl = boc[0]; m_arrayMaxElements = boc[1]; LCDClear(); end_proc = TRUE; break; default: break; } } } /***********************************************************************/ /** Set Parameter over keyboard (float). @param text[] name of parameter @param minp,maxp minimum and maximum value of parameter @param start start value for parameter @param inc step to increment parameter */ /***********************************************************************/ float set_fparam(char text[], float minp, float start, float maxp, float inc) { float val; int done = FALSE; LCDClear(); LCDPrintf("Set Parameter\n%s\n", text); LCDMenu("+", "-", " ","OK"); val = start; do { LCDSetPos(5, 0); LCDPrintf("%f\n", val); switch(KEYGet()) { case KEY1: if (val < maxp) val += inc; break; case KEY2: if (val > minp) val -= inc; break; case KEY4: done = TRUE; } } while (!done); LCDClear(); return val; } /***********************************************************************/ /** Change driving parameters. Changes robot speed. */ /***********************************************************************/ void set_drv_params() { int ind = 0; int end_proc = FALSE; LCDClear(); LCDMenu("CHG", "NXT", " ", "END"); while (!end_proc) { LCDSetPos(0, 0); LCDPrintf("Driving param.\n"); LCDSetPos(2, 0); LCDPrintf("Lin speed\n"); LCDSetPos(3, 0); LCDPrintf("Rot speed\n"); LCDSetChar(2 + ind, 15, '*'); switch (KEYGet()) { case KEY1: switch(ind) { case 0: MaxVelLin = set_fparam("Lin speed", 0.0, MaxVelLin, 1.0, 0.1); break; case 1: MaxVelRot = set_fparam("Rot. speed", 0.0, MaxVelRot, 1.5, 0.1); break; default: break; } LCDMenu("CHG", "NXT", " ", "END"); break; case KEY2: LCDSetChar(2 + ind, 15, ' '); ind ++; if (ind > 1) ind = 0; break; case KEY4: LCDClear(); end_proc = TRUE; break; default: break; } } } void SensorValFrom0(int* Sensor) { int m_SensorOffset = 200; if (*Sensor < m_SensorOffset) *Sensor = 0; else *Sensor -= m_SensorOffset; } void speedFromSensor(int leftSensor, int rightSensor, double* linSpeed, double* rotSpeed) { int SensorRange = 824; int sumRight = 0, sumLeft = 0,i; SensorValFrom0(&leftSensor); SensorValFrom0(&rightSensor); if (m_bUseControl) { m_lastValues[m_currentValue][RIGHT] = rightSensor; m_lastValues[m_currentValue][LEFT] = leftSensor; /* set pointer to next element in list (will be overwritten in next cycle */ if (m_currentValue values per second */ buffer_pos += sprintf(sensorValues + buffer_pos, "%4d %4d\n", leftSensor, rightSensor); duplicateCounter =0; } } } /* m_nomValsPerSec == m_actValsPerSec: do nothing */ } /* beep every 100 sensor readings */ if (measurements > last100) { AUBeep(); if (buffer_pos +10 >= BUFFER_SIZE) AUBeep(); last100 += 100; } speedFromSensor(leftSensor, rightSensor, &linSpeed, &rotSpeed); OMNI_SetSpeed (m_vw, linSpeed, 0, rotSpeed); key = KEYRead(); }while (key != KEY3); OMNI_SetSpeed(m_vw, 0, 0, 0); dur_time = OSGetCount() - start_time; m_actValsPerSec = (100 * measurements)/dur_time; OSWait(100); LCDClear(); LCDPrintf("Speed: %d\nmeasurements\nper second\n", m_actValsPerSec); LCDPrintf("\nUpload sensor \nvalues?"); LCDMenu("Yes", "", "", "No"); if (KEYGet() == KEY1) sendstr(sensorValues, buffer_pos); else LCDClear(); break; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ case KEY2: /* - - - - - CTR - - - - - */ set_ctrl_params(); break; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ case KEY3: /* - - - - - DRV - - - - - */ set_drv_params(); break; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ case KEY4: /* - - - - END - - - - */ LCDClear(); exit_program = TRUE; break; default: break; } } while (!exit_program); OMNI_Release(m_vw); return 0; } /*@}*/