….. en proceso… cuando la acabe quitaré este aviso…
En la foto de arriba se puede apreciar la conexión de los sensores ultrasónicos (HC-SR04). En las siguientes fotos se aprecia dónde va cada cable en la placa arduino.
El par de cables blanco/gris de la zona izquierda de la placa, coincide con el sensor izquierdo.
Vista trasera de las conexiones para GND y 5V. Se puede apreciar como los 4 cables de la zona izquierda son negros (GND) y los de la derecha son rojos o morados (5V).
El Código fuente
Aquí abajo puedes ver el código fuente para este montaje…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 | /* File....... _4ESO_PRC_00_coche_R008_jcecilio_ Purpose.... pruebas con el chasis de motores bipolares y algun HC-SR04 Author..... jcecilio E-mail..... Started.... 18 jun 2014 Updated.... 4 dic 2018 */ #include <NewPing.h> NewPing distIZQUIERDA(8, 11, 100); // sensor de distancia situado al frente IZQ NewPing distDERECHA(6, 7, 100); // sensor de distancia situado al frente DER int COMPENSACION = 0; // compensacion para que los motores vayan a la misma v // es tan elevada porque al tener que detectarlos de forma oblicua se falsea mucho la distancia real int cmIZQ = 0; int cmDER = 0; // const byte irqdDERPin = 3; //long cDER = 0; // const byte irqdIZQPin = 2; long cIZQ = 0; const int ENA = 10; //(output pwm) const int IN1 = 17; const int IN2 = 18; const int ENB = 9; //(output pwm) const int IN3 = 4; const int IN4 = 5; const int ledIzq = 13; const int ledDer = 12; int LDRizq = 0; int LDRder = 0; // ****************************************************************************************************** // ****************************************************************************************************** // ****************************************************************************************************** void setup() { pinMode(ENA, OUTPUT); //output pinMode(ENB, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(ledIzq, OUTPUT); digitalWrite(ledIzq, LOW); pinMode(ledDer, OUTPUT); digitalWrite(ledDer, LOW); digitalWrite(ENA, LOW); // parar motor A digitalWrite(ENB, LOW); // parar motor B digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); //dirección motor A digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); //dirección motor B Serial.begin(9600); } // ****************************************************************************************************** // ****************************************************************************************************** // ****************************************************************************************************** void loop() { int luz = 0; int DETECCION = 20; // distancia de deteccion de objetos int velocidad = 150; // velocidad normal // Mientras este encendido cmIZQ = distIZQUIERDA.ping_cm(); if (cmIZQ < DETECCION && cmIZQ > 1) // obstaculo por la izquierda { digitalWrite(ledIzq, HIGH); Serial.println("---Obstaculo por la IZQUIERDA"); atras(velocidad); delay(500); derecha(velocidad); delay(400);// Girar a la derecha digitalWrite(ledIzq, LOW); } delay(50); adelante(velocidad); cmDER = distDERECHA.ping_cm(); if (cmDER < DETECCION && cmDER > 1) { digitalWrite(ledDer, HIGH); Serial.println("---Obstaculo por la DERECHA"); atras(velocidad); delay(500); izquierda(velocidad); delay(400); // Girar a la izquierda digitalWrite(ledDer, LOW); } // comprobar LDRs LDRizq = analogRead(A0); LDRder = analogRead(A1); if (LDRizq > (LDRder + 100)) { derecha(velocidad ); delay(200); // Girar a la derecha } if (LDRder > (LDRizq + 100)) { izquierda(velocidad ); delay(200); // Girar a la derecha } // avance recto adelante(velocidad); Serial.print("IZQ: "); Serial.print(cmIZQ); Serial.print("cm DER: "); Serial.print(cmDER); Serial.println("cm "); delay(50); } // ****************************************************************************************************** // ****************************************************************************************************** // ****************************************************************************************************** // mis funciones // adelante int adelante(byte v) { int minV = 80; // velocidad mínima static int comp; // fijar direccion. IMPORTANTE!!!! respetar cableado original (Ver fotos) digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); //setting motorA's direction digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); //setting motorB's directon if (v < minV) v = minV; if (v > 255) v = 255; analogWrite(ENA, v); //iniciar ambos motores a la misma velocidad analogWrite(ENB, v); // return 1; } // atras int atras(byte v) { int minV = 80; // velocidad mínima // fijar direccion. IMPORTANTE!!!! respetar cableado original digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); //setting motorA's direction digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); //setting motorB's directon if (v < minV) v = minV; if (v > 255) v = 255; analogWrite(ENA, v - COMPENSACION); //iniciar ambos motores a la misma velocidad analogWrite(ENB, v); // return 1; } // parar int parar() { analogWrite(ENA, LOW); // parar ambos motores analogWrite(ENB, LOW); // Los motores no paran si no se ponen ENA y ENB a 0. while (true) { digitalWrite(ledDer, HIGH); digitalWrite(ledIzq, LOW); delay(100); digitalWrite(ledDer, LOW); digitalWrite(ledIzq, HIGH); delay(100); } return 1; } // izquierda int izquierda(byte v) { int minV = 80; // velocidad mínima // fijar direccion. IMPORTANTE!!!! respetar cableado original digitalWrite(IN3, LOW); // solo fijo la direccion del motor B... pa'lante digitalWrite(IN4, HIGH); if (v < minV) v = minV; if (v > 255) v = 255; analogWrite(ENA, 0); //paro el motor A (izq)... para que gire hacia ese lado analogWrite(ENB, v); //muevo el B. Le sumo la compensación return 1; } // derecha int derecha(byte v) { int minV = 80; // velocidad mínima // fijar direccion. IMPORTANTE!!!! respetar cableado original digitalWrite(IN1, LOW); // solo fijo la direccion del motor A... pa'lante digitalWrite(IN2, HIGH); if (v < minV) v = minV; if (v > 255) v = 255; analogWrite(ENA, v); //paro el motor B (derecha)... para que gire hacia ese lado analogWrite(ENB, 0); //muevo el A return 1; } |
El controlador
Ahora toca la conexión del controlador o driver de los motores.
Este componente tiene la función de recibir órdenes del arduino y transformarlas en la corriente necesaria para gobernar los motores de corriente continua. Por ser breve, no es buena idea conectar un motor de este tipo directamente a las salidas del arduino.