Autonoma Autonavigation Robot (Arduino) (4 / 4 steg)

Steg 4: programmering



Vi använder Arduino Uno programmeringsspråk. Den är baserad på Java.
Här är vår exempelkod för navigering med hjälp av 2D-matriser. Inne i 2D array rutnätet input vi antingen 0 eller 1. En 1 representerar ett objekt eller ett hinder. En 0 representerar ledigt utrymme. Roboten färdas genom 0.

Grid navigering:

DETTA ÄR ETT PROGRAM FÖR ATT KARTLÄGGA ETT OMRÅDE MED 2D MATRISER OCH NAVIGERA SEDAN ENDAST IGENOM DE
NOLLOR NÄRVARANDE. ULTRALJUDSSENSORER ANVÄNDS INTE ÄVEN OM DE HAR INITIERATS.
KODARE ANVÄNDS OCKSÅ INTE UTAN INITIERAS

Wolrath

#include "Servo.h"

Motorer
Servo motor1;
Servo motor2;

Roterande pulsgivare
int encoderAPin = 4; Vänster / / PIN-kod för den roterande encoderA
int encoderBPin = 2; Höger / / PIN-kod för den roterande encoderB
int encoderAPosition = 0; position-mätare för encoderA
int encoderBPosition = 0; position-mätare för encoderB
int signalAInput1; signalingång 1 för encoderA
int signalAInput2; signalingång 2 för encoderA
int signalBInput1; signalingång 1 för encoderB
int signalBInput2; signalingång 2 för encoderB

robot läge service
0 är upp
1 är rätt
2 är nere
3 är kvar
int robotDirection = 2;

Detta är koordinaterna i rutnätet med där roboten är
Det är också x och y index i matrisen.
kom ihåg att matrisen startar vid index 0.
int xcoordinate = 2;
int ycoordinate = 1;

Ultrasonic pins
CONST int Trig_pin = 5; PIN-kod för att utlösa puls INPUT
CONST int Echo_pin = 6; PIN-kod för att ta emot echo OUPUT
lång varaktighet; Hur lång tid det tar för ljudet att återhämta

motoriska pins
CONST int Motor1Pin = 9; Vänster sida
CONST int Motor2Pin = 10; höger sida

matrisen som det spår med
Detta kan vara en matris med valfri storlek
se bara till att roboten har ett fritt utrymme att flytta till från sitt ursprungliga läge.
int arraything [6] [6] =
{
{1,1,1,1,1,1}
,
{1,1,0,1,0,1}
,
{1,1,0,1,0,1}
,
{1,1,0,1,0,1}
,
{1,1,0,1,1,1}
,
{1,1,1,0,1,1}
};

Ogiltiga inställningar () {
Rotationsencoder
pinMode (encoderAPin, ingång);
pinMode (encoderBPin, ingång);
Serial.BEGIN(9600);
Serial.println ("Start nu...");
\

ultraljud
pinMode (Trig_pin, OUTPUT); initiera puls stiftet som utdata:
pinMode (Echo_pin, indata); initiera echo_pin PIN-koden som indata:

motorsmmmmmmmmm
motor1.attach(Motor1Pin);
motor2.attach(Motor2Pin);

}

Detta program ser i svenska, om det finns något framför den.
Om nej, den rör sig rakt. Om ja, kontrollerar sin rätt.
Om sin rätt är gratis, det visar på så sätt, annars, kontrollerar den vänster.
Om vänster är gratis, det visar på så sätt, annars, det visar bara 180 grader
och går tillbaka hur det kom.
//
Bredvid do är att encorporate början och destination samt optimal väg att hitta
//
Senast är att använda det ultraljuds med grid.

Ogiltig loop () {

medan (1 == 1) {
om (isFrontOpen() == true) {
moveForward();
fördröjning (2000);
}
annat
om (isRightOpen() == true) {
turnRight();
fördröjning (2000);
}
annat
om (isLeftOpen() == true) {
turnLeft();
fördröjning (2000);
}
annat {
turnAround();
fördröjning (2000);
}
}
}

