Stap 3: Code
Ik heb geprobeerd te schrijven van de code gemakkelijk genoeg om ook gewoon voor de beginners. Maar als u eventuele problemen, vragen en suggesties kan, ik graag willen weten.
Enkele tips:
- Minimale afstand is de remafstand ter voorkoming van de crash. De beste afstand van een blok te stoppen met de robot, is afhankelijk van de snelheid van de versnellingsbak.
- Robot komt terug naar max afstand.
- backDist en turnDist moeten worden aangepast afhankelijk van de snelheid van de robot.
- Een willekeurig gedrag, met inbegrip van een stop, heeft melodie en willekeurige beweging gebruikt.
//******************************
* Door: http://blog.mshams.ir *
//******************************
pincodes
Const byte pinMotor1 = 4, pinMotor2 5, pinMotor3 = = 6, pinMotor4 = 7;
Const byte pinLed = 8, pinTone = 10, pinSonar1 = 11, pinSonar2 = 12;
geluid freq
Const int toneFreq = 800;
sonar afstanden
Const byte minDistance = 45, maxDistance = 1000;
motor valt bestuurlijk
Const byte M_STOP = 0, M_GO = 1, M_BACK = 2, M_RIGHT = 3, M_LEFT = 4, M_RIGHT2X 5, M_LEFT2X = = 6;
robot Staten
Const byte R_START = 0, R_DRIVE = 1, R_BLOCK = 2, R_TURN = 3;
detecteren van de kater
Const int hangoverWait = 5000;
blok detecteren Ga terug
Const int backDist 1000, turnDist = = 300;
willekeurige gedrag
Const int randomChance = 300, randomStopWait = 10000, randomTurnWait = 200;
byte status = R_START;
int i, counter = 0;
int dist;
VOID Setup {}
randomSeed(analogRead(1));
init motor pinnen
pinMode (pinMotor1, OUTPUT);
pinMode (pinMotor2, OUTPUT);
pinMode (pinMotor3, OUTPUT);
pinMode (pinMotor4, OUTPUT);
pinMode (pinSonar1, OUTPUT);
pinMode (pinSonar2, INPUT);
init LED pin
pinMode (pinLed, OUTPUT);
}
void loop {}
schakelaar (staat) {}
Case R_START:
Motor(M_GO);
Melody();
staat = R_DRIVE;
breken;
Case R_DRIVE:
dist = Pingu();
Als (dist < minDistance) {}
Motor(M_STOP);
staat = R_BLOCK;
}
anders als (willekeurige (0, randomChance) == 5) {}
RandomTone();
Motor(M_STOP);
delay(randomStopWait);
Motor (willekeurige (M_BACK, M_LEFT2X + 1));
delay(randomTurnWait);
Motor(M_GO);
}
breken;
Case R_BLOCK:
Beep();
Motor(M_BACK);
delay(backDist);
Motor (willekeurige (M_RIGHT2X, M_LEFT2X + 1));
delay(turnDist);
staat = R_TURN;
breken;
Case R_TURN:
dist = Pingu();
Als (dist > = maxDistance) {}
Motor(M_STOP);
Motor(M_GO);
Beep();
staat = R_DRIVE;
}
else {}
teller += 1;
Als (teller > = hangoverWait) {}
Counter = 0;
Motor(M_STOP);
RandomTone();
staat = R_BLOCK;
}
}
breken;
}
}
VOID Blink (byte staat) {}
digitalWrite (pinLed, state);
}
VOID Beep() {}
Blink(1);
SpeakTone(2);
SpeakTone(1);
Blink(0);
}
VOID Melody() {}
Blink(1);
for (int i = 1; ik < 10; i ++) {}
SpeakTone(i);
}
Blink(0);
}
VOID RandomTone() {}
Blink(1);
for (int i = 1; ik < 10; i ++) {}
SpeakTone (random(1, 10));
}
Blink(0);
}
VOID SpeakTone(byte note) {}
Toon (pinTone, toneFreq * opmerking);
delay(100);
noTone(pinTone);
}
VOID Motor (byte staat) {}
byte m1, m2, m3, m4;
schakelaar (staat) {}
Case M_STOP:
M1 = m2 = m3 = m4 = laag;
breken;
Case M_GO:
M1 = hoog;
m2 = laag;
M3 = hoog;
M4 = laag;
breken;
Case M_BACK:
M1 = laag;
m2 = hoog;
M3 = laag;
M4 = hoog;
breken;
Case M_RIGHT:
M1 = hoog;
m2 = laag;
M3 = laag;
M4 = laag;
breken;
Case M_LEFT:
M1 = laag;
m2 = laag;
M3 = hoog;
M4 = laag;
breken;
Case M_RIGHT2X:
M1 = hoog;
m2 = laag;
M3 = laag;
M4 = hoog;
breken;
Case M_LEFT2X:
M1 = laag;
m2 = hoog;
M3 = hoog;
M4 = laag;
breken;
}
digitalWrite (pinMotor1, m1);
digitalWrite (pinMotor2, m2);
digitalWrite (pinMotor3, m3);
digitalWrite (pinMotor4, m4);
}
int Pingu() {}
digitalWrite (pinSonar1, laag);
delayMicroseconds(5);
digitalWrite (pinSonar1, hoge);
delayMicroseconds(5);
digitalWrite (pinSonar1, laag);
delayMicroseconds(2);
lange duur = pulseIn (pinSonar2, hoge);
retourneren (duur / 29 /2);
}