Помогите написать прогу по езде робота по линии. оплата 1500 руб.

Тема в разделе "Arduino & Shields", создана пользователем roman88, 25 мар 2015.

  1. roman88

    roman88 Нерд

    Нужен скетч по плавной езде робота по белой линии на основе ардуино и аналогового датчика линии от амперки. Программа запускается с помощью кнопки на lcd экране.
     
  2. Arduinщик

    Arduinщик Нерд

    Вопрос, какое значение получают датчики, когда они "видят" белый или чёрный цвет.
    Подключите датчик так:
    G - в землю
    V - к 5В
    S - к аналоговому входу A0

    Для этого пропишите код:
    int sensorPin = A0;

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

    void loop() {
    // read the value from the sensor:
    int sensorValue = analogRead(sensorPin);
    Serial.print(sensorValue);
    Serial.print("\r\n");
    delay(500);
    }
    чтобы увидеть показания
    надо нажать на "лупу" в верхнем правом углу Arduino IDE.
    Когда я узнаю показания напишу код.
     
  3. roman88

    roman88 Нерд

    Насколько помню
    белое - 49
    Черное > 50
    забыл упомянуть что датчика 2.
    с готовым кодом вышлите реквизиты для оплаты на robototechnik_gen@mail.ru.
     
  4. Arduinщик

    Arduinщик Нерд

    // Моторы подключаются к клеммам M1+,M1-,M2+,M2-
    // Motor shield использует четыре контакта 6,5,7,4 для управления моторами
    #define SPEED_LEFT 6
    #define SPEED_RIGHT 5
    #define DIR_LEFT 7
    #define DIR_RIGHT 4
    #define LEFT_SENSOR_PIN A0
    #define RIGHT_SENSOR_PIN A1
    #define BUTTON_PIN 8 // кнопка от LCD экрана.
    // Скорость, с которой мы движемся вперёд (0-255)
    #define SPEED 35

    // Коэффициент, задающий во сколько раз нужно затормозить
    // одно из колёс для поворота
    #define BRAKE_K 4

    #define STATE_FORWARD 0
    #define STATE_RIGHT 1
    #define STATE_LEFT 2

    int state = STATE_FORWARD;
    bool wasButtonDown = false;

    void runForward()
    {
    state = STATE_FORWARD;

    // Для регулировки скорости `SPEED` может принимать значения от 0 до 255,
    // чем болше, тем быстрее.
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    // Если в DIR_LEFT или DIR_RIGHT пишем HIGH, мотор будет двигать соответствующее колесо
    // вперёд, если LOW - назад.
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
    }

    void steerRight()
    {
    state = STATE_RIGHT;

    // Замедляем правое колесо относительно левого,
    // чтобы начать поворот
    analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
    analogWrite(SPEED_LEFT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
    }

    void steerLeft()
    {
    state = STATE_LEFT;

    analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
    }


    void setup()
    {
    // Настраивает выводы платы 4,5,6,7 на вывод сигналов
    for(int i = 4; i <= 7; i++)
    pinMode(i, OUTPUT);

    // Сразу едем вперёд
    runForward();
    }

    void loop()
    {
    bool isButtonDown = digitalRead(BUTTON_PIN);
    // Наш робот ездит по белому полю с чёрным треком. В обратном случае не нужно
    // инвертировать значения с датчиков
    int left = analogRead(LEFT_SENSOR_PIN);
    int right = analogRead(RIGHT_SENSOR_PIN);
    // В какое состояние нужно перейти?
    int targetState;

    if (isButtonDown && !wasButtonDown) {
    if (left == right) {
    // под сенсорами всё белое или всё чёрное
    // едем вперёд
    targetState = STATE_FORWARD;
    } else if (left == 49) {
    // левый сенсор упёрся в трек
    // поворачиваем налево
    targetState = STATE_LEFT;
    } else {
    targetState = STATE_RIGHT;
    }

    if (state == targetState) {
    // мы уже делаём всё что нужно,
    // делаем измерения заново
    return;
    }

    switch (targetState) {
    case STATE_FORWARD:
    runForward();
    break;

    case STATE_RIGHT:
    steerRight();
    break;

    case STATE_LEFT:
    steerLeft();
    break;
    }

    // не позволяем сильно вилять на прямой
    delay(50);
    }
    }





    Денег не возьму, потому что код не писал, а содрал.
    Если что-то не так пишите.