Kontrollerar om det finns något precis framför den med galler
booleska isFrontOpen () {
int nextNumber = getFrontNumber();
om (nextNumber == 0) {
return true;
}
annat {
returnera false;
}
}

Kontrollerar om det finns något till höger om den med galler
booleska isRightOpen() {
int nextNumber = getRightNumber();
om (nextNumber == 0) {
return true;
}
annat {
returnera false;
}
}

Kontrollerar om det finns något till vänster om den med galler
booleska isLeftOpen() {
int nextNumber = getLeftNumber();
om (nextNumber == 0) {
return true;
}
annat {
returnera false;
}
}

Rör sig rakt fram.
void moveForward () {
motor1.write(180);
motor2.write(0);

Serial.println("forward");
om (robotDirection == 0)
ycoordinate = ycoordinate - 1;
om (robotDirection == 1)
xcoordinate = xcoordinate + 1.
om (robotDirection == 2)
ycoordinate = ycoordinate + 1.
om (robotDirection == 3)
xcoordinate = xcoordinate - 1;
fördröjning (100);
/ * Serial.print("xcoordinate");
Serial.Print(xcoordinate);
fördröjning (500).
Serial.Print ("ycoordinate");
Serial.Print(ycoordinate);
fördröjning (500).
Serial.Print ("robot riktning:");
Serial.Print(robotDirection);
Delay(500);
Serial.println ();
Delay(1000);

*/
Delay(800);
}

Vrider 90 grader till höger
void svänghöger () {
motor1.write (60);
motor2.write (60);
Delay(178);
motor2.write(95);
Delay(65);
motor1.write(90);
Serial.println("Right");
om (robotDirection == 0)
robotDirection = 1;
annat if (robotDirection == 1)
robotDirection = 2;
annat if (robotDirection == 2)
robotDirection = 3;
annat if (robotDirection == 3)
robotDirection = 0;
fördröjning (500).
Serial.Print("xcoordinate");
Serial.Print(xcoordinate);
fördröjning (500).
Serial.Print ("ycoordinate");
Serial.Print(ycoordinate);
fördröjning (500).
Serial.Print ("robot riktning:");
Serial.Print(robotDirection);
fördröjning (500).
Serial.println();

Delay(1000);
}

Vrider 90 grader till vänster
void svängvänster () {
motor1.write(120);
motor2.write(120);
Delay(325);
motor2.write(95);
Delay(65);
motor1.write(90);
Serial.println("left");
om (robotDirection == 0)
robotDirection = 3;
annat if (robotDirection == 1)
robotDirection = 0;
annat if (robotDirection == 2)
robotDirection = 1;
annat if (robotDirection == 3)
robotDirection = 2;
fördröjning (500).
Serial.Print("xcoordinate");
Serial.Print(xcoordinate);
fördröjning (500).
Serial.Print ("ycoordinate");
Serial.Print(ycoordinate);
fördröjning (500).
Serial.Print ("robot riktning:");
Serial.Print(robotDirection);
Delay(500);
Serial.println();
Delay(1000);
}

Vänder 180 grader
void vändning () {
Delay(1000);
Serial.println("Around");
om (robotDirection == 0)
robotDirection = 2;
annat if (robotDirection == 1)
robotDirection = 3;
annat if (robotDirection == 2)
robotDirection = 0;
annat if (robotDirection == 3)
robotDirection = 1;
fördröjning (500).
Serial.Print("xcoordinate");
Serial.Print(xcoordinate);
fördröjning (500).
Serial.Print ("ycoordinate");
Serial.Print(ycoordinate);
fördröjning (500).
Serial.Print ("robot riktning:");
Serial.Print(robotDirection);
Delay(500);
Serial.println();

Delay(1000);
}

Får numret på nätet utrymme rätt framför den.
int getFrontNumber() {
om (robotDirection == 0) {
återgå arraything [ycoordinate - 1] [xcoordinate];
}
om (robotDirection == 1) {
återgå arraything [ycoordinate] [xcoordinate + 1];
}
om (robotDirection == 2) {
återgå arraything [ycoordinate + 1] [xcoordinate];
}
om (robotDirection == 3) {
återgå arraything [ycoordinate] [xcoordinate - 1];
}
}

