Помогите со скетчем

Тема в разделе "Флудилка", создана пользователем Deni6470, 30 ноя 2016.

Метки:
  1. Deni6470

    Deni6470 Нуб

    Доброго времени суток! Ребят помогите пожалуйста, собрал робота всем известного 4WD используя Arduino UNO и драйвер шагового двигателя L298N. Собрать было не сложно но вот с написанием программы возникла проблема=( вот мой скетч
    Код (C++):

    #include <Servo.h>
    Servo myservo;
    int servposnum = 0;
    int servpos = 0;
    int enableA = 1;
    int pinA1 = 3;
    int pinA2 = 2;
    int enableB = 6;
    int pinB1 = 5;
    int pinB2 = 4;
    #define trigPin 8
    #define echoPin 9
    void setup()
    {
       pinMode (enableA, OUTPUT);
       pinMode (pinA1, OUTPUT);
       pinMode (pinA2, OUTPUT);
       pinMode (enableB, OUTPUT);
       pinMode (pinB1, OUTPUT);
       pinMode (pinB2, OUTPUT);
       pinMode(trigPin, OUTPUT);
       pinMode(echoPin, INPUT);
       myservo.attach(7);
    }
    void loop()
    {
         car();
         avoid();    
    }
    void motorAforward()
    {
     digitalWrite (pinA1, HIGH);
     digitalWrite (pinA2, LOW);
    }
    void motorBforward()
    {
     digitalWrite (pinB1, LOW);
     digitalWrite (pinB2, HIGH);
    }
    void motorAbackward()
    {
     digitalWrite (pinA1, LOW);
     digitalWrite (pinA2, HIGH);
    }
    void motorBbackward()
    {
     digitalWrite (pinB1, HIGH);
     digitalWrite (pinB2, LOW);
    }
    void motorAstop()
    {
     digitalWrite (pinA1, HIGH);
     digitalWrite (pinA2, HIGH);
    }
    void motorBstop()
    {
     digitalWrite (pinB1, HIGH);
     digitalWrite (pinB2, HIGH);
    }
    void motorAcoast()
    {
     digitalWrite (pinA1, LOW);
     digitalWrite (pinA2, LOW);
    }
    void motorBcoast()
    {
     digitalWrite (pinB1, LOW);
     digitalWrite (pinB2, LOW);
    }
    void motorAon()
    {
     digitalWrite (enableA, HIGH);
    }
    void motorBon()
    {
     digitalWrite (enableB, HIGH);
    }
    void motorAoff()
    {
     digitalWrite (enableA, LOW);
    }
    void motorBoff()
    {
     digitalWrite (enableB, LOW);
    }
    void forward (int duration)
    {
     motorAforward();
     motorBforward();
     delay (duration);
    }
    void backward (int duration)
    {
     motorAbackward();
     motorBbackward();
     delay (duration);
    }
    void right (int duration)
    {
     motorAbackward();
     motorBforward();
     delay (duration);
    }
    void left (int duration)
    {
     motorAforward();
     motorBbackward();
     delay (duration);
    }
    void coast (int duration)
    {
     motorAcoast();
     motorBcoast();
     delay (duration);
    }
    void breakRobot (int duration)
    {
     motorAstop();
     motorBstop();
     delay (duration);
    }
    void disableMotors()
    {
     motorAoff();
     motorBoff();
    }
    void enableMotors()
    {
     motorAon();
     motorBon();
    }
    int distance()
    {
      int duration, distance;
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(1000);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = (duration/2) / 29.1;
      return distance;
    }
    void car()
    {
    int distance_0;
    distance_0 = distance();
      while(distance_0 > 15)
      {
         if(servposnum == 0)
         {
          myservo.writeMicroseconds (1900);
          servposnum = 1;
          delay(100);    
         }
         else if(servposnum == 1)
         {
          myservo.writeMicroseconds (2200);
          servposnum = 2;
         delay(100);
         }
         else if(servposnum  == 2)
         {
          myservo.writeMicroseconds (1900);
          servposnum = 3;
          delay(100);
         }
         else if(servposnum == 3)
         {
          myservo.writeMicroseconds (1600);
          servposnum = 1;
          delay(100);
         }
         motorAon();
         motorBon();
         forward(1);    
         distance_0 = distance();
         
      }
      breakRobot(0);
    }
    void avoid()
    {
        backward(500);
        right(360);
    }
     
    Где в нем может быть ошибка и как ее исправить? что дописать нужно? или что исправить? заранее огромное спасибо!
     
    Последнее редактирование: 30 ноя 2016
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    оформите код правильно (9-я кнопочка), нечитаемо ведь.
     
  3. Deni6470

    Deni6470 Нуб

    исправил
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    у меня скетч компилируется без ошибок.
     
  5. Deni6470

    Deni6470 Нуб

    вот сообщение об ошибке
    Arduino: 1.6.11 (Windows Store 1.6.11.0) (Windows 10), Плата:"Arduino/Genuino Uno"

    C:\Users\Денис\Desktop\robot1\robot1.ino: In function 'void loop()':

    robot1:27: error: 'car' was not declared in this scope

    robot1:28: error: 'avoid' was not declared in this scope

    exit status 1
    'car' was not declared in this scope

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    "Показать подробный вывод во время компиляции"
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    попробуй это перенести в самый конец скетча, после всех скобок.
    Код (C++):
    void loop()
    {
         car();
         avoid();  
    }
     
  7. Deni6470

    Deni6470 Нуб

    помогло спасибо но робот не работает((
     
  8. Deni6470

    Deni6470 Нуб

    все спасибо решил проблему=) все заработало....но есть вопрос как можно увеличить угол поворота сервы а то что то радиус ультразвукового датчика мал(
     
  9. AVGN

    AVGN Нуб

    Экспериментируйте с функцией writeMicroseconds()
    Передает на сервомотор значение в микросекундах, тем самым осуществляя управление валом.
    Если это стандартный сервомотор, то переданное значение устанавливает угол, на который должен повернуться вал.
    То есть значение «1000» – это полный поворот против часовой стрелки, «2000» – полный поворот по часовой стрелке, а «1500» – это полная остановка.
    Обратите внимание, что производители далеко не всегда строго следуют этому стандарту, поэтому сервомоторы часто реагируют на значение от «700» до «2300».
    Поэтому, чтобы узнать реальный диапазон, имеет смысл поэкспериментировать с конечными значениями.
    Также имейте в виду, что поворот вала за пределы этих конечных точек (зачастую сопровождаемый рычащим звуком) – это ситуация,
    когда на сервомотор подается ток высокого напряжения, и ее следует избегать.
    Сервомоторы непрерывного вращения реагируют на эту функцию так же, как и на функцию write().

    Синтаксис
    servo.writeMicroseconds(uS)
    Параметры
    servo – переменная типа Servo
    uS – значение, которое нужно передать сервомотору, в микросекундах. Тип данных – int

    Пример:
    Код (C++):

    #include <Servo.h>

    Servo myservo;

    void setup()
    {
      myservo.attach(7);
      myservo.writeMicroseconds(1500);  //  задаем среднюю точку, тем самым останавливая вал сервомотора
    }

    void loop()
    {}
     
    У меня с китайским сервоприводом неизвестной маркировки крутит вал от середины на 45 градусов в обе стороны вот с таким кодом:
    Код (C++):

    /*
      Code to use with a servo motor.
      Код для использования с сервомотором.
      AVG 08-01-2017.
    */


    // Setup the servo motor
    #include <Servo.h>      // библиотека Servo
    Servo myservo;            // инициализировать объект сервопривода
                                  // для подключенного серводвигателя
    int servposnum = 0;
    int servpos = 0;

    // Setup Motor A (front and rear) pins
    int enableA = 1;
    int pinA1 = 3;
    int pinA2 = 2;

    // Setup Motor B (front and rear) pins
    int enableB = 6;
    int pinB1 = 5;
    int pinB2 = 4;

    // Setup Ultrasonic Sensor pins
    #define trigPin 8
    #define echoPin 9


    void setup() {
      // The setup code goes here and runs once only
      // Configure the pin modes for each drive motor
       pinMode (enableA, OUTPUT);
       pinMode (pinA1, OUTPUT);
       pinMode (pinA2, OUTPUT);

       pinMode (enableB, OUTPUT);
       pinMode (pinB1, OUTPUT);
       pinMode (pinB2, OUTPUT);

       // Configure the pin modes for the Ultrasonic Sensor
       pinMode(trigPin, OUTPUT);
       pinMode(echoPin, INPUT);

       // Turn pin into servo driver. Calls pinMode. Returns 0 on failure.
       myservo.attach(7);
    }

    void loop() {
      // Main code goes here and will run repeatedly:

         car(); // function keeps moving car forward while distance > 15cm
         avoid(); // function makes car go back, turn slightly right to move forward in new direction
     
    }

    // Create motor functions
    void motorAforward() {
    digitalWrite (pinA1, HIGH);
    digitalWrite (pinA2, LOW);
    }
    void motorBforward() {
    digitalWrite (pinB1, LOW);
    digitalWrite (pinB2, HIGH);
    }
    void motorAbackward() {
    digitalWrite (pinA1, LOW);
    digitalWrite (pinA2, HIGH);
    }
    void motorBbackward() {
    digitalWrite (pinB1, HIGH);
    digitalWrite (pinB2, LOW);
    }
    void motorAstop() {
    digitalWrite (pinA1, HIGH);
    digitalWrite (pinA2, HIGH);
    }
    void motorBstop() {
    digitalWrite (pinB1, HIGH);
    digitalWrite (pinB2, HIGH);
    }
    void motorAcoast() {
    digitalWrite (pinA1, LOW);
    digitalWrite (pinA2, LOW);
    }
    void motorBcoast() {
    digitalWrite (pinB1, LOW);
    digitalWrite (pinB2, LOW);
    }
    void motorAon() {
    digitalWrite (enableA, HIGH);
    }
    void motorBon() {
    digitalWrite (enableB, HIGH);
    }
    void motorAoff() {
    digitalWrite (enableA, LOW);
    }
    void motorBoff() {
    digitalWrite (enableB, LOW);
    }

    // Setup movement functions
    void forward (int duration) {
    motorAforward();
    motorBforward();
    delay (duration);
    }
    void backward (int duration) {
    motorAbackward();
    motorBbackward();
    delay (duration);
    }
    void right (int duration) {
    motorAbackward();
    motorBforward();
    delay (duration);
    }
    void left (int duration) {
    motorAforward();
    motorBbackward();
    delay (duration);
    }
    void coast (int duration) {
    motorAcoast();
    motorBcoast();
    delay (duration);
    }
    void breakRobot (int duration) {
    motorAstop();
    motorBstop();
    delay (duration);
    }
    void disableMotors() {
    motorAoff();
    motorBoff();
    }
    void enableMotors() {
    motorAon();
    motorBon();
    }

    // Setup Ultrasonic Sensor distance measuring
    int distance() {
      int duration, distance;
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(1000);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = (duration/2) / 29.1;
      return distance;
    }

    // Setup the main car function
    void car() {
    int distance_0;
    distance_0 = distance();
      // Keep moving forward in a straight line while distance of objects > 15cm
      while(distance_0 > 15)
      {
         // Keep moving servo motor back and forth to scan surroundings
         // This allows the ultrasonic sensor to see more to its left and right
         if(servposnum == 0)
         {
          myservo.writeMicroseconds (1500);   //  задаем среднюю точку, тем самым останавливая вал сервомотора если задать 1480 для моего сервопривода. Было myservo.writeMicroseconds (1900);
          servposnum = 1;
          delay(100);  
         }
         else if(servposnum == 1)
         {
          myservo.writeMicroseconds (1800);   // задаем поворот сервопривода по ходу движения на лево "+300" от средней точки 1500 Было myservo.writeMicroseconds (2200);
          servposnum = 2;
         delay(100);
         }
         else if(servposnum  == 2)
         {
          myservo.writeMicroseconds (1500);   //  задаем среднюю точку, тем самым останавливая вал сервомотора если задать 1480 для моего сервопривода. Было myservo.writeMicroseconds (1900);
          servposnum = 3;
          delay(100);
         }
         else if(servposnum == 3)
         {
          myservo.writeMicroseconds (1200);   // задаем поворот сервопривода по ходу движения на право "-300" от средней точки 1500 Было myservo.writeMicroseconds (1600);
          servposnum = 1;
          delay(100);
         }
         motorAon();
         motorBon();
         forward(1);
         distance_0 = distance();
     
      }
      breakRobot(0);

    }
    void avoid()
    {
        // Go back and turn slightly right to move car in new direction if object detected < 15cm away
        backward(500);
        right(360);
    }
     
     
    Последнее редактирование: 7 янв 2017