Неправильно работают двигатели
- Войдите на сайт для отправки комментариев
Всем привет!
Есть проблемка с движками. Помогите решить, пожалуйста.
При движении вперед движки работают только на максимальной скорости (255);" при других скоростях оба канала не работают. При движении назад работает только один канал и, также, только на максимальной скорости.
Участники:
1. Arduino UNO R3
2. Sensor shield
3. Stepper Motor Driver L298
4. 4x DC motors на 5V
К плате подключены также: серва TowerPro 9G, сонар Ultrasonic HC-SR04, IR приемник (эти девайсы работают нормально).
Схема работает одинаково неправильно при разных вариантах питания (раздельное с разной землей, раздельное с общей землей, монопольное). На движках стоят 104 кондеры (по три на каждом). Ниже привожу фотку драйвера и код:
Перемычки U1, U2, U3, U4, 5V_EN убраны
#include <Servo.h> #include <IRremote.h> #include <NewPing.h> // ULTRASONIC PINS #define TRIGGER_PIN 13 // yellow #define ECHO_PIN 12 // orange #define MAX_DISTANCE 500 #define MIN_DISTANCE 26 // SERVO PINS #define SERVO_PIN 7 // orange // IR PINS #define IR_PIN 11 // yellow // MOTOR SHIELD PINS #define ENA_PIN 9 // black #define ENB_PIN 10 // white #define IN1_PIN 2 // gray BACK #define IN2_PIN 3 // violet FORWARD #define IN3_PIN 4 // blue FORWARD #define IN4_PIN 5 // green BACK // BLUETOTH PINS #define RX_PIN 0 // yellow #define TX_PIN 1 // orange boolean OPERATION = true; unsigned int DISTANCE = 0; // boolean LDir = true, RDir = true; // true = Forward, false = Backward boolean Changes = false; boolean DIR = true; int SPEED = 255; // -------------------------------------------------------------------------------- NewPing ultrasonic(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); Servo servoDrive; IRrecv ir(IR_PIN); decode_results irResult; int getAngle(void); int getAngleArray(void); unsigned int getDistance(void); void TURNFB(boolean, int); void TURNLR(int); void MOVE(boolean, unsigned int); void STOP(void); // --------------------------------------------------------------------------------- // ----------------------- SETUP BEGIN --------------------------------------------- void setup() { Serial.begin(9600); servoDrive.attach(SERVO_PIN); servoDrive.write(90); delay(200); servoDrive.detach(); ir.enableIRIn(); // IR Initialisation // MOTOR Initialisation pinMode(IN1_PIN, OUTPUT); // ---- Dir 1 --------- pinMode(IN2_PIN, OUTPUT); // ---- Dir 2 --------- pinMode(ENA_PIN, OUTPUT); // ---- ENA ----------- pinMode(IN3_PIN, OUTPUT); // ---- Dir 1 --------- pinMode(IN4_PIN, OUTPUT); // ---- Dir 2 --------- pinMode(ENB_PIN, OUTPUT); // ---- ENB ----------- } // ------------------------- END SETUP --------------------------------------------- // ------------------------ LOOP BEGIN --------------------------------------------- void loop() { if (ir.decode(&irResult)) { switch (irResult.value) { case 0xFF02FD: if (OPERATION == false) OPERATION = true; else OPERATION = false; Changes = true; Serial.print ("OPERATION = "); Serial.print (OPERATION); Serial.println (); break; // ---------------------- oter cases ----------------------------------------- case 0xFF629D: DIR = true; Changes = true; Serial.println ("FORWARD DIRECTION"); break; case 0xFFA857: DIR = false; Changes = true; Serial.println ("BACKWARD DIRECTION"); break; case 0xFF42BD: if (SPEED >= 5) { SPEED -= 5; Changes = true; Serial.print ("SPEED = "); Serial.println (SPEED); } break; case 0xFF52AD: if (SPEED <= 250) { SPEED += 5; Changes = true; Serial.print ("SPEED = "); Serial.println (SPEED); } break; // ---------------------- oter cases ----------------------------------------- } ir.resume(); } //delay(100); //Serial.println ("loop"); DISTANCE = getDistance(); if (DISTANCE < MIN_DISTANCE) Changes = true; if (Changes == true) MOVE(OPERATION, DISTANCE); } // ------------------------ END LOOP ----------------------------------------------- void STOP() { analogWrite (ENA_PIN, 0); digitalWrite (IN1_PIN, LOW); digitalWrite (IN2_PIN, LOW); analogWrite (ENB_PIN, 0); digitalWrite (IN3_PIN, LOW); digitalWrite (IN4_PIN, LOW); } void TURNFB(boolean Dir, int Speed) {` //delay (100); analogWrite (ENA_PIN, Speed); analogWrite (ENB_PIN, Speed); //delay (500); if (Dir == true) { digitalWrite (IN1_PIN, LOW); digitalWrite (IN2_PIN, HIGH); //BACKWARD digitalWrite (IN3_PIN, HIGH); //BACKWARD digitalWrite (IN4_PIN, LOW); } else { digitalWrite (IN1_PIN,HIGH); digitalWrite (IN2_PIN, LOW); //BACKWARD digitalWrite (IN3_PIN, LOW); //BACKWARD digitalWrite (IN4_PIN, HIGH); } } void TURNLR(int angle) { // "TURN CAR LEFT OR RIGHT return; } void MOVE(boolean operation, unsigned int distance) { Serial.print ("TURNF FUNCTION:"); Serial.print (" OPERATION = "); Serial.print (operation); Serial.print (" DISTANCE = "); Serial.println (distance); if (operation == false) { STOP(); Serial.println ("STOP"); Changes = false; return; } if (operation == true && (distance > MIN_DISTANCE || distance == 0)) { Serial.println ("MOVE FORWARD"); TURNFB(DIR, SPEED); Changes = false; return; } if (operation == true && distance <= MIN_DISTANCE) { Serial.println ("COLLISION EMEREGENCY"); STOP(); // int optangle = getAngleArray();// FIND NEW DIRECTION !!!!!!! TURNLR(getAngleArray()); Changes = false; return; } } int getAngleArray() { servoDrive.attach(SERVO_PIN); unsigned int Angles[18] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; unsigned int rDistance = 1; int rangle = 90; for (int a = 0; a <= 18; a++) { servoDrive.write(a * 10); //delay(50); Angles[a] = getDistance(); Serial.print ("Angle = "); Serial.print (a * 10); Serial.print (" Distance = "); Serial.println (Angles[a]); } for (int a = 0; a <= 18; a++) { if (Angles[a] > rDistance) { rDistance = Angles[a]; rangle = a * 10; } } servoDrive.write(90); delay(200); Serial.print ("OPTIMAL ANGLE = "); Serial.print (rangle); Serial.print (" MAX DISTANCE = "); Serial.println (rDistance); servoDrive.detach(); if (rangle < 90) return -(90 - rangle); if (rangle > 90) return rangle - 90; if (rangle == 90) return 0; } unsigned int getDistance() { delay(200); unsigned int uS = ultrasonic.ping(); // Send ping, get ping time in microseconds (uS). //Serial.print ("getDistance = "); //Serial.println (uS / US_ROUNDTRIP_CM); return (uS / US_ROUNDTRIP_CM); }
Читайте внимательно Servo и особенно второе предложение второго обзаца.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Спасибо, Максим!
И всеравно - лажа. Поставил ENA, ENB на 11, 6 пины. Теперь правые колеса крутятся вперед и назад нормально, но скорость можно регулировать только при движении вперед. Если скорость при движении назад меньше 255 движки затыкаются. С леаой стороной все еще хуже. При движении вперед все Ок только на максимальной скорости (меньше 255 - стоп), а назад они вообще не крутятся. На драйвере моторов светодиоды для левой стороны не горят, а зажигаются только с уменьшением скорости, но движки всеравно не крутятся. Я уже все идеи перебрал. Может подскажет кто чего?
Покажите схему подключения двигателей
Кондеры все 104.