Antibotsbot

Een robot die obstakels ontwijkt zonder ze aan te raken, blijft toch nog steeds iets speciaals. Ik heb zodus een script geschreven zodat hij (bijna) nergens tegenaan rijdt. Ik moet er wel nog wat aan verbeteren, want de robot zet zich soms vast in hoeken, en het duurt dan een tijdje voor dat hij eruit is. Het hoofdprogramma heb ik voornamlijk geschreven in Dwengo Blocks, de rest heb ik handmatig ingetipt.

Ik heb ondertussen een tweede versie gemaakt met geïntegreerde grondsensoren, die niet meer in hoeken vastzit en uitgerust is met een automatisch calibratieprogramma. Echter, er moeten nog enkele dingen verholpen worden voordat ik het programma op het web zet.

Het programma kan je zo in je robot programmeren. Zet wel de jumper JP2 op 5v zodat de robot niet te snel rijdt, indien je echter wilt dat hij sneller gaat, verplaats dan de jumper en verander dan de Threshold waardes TIME, TIME2 en TIME3 res. in 750, 300 en 1250.

Programma Antibotsbot:

#include <dwengoBoard.h>
#include <dwengoConfig.h>
#include <dwengoSensorModule.h>
#include <dwengoMotor.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>

#define MAX_SPEED    1023     //Min., max. en snelheid bij achteruit rijden.
#define AVE_SPEED       0
#define BACK_SPEED    700

#define THRESHOLD       6     //Threshold zijkant en midden.
#define THRESHOLDMID    4

#define TIME         1000     //Delay voor koerswijziging.
#define TIME2         500
#define TIME3        1750
#define SAFE           50     //Delay tegen overbelasting motoren.

void main(void) {

  int LS, RS, MID;  // variables for sensors

  initBoard();
  initLCD();
  initMotor();
  backlightOn(); 
  initSensorModule();
  powerLongRange(FALSE);               //Lange afstand sensor af.

  appendStringToLCD("Press button C");
  while (SW_C != PRESSED) {
  delay_ms(10);
  }  
         while(TRUE) {
        
         //Voorprogramma.

         MID = readSensor(OS6, DIFF_MODE);     //Definitie en lezen sensor midden.
         RS = readSensor(OS5, DIFF_MODE);      //Definitie en lezen sensoren zijkant.
         LS = readSensor(OS7, DIFF_MODE);

         //LCDprogramma.
    clearLCD();
    printStringToLCD("LS:", 0, 0);         //Scrijf LS:" op de eerste lijn.
    appendIntToLCD(LS);                    //Lees sensor rechts.

         printStringToLCD("RS:", 0, 9);         //Scrijf "RS:" op de eerste lijn.
    appendIntToLCD(RS);                    //Lees sensor links.
   
         printStringToLCD("MID:", 1, 0);        //Scrijf "MID:" op de tweede lijn.
    appendIntToLCD(MID);                   //Lees sensor midden.
   
         //Hoofdprogramma.
    if ((LS > THRESHOLD)) {
      if ((MID > THRESHOLDMID)) {
        stopMotors();
        delay_ms(SAFE);
        setSpeedMotor1(-MAX_SPEED);
        setSpeedMotor2(MAX_SPEED);
        delay_ms(TIME2);
        setSpeedMotor1(0);
        delay_ms(TIME3);
        stopMotors();
      }
      else {
        setSpeedMotor2(-AVE_SPEED);
        delay_ms(TIME);
      }
    }
    else {
      if ((RS > THRESHOLD)) {
        if ((MID > THRESHOLDMID)) {
          stopMotors();
          delay_ms(SAFE);
          setSpeedMotor1(-MAX_SPEED);
          setSpeedMotor2(MAX_SPEED);
          delay_ms(TIME2);
          setSpeedMotor2(0);
          delay_ms(TIME3);
          stopMotors();
        }
        else {
          setSpeedMotor1(AVE_SPEED);
          delay_ms(TIME);
        }
      }
      else {
        delay_ms(SAFE);
        setSpeedMotor1(MAX_SPEED);
        setSpeedMotor2(-MAX_SPEED);
      }
    }
         //Einde hoofdprogramma.
  }
}

Je kan de robot aan de hand van het terrein nog wat meer "tunen" d.m.v. het veranderen van de Threshold-waardes. Ik ben momenteel bezig met een verbetering van het programma, zodat hij geen probleem meer heeft met de hoeken. Ook de integratie van een kompas staat op het programma. Ideeën zijn altijd welkom!

Geen opmerkingen:

Een reactie posten