Помогите разобраться с motor shield и дальномером

Тема в разделе "Arduino & Shields", создана пользователем CasperSimfer, 16 ноя 2014.

  1. CasperSimfer

    CasperSimfer Нуб

    Добрые люди. Подскажите пожалуйста, как подключить четыре моторчика ( http://ru.aliexpress.com/item/N20-R...e-Electric-Gear-Box-Motor-5PCS/543637993.html ) к ( http://ru.aliexpress.com/item/Big-D...UNO-Free-Shipping-Dropshipping/620258354.html ) ? Никак не могу разобраться, почему не работает библиотека?

    В дальнейшем хочу это все скомбинировать с ультразвуковым дальномером, чтобы избегать препятствия и менять курс движения.

    Заранее спасибо.
    [​IMG]
    CasperSimferНуб
    Добрые люди. Подскажите пожалуйста, как подключить четыре моторчика ( http://ru.aliexpress.com/item/N20-R...e-Electric-Gear-Box-Motor-5PCS/543637993.html ) к ( http://ru.aliexpress.com/item/Big-D...UNO-Free-Shipping-Dropshipping/620258354.html ) ? Никак не могу разобраться, почему не работает библиотека?

    В дальнейшем хочу это все скомбинировать с ультразвуковым дальномером, чтобы избегать препятствия и менять курс движения.

    Заранее спасибо.

    [​IMG]
    CasperSimferНуб
    Добрые люди. Подскажите пожалуйста, как подключить четыре моторчика ( http://ru.aliexpress.com/item/N20-R...e-Electric-Gear-Box-Motor-5PCS/543637993.html ) к ( http://ru.aliexpress.com/item/Big-D...UNO-Free-Shipping-Dropshipping/620258354.html ) ? Никак не могу разобраться, почему не работает библиотека?

    В дальнейшем хочу это все скомбинировать с ультразвуковым дальномером, чтобы избегать препятствия и менять курс движения.

    Заранее спасибо.
     
  2. Unixon

    Unixon Оракул Модератор

    Библиотеку какую используете?
     
  3. CasperSimfer

    CasperSimfer Нуб

    #include <AFMotor.h>

    AF_DCMotor motor(4);

    void setup() {
    Serial.begin(9600); // set up Serial library at 9600 bps
    Serial.println("Motor test!");

    // turn on motor
    motor.setSpeed(200);

    motor.run(RELEASE);
    }

    void loop() {
    uint8_t i;
    Serial.print("tick");
    motor.run(FORWARD);
    for (i=0; i<255; i++) {
    motor.setSpeed(i);
    delay(10);
    }

    for (i=255; i!=0; i--) {
    motor.setSpeed(i);
    delay(10);
    }
    Serial.print("tock");

    motor.run(BACKWARD);
    for (i=0; i<255; i++) {
    motor.setSpeed(i);
    delay(10);
    }

    for (i=255; i!=0; i--) {
    motor.setSpeed(i);
    delay(10);
    }

    Serial.print("tech");
    motor.run(RELEASE);
    delay(1000);
    }
     
  4. Unixon

    Unixon Оракул Модератор

    А не мало ли 10мс на итерацию? Мотор поди и сообразить не успевает, что ему ехать нужно. Впрочем, там 2.5с набегает за цикл... м\б и нормально.

    Питание как организовано?
     
  5. SSnick

    SSnick Гик

    Скажите, пожалуйста, насколько большой у этих моторов крутящий момент? Для чего Вы их используюте? справляется с задачей?
     
    Последнее редактирование: 17 ноя 2014
  6. CasperSimfer

    CasperSimfer Нуб

    с этим я разобрался. Спасибо
     
  7. CasperSimfer

    CasperSimfer Нуб

    подскажите пожалуйста лучше следующее. Гудит сервопривод, как будто бы он хочет крутиться,а ему некуда. Как убрать этот шум? серво MG995
     
  8. SSnick

    SSnick Гик

    тока не хватает ему ну либо не верно прописал углы поворота
     
  9. CasperSimfer

    CasperSimfer Нуб

    9В подаю. Углы от 0 до 160. В одну сторону доходит до предела - не гудит, в другую доходит - гудит
     
  10. CasperSimfer

    CasperSimfer Нуб

    подскажите пожалуйста, что это за ошибка?

    sketch_nov18a.ino:83:16: error: invalid suffix "nt" on integer constant
     
  11. Unixon

    Unixon Оракул Модератор

    Код где?
     
  12. CasperSimfer

    CasperSimfer Нуб

    #include <AFMotor.h>
    #define trigPin 14
    #define echoPin 15

    AF_DCMotor motor1(1); // передний мотор
    AF_DCMotor motor2(2); // передний мотор
    AF_DCMotor motor3(3); // задний мотор
    AF_DCMotor motor4(4); // задний мотор

    int d1, d2;

    void set_speed(int speed)
    {
    motor1.setSpeed(speed);
    motor2.setSpeed(speed);
    motor3.setSpeed(speed);
    motor4.setSpeed(speed);
    }

    void robot_forward()
    {
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    motor3.run(FORWARD);
    motor4.run(FORWARD);
    }

    void robot_backward()
    {
    motor1.run(BACKWARD);
    motor2.run(BACKWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);
    }

    void robot_release()
    {
    motor1.run(RELEASE);
    motor2.run(RELEASE);
    motor3.run(RELEASE);
    motor4.run(RELEASE);
    }


    void turning_to_the_right()
    {
    motor1.run(FORWARD);
    motor3.run(FORWARD);
    motor2.run(BACKWARD);
    motor4.run(BACKWARD);
    }

    void turning_to_the_left()
    {
    motor2.run(FORWARD);
    motor4.run(FORWARD);
    motor1.run(BACKWARD);
    motor3.run(BACKWARD);
    }
    int get_distance()
    {
    long duration;
    int d_1, d_2, average = -1;
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    d_1 = (int) duration / 58.2;


    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    d_2 = (int) duration / 58.2;


    average = (1nt) (d_1 + d_2) / 2;
    Serial.print("distance: ");
    Serial.print(average);
    return average;

    }



    void setup()
    {
    Serial.begin(9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    motor1.setSpeed(200);
    motor1.run(RELEASE);
    motor2.setSpeed(200);
    motor2.run(RELEASE);
    motor3.setSpeed(200);
    motor3.run(RELEASE);
    motor4.setSpeed(200);
    motor4.run(RELEASE);
    robot_forward();
    }


    void loop()
    {

    if (get_distance() < 20){

    Serial.println("backward");

    robot_backward();
    delay(1000);
    Serial.println("forward");

    robot_forward();

    } else if (get_distance() < 50){

    robot_release();

    delay(500);

    d1 = get_distance();

    delay(500);

    d2 = get_distance();

    if (d1 > d2){

    Serial.println("turning to the right");

    turning_to_the_right();
    } else {

    Serial.println("turning to the left");

    turning_to_the_left();
    }

    delay(500);

    while (get_distance() < 50){
    delay(500);
    }

    robot_forward();
    }

    delay(500);
    }
     
    Последнее редактирование: 18 ноя 2014
  13. geher

    geher Гуру

    average = (1nt) (d_1 + d_2) / 2;
    Опечатка. должно быть int, а начинается не с i, а с единицы.
     
  14. CasperSimfer

    CasperSimfer Нуб

    спасибо. Это я исправил, но в чем проблема все еще осталась, так в том, что на каком то этапе своего пути робот просмотрев направо и налево начинает ехать прямо(если нет преград), но как он упирается в стену, он просто начинает двигаться вперед-назад...и так бесконечно, пока его не поставить на свободную от преград местность.
    как исправить не могу сообразить. Вот конечный код, который я сейчас имею

    #include <Servo.h>
    #include <AFMotor.h>


    #define trigPin 14
    #define echoPin 15


    AF_DCMotor motor_b1(1);
    AF_DCMotor motor_b2(2);


    AF_DCMotor motor_f1(3);
    AF_DCMotor motor_f2(4);



    Servo neck;


    int d1, d2;

    void set_speed(int speed)
    {
    motor_b1.setSpeed(speed);
    motor_b2.setSpeed(speed);
    motor_f1.setSpeed(speed);
    motor_f2.setSpeed(speed);
    }


    void robot_forward()
    {
    motor_b1.run(FORWARD);
    motor_b2.run(FORWARD);
    motor_f1.run(FORWARD);
    motor_f2.run(FORWARD);
    delay(1000);
    }


    void robot_backward()
    {
    motor_b1.run(BACKWARD);
    motor_b2.run(BACKWARD);
    motor_f1.run(BACKWARD);
    motor_f2.run(BACKWARD);
    delay(1000);
    }


    void robot_release()
    {
    motor_b1.run(RELEASE);
    motor_b2.run(RELEASE);
    motor_f1.run(RELEASE);
    motor_f2.run(RELEASE);
    delay(1000);
    }


    void turning_to_the_right()
    {
    motor_b1.run(FORWARD);
    motor_f2.run(FORWARD);
    motor_b2.run(BACKWARD);
    motor_f1.run(BACKWARD);
    delay(1000);
    }


    void turning_to_the_left(){
    motor_b2.run(FORWARD);
    motor_f1.run(FORWARD);
    motor_b1.run(BACKWARD);
    motor_f2.run(BACKWARD);
    delay(1000);
    }


    int get_distance()
    {
    long duration;
    int d_1, d_2, average = -1;

    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    d_1 = (int) duration / 58.2;


    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    d_2 = (int) duration / 58.2;

    average = (int) (d_1 + d_2) / 2;
    Serial.print("distance: ");
    Serial.println(average);
    return average;
    }


    void setup()
    {
    Serial.begin(19200);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    neck.attach(10);
    neck.write(120);
    set_speed(200);
    robot_forward();
    }

    void loop()
    {



    if (get_distance() < 20){
    Serial.println("backward");
    robot_backward();
    delay(1000);
    Serial.println("forward");
    robot_forward();
    }
    else if (get_distance() < 50)
    {
    robot_release();
    neck.write(70);
    delay(500);
    d1 = get_distance();
    neck.write(170);
    delay(500);
    d2 = get_distance();
    if (d1 > d2)
    {
    Serial.println("turning to the right");
    turning_to_the_right();
    }
    else
    {
    Serial.println("turning to the left");
    turning_to_the_left();
    }
    neck.write(120);
    delay(500);
    while (get_distance() < 50)
    {
    delay(500);
    }
    robot_forward();
    }
    delay(500);
    }
     
  15. studentIvan

    studentIvan Нерд

    Поворачивай его не полностью, у меня такая же фигня с FS90. Максимальный угол легко выявить поворачивая его например потенциометром и отправляя угол по USB на компьютер.
     
  16. SSnick

    SSnick Гик

    причем тут вольты? я ТОК сказал
     
  17. CasperSimfer

    CasperSimfer Нуб

    обычна, 9В батарейка - крона или просто через ЮСБ шнур подключаю. Какая там сила тока? я без понятия
     
  18. SSnick

    SSnick Гик

    Разберитесь сначала с понятиями силы тока и напряжением. Бывают ситуации когда не хватает напряжения, а бывает когда не хватает тока. Есть достаточно много примеров на основе воды ясно показывающие, что такое напряжение и сила тока и в чем разница между ними.
    А если компиляция происходит без ошибок, это совершенно не значит, что код будет работать так как вы захотели.
    Бывают как синтаксические ошибки (не верное написание функций, недостача запятых, скобок, лишние знаки) из за которых не компилируется код, а кроме этого есть и логические ошибки. Компиляция при этом происходит без ошибок, но код не работает или не работает как Вам надо ибо все функции верно написаны и все знаки на месте, но неверна логика построения кода. Один из банальных примеров логический ошибки это прописать LOW вместо HIGH или перепутать местами пины = код компилируется, но работает не так как хотите, ибо программа действует как Вы написали код, а не как Вы захотели.
    Для начала, если сложно с этим, напишите на бумаге ручкой по порядку НА РУССКОМ ЯЗЫКЕ БУКВАМИ по пунктам, что должна делать программа и подумайте, нет ли ошибок логики в этой цепочке, последовательность действий должна быть логичной. Нельзя полить огород из колодца, а потом узнать, что в колодце нет воды. Предвидите результат работы кода, что будет если случится так, а что будет если будет эдак? Напишите условия для исполнения любого из событий, если это необходимо.

    После чего переводите каждую строчку на язык программирования с соблюдением всех правил синтаксиса и вдумываясь в каждую строчку - "а то ли я пишу?"
     
    Последнее редактирование: 8 дек 2014