Sumobot met Dwengo

bewerken

Hier komt een tutorial om een Sumobot te maken met Dwengo en een rupsvoertuig. Deze tutorial wordt opgebouwd terwijl de leerlingen experimenteren en hopelijk uitgebreid met hun bevindingen.

Dwengo

We maken gebruik van het Dwengo - experimenteerbord. Meer info hierover vind je op de uitstekende website Dit projectje lijkt me niet ideaal om met Dwengo te starten. Hiervoor vind je wel uitstekende tutorials op de website. Als inleiding kan ik zeker ook dit eboekje aanraden.

Sumobot

Iedereen kent Sumo-worstelen, een Japanse sport waarbij schaarsgeklede meestal dikke mannen elkaar uit een cirkel proberen duwen.
Wereldwijd bestaan er vele robot-varianten. In verschillende gewichtscategorieën nemen ze het tegen elkaar op.
Wie het eerst de tegenstander uit de cirkel duwt is gewonnen.
De 'arena' is een zwartgekleurde cirkel met witte rand.
Er strikte regels voor de robots wat betreft afmetingen, sensoren en gewicht.

Materiaal

We maken gebruik van het standaard rupsvoertuig van Dwengo:

  • Dwengo - experimenteerdbord
  • Dwengo breadbord
  • Dwengo sensorbord
  • rupsvoertuig (of iets dat je zelf ineenknutselt)

Vereiste voorkennis

Dwengo wordt geprogrammeerd in C. Beperkte programmeerkennis is voldoende.

Voorbereidend werk

  • Aankopen / maken materiaal
  • Zelfgemaakte arena. (je kan uiteraard al starten voor deze arena af is. Kijk voor de juiste grootte naar de competitie waaraan je zal deelnemen)
  • Programmeeromgeving. website

Voorbeelden
Een eerste test
Een eerste gevecht

Stap 1: Robot programmeren die in zich in de cirkel voortbeweegt en de rand detecteert.

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

void main(void) {
  int teller,os1, os4, os5, os8, d1, d2; // variables for sensors

 initBoard();
 initLCD();
 initSensorModule();
 initMotor();
 powerLongRange(TRUE);
 teller = 0;
  while(TRUE) {
      os1 = readSensor(OS1, DIFF_MODE);
      os4 = readSensor(OS4, DIFF_MODE);
      printIntToLCD(os1 , 0, 10);
      printIntToLCD(os4 , 0, 0 );
      os8 = readSensor(OS8, ACTIVE_MODE);
      clearLCD();
      printIntToLCD(os8, 1, 0);
      
        

            if(os1 < 30 ){
                teller = 0;
              setSpeedMotor1(1023);
              setSpeedMotor2(1023);}
            else if (os4 < 30){
                  teller = 0;
              setSpeedMotor1(1023);
              setSpeedMotor2(1023);
              }
                   
            else{
            setSpeedMotor1(-750);
            setSpeedMotor2(-750);
            delay_ms(1000);
            setSpeedMotor1(-1023);
            setSpeedMotor2(1023);
            delay_ms(1500);
            }
            }  
 }
}

Stap 2: Sensor programmeren die tegenstander zoekt en aanval uitvoert.

bewerken
#include <dwengoBoard.h>
#include <dwengoConfig.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>
#include <dwengoMotor.h>
#include <dwengoSensorModule.h>
// To do in deze code: de delays zoveel mogelijk eruit halen omdat er dan geen sensoren worden ingelezen 
void main(void) {
  int os8,i;
  initBoard();
  initLCD();
  initMotor();
  initSensorModule();
  powerLongRange(TRUE);
  i=0;
  while (TRUE){                          // oneindige lus starten
  os8 = readSensor(OS8, ACTIVE_MODE);    // Lange Afstandssensor meten
  clearLCD();                            // LCD scherm leegmaken
  printIntToLCD(os8,1,0);                // Gemeten waarde op scherm weergeven   
 
                                        // Interpreteren waarde
  if (os8>30 ) {                        // Als de lange afstandssensor 'iets' detecteert
  setSpeedMotor1 (800);                 // Rechtdoor rijden 
  setSpeedMotor2 (800);
  delay_ms(400);                        
  }

  else                                  // Als de sensor niks detecteert
  {
      if (i<10){                       //De eerste 10 keer naar links draaien ... scannen naar een slachtoffer
      setSpeedMotor1 (-600);
      setSpeedMotor2 (600);
      delay_ms(400);
      i=i+1;
      }
      else if (i<20){                 //Dan naar rechts
      setSpeedMotor1 (600);
      setSpeedMotor2 (-600);
      delay_ms(400);
      i=i+1;
      }
      else
      {
       i=0;                          //Niks gevonden... we beginnen opnieuw
      }
  }
}
}

Stap 3: Stap 1 en 2 combineren

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

#define LINE       1
#define LIGHT     2
#define WALL      3

#define LIGHT_THRESHOLD     20

#define LINE_THRESHOLD     10

#define PROXIMITY_MIN_THRESHOLD 5
#define PROXIMITY_MAX_THRESHOLD  7
#define DISTANCE_THRESHOLD        70

