Paso 63: código
Muy bien - así - cuando se trabaja con código es ideal para usar algo como Github seguimiento de revisiones. No hacerlo. Así, accidentalmente escribí sobre la versión más actual de trabajo del código. Tengo la última versión guardada, pero no estoy seguro cómo es. Probablemente es un poco buggy.
Novertheless, ya que ninguno de ustedes es probable que construirá esta cosa cualquier que forma y la cama está en pedazos y no funciona, yo solo voy a publicar lo que tengo.
También estoy compartiendo código de prueba para el control manual de los motores. Si usted está buscando en este proyecto para interfaces de un Arduino a motores muy grandes a través de un regulador del motor de Alltrax, este código será más útil de todos modos.
Última versión guardada de código de prueba de la cama de Robot:
/ * Este ejemplo de código es de dominio público. * / //establish acelerador pernos int leftThrottle = 3; LED conectado al pin digital 9 int rightThrottle = 5; LED conectado al pin digital 9 //establish solenoide pernos int leftOn = 7; LED conectado al pin digital 9 int Apartamento = 8; LED conectado al pin digital 9 //establish contactor pernos int leftReverse = 9; int rightReverse = 10; La velocidad a la válvula reguladora int gospeed = 86; volátiles int foserious = 0; DELANTERA int FrontLeftSnd = 30; int FrontLeftRcv = 31; int FrontCenterSnd = 32; int FrontCenterRcv = 33; int FrontRightSnd = 34; int FrontRightRcv = 35; LADO derecho int Side1LeftSnd = 36; int Side1LeftRcv = 37; int Side1CenterSnd = 38; int Side1CenterRcv = 39; int Side1RightSnd = 40; int Side1RightRcv = 41; TRASERA int BackLeftSnd = 42; int BackLeftRcv = 43; int BackCenterSnd = 44; int BackCenterRcv = 45; int BackRightSnd = 46; int BackRightRcv = 47; LADO izquierdo int Side2LeftSnd = 49; int Side2LeftRcv = 48; int Side2CenterSnd = 51; int Side2CenterRcv = 50; int Side2RightSnd = 53; int Side2RightRcv = 52; matriz de todos los nombres de pines de entrada y salida. Utilizado más adelante para leer todos los sensores en un bucle for. 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; número de sensores total 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; lefthit int = 0; int amountToMove = 1000; int seleccionado; void setup() {cli (); //stop interrupciones TCCR1A = 0; / / set completo registro TCCR1A 0 TCCR1B = 0; / / mismo para TCCR1B TCNT1 = 0; //initialize valor de contador a 0 / / sistema compara partido registro para incrementos de 1 hz OCR1A = 512; / = (16 * 10 ^ 6) / (1 * 1024) - 1 (debe ser < 65536) / / Activar modo CTC TCCR1B | = (1 << WGM12); / CS10 sistema y CS12 pedacitos para 1024 prescaler TCCR1B | = (1 << CS12) | (1 << CS10); habilitar interrupción de timer compara TIMSK1 | = (1 << OCIE1A); (SEI); interrupciones //allow Serial.begin(9600); pinMode (leftOn, salida); pinMode (apartamento, salida); pinMode (leftReverse, salida); pinMode (rightReverse, salida); Asegúrese de que la energía está apagada digitalWrite (leftOn, LOW); digitalWrite (apartamento, baja); digitalWrite (leftReverse, bajo); digitalWrite (rightReverse, bajo); sensor parachoques pines pinMode (18, entrada); pinMode (19, entrada); Salida del sensor de distancia fija pines pinMode (FrontLeftSnd, salida); Pin 30 pinMode (FrontCenterSnd, salida); pin 32 pinMode (FrontRightSnd, salida); pin 34 pinMode (Side1LeftSnd, salida); PIN 36 pinMode (Side1CenterSnd, salida); PIN 38 pinMode (Side1RightSnd, salida); PIN 40 pinMode (BackLeftSnd, salida); PIN 42 pinMode (BackCenterSnd, salida); PIN 44 pinMode (BackRightSnd, salida); PIN 46 pinMode (Side2LeftSnd, salida); perno 49 pinMode (Side2CenterSnd, salida); PIN 51 pinMode (Side2RightSnd, salida); sensor de distancia //Set PIN 53 entrada pines pinMode (FrontLeftRcv, entrada); PIN 31 pinMode (FrontCenterRcv, entrada); PIN 33 pinMode (FrontRightRcv, entrada); perno 35 pinMode (Side1LeftRcv, entrada); PIN 37 pinMode (Side1CenterRcv, entrada); PIN 39 pinMode (Side1RightRcv, entrada); PIN 41 pinMode (BackLeftRcv, entrada); PIN 43 pinMode (BackCenterRcv, entrada); PIN 45 pinMode (BackRightRcv, entrada); PIN 47 pinMode (Side2LeftRcv, entrada); PIN 48 pinMode (Side2CenterRcv, entrada); PIN 50 pinMode (Side2RightRcv, entrada); //And 52 PIN espere un momento delay(3000); } void loop() {lookAllAround(); moveRobot(); delay(amountToMove); slowstop(); delay(1500);} ISR(TIMER1_COMPA_vect) {//Interrupt en frecuencia de 1kHz para medir interruptor de láminas / / genera la onda de pulso de frecuencia 8kHz/2 = 4 kHz (toma dos ciclos de alternancia de la onda completo alto luego alternar bajo) si (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;}} } Si (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {if(digitalRead(19) == HIGH) {hardstop(); Serial.println ("joder NO!"); 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 ver si golpear--si golpeado mientras se mueven en cualquiera de las direcciones - auto-pick la otra dirección / /--de lo contrario la selección al azar if(backhit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; recogido = 0;} otro if(fronthit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; recogido = 1;} otro if(lefthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; recogido = 2;} otro if(righthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; seleccionado = 3; } else {seleccionado = random(3); Serial.println ("WTF!?"); amountToMove = 1000; } switch(picked) {caso 0: goingforward = 1; goingbackward = 0; goingright = 0; goingleft = 0; forwards(); Serial.println ("ir hacia adelante"); rotura; caso 1: goingforward = 0; goingbackward = 1; goingright = 0; goingleft = 0; backwards(); Serial.println ("volver"); rotura; caso 2: goingforward = 0; goingbackward = 0; goingright = 1; goingleft = 0; Right(); Serial.println ("a la derecha"); rotura; caso 3: goingforward = 0; goingbackward = 0; goingright = 0; goingleft = 1; Left(); Serial.println ("ir a la izquierda"); rotura; } delay(1); retardo entre lecturas para estabilidad} void forwards() {//activate el contactor reverso digitalWrite (leftReverse, HIGH); delay(50); digitalWrite (rightReverse, HIGH); delay(100); //activate lo solenoides digitalWrite (leftOn, alto); digitalWrite (apartamento, alto); //take un delay(500) de aliento; //engage el acelerador analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} void backwards() {//activate lo solenoides digitalWrite (leftOn, HIGH); digitalWrite (apartamento, alto); //take un delay(500) de aliento; / / realizar la aceleración analogWrite (rightThrottle gospeed); analogWrite (leftThrottle, gospeed); } void right() {if(dontgo == 0) {//activate lo solenoides digitalWrite (leftOn, HIGH); digitalWrite (apartamento, alto) //activate el contactor reverso digitalWrite (rightReverse, HIGH); //take un delay(500) de aliento; //engage el acelerador analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} //reset la variable dontgo = 0;} void left() {if(dontgo == 0) {//activate lo solenoides digitalWrite (leftOn, HIGH); digitalWrite (apartamento, alto) //activate el contactor reverso digitalWrite (leftReverse, HIGH); //take un delay(500) de aliento; //engage el acelerador analogWrite (rightThrottle gospeed); analogWrite (leftThrottle, gospeed); } //reset la variable dontgo = 0; } void slowstop() {para (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / establece el valor (rango de 0 a 255): analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); / / espere 30 milisegundos ver la atenuación delay(500) de efecto;} digitalWrite (leftOn, LOW); digitalWrite (apartamento, 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() {para (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / establece el valor (rango de 0 a 255): analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); Espere 30 milisegundos ver la atenuación altDelay(50) de efecto; } digitalWrite (leftOn, LOW); digitalWrite (apartamento, baja); digitalWrite (leftReverse, bajo); digitalWrite (rightReverse, bajo); } void altDelay(int x) {para (unsigned int = 0; me < = x; i ++) {delayMicroseconds(1000);}} void lookAllAround() {duración largo, pulgadas, cm; para (int thisPin = 0; thisPin < 1; thisPin ++) {digitalWrite (SensorOutputs [thisPin], LOW); delayMicroseconds(2); digitalWrite (SensorOutputs [thisPin], alto); delayMicroseconds(12); digitalWrite (SensorOutputs [thisPin], LOW); duración = pulseIn (SensorInputs [thisPin], alto); digitalWrite (SensorOutputs [thisPin], LOW); / / convertir el tiempo a una pulgadas de distancia = microsecondsToInches(duration); Serial.Print(SensorOutputs[thisPin]); Serial.Print(":"); Serial.Print(inches); Serial.println ("in"); //Check y compruebe otra vez / si (pulgadas > 10 & & pulgadas < 25) {/ / realCloseLike = 0; / / para (int checkagain = 0; checkagain < 3; checkagain ++) {/ / delay(100); / / digitalWrite (SensorOutputs [thisPin], LOW); / / delayMicroseconds(2); / / digitalWrite (SensorOutputs [thisPin], alto); / / delayMicroseconds(12); / / digitalWrite (SensorOutputs [thisPin], LOW); / / / / duración = pulseIn (SensorInputs [thisPin], alto); / / pulgadas = microsecondsToInches(duration); / / digitalWrite (SensorOutputs [thisPin], LOW); / / / / delay(100); / / / / si (pulgadas > 10 & & pulgadas < 25) {/ / / / Serial.print(SensorOutputs[thisPin]); / / Serial.print (" : "); Serial.Print(inches); Serial.println ("in"); / / realCloseLike = realCloseLike + 1; / / if (realCloseLike > 2) {/ / dontgo = 1; / /} / /} / /} / /} //Takes alrededor de 1/2 segundo para comprobar todos los sensores a 50uS delay(100); microsecondsToInches(long microseconds) largo}} {/ / según ficha técnica de paralaje para el PING))), hay / / 73,746 microsegundos por pulgada (es decir de sonido viaja en 1130 pies / segundo). Esto da la distancia recorrida por el ping, saliente / / y el retorno, por lo que dividimos por 2 para obtener la distancia del obstáculo. Ver: < a href = "http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf" >< a href = "http://www.parallax.com/dl/docs/prod/acc/28015-PI... < / a" > http://www.parallax.com/dl/docs/prod/acc/28015-PI...</a>> volver microsegundos / 74 / 2; }
Ejemplo de código de prueba de control del motor:
/ * Este ejemplo de código es de dominio público. * / //establish acelerador pernos int leftThrottle = 3; LED conectado al pin digital 9 int rightThrottle = 5; LED conectado al pin digital 9 //establish solenoide pernos int leftOn = 7; LED conectado al pin digital 9 int Apartamento = 8; LED conectado al pin digital 9 //establish contactor pernos int leftReverse = 9; int rightReverse = 10; La velocidad a la válvula reguladora 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; lefthit int = 0; int amountToMove = 1000; int timeToWait = 30000; int seleccionado; void setup() {cli (); //stop interrupciones TCCR1A = 0; / / set completo registro TCCR1A 0 TCCR1B = 0; / / mismo para TCCR1B TCNT1 = 0; //initialize valor de contador a 0 / / sistema compara partido registro para incrementos de 1 hz OCR1A = 512; / = (16 * 10 ^ 6) / (1 * 1024) - 1 (debe ser < 65536) / / Activar modo CTC TCCR1B | = (1 << WGM12); / CS10 sistema y CS12 pedacitos para 1024 prescaler TCCR1B | = (1 << CS12) | (1 << CS10); habilitar interrupción de timer compara TIMSK1 | = (1 << OCIE1A); (SEI); interrupciones //allow Serial.begin(9600); pinMode (leftOn, salida); pinMode (apartamento, salida); pinMode (leftReverse, salida); pinMode (rightReverse, salida); Asegúrese de que la energía está apagada digitalWrite (leftOn, LOW); digitalWrite (apartamento, baja); digitalWrite (leftReverse, bajo); digitalWrite (rightReverse, bajo); sensor parachoques pines pinMode (18, entrada); pinMode (19, entrada); Y esperar un momento delay(3000); } void loop() {left(); delay(amountToMove); slowstop(); delay(timeToWait); backwards(); delay(amountToMove); slowstop(); delay(timeToWait); forwards(); delay(amountToMove); slowstop(); delay(timeToWait); right(); delay(amountToMove); slowstop(); delay(timeToWait); / / right(); delay(amountToMove); slowstop(); delay(timeToWait); forwards(); delay(amountToMove); slowstop(); delay(timeToWait); backwards(); delay(amountToMove); slowstop(); delay(timeToWait); left(); 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 en frecuencia de 1kHz para medir interruptor de láminas / / genera la onda de pulso de frecuencia 8kHz/2 = 4 kHz (toma dos ciclos de alternancia de la onda completo alto luego alternar bajo) si (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;}} } Si (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 ("joder ¡ NO!"); 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 ver si golpear--si golpeado mientras se mueven en cualquiera de las direcciones - auto-pick la otra dirección / /--de lo contrario la selección al azar if(backhit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; recogido = 0;} otro if(fronthit == 1) {amountToMove = 1000; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; recogido = 1;} otro if(lefthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; recogido = 2;} otro if(righthit == 1) {amountToMove = 500; backhit = 0; fronthit = 0; lefthit = 0; righthit = 0; seleccionado = 3; } else {seleccionado = random(3); Serial.println ("WTF!?"); amountToMove = 1000; } switch(picked) {caso 0: goingforward = 1; goingbackward = 0; goingright = 0; goingleft = 0; forwards(); Serial.println ("ir hacia adelante"); rotura; caso 1: goingforward = 0; goingbackward = 1; goingright = 0; goingleft = 0; backwards(); Serial.println ("volver"); rotura; caso 2: goingforward = 0; goingbackward = 0; goingright = 1; goingleft = 0; Right(); Serial.println ("a la derecha"); rotura; caso 3: goingforward = 0; goingbackward = 0; goingright = 0; goingleft = 1; Left(); Serial.println ("ir a la izquierda"); rotura; } delay(1); retardo entre lecturas para estabilidad} void forwards() {//activate el contactor reverso digitalWrite (leftReverse, HIGH); delay(50); digitalWrite (rightReverse, HIGH); delay(100); //activate lo solenoides digitalWrite (leftOn, alto); digitalWrite (apartamento, alto); //take un delay(500) de aliento; //engage el acelerador analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} void backwards() {//activate lo solenoides digitalWrite (leftOn, HIGH); digitalWrite (apartamento, alto); //take un delay(500) de aliento; / / realizar la aceleración analogWrite (rightThrottle gospeed); analogWrite (leftThrottle, gospeed); } void right() {//activate lo solenoides digitalWrite (leftOn, HIGH); digitalWrite (apartamento, alto) //activate el contactor reverso digitalWrite (rightReverse, HIGH); //take un delay(500) de aliento; //engage el acelerador analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle, gospeed);} void left() {//activate lo solenoides digitalWrite (leftOn, HIGH); digitalWrite (apartamento, alto) //activate el contactor reverso digitalWrite (leftReverse, HIGH); //take un delay(500) de aliento; //engage el acelerador analogWrite (rightThrottle, gospeed); analogWrite (leftThrottle gospeed); } void slowstop() {para (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / establece el valor (rango de 0 a 255): analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); / / espere 30 milisegundos ver la atenuación delay(500) de efecto;} digitalWrite (leftOn, LOW); digitalWrite (apartamento, LOW); digitalWrite (leftReverse, LOW); digitalWrite (rightReverse, LOW); int goingforward = 0; int goingbackward = 0; int goingright = 0; int goingleft = 0;} void hardstop() {para (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {/ / establece el valor (rango de 0 a 255) : analogWrite (rightThrottle, fadeValue); analogWrite (leftThrottle, fadeValue); Espere 30 milisegundos ver la atenuación altDelay(50) de efecto; } digitalWrite (leftOn, LOW); digitalWrite (apartamento, baja); digitalWrite (leftReverse, bajo); digitalWrite (rightReverse, bajo); } void altDelay(int x) {para (unsigned int i = 0; i < = x; i ++) {delayMicroseconds(1000);}}