Arduino Robot som undviker mänskliga (3 / 3 steg)
Steg 3: Koden
Handhavande i detalj av ultraljud avstånd sensorn kunde hittas i HC_SR04 datablad.
Den kod som används i denna robot är egentligen enkel. I det viktigaste kretsar (loop()), det Mät avståndet genom att funktionen getDistance().
Om avståndet mellan roboten och hindret (i detta fall, mina händer) är alltför nära (säg 10cm), roboten flytta bakåt för 300 millisekunder och slumpmässigt slå vänster eller höger för ytterligare 200 millisekunder.
void loop()
{
avståndet = getDistance();
Serial.Print ("avstånd =");
Serial.Print(Distance);
Serial.println("cm");
om (avstånd < 10) {
robotBackward(300);
om (random(2)==0) {
robotRight(200);
} annat {
robotLeft(200);
}
}
robotStop(50);
}
Här är hur den "getDistance()" fungerar arbete:
float getDistance() {
digitalWrite (TRIGGER_PIN, låg);
delayMicroseconds(2);
digitalWrite (TRIGGER_PIN, hög);
delayMicroseconds(10);
digitalWrite (TRIGGER_PIN, låg);
Return (pulseIn (ECHO_PIN, hög) * 0,017);
}
Det sänder ut en stigande kanten på "Trig" stift genom första sända ut låg och följt av hög. Efter 10 micro-sekunder sänker det "Trig" signalen igen. Detta gör sensorn sänder ut ultraljud pulser. Det övervakar senare eko reflekteras av hinder. Om hindret är närmare, tar det mindre tid att ta emot ekon. Å andra sidan, om hindret är långt borta, tar det mer tid att vänta på ekon. Sensorn skickar ut en hög puls på "Echo" stift och puls bredd är lika med tur och retur fördröjningen av ultraljud pulserar (i mikrosekunder).
Eftersom ljudets hastighet är 340 meter/sekund, avståndet kunde beräknas av D = 0,5 * pulse_width * 340 m/s * 1e-6
Det fullständiga programmet listas här:
Pins controller motorer
#define motor1_pos 3
#define motor1_neg 10
#define motor2_pos 6
#define motor2_neg 9
#define motor_en A2
#define TRIGGER_PIN 15 / / (A1) Arduino PIN-kod knuten till utlösa pin på ultrasonic sensor.
#define ECHO_PIN 14 / / (A0) Arduino PIN-kod knuten till echo pin på ultrasonic sensor.
float avstånd;
void setup()
{
Serial.BEGIN(57600);
setupMotor();
}
void loop()
{
avståndet = getDistance();
Serial.Print ("avstånd =");
Serial.Print(Distance);
Serial.println("cm");
om (avstånd < 10) {
robotBackward(300);
om (random(2)==0) {
robotRight(200);
} annat {
robotLeft(200);
}
}
robotStop(50);
}
void setupMotor() {
pinMode(motor1_pos,OUTPUT);
pinMode(motor1_neg,OUTPUT);
pinMode(motor2_pos,OUTPUT);
pinMode(motor2_neg,OUTPUT);
pinMode(motor_en,OUTPUT);
enableMotor();
robotStop(50);
}
//-----------------------------------------------------------------------------------------------------
Ultrasonic avstånd Sensor
//-----------------------------------------------------------------------------------------------------
float getDistance() {
digitalWrite (TRIGGER_PIN, låg);
delayMicroseconds(2);
digitalWrite (TRIGGER_PIN, hög);
delayMicroseconds(10);
digitalWrite (TRIGGER_PIN, låg);
Return (pulseIn (ECHO_PIN, hög) * 0,017);
}
//-----------------------------------------------------------------------------------------------------
motor
//-----------------------------------------------------------------------------------------------------
void enableMotor() {
Slå på motorn förarens chip: L293D
digitalWrite (motor_en, hög);
}
void disableMotor() {
Stäng av motorn förarens chip: L293D
digitalWrite (motor_en, låg);
}
void robotStop (int ms) {
digitalWrite (motor1_pos, låg);
digitalWrite (motor1_neg, låg);
digitalWrite (motor2_pos, låg);
digitalWrite (motor2_neg, låg);
Delay(MS);
}
void robotForward (int ms) {
digitalWrite (motor1_pos, hög);
digitalWrite (motor1_neg, låg);
digitalWrite (motor2_pos, hög);
digitalWrite (motor2_neg, låg);
Delay(MS);
}
void robotBackward (int ms) {
digitalWrite (motor1_pos, låg);
digitalWrite (motor1_neg, hög);
digitalWrite (motor2_pos, låg);
digitalWrite (motor2_neg, hög);
Delay(MS);
}
void robotRight (int ms) {
digitalWrite (motor1_pos, låg);
digitalWrite (motor1_neg, hög);
digitalWrite (motor2_pos, hög);
digitalWrite (motor2_neg, låg);
Delay(MS);
}
void robotLeft (int ms) {
digitalWrite (motor1_pos, hög);
digitalWrite (motor1_neg, låg);
digitalWrite (motor2_pos, låg);
digitalWrite (motor2_neg, hög);
Delay(MS);
}