Får numret på nätet av utrymmet till höger om den.
int getRightNumber() {
om (robotDirection == 0) {
återgå arraything [ycoordinate] [xcoordinate + 1];

}
om (robotDirection == 1) {
återgå arraything [ycoordinate + 1] [xcoordinate];

}
om (robotDirection == 2) {
återgå arraything [ycoordinate] [xcoordinate - 1];
}
om (robotDirection == 3) {
återgå arraything [ycoordinate - 1] [xcoordinate];
}
}

Blir numret på nätet av utrymmet till vänster om den.
int getLeftNumber() {
om (robotDirection == 0) {
återgå arraything [ycoordinate] [xcoordinate - 1];
}
om (robotDirection == 1) {
återgå arraything [ycoordinate - 1] [xcoordinate];
}
om (robotDirection == 2) {
återgå arraything [ycoordinate] [xcoordinate + 1];
}
om (robotDirection == 3) {
återgå arraything [ycoordinate + 1] [xcoordinate];
}
}

Här är prov program för ultraljudssensorer. Detta program kommer att bara undvika allting som kommer i vägen.
Ingår i programmet är programmering för en extra servo bara snurrar fram och tillbaka på toppen av roboten. Om du inte gör detta på din robot, ignorera den del av koden, det ska ha någon effekt på ditt program.

DENNA KOD UNDVIKER HINDER
DET KAN ANTINGEN STÖTER PÅ ETT HINDER PÅ HÖGER ELLER VÄNSTER SIDA
DÄRFÖR PROGRAMMERADE VI DET TUR TILL VÄNSTER OM DET UPPSTÅR ETT HINDER TILL HÖGER
OCH RÄTT OM VI STÖTT PÅ DET TILL VÄNSTER

Wolrath

/*
Ultraljud 1
Stift 5 utlöser pulsen (gula leda)
Stift 6 får Echo (Orange leda)

Ultraljud 2
Stift 7 utlöser pulsen (gula leda)
Stift 8 får Echo (Orange leda)
*/

#include "Servo.h"
Servo motorR;
Servo motorL;
Servomotorer;

Ultrasonic pins
ultraljud rätt
CONST int Trig1_pin = 5; PIN-kod för att utlösa puls INPUT
CONST int Echo1_pin = 6; PIN-kod för att ta emot echo OUPUT
lång varaktighet 1; Hur lång tid det tar för ljudet att återhämta

Ultrasonic vänster
CONST int Trig2_pin = 7.
CONST int Echo2_pin = 8;
långa Företagsvaraktighet 2;

motoriska pins
CONST int MotorLPin = 2; Vänster
CONST int MotorRPin = 13. Höger

spinning ultraljudsmotor
CONST int MotorSpinPin = 3;
int spinCounter = 0;

Sensing eller inte
booleska isARightWallThere = false;
booleska isALeftWallThere = false;

vilken väg att vända
booleska höger = sant;

void setup() {
Serial.BEGIN(9600);
Serial.println ("Start");
ultraljud 1
pinMode (Trig1_pin, OUTPUT); initiera puls stiftet som utdata:
pinMode (Echo1_pin, indata); initiera echo_pin PIN-koden som indata:
ultraljud 2
pinMode (7, OUTPUT); initiera puls stiftet som utdata:
pinMode (Echo2_pin, indata); initiera echo_pin PIN-koden som indata:
motorer
motorR.attach(MotorRPin);
motorL.attach(MotorLPin);
motorS.attach(MotorSpinPin);

}

void loop() {
medan (1 == 1) {

om (spinCounter < 2) {
motorS.write(160);
}
annat {
motorS.write(20);
}
om (spinCounter > = 3) {
spinCounter = 0;
}

spinCounter ++;

checkTheRightWall();
checkTheLeftWall();

om (isARightWallThere == false & & isALeftWallThere == false) {
motorR.write(120);
motorL.write(72);

}
annat {

om (isARightWallThere == true & & isALeftWallThere == true) {

motorR.write(0);
motorL.write(180);
Delay(300);
motorR.write(80);
motorL.write(80);
Delay(500);
motorR.write(0);
motorL.write(180);

}

annat {
om (isARightWallThere == false & & isALeftWallThere == true) {

motorR.write(50);
motorL.write(90);

}
annat {
om (isARightWallThere == true & & isALeftWallThere == false) {

motorR.write(90);
motorL.write(140);
}

}

}

}

}
}

