Schritt 63: Code
Okay - so - beim Arbeiten mit Code es ideal ist, um etwas wie Github verwenden, um Änderungen nachzuverfolgen. Ich tu das nicht. So schrieb ich versehentlich über die aktuelle Arbeitsversion des Codes. Ich habe die letzte gespeicherte Version, aber ich bin mir nicht sicher, wie weit es ist. Es ist wahrscheinlich ein wenig fehlerhaft.
Novertheless, da keiner von euch wahrscheinlich dieses Ding was Weg, und das Bett befindet sich in Stücke zu bauen und nicht in Betrieb, ich werde einfach Posten wird, was ich habe.
Ich verbreite auch Testcode für manuelle Steuerung von Motoren. Suchst du an diesem Projekt für die Anbindung von Arduino, sehr große Motoren durch einen Alltrax motor Controller, wird dieser Code sowieso mehr nützlich für Sie sein.
Zuletzt gespeicherte Version der Roboter Bett Testcode:
/ * Dieses Beispiel-Code ist in der Public Domain. * / //establish Drossel pins Int LeftThrottle = 3; LED verbunden mit digitalen Stift 9 Int RightThrottle = 5; LED mit digitalen Stift 9 //establish Magnet Pins Int LeftOn verbunden = 7; LED mit digitalen Stift 9 Int RightOn verbunden = 8; LED verbunden mit digitalen Stift 9 //establish Schütz Pins Int LeftReverse = 9; Int RightReverse = 10; Die Laufwerksgeschwindigkeit geschickt, um die Drosselklappe Int Gospeed = 86; volatile Int Foserious = 0; VORDERE Int FrontLeftSnd = 30; Int FrontLeftRcv = 31; Int FrontCenterSnd = 32; Int FrontCenterRcv = 33; Int FrontRightSnd = 34; Int FrontRightRcv = 35; RECHTEN Seite Int Side1LeftSnd = 36; Int Side1LeftRcv = 37; Int Side1CenterSnd = 38; Int Side1CenterRcv = 39; Int Side1RightSnd = 40; Int Side1RightRcv = 41; HINTEREN Int BackLeftSnd = 42; Int BackLeftRcv = 43; Int BackCenterSnd = 44; Int BackCenterRcv = 45; Int BackRightSnd = 46; Int BackRightRcv = 47; LINKE Seite Int Side2LeftSnd = 49; Int Side2LeftRcv = 48; Int Side2CenterSnd = 51; Int Side2CenterRcv = 50; Int Side2RightSnd = 53; Int Side2RightRcv = 52; Array aller der Input- und Output-Pin-Namen. Später verwendet, um alle Sensoren im Lesen eine for-Schleife. 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; Anzahl der insgesamt 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 abgeholt; void setup() {Cli (); //stop Interrupts TCCR1A = 0; / / gesamte TCCR1A-Register auf 0 TCCR1B = 0; / / gleiche für TCCR1B TCNT1 = 0; //initialize Zählerstand auf 0 / / Satz Compare Match Register für 1 hz-Schritten OCR1A = 512; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (muss < 65536) / / CTC-Modus TCCR1B | = (1 << WGM12); / / Set CS10 und CS12 bits für 1024 Vorteiler TCCR1B | = (1 << CS12) | (1 << CS10); Timer-Compare Interrupt TIMSK1 ermöglichen | = (1 << OCIE1A); //allow Interrupts Serial.begin(9600) (Sei); PinMode (LeftOn, Ausgang); PinMode (RightOn, OUTPUT); PinMode (LeftReverse, Ausgang); PinMode (RightReverse, Ausgang); Stellen Sie sicher, dass das Gerät ausgeschaltet DigitalWrite (LeftOn, LOW); ist DigitalWrite (RightOn, LOW); DigitalWrite (LeftReverse, LOW); DigitalWrite (RightReverse, LOW); Stoßstange Sensor Stifte PinMode (18, Eingang); PinMode (19, Eingang); Vorgegebene Distanz Sensor Output Pins PinMode (FrontLeftSnd, OUTPUT); Klemme 30 PinMode (FrontCenterSnd, OUTPUT); PIN 32 PinMode (FrontRightSnd, OUTPUT); 34-Pin-PinMode (Side1LeftSnd, OUTPUT); PIN 36 PinMode (Side1CenterSnd, OUTPUT); PIN 38 PinMode (Side1RightSnd, OUTPUT); PIN 40 PinMode (BackLeftSnd, OUTPUT); PIN 42 PinMode (BackCenterSnd, OUTPUT); Stift 44 PinMode (BackRightSnd, OUTPUT); PIN 46 PinMode (Side2LeftSnd, OUTPUT); Zapfen 49 PinMode (Side2CenterSnd, OUTPUT); Klemme 51 PinMode (Side2RightSnd, OUTPUT); Distanzsensor PIN 53 //Set input Pins PinMode (FrontLeftRcv, Eingabe); PIN 31 PinMode (FrontCenterRcv, Eingabe); PIN 33 PinMode (FrontRightRcv, Eingabe); PIN 35 PinMode (Side1LeftRcv, Eingabe); PIN 37 PinMode (Side1CenterRcv, Eingabe); Stift 39 PinMode (Side1RightRcv, Eingabe); PIN 41 PinMode (BackLeftRcv, Eingabe); PIN 43 PinMode (BackCenterRcv, Eingabe); PIN 45 PinMode (BackRightRcv, Eingabe); PIN 47 PinMode (Side2LeftRcv, Eingabe); Bolzen 48 PinMode (Side2CenterRcv, Eingabe); PIN 50 PinMode (Side2RightRcv, Eingabe); 52 //And PIN warten einen Augenblick delay(3000); } void loop() {lookAllAround(); moveRobot(); delay(amountToMove); slowstop(); delay(1500);} ISR(TIMER1_COMPA_vect) {//Interrupt bei Freq 1 kHz, Reed-Schalter zu messen / / erzeugt Pulswelle der Frequenz 8kHz/2 = 4 kHz (dauert zwei Zyklen für volle Welle-Toggle hoch dann niedrig umschalten) wenn (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;}} } Wenn (Lefthit == 0 & & Righthit == 0 & & Fronthit == 0 & & Backhit == 0) {if(digitalRead(19) == HIGH) {hardstop(); Serial.println ("FUCK Nein!"); 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;}} void moveRobot() {}} {//first zu sehen, ob schlagen--wenn hit während der Bewegung in alle Richtungen - Auto-wählen Sie die andere Richtung / /--sonst wählen Sie zufällig if(backhit == 1) {AmountToMove = 1000; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; abgeholt = 0;} sonst if(fronthit == 1) {AmountToMove = 1000; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; abgeholt = 1;} sonst if(lefthit == 1) {AmountToMove = 500; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; abgeholt = 2;} sonst if(righthit == 1) {AmountToMove = 500; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; hob = 3; } else {abgeholt = random(3); Serial.println ("WTF!?"); AmountToMove = 1000; } switch(picked) {case 0: Goingforward = 1; Goingbackward = 0; Goingright = 0; Goingleft = 0; forwards(); Serial.println ("Geh nach vorne"); zu brechen; Fall 1: Goingforward = 0; Goingbackward = 1; Goingright = 0; Goingleft = 0; Backwards(); Serial.println ("go back"); zu brechen; Fall 2: Goingforward = 0; Goingbackward = 0; Goingright = 1; Goingleft = 0; rechts(); Serial.println ("gehen Sie rechts"); zu brechen; Fall 3: Goingforward = 0; Goingbackward = 0; Goingright = 0; Goingleft = 1; Links(); Serial.println ("gehen Sie links"); zu brechen; } delay(1); Verzögerung zwischen liest für Stabilität} void forwards() {//activate die umgekehrte Schütz DigitalWrite (LeftReverse, HIGH); delay(50); DigitalWrite (RightReverse, HIGH); delay(100); //activate Magnete DigitalWrite (LeftOn, HIGH); DigitalWrite (RightOn, HIGH); //take eine Atem-delay(500); //engage Gas-AnalogWrite (RightThrottle, Gospeed); AnalogWrite (LeftThrottle, Gospeed);} void backwards() {DigitalWrite (RightOn, HIGH), //activate Magnete DigitalWrite (LeftOn, HIGH); //take eine Atem-delay(500); / / Gas-AnalogWrite (RightThrottle zu engagieren Gospeed); AnalogWrite (LeftThrottle, Gospeed); } void rechts() {if(dontgo == 0) {//activate Magnete DigitalWrite (LeftOn, HIGH) DigitalWrite (RightOn, HIGH); //activate die umgekehrte Schütz DigitalWrite (RightReverse, HIGH); //take eine Atem-delay(500); //engage Gas-AnalogWrite (RightThrottle, Gospeed); AnalogWrite (LeftThrottle, Gospeed);} //reset die Variable Dontgo = 0;} void links() {if(dontgo == 0) {//activate Magnete DigitalWrite (LeftOn, HIGH) DigitalWrite (RightOn, HIGH); //activate die umgekehrte Schütz DigitalWrite (LeftReverse, HIGH); //take eine Atem-delay(500); //engage Gas-AnalogWrite (RightThrottle Gospeed); AnalogWrite (LeftThrottle, Gospeed); } //reset die Variable Dontgo = 0; } void slowstop() {für (Int FadeValue = Gospeed; FadeValue > = 0; FadeValue-=5) {/ / setzt den Wert (Bereich von 0 bis 255): AnalogWrite (RightThrottle, FadeValue); AnalogWrite (LeftThrottle, FadeValue); / / warten 30 Millisekunden zu sehen, das Dimmen Wirkung delay(500);} DigitalWrite (LeftOn, LOW); DigitalWrite (RightOn, LOW); DigitalWrite (LeftReverse, LOW); DigitalWrite (RightReverse, LOW); Int Goingforward = 0; Int Goingbackward = 0; Int Goingright = 0; Int Goingleft = 0; delay(2000); lookAllAround(); delay(1000);} void hardstop() {für (Int FadeValue = Gospeed; FadeValue > = 0; FadeValue-=5) {/ / setzt den Wert (Bereich von 0 bis 255): AnalogWrite (RightThrottle, FadeValue); AnalogWrite (LeftThrottle, FadeValue); warten Sie 30 Millisekunden zu dimmen Wirkung altDelay(50) sehen; } DigitalWrite (LeftOn, LOW); DigitalWrite (RightOn, LOW); DigitalWrite (LeftReverse, LOW); DigitalWrite (RightReverse, LOW); } void AltDelay(int x) {für (unsigned Int ich = 0; ich < = X; i ++) {delayMicroseconds(1000);}} void lookAllAround() {langer Dauer, Zoll, cm; für (Int ThisPin = 0; ThisPin < 1; ThisPin ++) {DigitalWrite (SensorOutputs [ThisPin], LOW); delayMicroseconds(2); DigitalWrite (SensorOutputs [ThisPin], HIGH); delayMicroseconds(12); DigitalWrite (SensorOutputs [ThisPin], LOW) Dauer = PulseIn (SensorInputs [ThisPin], HIGH); DigitalWrite (SensorOutputs [ThisPin], LOW); / / konvertieren Sie die Zeit in einem Abstand Zoll = microsecondsToInches(duration); Serial.Print(SensorOutputs[thisPin]); Serial.Print(":"); Serial.Print(inches); Serial.println ("in,"); //Check und überprüfen Sie erneut / / if (> 10 Zoll & & < 25 Zoll) {/ / RealCloseLike = 0; / / für (Int Checkagain = 0; Checkagain < 3 Checkagain ++) {/ / delay(100); / / DigitalWrite (SensorOutputs [ThisPin], LOW); / / delayMicroseconds(2); / / DigitalWrite (SensorOutputs [ThisPin], HIGH); / / delayMicroseconds(12); / / DigitalWrite (SensorOutputs [ThisPin], LOW); / / / / Dauer = PulseIn (SensorInputs [ThisPin], HIGH); / / Zoll = microsecondsToInches(duration); / / DigitalWrite (SensorOutputs [ThisPin], LOW); / / / / delay(100); / / / / if (> 10 Zoll & & < 25 Zoll) {/ / / / Serial.print(SensorOutputs[thisPin]); / / Serial.print (" : "); Serial.Print(inches); Serial.println ("in,"); / / RealCloseLike = RealCloseLike + 1; / / if (RealCloseLike > 2) {/ / Dontgo = 1; / /} / /} / /} / /} //Takes ca. 1/2 Sekunde überprüfen alle Sensoren @ 50uS delay(100); lange MicrosecondsToInches(long microseconds) {}} {/ / nach Parallax Datenblatt für den PING))), es gibt / / 73,746 Mikrosekunden pro Zoll (d.h. klingen Reisen 1130 Füßen pro / / Sekunde). Dies gibt die zurückgelegte Strecke von Ping, ausgehende / / und zurück, so dass die Division durch 2 um die Entfernung des Hindernisses. Siehe auch: < ein Href = "http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf" >< ein Href = "http://www.parallax.com/dl/docs/prod/acc/28015-PI... < / a" > http://www.parallax.com/dl/docs/prod/acc/28015-PI...</a>> return Mikrosekunden / 74 / 2; }
Motorsteuerung Test Codebeispiel:
/ * Dieses Beispiel-Code ist in der Public Domain. * / //establish Drossel pins Int LeftThrottle = 3; LED verbunden mit digitalen Stift 9 Int RightThrottle = 5; LED mit digitalen Stift 9 //establish Magnet Pins Int LeftOn verbunden = 7; LED mit digitalen Stift 9 Int RightOn verbunden = 8; LED verbunden mit digitalen Stift 9 //establish Schütz Pins Int LeftReverse = 9; Int RightReverse = 10; Die Laufwerksgeschwindigkeit geschickt, um die Drosselklappe 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 abgeholt; void setup() {Cli (); //stop Interrupts TCCR1A = 0; / / gesamte TCCR1A-Register auf 0 TCCR1B = 0; / / gleiche für TCCR1B TCNT1 = 0; //initialize Zählerstand auf 0 / / Satz Compare Match Register für 1 hz-Schritten OCR1A = 512; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (muss < 65536) / / CTC-Modus TCCR1B | = (1 << WGM12); / / Set CS10 und CS12 bits für 1024 Vorteiler TCCR1B | = (1 << CS12) | (1 << CS10); Timer-Compare Interrupt TIMSK1 ermöglichen | = (1 << OCIE1A); //allow Interrupts Serial.begin(9600) (Sei); PinMode (LeftOn, Ausgang); PinMode (RightOn, OUTPUT); PinMode (LeftReverse, Ausgang); PinMode (RightReverse, Ausgang); Stellen Sie sicher, dass das Gerät ausgeschaltet DigitalWrite (LeftOn, LOW); ist DigitalWrite (RightOn, LOW); DigitalWrite (LeftReverse, LOW); DigitalWrite (RightReverse, LOW); Stoßstange Sensor Stifte PinMode (18, Eingang); PinMode (19, Eingang); Und warten Sie einen Moment delay(3000); } void loop() {links(); 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); links(); 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 bei Freq 1 kHz, Reed-Schalter zu messen / / erzeugt Pulswelle der Frequenz 8kHz/2 = 4 kHz (dauert zwei Zyklen für volle Welle-Toggle hoch dann niedrig umschalten) wenn (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;}} } Wenn (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 Nein!"); 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;}} void moveRobot() {}} {//first zu sehen, ob schlagen--wenn hit während der Bewegung in alle Richtungen - Auto-wählen Sie die andere Richtung / /--sonst wählen Sie zufällig if(backhit == 1) {AmountToMove = 1000; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; abgeholt = 0;} sonst if(fronthit == 1) {AmountToMove = 1000; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; abgeholt = 1;} sonst if(lefthit == 1) {AmountToMove = 500; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; abgeholt = 2;} sonst if(righthit == 1) {AmountToMove = 500; Backhit = 0; Fronthit = 0; Lefthit = 0; Righthit = 0; hob = 3; } else {abgeholt = random(3); Serial.println ("WTF!?"); AmountToMove = 1000; } switch(picked) {case 0: Goingforward = 1; Goingbackward = 0; Goingright = 0; Goingleft = 0; forwards(); Serial.println ("Geh nach vorne"); zu brechen; Fall 1: Goingforward = 0; Goingbackward = 1; Goingright = 0; Goingleft = 0; Backwards(); Serial.println ("go back"); zu brechen; Fall 2: Goingforward = 0; Goingbackward = 0; Goingright = 1; Goingleft = 0; rechts(); Serial.println ("gehen Sie rechts"); zu brechen; Fall 3: Goingforward = 0; Goingbackward = 0; Goingright = 0; Goingleft = 1; Links(); Serial.println ("gehen Sie links"); zu brechen; } delay(1); Verzögerung zwischen liest für Stabilität} void forwards() {//activate die umgekehrte Schütz DigitalWrite (LeftReverse, HIGH); delay(50); DigitalWrite (RightReverse, HIGH); delay(100); //activate Magnete DigitalWrite (LeftOn, HIGH); DigitalWrite (RightOn, HIGH); //take eine Atem-delay(500); //engage Gas-AnalogWrite (RightThrottle, Gospeed); AnalogWrite (LeftThrottle, Gospeed);} void backwards() {DigitalWrite (RightOn, HIGH), //activate Magnete DigitalWrite (LeftOn, HIGH); //take eine Atem-delay(500); / / Gas-AnalogWrite (RightThrottle zu engagieren Gospeed); AnalogWrite (LeftThrottle, Gospeed); } void rechts() {//activate Magnete DigitalWrite (LeftOn, HIGH) DigitalWrite (RightOn, HIGH); //activate die umgekehrte Schütz DigitalWrite (RightReverse, HIGH); //take eine Atem-delay(500); //engage Gas-AnalogWrite (RightThrottle, Gospeed); AnalogWrite (LeftThrottle, Gospeed);} void links() {//activate Magnete DigitalWrite (LeftOn, HIGH) DigitalWrite (RightOn, HIGH); //activate die umgekehrte Schütz DigitalWrite (LeftReverse, HIGH); //take eine Atem-delay(500); //engage Gas-AnalogWrite (RightThrottle, Gospeed); AnalogWrite (LeftThrottle Gospeed); } void slowstop() {für (Int FadeValue = Gospeed; FadeValue > = 0; FadeValue-=5) {/ / setzt den Wert (Bereich von 0 bis 255): AnalogWrite (RightThrottle, FadeValue); AnalogWrite (LeftThrottle, FadeValue); / / warten 30 Millisekunden zu sehen, das Dimmen Wirkung delay(500);} DigitalWrite (LeftOn, LOW); DigitalWrite (RightOn, LOW); DigitalWrite (LeftReverse, LOW); DigitalWrite (RightReverse, LOW); Int Goingforward = 0; Int Goingbackward = 0; Int Goingright = 0; Int Goingleft = 0;} void hardstop() {für (Int FadeValue = Gospeed; FadeValue > = 0; FadeValue-=5) {/ / setzt den Wert (Bereich von 0 bis 255) : AnalogWrite (RightThrottle, FadeValue); AnalogWrite (LeftThrottle, FadeValue); warten Sie 30 Millisekunden zu dimmen Wirkung altDelay(50) sehen; } DigitalWrite (LeftOn, LOW); DigitalWrite (RightOn, LOW); DigitalWrite (LeftReverse, LOW); DigitalWrite (RightReverse, LOW); } void AltDelay(int x) {für (unsigned Int ich = 0; ich < = X; i ++) {delayMicroseconds(1000);}}