OmniWorm: en rundstrålande Robot Inchworm (5 / 5 steg)
Steg 5: Program, så njut av din nya Robot!
Nedan är att undvika hinder koden för OmniWorm! Känn dig fri att anpassa det därmed.
------------------------------------------------------------------------------------
Vad du behöver ändra:
------------------------
SERVO kod: Två servon kan visa olika riktningar för varje vinkel
skickas till den. Därför testa varje servo seperatly. Ställa dem den
Max vinkel innan du monterar dem för att säkerställa att roboten kommer att vika in
en låda och att servon inte kommer att driva separat riktningar. Också,
Du kan behöva använda sjätte servo (servoFront2) beroende på den
vikt för din design. Min är endast 3 kg totalt så jag inte behöver det: P
SERVON: 313WP servon går från 20 till 160 grader utan att redigera den
servo bibliotek. 140 grader är bra nog för det här programmet
dock. Om du använder olika servon, kan du få mer eller mindre än
140 grader. Om servo är beräknat för 180 grader och du får en
mycket mindre, antingen använda pwm eller försöka ändra min och max pulsewidths
i servo biblioteket (servo.h). Redigera filen, downoad Notepad ++
MOTORISKA kod: Jag använder en halv-bruten robust motor förare från robusta
kretsar. Stift märkt EM är fastlödda kat2 på skölden som den
normala stift inte ändra riktning. Om du använder samma
sköld, sedan radera EM och bära! Om du använder en h-bron,
känner sedan fri att använda stift 3, 11-13 eller välja din egen. Var försiktig
inte att övermanna kretsen ändå! Nedan finns länkar till tutorials.
Den sista länken är där du kan köpa den sköld som jag använder!
http://ITP.NYU.edu/physcomp/Labs/DCMotorControl
http://www.ECS.UMass.edu/ECE/M5/tutorials/H-Bridge_tutorial.html
http://www.societyofrobots.com/schematics_h-bridgedes.shtml
http://www.ruggedcircuits.com/motor-Control/Rugged-motor-driver
MOTORER: Gör din plånbok en stor tjänst och inte riva sönder namebrand
Parallex servon att köra som DC-motorer (om inte om de var trasiga
som mitt var). Om du gör hacka dem, helt enkelt skruva loss baksidan,
dra tre trådar av, sätt tillbaka skruvarna i att hålla den
växellåda tillsammans (vissa hotglue kan hjälpa), och noggrant löda en
tråd till varje DC motor slutet bara. Överskjutande löda kan Sila setup.
Men jag skulle helt enkelt köpa gul robot hjul/gearboxs på ebay.
Sök för "robot hjul" och de kommer att dyka upp. Alternativt, Använd
360 graders servon som... ja... servon! Du kan lägga till eller
subtrahera vinklar för framåt/bakåt rörelse.
FUNKTIONER: Måste du redigera funktioner (eller spela med sladdar)
för att få det att fungera med din design. Några bra gamla försök och misstag
kommer att göra susen!
Några ord av råd:
----------------------
Om du använder en extern strömkälla för din servon, ansluta
marken till arduino är marken. Också vara försiktig med att koppla in
batteriet i backwords eller kort det ut... det kan lätt döda
servon. Dessutom om du övermanna ett servo kan den dö. Start
servon bort på låg effekt och arbeta dig upp. Min setup är
Pushing den... > :)
Jag skulle föreslå att du hitta (eller göra!) din egen h-bro till contol
din motors. Också, Anslut marken till arduino. Var noga med
inte dominera din setup! Slutligen håller en reset funktion setup
från kortslutning.
Glöm inte att du behöver luta sensorer om du ska stoppa sidan
hjulen från att flytta när du ritar ström!
Känner mig inte begränsad till stift jag använder. Välj din egen digital
Pins!!!
Min kod är anpassade från:
------------------------
http://www.ruggedcircuits.com/Rugged-motor-driver
http://Arduino.cc/en/reference/ServoWrite
http://arduinobasics.blogspot.com/2012/11/arduinobasics-HC-sr04-Ultrasonic-sensor.html
*/
#include < Servo.h >
Inkludera Servo biblioteket så vi behöver inte använda PWM
Servo servoFront;
Servo servoFront2;
Servo servoTail;
Servo servoTail2;
Servo servoBack;
Servo servoBack2;
Detta definierar våra servo namn (servoFront etc.)
Aktivera (PWM) utgångar (robust sköld)
#define EN1_PIN 3
#define EN2_PIN 11
Riktning-utgångar (robust sköld)
#define DIR1_PIN 12
#define DIR2_PIN 13
#define EM 10 //Cause 13 inte vill arbeta. Otur nummer! =/
#define echoPin 8 / / Echo Pin (för ultrasonic sensor)
#define trigPin 9 / / Trigger Pin (för ultrasonic sensor)
int maximumRange = 200. Maximal räckvidd krävs (kan ändras)
int minimumRange = 0; Minsta område behövs (kan ändras)
lång varaktighet, avstånd; Längd används för att beräkna avstånd
void setup() {
servoFront.attach(6);
servoTail.attach(1);
servoTail2.attach(2);
servoBack.attach(4);
servoBack2.attach(5);
pinMode (EN1_PIN, OUTPUT);
digitalWrite (EN1_PIN, låg);
pinMode (EN2_PIN, OUTPUT);
digitalWrite (EN2_PIN, låg);
pinMode (DIR1_PIN, OUTPUT);
digitalWrite (DIR1_PIN, låg);
pinMode (DIR2_PIN, OUTPUT);
digitalWrite (DIR2_PIN, låg);
pinMode (trigPin, produktionen);
pinMode (echoPin, ingång);
Ställa in/utgångar för motorer/servon/sensor
Closed();
fördröjning (1000);
Håller roboten lagt innan loopen börjar.
}
void loop() {
Nollställ;
Delay(50);
Closed();
Scan(); mäter distans via ultrasonic sensor
Delay(90);
om (avstånd < = 20 & & avstånd > = 0) {//if avståndet är mindre än 15 cm
Opened();
Delay(1000);
Reset();
Delay(50);
spin_right();
Opened();
Delay(1500);
Closed();
Delay(1000);
Scan();
Delay(800);
om (avstånd < = 15 & & avstånd > = 0) {
Opened();
Delay(1000);
Reset();
Delay(50);
spin_left();
Opened();
Delay(2200);
}
annat {
Reset();
Delay(50);
inch();
inch();
inch();
inch();
inch();
}
}
annat {//if avståndet är större än 15 cm
Reset();
Delay(50);
Closed();
Forward();
Delay(1000);
}
}
/*
Nedan finns funktioner som vi kallar genom ut våra loop. Det gör livet mycket
enklare, eftersom du kan styra flera stift och servon på en gång!
*/
void closed() {
servoFront.write(20);
servoTail.write(20);
servoTail2.write(160);
servoBack.write(20);
servoBack2.write(160);
}
void opened() {
servoFront.write(140);
servoTail.write(20);
servoTail2.write(160);
servoBack.write(100);
servoBack2.write(80);
}
void inch() {
Closed();
Delay(1000);
servoTail.write(160);
servoTail2.write(20);
Delay(1000);
servoTail.write(160);
servoTail2.write(20);
servoBack.write(160);
servoBack2.write(20);
Delay(1000);
servoTail.write(20);
servoTail2.write(160);
servoBack.write(160);
servoBack2.write(20);
Delay(1000);
servoFront.write(140);
Delay(1000);
}
void spin_right() {
digitalWrite (DIR1_PIN, hög);
analogWrite (EN1_PIN, 255);
digitalWrite (DIR2_PIN, hög);
analogWrite (EN2_PIN, 255);
digitalWrite (EM, hög);
}
void spin_left() {
digitalWrite (DIR1_PIN, låg);
analogWrite (EN1_PIN, 255);
digitalWrite (DIR2_PIN, hög);
analogWrite (EN2_PIN, 255);
digitalWrite (EM, låg);
}
void backward() {
digitalWrite (DIR1_PIN, hög);
analogWrite (EN1_PIN, 255);
digitalWrite (DIR2_PIN, låg);
digitalWrite (EM, hög);
analogWrite (EN2_PIN, 255);
}
void forward() {
digitalWrite (DIR2_PIN, hög);
analogWrite (EN2_PIN, 255);
digitalWrite (DIR1_PIN, låg);
analogWrite (EN1_PIN, 255);
digitalWrite (EM, hög);
}
void reset() {
analogWrite (EN2_PIN, 0);
analogWrite (EN1_PIN, 0);
Delay(15);
}
void scan() {
digitalWrite (trigPin, låg);
delayMicroseconds(2);
digitalWrite (trigPin, hög);
delayMicroseconds(10);
digitalWrite (trigPin, låg);
längd = pulseIn (echoPin, hög);
Beräkna avståndet (i cm) baserat på ljudets hastighet.
avståndet = varaktighet/58,2;
Delay(50);
}