void checkTheRightWall () {
digitalWrite (Trig1_pin, låg);
delayMicroseconds(2);
digitalWrite (Trig1_pin, hög);
delayMicroseconds(10);
digitalWrite (Trig1_pin, låg);
varaktighet 1 = pulseIn(Echo1_pin,10);
Serial.println ("varaktighet 1:");
Serial.println (varaktighet 1, DEC);

om ((varaktighet 1 > 4000 || Företagsvaraktighet 1 == 0)) {
isARightWallThere = false;
}
annat {
isARightWallThere = sant;
}

}

void checkTheLeftWall() {
digitalWrite (7, låg).
delayMicroseconds(2);
digitalWrite (7, hög).
delayMicroseconds(10);
digitalWrite (7, låg).
Företagsvaraktighet 2 = pulseIn(Echo2_pin,10);
Serial.println ("Företagsvaraktighet 2:");
Serial.println (Företagsvaraktighet 2, DEC);

om ((Företagsvaraktighet 2 > 4000 || Företagsvaraktighet 2 == 0)) {
isALeftWallThere = false;
}
annat {
isALeftWallThere = sant;
}

}

Om du har tid, kolla in en av min väns sidor. Han är den som gjorde all programmering för oss.
Här är länken till hans sida:

Slutet
Gnista industrier,

Se Steg
Relaterade Ämnen

Autonoma Solar Robot steg 1

bakgrund:Hej, mitt namn är Ben Rawstron och detta är roboten har jag arbetat på, nyligen i min sophomore (tionde klass) året i gymnasiet. Jag skapade detta projekt som en "oberoende studie" på min lokala skola här i Waldoboro Maine eftersom jag...

Chefbot: En DIY autonoma mobil robot för att servera mat på Hotell

Som titeln säger, ska vi se hur man bygger en autonom mobil robot kallas Chefbot som är för servering av mat och dryck i hotell och restauranger.Detta var ett hobbyprojekt och jag byggde denna robot efter att ha sett en robot som kallas Turtlebot2. H...

Autonoma mobil Robot med ROS clumsybot

vår inomhus autonoma mobil robot med ROS, Rtabmap, raspberry pi 2, kinect, ubuntu14.04 ltsVårt Examensarbetevår inomhus autonoma mobil robot med ROS, Rtabmap, raspberry pi 2, kinect, ubuntu14.04 lts vi installerar ubuntu 14.04 LTS och ROS indigo på l...

Robot Arduino fysiska Etoys Lego Technic 9390

http://www.youtube.com/watch?v=fjEgFETZJDs&feature=player_detailpage&list=PL_OV7t1UYttjlaLJniWTt3DXYMK7F67z7Robot Arduino fysiska Etoys Lego Technic 9390En este pequeño Robot le dotamos de dos fotorresistencias LDR para poder hacer tres programas...

Billig autonoma Humanoid Robot

