Массив данных расстояния датчика HC-SR04 закреплённом на сервоприводе

Тема в разделе "Arduino & Shields", создана пользователем vegas203, 13 июл 2018.

  1. vegas203

    vegas203 Нуб

    Всем привет! Недавно начал работать с ардуино. Сделал проекты со светодиодами, потенциометрами, моторчиками и сервоприводами. Решил взяться за проект посложнее, а именно - робота, который сам перемещается. Написал программу для сбора данных в массив и вращение сервы, но оно у меня в последовательном порту выдаёт только значения massAll[0][0] и massAll[0][1]. Нужна помощь, не понимаю в чём проблема.
    Код (C++):
    #include <Servo.h>
    #include <Ultrasonic.h>

    Ultrasonic ultrasonic(8,9);
    Servo servo;

    int massAll[3][4];
    int massMax[3];
    int massMin[3];

    int val_servo ;

    void setup() {
      Serial.begin(9600);

      servo.attach(3);                              
     
    }

    void mass_left(){
       if (val_servo = 40){
        massAll[0][0] = ultrasonic.Ranging(CM);
        Serial.print("massAll[0][0]"); Serial.println(" = "); Serial.println(massAll[0][0]);
       }
       else if (val_servo = 50){
        massAll[0][1] = ultrasonic.Ranging(CM);
        Serial.print("massAll[0][1]"); Serial.println(" = "); Serial.println(massAll[0][1]);
       }
       else if (val_servo = 60){
        massAll[0][2] = ultrasonic.Ranging(CM);
        Serial.print("massAll[0][2]"); Serial.println(" = "); Serial.println(massAll[0][2]);
       }
       else if (val_servo = 65){
        massAll[0][3] = ultrasonic.Ranging(CM);
        Serial.print("massAll[0][3]"); Serial.println(" = "); Serial.println(massAll[0][3]);
       }
    }
    void mass_forvard(){
       if (val_servo = 70){
        massAll[1][0] = ultrasonic.Ranging(CM);
        Serial.print("massAll[1][0]"); Serial.println(" = "); Serial.println(massAll[1][0]);
       }
       else if (val_servo = 80){
        massAll[1][1] = ultrasonic.Ranging(CM);
        Serial.print("massAll[1][1]"); Serial.println(" = "); Serial.println(massAll[1][1]);
       }
       else if (val_servo = 90){
        massAll[1][2] = ultrasonic.Ranging(CM);
        Serial.print("massAll[1][2]"); Serial.println(" = "); Serial.println(massAll[1][2]);
       }
       else if (val_servo = 100){
        massAll[1][3] = ultrasonic.Ranging(CM);
        Serial.print("massAll[1][3]"); Serial.println(" = "); Serial.println(massAll[1][3]);
       }
    }
    void mass_right(){
       if (val_servo = 105){
        massAll[2][0] = ultrasonic.Ranging(CM);
        Serial.print("massAll[2][0]"); Serial.println(" = "); Serial.println(massAll[0][0]);
       }
       else if (val_servo = 110){
        massAll[2][1] = ultrasonic.Ranging(CM);
        Serial.print("massAll[2][1]"); Serial.println(" = "); Serial.println(massAll[2][0]);
       }
       else if (val_servo = 120){
        massAll[2][2] = ultrasonic.Ranging(CM);
        Serial.print("massAll[2][2]"); Serial.println(" = "); Serial.println(massAll[2][2]);
       }
       else if (val_servo = 130){
        massAll[2][3] = ultrasonic.Ranging(CM);
        Serial.print("massAll[2][3]"); Serial.println(" = "); Serial.println(massAll[2][3]);
       }
    }
    void servo_osnova(){
      for(val_servo; val_servo <= 130; val_servo++){
        servo.write(val_servo);
        delay(5);
    }
    servo.write(90);
    delay(20);
    for(val_servo; val_servo >= 40; val_servo--){
        servo.write(val_servo);
       delay(5);
    }
    }
    void loop() {

        mass_left();
        mass_forvard();
        mass_right();
        servo_osnova();
      }
     
     
  2. Mitrandir

    Mitrandir Гуру

    Ошибка в логике.
    Перый проход лупа.
    Val_servo = 0.
    Вызываются функции mass_* ничего не выводят.

    Вызывается функция servo_osnova
    Прощелкивает до 130
    Серваке повернулась val_servo = 130
    Затем крутится обратно
    Докрутилась до 40
    Val_servo= 40

    Следующий цикл loop

    Запускается mass_left
    Видит вал_серво 40
    Выводит
    Или.д
     
  3. vegas203

    vegas203 Нуб

    т.е. мне нужно задать начальное значение сервопривода равное 40?
     
  4. Mitrandir

    Mitrandir Гуру

    *facepalm* нет.

    отложить клавиатуру, взять ручку и нарисовать блок схему алгоритма
     
  5. ИгорьК

    ИгорьК Гуру

    Зачем писать в раздел форума, где люди делятся готовыми решениями?
     
  6. fogary

    fogary Гик

    Перепешите функцию servo_osnova() без использования циклов (функция loop() сама по себе цикл). Так что бы за один вызов функции значение val_servo менялось только один раз. Должно заработать как Вы хотите.