#define MAX_SPEED_LIGHT    1023
#define LOW_SPEED_LIGHT    700

#define MAX_SPEED_LINE    900
#define LOW_SPEED_LINE  500

#define MAX_SPEED_WALL    1023
#define LOW_SPEED_WALL 550


void main(void) {
  int teller,os1, os4, os5, os8, d1, d2; // variables for sensors

 initBoard();
 initLCD();
 initSensorModule();
 initMotor();
 powerLongRange(TRUE);
 teller = 0;
  while(TRUE) {
      os1 = readSensor(OS1, DIFF_MODE);
      os4 = readSensor(OS4, DIFF_MODE);
      printIntToLCD(os1 , 0, 10);
      printIntToLCD(os4 , 0, 0 );
      os8 = readSensor(OS8, ACTIVE_MODE);
      clearLCD();
      printIntToLCD(os8, 1, 0);

      if (os8>30 ) {
  setSpeedMotor1 (800);
  setSpeedMotor2 (800);
  delay_ms(400);
  }

  else
  {
            if(os1 < 30 ){
                teller = 0;
              setSpeedMotor1(1023);
              setSpeedMotor2(1023);}
            else if (os4 < 30){
                  teller = 0;
              setSpeedMotor1(1023);
              setSpeedMotor2(1023);
              }
                   
            else{
            setSpeedMotor1(-750);
            setSpeedMotor2(-750);
            delay_ms(1000);
            setSpeedMotor1(-1023);
            setSpeedMotor2(1023);
            delay_ms(1500);
            }


  }

 }
}

Stap 4: Strategieën, finetunenen

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

#define LINE       1
#define LIGHT     2
#define WALL      3

#define LIGHT_THRESHOLD     20

#define LINE_THRESHOLD     10

#define PROXIMITY_MIN_THRESHOLD 5
#define PROXIMITY_MAX_THRESHOLD  7
#define DISTANCE_THRESHOLD        70

#define MAX_SPEED_LIGHT    1023
#define LOW_SPEED_LIGHT    700

#define MAX_SPEED_LINE    900
#define LOW_SPEED_LINE  500

#define MAX_SPEED_WALL    1023
#define LOW_SPEED_WALL 550


void main(void) {
  int teller,os1, os4, os5, os7, os6, os8, d1, d2; // variables for sensors

 initBoard();
 initLCD();
 initSensorModule();
 initMotor();
 powerLongRange(TRUE);
 teller = 0;
       
 setLedPattern(1,0,0,0,0,0,0,0);
 delay_ms(1000);
 setLedPattern(1,1,0,0,0,0,0,0);
 delay_ms(1000);
 setLedPattern(1,1,1,0,0,0,0,0);
 delay_ms(1000);
 setLedPattern(1,1,1,1,0,0,0,0);
 delay_ms(1000);
 setLedPattern(1,1,1,1,1,0,0,0);
 delay_ms(1000);

  while(TRUE) {
      os1 = readSensor(OS1, DIFF_MODE);
      os4 = readSensor(OS4, DIFF_MODE);
      //printIntToLCD(os1 , 0, 10);
      //printIntToLCD(os4 , 0, 0 );
      os8 = readSensor(OS8, ACTIVE_MODE);
      clearLCD();
      printIntToLCD(os8, 1, 0);



      if (os8>40 ) {
  setSpeedMotor1 (1023);
  setSpeedMotor2 (1023);
  delay_ms(400);
  if (os6 < 40){
      if (os5 < 40){
          setSpeedMotor1 (800);
          setSpeedMotor2 (-800);
          delay_ms(500);
      }
      else if (os7 < 40){
          setSpeedMotor1 (-800);
          setSpeedMotor2 (800);
          delay_ms(500);
      }
  }



  }

  else
  {
            if(os1 < 40 ){
                teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2(-800);}
            else if (os4 < 40){
                  teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2-(800);
              }
                   
            else{
            setSpeedMotor1(-750);
            setSpeedMotor2(-750);
            delay_ms(1000);
            setSpeedMotor1(-1023);
            setSpeedMotor2(1023);
            //delay_ms(1500);
            }


  }

 }
}

// verschil met vorige: hij wacht 5 sec voor de start, als hij geen target ziet blijft hij draaien en zoekt terwijl een vijand
// hij telt af en hij draait als hij hem enkel maar aan de zijkanten ziet
#include <dwengoConfig.h>
#include <dwengoBoard.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>
#include <dwengoSensorModule.h>
#include <dwengoMotor.h>

#define LINE       1
#define LIGHT     2
#define WALL      3

#define LIGHT_THRESHOLD     20

#define LINE_THRESHOLD     10

#define PROXIMITY_MIN_THRESHOLD 5
#define PROXIMITY_MAX_THRESHOLD  7
#define DISTANCE_THRESHOLD        70

#define MAX_SPEED_LIGHT    1023
#define LOW_SPEED_LIGHT    700

#define MAX_SPEED_LINE    900
#define LOW_SPEED_LINE  500

#define MAX_SPEED_WALL    1023
#define LOW_SPEED_WALL 550


