Seed sprida Robot (60 / 65 steg)
Steg 60: Program
/*
Utsäde sprida Robot exempelkod
För mer information besök:
Denna kod är i public domain.
*/
int motorRotateCounter = 0; räknaren för antal motor rotationer
int hallState = 0; aktuell status för hall effekt sensor
int lastHallState = 0; tidigare tillstånd av hall effekt sensorn
fastställa variabler för varaktigheten av ping,
och avstånd resultatet i tum och centimeter:
lång varaktighet, tum, cm;
servo2 är ansluten till Arduino pin10
#define servo2control OCR1B
servo konstanter--trim som behövs
#define servo2null 2980
//////////
CONST int pingPin = 7.
//////////
int StoredMotorData = 0;
ändra detta nummer om du vill ändra mängden vänster / höger rotation - i millisekunder
int LeftRotation = 900;
int RightRotation = 1000;
hur snart roboten bromsar från hinder - i tum
int wallDistance = 15.
tätheten av ränder över gräsmattan
int nextRow = 1000;
void setup() {
pinMode (5, ingång); Hall effekt
pinMode(10,OUTPUT); servo PWM stift
TCCR1B = 0b00011010; Snabb PWM, topp i ICR1, /8 prescale (.5 uSec)
TCCR1A = 0b00100010; tydlig på Jämför match, snabb PWM
Om du använder pin 9 som normala ingång eller utgång, använda TCCR1A = 0b00100010
Om du använder stift 10 som normala ingång eller utgång, använda TCCR1A = 0b10000010
ICR1 = 39999; 40.000 klockor @.5 oss = 20mS
servo2control = servo2null; kontroller chip pin 16 ARDUINO stift 10
Setup kanal A
pinMode (12, OUTPUT); Initierar Motor kanal A stift
pinMode (9, OUTPUT); Initierar broms kanal A stift
Ställa in kanal B
pinMode (13, OUTPUT); Initierar Motor kanal A stift
pinMode (8, OUTPUT); Initierar broms kanal A stift
vänta 5 sekunder innan du går
Delay(5000);
ställa in inches ovanför ena foten
inches = 24.
Serial.BEGIN(9600);
}
void loop() {
disengageBrake();
driva fram
Forward();
Starta frö spridare servo
servo2control = 2000.
Delay(10);
checkForRotation();
PingRead();
PING sensor test
Serial.println(inches);
IF(inches < wallDistance) {
sluta köra
engageBrake();
stoppa utsäde spridaren
servo2control = servo2null;
vänta två sekunder
Delay(2000);
Kontrollera avståndet igen.
Detta är att redogöra för saker och ting framför den kort
och felaktiga avläsningar
PingRead();
om det är fortfarande något framför den, är det förmodligen staketet
IF(inches < wallDistance) {
vi spela in hur många rotationer motorn att få över gräsmattan
StoredMotorData = motorRotateCounter;
och sedan vi återställa räknaren motor rotation
motorRotateCounter = 0;
Aktivera motorn att flytta
disengageBrake();
Låt oss vända rätt
Right();
denna försening avgör mängden rotation.
från tester på trägolv är 1 sekund (1000 mikrosekunder) ungefär 90 grader.
måste förmodligen vara tweeked för gräsmatta. Ändra rotation värde ovan
att ange rotation fördröjning för hela koden.
Delay(RightRotation);
sluta köra
engageBrake();
//
DRIVA FRAM LITE HÄR
//
Delay(100);
disengageBrake();
Forward();
Delay(nextRow);
engageBrake();
//
Kolla avstånd - om väggen inom avstånd -> sedan stopp!!!
//
IF(inches < wallDistance) {
vänta två sekunder
Delay(2000);
Kontrollera avståndet igen.
Detta är att redogöra för saker och ting framför den kort
och felaktiga avläsningar
PingRead();
om det är fortfarande något framför den, är det förmodligen staketet
IF(inches < wallDistance) {
While(1) {};
}
}
//
rätt igen
//
Delay(500);
disengageBrake();
Right();
Delay(RightRotation);
engageBrake();
//
KÖRA FRAMÅT MOTORROTATIONS
ENGAGERA SERVO
//
servo2control = 2000.
disengageBrake();
medan ((StoredMotorData + 5) > motorRotateCounter) {
Forward();
Delay(50);
checkForRotation();
}
motorRotateCounter = 0;
StoredMotorData = 0;
engageBrake();
servo2control = servo2null;
//
Sväng vänster
//
Delay(500);
disengageBrake();
Left();
Delay(LeftRotation);
engageBrake();
//
DRIVA FRAM LITE HÄR
//
Delay(100);
disengageBrake();
Forward();
Delay(nextRow);
engageBrake();
//
Kolla avstånd - om väggen inom avstånd -> sedan stopp!!!
//
IF(inches < wallDistance) {
vänta två sekunder
Delay(2000);
Kontrollera avståndet igen.
Detta är att redogöra för saker och ting framför den kort
och felaktiga avläsningar
PingRead();
om det är fortfarande något framför den, är det förmodligen staketet
IF(inches < wallDistance) {
While(1) {};
}
}
//
vänster igen
//
Delay(500);
disengageBrake();
Left();
Delay(LeftRotation);
engageBrake();
vänta två sekunder innan de kör bil tillbaka
Delay(2000);
}
}
}
void checkForRotation() {
Läs ingångsstift hall effekt:
hallState = digitalRead(5);
Jämför tillståndet hall effekt till sitt tidigare tillstånd
om (hallState! = lastHallState) {
om staten har förändrats, öka räknaren
om (hallState == hög) {
om det aktuella läget är hög då sensorn
wend från av till på:
motorRotateCounter ++;
Serial.Print ("antal halva rotationer skjuter:");
Serial.println(motorRotateCounter);
}
}
spara det aktuella läget som den förra staten,
för nästa gång genom öglan
lastHallState = hallState;
}
/////////////////////???? ////
kör motoriska funktioner / /
/////////////////////////////
void engageBrake() {
digitalWrite 8, hög. Engagera sig bromsen för kanal A
digitalWrite (9, hög). Engagera sig bromsen för kanal B
}
void disengageBrake() {
digitalWrite 8, låg. Engagera sig bromsen för kanal A
digitalWrite (9, låg). Engagera sig bromsen för kanal B
}
void forward() {
Motor en framåt @ full fart
digitalWrite 12, låg. Upprättar riktning framåt av kanal A
digitalWrite (9, låg). Lossa bromsen för kanal A
analogWrite (3, 255); Snurrar motorn på kanal A i full fart
Motor B bakåt @ halvfart
digitalWrite 13, hög. Upprättar bakåt riktning av kanal B
digitalWrite 8, låg. Lossa bromsen för kanal B
analogWrite (11, 255); Snurrar motorn på kanal B på halvfart
}
void backward() {
Motor en framåt @ full fart
digitalWrite 12, hög. Upprättar riktning framåt av kanal A
digitalWrite (9, låg). Lossa bromsen för kanal A
analogWrite (3, 255); Snurrar motorn på kanal A i full fart
Motor B bakåt @ halvfart
digitalWrite 13, låg. Upprättar bakåt riktning av kanal B
digitalWrite 8, låg. Lossa bromsen för kanal B
analogWrite (11, 255); Snurrar motorn på kanal B på halvfart
}
void left() {
Motor en framåt @ full fart
digitalWrite 12, hög. Upprättar riktning framåt av kanal A
digitalWrite (9, låg). Lossa bromsen för kanal A
analogWrite (3, 255); Snurrar motorn på kanal A i full fart
Motor B bakåt @ halvfart
digitalWrite 13, hög. Upprättar bakåt riktning av kanal B
digitalWrite 8, låg. Lossa bromsen för kanal B
analogWrite (11, 255); Snurrar motorn på kanal B på halvfart
}
void right() {
Motor en framåt @ full fart
digitalWrite 12, låg. Upprättar riktning framåt av kanal A
digitalWrite (9, låg). Lossa bromsen för kanal A
analogWrite (3, 255); Snurrar motorn på kanal A i full fart
Motor B bakåt @ halvfart
digitalWrite 13, låg. Upprättar bakåt riktning av kanal B
digitalWrite 8, låg. Lossa bromsen för kanal B
analogWrite (11, 255); Snurrar motorn på kanal B på halvfart
}
/////////////////////////////////
distansera sensor funktioner / /
/////////////////////////////////
void PingRead() {
PING))) utlöses av en hög puls av 2 eller fler mikrosekunder.
Ge en kort låg puls förhand för att säkerställa en ren hög puls:
pinMode (pingPin, produktionen);
digitalWrite (pingPin, låg);
delayMicroseconds(2);
digitalWrite (pingPin, hög);
delayMicroseconds(5);
digitalWrite (pingPin, låg);
Samma PIN-koden används för att läsa signalen från PING))): en hög
puls vars längd är tid (i mikrosekunder) från den sändande
ping till mottagning av dess eko av ett objekt.
pinMode (pingPin, ingång);
längd = pulseIn (pingPin, hög);
konvertera tiden till ett avstånd
tum = microsecondsToInches(duration);
Delay(100);
}
för PING andra till tum konvertering
lång microsecondsToInches(long microseconds)
{
Enligt Parallaxs datablad för PING))), det finns
73.746 mikrosekunder per tum (dvs. ljud resor på 1130 fot per
det andra). Detta ger vägsträcka som ping, utgående
och tillbaka, så vi delar med 2 att få distansera av hindret.
Se: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
återvända mikrosekunder / 74 / 2;
}