Stap 63: Code
Okay - dus - is wanneer u werkt met code het ideaal om iets te gebruiken als Github om wijzigingen bij te houden. Ik doe dit niet. Dus, ik per ongeluk schreef over de meest recente werkversie van de code. Ik heb de laatst opgeslagen versie, maar ik ben niet zeker hoe compleet is. Het is waarschijnlijk een beetje buggy.
Novertheless, aangezien niemand van u zal waarschijnlijk bouwen dit ding aanwezig die manier, en het bed is momenteel in stukken en niet operationeel is, ik ga om te posten wat ik heb.
Ik ben ook het delen van code van de test voor handmatig controleren van de motoren. Als u op zoek bent op dit project voor een Arduino aan zeer grote motoren via een Alltrax motor controller interfacing, zullen deze code meer nuttig aan u hoe dan ook.
Laatst opgeslagen versie van de Robot Bed test code:
/ * Deze voorbeeldcode is in het publieke domein. * / //establish gashendel pinnen int leftThrottle = 3; LED aangesloten op digital pin 9 int rightThrottle = 5; LED aangesloten op digital pin 9 //establish solenoïde pinnen int leftOn = 7; LED aangesloten op digital pin 9 int rightOn = 8; LED aangesloten op digital pin 9 //establish relais pinnen int leftReverse = 9; int rightReverse = 10; De snelheid van het station verzonden naar de gashendel int gospeed = 86; vluchtige int foserious = 0; VOORSTE int FrontLeftSnd = 30; int FrontLeftRcv = 31; int FrontCenterSnd = 32; int FrontCenterRcv = 33; int FrontRightSnd = 34; int FrontRightRcv = 35; RECHTERKANT int Side1LeftSnd = 36; int Side1LeftRcv = 37; int Side1CenterSnd = 38; int Side1CenterRcv = 39; int Side1RightSnd = 40; int Side1RightRcv = 41; TERUG int BackLeftSnd = 42; int BackLeftRcv = 43; int BackCenterSnd = 44; int BackCenterRcv = 45; int BackRightSnd = 46; int BackRightRcv = 47; LEFT SIDE int. Side2LeftSnd = 49; int Side2LeftRcv = 48; int Side2CenterSnd = 51; int Side2CenterRcv = 50; int Side2RightSnd = 53; int Side2RightRcv = 52; matrix met alle van de namen input- en output-pin. Later gebruikt om te lezen alle van de sensoren in een for-lus. int [SensorOutputs] = {FrontLeftSnd, FrontCenterSnd, FrontRightSnd, Side1LeftSnd, Side1CenterSnd, Side1RightSnd, BackLeftSnd, BackCenterSnd, BackRightSnd, Side2LeftSnd, Side2CenterSnd, Side2RightSnd}; int [SensorInputs] = {FrontLeftRcv, FrontCenterRcv, FrontRightRcv, Side1LeftRcv, Side1CenterRcv, Side1RightRcv, BackLeftRcv, BackCenterRcv, BackRightRcv, Side2LeftRcv, Side2CenterRcv, Side2RightRcv}; int dontgo = 0; aantal totale sensoren int SensorCount = 12; int nothingHappening = 0; int realCloseLike = 0; int goingforward = 0; int goingbackward = 0; int goingright = 0; int goingleft = 0; int backhit = 0; int fronthit = 0; int righthit = 0; int lefthit = 0; int amountToMove = 1000; int geplukt; void setup {cli (); //stop interrupts TCCR1A = 0; / / set hele TCCR1A register op 0 TCCR1B = 0; / / zelfde voor TCCR1B TCNT1 = 0; //initialize waarde van de teller op 0 / / set vergelijk wedstrijd inschrijven voor 1 hz stappen OCR1A = 512; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (moet < 65536) / / CTC modus TCCR1B inschakelen | = (1 << WGM12); / / Set CS10 en CS12 bits voor 1024 prescaler TCCR1B | = (1 << CS12) | (1 << CS10); inschakelen van de timer vergelijk interrupt TIMSK1 | = (1 << OCIE1A); Sei (); //allow interrupts Serial.begin(9600); pinMode (leftOn, OUTPUT); pinMode (rightOn, OUTPUT); pinMode (leftReverse, OUTPUT); pinMode (rightReverse, OUTPUT); Zorg ervoor dat de stroom is uitgeschakeld digitalWrite (leftOn, laag); digitalWrite (rightOn, laag); digitalWrite (leftReverse, laag); digitalWrite (rightReverse, laag); bumper sensor pins pinMode (18, INPUT); pinMode (19, INPUT); Bepaalde afstand sensor output pinnen pinMode (FrontLeftSnd, uitvoer); PIN 30 pinMode (FrontCenterSnd, uitvoer); PIN 32 pinMode (FrontRightSnd, uitvoer); PIN 34 pinMode (Side1LeftSnd, uitvoer); PIN 36 pinMode (Side1CenterSnd, uitvoer); PIN 38 pinMode (Side1RightSnd, uitvoer); PIN 40 pinMode (BackLeftSnd, uitvoer); PIN 42 pinMode (BackCenterSnd, uitvoer); PIN 44 pinMode (BackRightSnd, uitvoer); PIN 46 pinMode (Side2LeftSnd, uitvoer); PIN 49 pinMode (Side2CenterSnd, uitvoer); PIN 51 pinMode (Side2RightSnd, uitvoer); PIN 53 //Set afstandssensor input pins pinMode (FrontLeftRcv, INPUT); PIN 31 pinMode (FrontCenterRcv, INPUT); PIN 33 pinMode (FrontRightRcv, INPUT); PIN 35 pinMode (Side1LeftRcv, INPUT); PIN 37 pinMode (Side1CenterRcv, INPUT); PIN 39 pinMode (Side1RightRcv, INPUT); PIN 41 pinMode (BackLeftRcv, INPUT); PIN 43 pinMode (BackCenterRcv, INPUT); PIN 45 pinMode (BackRightRcv, INPUT); PIN 47 pinMode (Side2LeftRcv, INPUT); PIN 48 pinMode (Side2CenterRcv, INPUT); PIN 50 pinMode (Side2RightRcv, INPUT); PIN 52 //And wacht een ogenblik delay(3000); } void loop {lookAllAround(); moveRobot(); delay(amountToMove); slowstop(); delay(1500);} ISR(TIMER1_COMPA_vect) {//Interrupt op freq van 1kHz tot meten reed switch rietschakelaar / / genereerd pols golf van frequentie 8kHz/2 = 4 kHz (neemt twee cycli voor volledige Golf-toggle hoog dan laag schakelen) als (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {if(digitalRead(18) == HIGH) {hardstop(); Serial.println(goingbackward); Serial.println(goingforward); Serial.println(goingleft); Serial.println(goingright); Serial.println ("FUCK YEAH!"); if(goingright == 1) {righthit = 1; goingright = 0;} if(goingleft == 1) {lefthit = 1; goingleft = 0;} if(goingbackward == 1) {backhit = 1; goingbackward = 0;} if(goingforward == 1) {fronthit = 1; goingforward = 0;}} } Als (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {if(digitalRead(19) == HIGH) {hardstop(); Serial.println ("FUCK Nee!"); Serial.println(goingbackward); Serial.println(goingforward); Serial.println(goingleft); Serial.println(goingright); if(goingbackward == 1) {backhit = 1; goingbackward = 0;} if(goingforward == 1) {fronthit = 1; goingforward = 0;} if(goingright == 1) {righthit = 1; goingright = 0;} if(goingleft == 1) {lefthit = 1; goingleft = 0;}} ongeldig moveRobot()}} {//first zien als hit--als raken tijdens het verplaatsen in een van de richtingen - auto-Kies de andere richting / /--anders kiezen willekeurig if(backhit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 0;} anders if(fronthit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 1;} anders if(lefthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 2;} anders if(righthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 3; } else {geplukt = random(3); Serial.println ("WTF!?"); amountToMove = 1000; } switch(picked) {0 kast: goingforward = 1; goingbackward = 0; goingright = 0; goingleft = 0; forwards(); Serial.println ("Ga voorwaarts"); breken; geval 1: goingforward = 0; goingbackward = 1; goingright = 0; goingleft = 0; Backwards(); Serial.println ("Ga terug"); breken; geval 2: goingforward = 0; goingbackward = 0; goingright = 1; goingleft = 0; rechts(); Serial.println ("Ga rechts"); breken; Case 3: goingforward = 0; goingbackward = 0; goingright = 0; goingleft = 1; datumwaarde; Serial.println ("Ga links"); breken; } delay(1); vertraging tussen leest voor stabiliteit} ongeldig forwards() {//activate de omgekeerde Relais digitalWrite (leftReverse, hoge) delay(50) digitalWrite (rightReverse, hoge); delay(100); //activate de elektromagneten digitalWrite (leftOn, hoge); digitalWrite (rightOn, hoge); //take een adem-delay(500); //engage de gasklep analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} ongeldig backwards() {//activate de elektromagneten digitalWrite (leftOn, hoog), digitalWrite (rightOn, hoge); //take een adem delay(500); / / betrekken van de gasklep analogWrite (rightThrottle gospeed); analogWrite (leftThrottle, gospeed); } ongeldig rechts() {if(dontgo == 0) {//activate de elektromagneten digitalWrite (leftOn, hoge); digitalWrite (rightOn, hoge) //activate de omgekeerde Relais digitalWrite (rightReverse, hoge); //take een adem-delay(500); //engage de gasklep analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} //reset de variabele dontgo = 0;} ongeldig datumwaarde {if(dontgo == 0) {//activate de elektromagneten digitalWrite (leftOn, hoge); digitalWrite (rightOn, hoge) //activate de omgekeerde Relais digitalWrite (leftReverse, hoge); //take een adem-delay(500); //engage de gasklep analogWrite (rightThrottle gospeed); analogWrite (leftThrottle, gospeed); } //reset de variabele dontgo = 0; } void slowstop() {voor (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / de waarde (bereik van 0 tot 255) ingesteld: analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); / / wait voor 30 milliseconden om te zien de dimmen effect delay(500);} digitalWrite (leftOn, laag); digitalWrite (rightOn, laag); digitalWrite (leftReverse, laag); digitalWrite (rightReverse, laag); int goingforward = 0; int goingbackward = 0; int goingright = 0; int goingleft = 0; delay(2000); lookAllAround(); delay(1000);} void hardstop() {voor (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / de waarde (bereik ingesteld van 0 tot 255): analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); wacht 30 milliseconden om te zien de dimmen effect altDelay(50); } digitalWrite (leftOn, laag); digitalWrite (rightOn, laag); digitalWrite (leftReverse, laag); digitalWrite (rightReverse, laag); } ongeldig altDelay(int x) {voor (unsigned int ik = 0; ik < = x; i ++) {delayMicroseconds(1000);}} void lookAllAround() {lange duur, inch, cm; voor (int thisPin = 0; thisPin < 1; thisPin ++) {digitalWrite (SensorOutputs [thisPin], lage); delayMicroseconds(2); digitalWrite (SensorOutputs [thisPin], hoge); delayMicroseconds(12); digitalWrite (SensorOutputs [thisPin], LOW), duur = pulseIn (SensorInputs [thisPin], hoge); digitalWrite (SensorOutputs [thisPin], laag); / / omzetten van de tijd in een afstand inch = microsecondsToInches(duration); Serial.Print(SensorOutputs[thisPin]); Serial.Print(":"); Serial.Print(inches); Serial.println ("in"); //check en controleer nogmaals / / als (> 10 inch & & < 25 inch) {/ / realCloseLike = 0; / / voor (int checkagain = 0; checkagain < 3; checkagain ++) {/ / delay(100); / / digitalWrite (SensorOutputs [thisPin], laag); / / delayMicroseconds(2); / / digitalWrite (SensorOutputs [thisPin], hoge); / / delayMicroseconds(12); / / digitalWrite (SensorOutputs [thisPin], laag); / / / / duur = pulseIn (SensorInputs [thisPin], hoge); / / duim = microsecondsToInches(duration); / / digitalWrite (SensorOutputs [thisPin], laag); / / / / delay(100); / / / / als (> 10 inch & & < 25 inch) {/ / / / Serial.print(SensorOutputs[thisPin]); / / Serial.print (" : "); Serial.Print(inches); Serial.println ("in"); / / realCloseLike = realCloseLike + 1; / / Als (realCloseLike > 2) {/ / dontgo = 1; / /} / /} / /} / /} //Takes ongeveer 1/2 seconde om te controleren alles van de sensoren @ 50uS delay(100); de lange microsecondsToInches(long microseconds)}} {/ / volgens de Parallax gegevensblad voor de PING))), er zijn / / 73.746 microseconden per inch (dwz geluid reizen aan 1130 voeten per / / seconde). Dit geeft de afstand die is afgelegd door de ping, uitgaande / / en terugkeer, dus wij door 2 delen te krijgen van de afstand van het obstakel. Zie: < een href = "http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf" >< een href = "http://www.parallax.com/dl/docs/prod/acc/28015-PI... < / a" > http://www.parallax.com/dl/docs/prod/acc/28015-PI...</a>> keren microseconden / 74 / 2; }
Motorische controle test codevoorbeeld:
/ * Deze voorbeeldcode is in het publieke domein. * / //establish gashendel pinnen int leftThrottle = 3; LED aangesloten op digital pin 9 int rightThrottle = 5; LED aangesloten op digital pin 9 //establish solenoïde pinnen int leftOn = 7; LED aangesloten op digital pin 9 int rightOn = 8; LED aangesloten op digital pin 9 //establish relais pinnen int leftReverse = 9; int rightReverse = 10; De snelheid van het station verzonden naar de gashendel int gospeed = 82; int nothingHappening = 0; int realCloseLike = 0; int goingforward = 0; int goingbackward = 0; int goingright = 0; int goingleft = 0; int backhit = 0; int fronthit = 0; int righthit = 0; int lefthit = 0; int amountToMove = 1000; int timeToWait = 30000; int geplukt; void setup {cli (); //stop interrupts TCCR1A = 0; / / set hele TCCR1A register op 0 TCCR1B = 0; / / zelfde voor TCCR1B TCNT1 = 0; //initialize waarde van de teller op 0 / / set vergelijk wedstrijd inschrijven voor 1 hz stappen OCR1A = 512; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (moet < 65536) / / CTC modus TCCR1B inschakelen | = (1 << WGM12); / / Set CS10 en CS12 bits voor 1024 prescaler TCCR1B | = (1 << CS12) | (1 << CS10); inschakelen van de timer vergelijk interrupt TIMSK1 | = (1 << OCIE1A); Sei (); //allow interrupts Serial.begin(9600); pinMode (leftOn, OUTPUT); pinMode (rightOn, OUTPUT); pinMode (leftReverse, OUTPUT); pinMode (rightReverse, OUTPUT); Zorg ervoor dat de stroom is uitgeschakeld digitalWrite (leftOn, laag); digitalWrite (rightOn, laag); digitalWrite (leftReverse, laag); digitalWrite (rightReverse, laag); bumper sensor pins pinMode (18, INPUT); pinMode (19, INPUT); En wacht een ogenblik delay(3000); } void loop {datumwaarde; delay(amountToMove); slowstop(); delay(timeToWait); backwards(); delay(amountToMove); slowstop(); delay(timeToWait); forwards(); delay(amountToMove); slowstop(); delay(timeToWait); rechts(); delay(amountToMove); slowstop(); delay(timeToWait); / / / rechts(); delay(amountToMove); slowstop(); delay(timeToWait); forwards(); delay(amountToMove); slowstop(); delay(timeToWait); backwards(); delay(amountToMove); slowstop(); delay(timeToWait); datumwaarde; delay(amountToMove); slowstop(); delay(timeToWait); / / / forwards(); delay(amountToMove); slowstop(); delay(timeToWait); backwards(); delay(amountToMove); slowstop(); delay(timeToWait); forwards(); delay(amountToMove); slowstop(); delay(timeToWait); backwards(); delay(amountToMove); slowstop(); delay(timeToWait);} ISR(TIMER1_COMPA_vect) {//Interrupt op freq van 1kHz tot meten reed switch rietschakelaar / / genereerd pols golf van frequentie 8kHz/2 = 4 kHz (neemt twee cycli voor volledige Golf-toggle hoog dan laag schakelen) als (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {if(digitalRead(18) == HIGH) {hardstop(); Serial.println(goingbackward); Serial.println(goingforward); Serial.println(goingleft); Serial.println(goingright); Serial.println ("FUCK YEAH!"); if(goingright == 1) {righthit = 1; goingright = 0;} if(goingleft == 1) {lefthit = 1; goingleft = 0;} if(goingbackward == 1) {backhit = 1; goingbackward = 0;} if(goingforward == 1) {fronthit = 1; goingforward = 0;}} } Als (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {if(digitalRead(19) == HIGH) {hardstop(); Serial.println(goingbackward); Serial.println(goingforward); Serial.println(goingleft); Serial.println(goingright); Serial.println ("FUCK Nee!"); if(goingbackward == 1) {backhit = 1; goingbackward = 0;} if(goingforward == 1) {fronthit = 1; goingforward = 0;} if(goingright == 1) {righthit = 1; goingright = 0;} if(goingleft == 1) {lefthit = 1; goingleft = 0;}} ongeldig moveRobot()}} {//first zien als hit--als raken tijdens het verplaatsen in een van de richtingen - auto-Kies de andere richting / /--anders kiezen willekeurig if(backhit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 0;} anders if(fronthit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 1;} anders if(lefthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 2;} anders if(righthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; geplukt = 3; } else {geplukt = random(3); Serial.println ("WTF!?"); amountToMove = 1000; } switch(picked) {0 kast: goingforward = 1; goingbackward = 0; goingright = 0; goingleft = 0; forwards(); Serial.println ("Ga voorwaarts"); breken; geval 1: goingforward = 0; goingbackward = 1; goingright = 0; goingleft = 0; Backwards(); Serial.println ("Ga terug"); breken; geval 2: goingforward = 0; goingbackward = 0; goingright = 1; goingleft = 0; rechts(); Serial.println ("Ga rechts"); breken; Case 3: goingforward = 0; goingbackward = 0; goingright = 0; goingleft = 1; datumwaarde; Serial.println ("Ga links"); breken; } delay(1); vertraging tussen leest voor stabiliteit} ongeldig forwards() {//activate de omgekeerde Relais digitalWrite (leftReverse, hoge) delay(50) digitalWrite (rightReverse, hoge); delay(100); //activate de elektromagneten digitalWrite (leftOn, hoge); digitalWrite (rightOn, hoge); //take een adem-delay(500); //engage de gasklep analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} ongeldig backwards() {//activate de elektromagneten digitalWrite (leftOn, hoog), digitalWrite (rightOn, hoge); //take een adem delay(500); / / betrekken van de gasklep analogWrite (rightThrottle gospeed); analogWrite (leftThrottle, gospeed); } ongeldig rechts() {//activate de elektromagneten digitalWrite (leftOn, hoge); digitalWrite (rightOn, hoge) //activate de omgekeerde Relais digitalWrite (rightReverse, hoge); //take een adem-delay(500); //engage de gasklep analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} ongeldig datumwaarde {//activate de elektromagneten digitalWrite (leftOn, hoge); digitalWrite (rightOn, hoge) //activate de omgekeerde Relais digitalWrite (leftReverse, hoge); //take een adem-delay(500); //engage de gasklep analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle gospeed); } void slowstop() {voor (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / de waarde (bereik van 0 tot 255) ingesteld: analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); / / wait voor 30 milliseconden om te zien de dimmen effect delay(500);} digitalWrite (leftOn, laag); digitalWrite (rightOn, laag); digitalWrite (leftReverse, laag); digitalWrite (rightReverse, laag); int goingforward = 0; int goingbackward = 0; int goingright = 0; int goingleft = 0;} void hardstop() {voor (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / de waarde (bereik van 0 tot 255) ingesteld : analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); wacht 30 milliseconden om te zien de dimmen effect altDelay(50); } digitalWrite (leftOn, laag); digitalWrite (rightOn, laag); digitalWrite (leftReverse, laag); digitalWrite (rightReverse, laag); } ongeldig altDelay(int x) {voor (unsigned int i = 0; ik < = x; i ++) {delayMicroseconds(1000);}}