void main(void) {
  int teller,os1,i, os4, os5, os8, d1, d2; // variables for sensors

 initBoard();
 initLCD();
 initSensorModule();
 initMotor();
 powerLongRange(TRUE);
 teller = 0;

 setLedPattern(1,0,0,0,0,0,0,1);
 delay_ms(1000);
 setLedPattern(0,1,0,0,0,0,1,0);
 delay_ms(1000);
 setLedPattern(0,0,1,0,0,1,0,0);
 delay_ms(1000);
 setLedPattern(0,0,0,1,1,0,0,0);
 delay_ms(1000);
 setLedPattern(1,1,1,1,1,1,1,1);
 delay_ms(1000);

  while(TRUE) {
      os1 = readSensor(OS1, DIFF_MODE);
      os4 = readSensor(OS4, DIFF_MODE);
     
      os8 = readSensor(OS8, ACTIVE_MODE);
     
      printIntToLCD(os8, 1, 0);
     




      if (os8<30){
      setSpeedMotor1 (-600);
      setSpeedMotor2 (600);
      delay_ms(200);
      
      }
      else if (os8<30){
      setSpeedMotor1 (600);
      setSpeedMotor2 (-600);
      delay_ms(200);
      
      }
    
      if (os8>100 ) {
  setSpeedMotor1 (1000);
  setSpeedMotor2 (1000);
  delay_ms(1500);
  }

  else
  {
            if(os1 < 30 ){
                teller = 0;
              setSpeedMotor1(1023);
              setSpeedMotor2(1023);}
            else if (os4 < 30){
                  teller = 0;
              setSpeedMotor1(1023);
              setSpeedMotor2(1023);
              }

            else{
            setSpeedMotor1(-750);
            setSpeedMotor2(-750);
            delay_ms(1000);
            setSpeedMotor1(-1023);
            setSpeedMotor2(1023);
            delay_ms(1000);
            }


  }

 }
}

Laatste code van 6IB

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

#define LINE       1
#define LIGHT     2
#define WALL      3

#define LIGHT_THRESHOLD     20

#define LINE_THRESHOLD     10

#define PROXIMITY_MIN_THRESHOLD 5
#define PROXIMITY_MAX_THRESHOLD  7
#define DISTANCE_THRESHOLD        70

#define MAX_SPEED_LIGHT    1023
#define LOW_SPEED_LIGHT    700

#define MAX_SPEED_LINE    900
#define LOW_SPEED_LINE  500

#define MAX_SPEED_WALL    1023
#define LOW_SPEED_WALL 550


void main(void) {
  int teller,os1, os4, os5, os7, os6, os8, d1, d2; // variables for sensors

 initBoard();
 initLCD();
 initSensorModule();
 initMotor();
 powerLongRange(TRUE);
 teller = 0;
       
 setLedPattern(1,0,0,0,0,0,0,1);
 delay_ms(1000);
 setLedPattern(1,1,0,0,0,0,1,1);
 delay_ms(1000);
 setLedPattern(1,1,1,0,0,1,1,1);
 delay_ms(1000);
 setLedPattern(1,1,1,1,1,1,1,1);
 delay_ms(1000);
 setLedPattern(0,0,0,0,0,0,0,0);
 delay_ms(1000);


  while(TRUE) {
      os1 = readSensor(OS1, DIFF_MODE);
      os4 = readSensor(OS4, DIFF_MODE);
      printIntToLCD(os1 , 0, 10);
      printIntToLCD(os4 , 0, 0 );
      os8 = readSensor(OS8, ACTIVE_MODE);
      clearLCD();
      printIntToLCD(os8, 1, 0);



      if (os8>40 ) {

           if(os1 > 40 || os4 > 40){
            setSpeedMotor1(-800);
            setSpeedMotor2(-800);
            delay_ms(1150);
            setSpeedMotor1(-1023);
            setSpeedMotor2(1023);
            //delay_ms(1150);
            }
  setSpeedMotor1 (1023);
  setSpeedMotor2 (1023);
  delay_ms(100);
  if (os6 < 40){
      if (os5 < 40){
          setSpeedMotor1 (800);
          setSpeedMotor2 (-800);
          delay_ms(2000);

          if(os1 < 40 ){
                teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2(-800);}
            else if (os4 < 40){
                  teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2-(800);
            }

      }
      else if (os7 < 40){
          setSpeedMotor1 (-800);
          setSpeedMotor2 (800);
          delay_ms(2000);
          
          if(os1 < 40 ){
                teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2(-800);}
            else if (os4 < 40){
                  teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2-(800);}


      }
  }



  }

  else
  {
            if(os1 < 40 ){
              teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2(-800);}
            else if (os4 < 40){
                  teller = 0;
              setSpeedMotor1(800);
              setSpeedMotor2-(800);
              }
                   
            else{
            setSpeedMotor1(-800);
            setSpeedMotor2(-800);
            delay_ms(1500);
            setSpeedMotor1(-1023);
            setSpeedMotor2(1023);
            //delay_ms(1500);
            }


  }

 }

 }
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.