möta Johnny 5.Han är en autonom humanoid robot som är 53 cm lång, väger bara ca 1 kg och har 20 servomotorer varje kan 14 kg * cm vridmoment. Ombord, anpassade kretskort knyta ihop fyra kraftfulla mikroprocessorer: två 500 MHz Blackfin DSP (en för va...

Robot Arduino 4x2 Scratch S4A Map

-Totalmente compatible con el Robot Arduino Minibloq.En este pequeño roboten le vamos en hacer diferentes programas de forma fácil e intuitiva utilizando el programa gráfico S4A basado en la plataforma repa.Lo podremos dirigir desde el to del ordenad...

Fönstret måleri Robot (arduino, bearbetning, accelerometer)

idén till projektet kom från en av mina favorit "ibles: polargraph. Jag älskade ritformat och tänkte hur coolt det vore att göra detta på sidan av en byggnad? Tyvärr utmaningarna till att inrätta en sådan stor polargraph på en student budget drivit m...

MANUELL / AUTONOM kontroll ROBOT (med SENSOR FUSION teknik)

DTMF eller två tonar flera frekvenser är fiffiga lilla sätt att kontrollera maskiner med din mobiltelefon. Detta instructable visar du, milda läsaren hur man gör en billigare än smuts DTMF kontrollerade robot som kan också fungera SJÄLVSTÄNDIGT, yeh!...

Hur man gör ett hinder att undvika Robot Arduino stil

du alltid velat göra en av dessa coola robotar som kan i princip undvika alla objekt. Men du inte har tillräckligt med pengar för att köpa en av de riktigt dyra sådana, med redan skär delar där allt material där det för dig. Om du är lik mig gillar d...

Terra spindel: Autonoma sanering Robot

Detta projekt ritades och byggdes av studenter i programmet arkitektur vid Kalifornien College of the Arts; Manali Chitre (MAAD), Anh Vu (BArch) och Mallory Van Ness (mars). Studio kursen hette kreativ arkitektur-maskiner (hösten 2014) och undervisad...

Autonoma brandman Robot

Det är en robot som självständigt upptäcka och släcka brand. Det använder lågan sensor för upptäckt och arduino styrelsen för bearbetning. Brandsläckare tillsammans med elektronisk ventil (ställdon) används för att släcka den upptäckta eld.Roboten ro...

Undvikande Robot Arduino

I marknaden för roboten, det finns gott om smarta undvikande robot kit till salu, men jag gillar inte att köpa färdiga kit, att utveckla gamla rc bil leksaker i förvaringsbox är mer utmaning. Bygga en undvikande robot med hjälp av dess chassi. Instal...

R2D2 ljud på din Robot, Arduino

Jag hämtade ljud från Youtube på min Arduino kompatibla MP3-spelare och dela denna framgång med dig.Alla ljud, musik eller ljudspår kan laddas ner och spelas på din dator eller på din MP3-spelare.Skölden på bilden har jag brukade spela den tillbaka m...

Rover robot - Arduino och lasercut plywood

Rover Robot är den mest grundläggande konstruktion som du kan bygga med LOFI Robot EDUBOX kit. Rover är en bas för de flesta andra robot konstruktioner som hinder skatteundandragande, ljus efter, målning, kontrollera över bluetooth, etc.LOFI Robot är...

Spider Pig - autonoma hexapod robot

Ungkarl examensarbete av en grupp av sju studenter (i teknisk fysik och elektroteknik) vid Linköpings universitet.Viktigaste hårdvara:1 x PhantomX AX metall Hexapod Mark II Kit (inklusive 18 x Dynamixel AX-12 servon, exklusive ArbotiX Robocontroller)...

"Liten Tank" Robot Arduino/Picaxe/Tamiya plattform

Snygg liten laser cut tank design, en följeslagare till detta instructable. Som svar på den dåligt gjorda erbjudanden på marknaden, och ett allmänt behov av en klar att gå, lätt att anpassa spårade plattform. Använder en Tamiya 70097 motor/växellåda...

Autonavigation Robots

I worked on these with AStarkFuture.Du hittar hela instructable här:...

Byggnaden av Q.T.Pi: en Robot autonoma Sumo

Vill du lära dig hur man bygger en robot?Detta Instructables kommer att berätta hur vi byggt våra 20lb (9.07185 kg) autonomaSumo Robot.Det är så vi började med att bygga sumo bots. Den lokala college som håller den årliga Sumo Bot konkurrensenhar int...

Labyrint Problemlösaren Robot, med artificiell intelligens med Arduino

(Om du gillar detta Instructable, glöm inte att rösta på det (ovan: högra hörnet flaggan). Rex, roboten tävlar på ROBOTICS och sensorer tävlingar. Tack så mycket! ;-)Detta Instructable utvecklades på mitt senaste projekt: rad efterföljare Robot - PID...