Dwengo/sumobot
Sumobot met Dwengo
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.
#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.
#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
#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
#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);
}
}
}
}