Помогите с кодом - создание робота.

Тема в разделе "Arduino & Shields", создана пользователем palagnyukvovan, 23 дек 2013.

  1. Здравствуйте!
    Создал робота на колесах.
    Управление по WI FI + видео камера на двух сервоприводах. Arduino(ARDUINO MEGA 2560) + router WR703N + L298N. передеча по UART.
    Набросал скетч так как в программировании не очень разбираюсь, прошу помощи.
    Вот код:

    #include <Servo.h>
    Servo servo1;
    Servo servo2;
    const int SERVO1_PIN = 8;
    const int SERVO2_PIN = 9;
    const int MAX_POS = 1023;
    const int MAX_ANGLE = 180;

    int incomingByte;
    void setup()
    {
    servo1.attach(SERVO1_PIN);
    servo2.attach(SERVO2_PIN);

    pinMode(2, OUTPUT); // L298N
    pinMode(3, OUTPUT); // L298N
    pinMode(4, OUTPUT); // L298N
    pinMode(5, OUTPUT); // L298N
    pinMode(6, OUTPUT); // ШИМ
    pinMode(7, OUTPUT); // ШИМ
    pinMode(10, OUTPUT); // Сигнал
    pinMode(11, OUTPUT); // Фары
    Serial.begin(115200);
    }

    void loop()
    {
    if (Serial.available() > 0) {
    incomingByte = Serial.read();
    // Установка серво 1 в среднее положение
    if (incomingByte == '5') {
    servo1.write(90);
    }
    // Установка серво 2 в среднее положение
    if (incomingByte == '5') {
    servo2.write(90);
    }
    // При нажатой 8 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '8') {
    servo1.write(130);
    delay(150);
    servo1.write(90);
    }
    // При нажатой 2 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '2') {
    servo1.write(10);
    delay(150);
    servo1.write(90);
    }
    // При нажатой 4 повернуть серво 2 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '4') {
    servo2.write(180);
    delay(150);
    servo2.write(90);
    }
    // При нажатой 6 повернуть серво 2 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '6') {
    servo2.write(10);
    delay(150);
    servo2.write(90);
    }
    // При нажатой 7 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    // При нажатой 7 повернуть серво 2 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '7') {
    servo1.write(130);
    servo2.write(180);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    // При нажатой 9 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    // При нажатой 9 повернуть серво 2 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '9') {
    servo1.write(130);
    servo2.write(10);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    // При нажатой 1 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    // При нажатой 1 повернуть серво 2 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '1') {
    servo1.write(10);
    servo2.write(180);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    // При нажатой 3 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    // При нажатой 3 повернуть серво 2 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '3') {
    servo1.write(10);
    servo2.write(10);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    digitalWrite(6, HIGH);// ето в место ШИМ
    digitalWrite(7, HIGH);// еио в место ШИМ
    // При нажатой Q двигатся влево передним ходом
    if (incomingByte == 'Q') {
    digitalWrite(2, HIGH);
    digitalWrite(5, HIGH);
    delay(120);
    digitalWrite(2, LOW);
    digitalWrite(5, LOW);
    }
    // При нажатой W двигатся вперед
    if (incomingByte == 'W') {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    delay(120);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    }
    // При нажатой E двигатся вправопередним ходом
    if (incomingByte == 'E') {
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    delay(120);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    }
    // При нажатой A двигатся влево задним ходом
    if (incomingByte == 'A') {
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    delay(120);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    }
    // При нажатой S двигатся назад
    if (incomingByte == 'S') {
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    delay(120);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    }
    // При нажатой D двигатся вправо задним ходом
    if (incomingByte == 'D') {
    digitalWrite(5, HIGH);
    digitalWrite(2, HIGH);
    delay(120);
    digitalWrite(5, LOW);
    digitalWrite(2, LOW);
    }
    // При нажатой R посигналить
    if (incomingByte == 'R') {
    digitalWrite(10, HIGH);
    delay(120);
    digitalWrite(10, LOW);
    }
    // При нажатой F включить фари
    if (incomingByte == 'F') {
    digitalWrite(11, HIGH);
    }
    // При нажатой G виключить фари
    if (incomingByte == 'G') {
    digitalWrite(11, LOW);
    }
    }
    }

    Всьо работает. Управление + видео.
    Но надо сгладить, зделать управление камерой плавно.
    Добавить управление двигателями с помощю ШИМ. Плавний запуск.
    Надеюсь на помощь.
    Заранее спасибо.
     
    Последнее редактирование: 24 дек 2013
  2. XCB

    XCB Гик

    вы не указали какую из плат использовали
    например тут http://arduino.cc/en/Main/ArduinoBoardUno не все выводы могут быть ШИМ
    у вас
    Код (Text):
    pinMode(2, OUTPUT); // L298N
    pinMode(3, OUTPUT); // L298N
    pinMode(4, OUTPUT); // L298N
    pinMode(5, OUTPUT); // L298N
    3 и 5 могут быть ШИМ но тогда ими нужно управлять как сервами или функцией analogWrite
     
  3. Значит использую ARDUINO MEGA 2560. http://arduino.cc/en/Main/ArduinoBoardMega2560
    В коде указано которий пин -ШИМ(PWM):
    digitalWrite(6, HIGH);// ето в место ШИМ постоянно включен/ а надо чтоб по возростанию.
    digitalWrite(7, HIGH);// еио в место ШИМ постоянно включен/ а надо чтоб по возростанию.
     
    Последнее редактирование: 24 дек 2013
  4. Megakoteyka

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

    Смотрите пример %Arduino IDE%\examples\01.Basics\Fade, там о плавном нарастании при помощи ШИМ написано.
     
  5. А как на счет сервоприводов ???
     
  6. XCB

    XCB Гик

    Код (Text):
      for (int i=0; i <= 255; i++){
          analogWrite(6, i);
          analogWrite(7, i);
          delay(10);
      }
     
  7. Megakoteyka

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

  8. Искал. Но не получается самому чето слипить.
     
  9. Пробивал вставлять ваш код в свой, выводит ошибку. Можыте интегрировать.?
     
  10. XCB

    XCB Гик

    прям заменил ваши строки своими и добавил точку с запятой и все собралось
     
  11. Megakoteyka

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

    Логично было бы сначала выучить язык, и только потом пытаться на нем что-то написать.
    Чтобы что-то "слипить", нужно сперва понять, как это работает.
     
  12. А на счет языка Русского, то извините я сам с Украины.
     
  13. в место строк
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    вставил ваш код,
    for (int i=0; i <= 255; i++){
    analogWrite(6, i);
    analogWrite(7, i);
    delay(10);
    }
    собралось, прошил дуину но управление не работает.
     
    Последнее редактирование: 24 дек 2013
  14. XCB

    XCB Гик

    for (int i=0; i <= 255; i++){
    ...
    delay(10);
    }
    будет выполняться примерно 2,6 секунд незнаю не мешает ли это в основном то цикле
     
  15. Ставил
    for (int i=0; i <= 255; i++){
    ...
    delay(150);
    }
    безрезультатно.
     
  16. XCB

    XCB Гик

    я к тому что delay да еще и в цикле это крайне плохо, я не великий специалист но мне кажется для обеспечения плавности в генерации PWM нужно использовать например прерывания, но для меня это пока сложно
    попробуйте например так:
    где то в начале константы и переменные
    Код (Text):
    const int PWM_STEP = 10;

    int pin6Val = 0;
    int pin7Val = 0;
    int pin6Goal = 0;
    int pin7Goal = 0;
    затем в основном цикле что то вроде
    Код (Text):
     if (pin6Val<pin6Goal-PWM_STEP) {
          pin6Val=pin6Val+PWM_STEP;
        }
        else if (pin6Val>pin6Goal+PWM_STEP) {
            pin6Val=pin6Val+PWM_STEP;
          };
        if (pin7Val<pin7Goal-PWM_STEP) {
          pin7Val=pin7Val+PWM_STEP;
        }
        else if (pin7Val>pin7Goal+PWM_STEP) {
            pin7Val=pin7Val+PWM_STEP;
          };
        analogWrite(6, pin6Val);
        analogWrite(7, pin7Val);
     
    и в каких то местах менять pin6Goal и pin7Goal ставя их например в 255
     
  17. Че то всьо ето мне не очень понятно..
     
  18. Зделал вот так :
    #include <Servo.h>
    Servo servo1;
    Servo servo2;
    const int PWM_STEP = 10;
    const int SERVO1_PIN = 8;
    const int SERVO2_PIN = 9;
    const int MAX_POS = 1023;
    const int MAX_ANGLE = 180;

    int pin6Val = 0;
    int pin7Val = 0;
    int pin6Goal = 0;
    int pin7Goal = 0;
    int incomingByte;
    void setup()
    {
    servo1.attach(SERVO1_PIN);
    servo2.attach(SERVO2_PIN);

    pinMode(2, OUTPUT); // L298N
    pinMode(3, OUTPUT); // L298N
    pinMode(4, OUTPUT); // L298N
    pinMode(5, OUTPUT); // L298N
    pinMode(6, OUTPUT); // ШИМ
    pinMode(7, OUTPUT); // ШИМ
    pinMode(10, OUTPUT); // Сигнал
    pinMode(11, OUTPUT); // Фары
    Serial.begin(115200);
    }

    void loop()
    {
    if (Serial.available() > 0) {
    incomingByte = Serial.read();





    if (pin6Val<pin6Goal-PWM_STEP) {
    pin6Val=pin6Val+PWM_STEP;
    }
    else if (pin6Val>pin6Goal+PWM_STEP) {
    pin6Val=pin6Val+PWM_STEP;
    };
    if (pin7Val<pin7Goal-PWM_STEP) {
    pin7Val=pin7Val+PWM_STEP;
    }
    else if (pin7Val>pin7Goal+PWM_STEP) {
    pin7Val=pin7Val+PWM_STEP;
    };
    analogWrite(6, pin6Val);
    analogWrite(7, pin7Val);









    // Установка серво 1 в среднее положение
    if (incomingByte == '5') {
    servo1.write(90);
    }
    // Установка серво 2 в среднее положение
    if (incomingByte == '5') {
    servo2.write(90);
    }
    // При нажатой 8 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '8') {
    servo1.write(130);
    delay(150);
    servo1.write(90);
    }
    // При нажатой 2 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '2') {
    servo1.write(10);
    delay(150);
    servo1.write(90);
    }
    // При нажатой 4 повернуть серво 2 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '4') {
    servo2.write(180);
    delay(150);
    servo2.write(90);
    }
    // При нажатой 6 повернуть серво 2 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '6') {
    servo2.write(10);
    delay(150);
    servo2.write(90);
    }
    // При нажатой 7 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    // При нажатой 7 повернуть серво 2 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '7') {
    servo1.write(130);
    servo2.write(180);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    // При нажатой 9 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    // При нажатой 9 повернуть серво 2 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '9') {
    servo1.write(130);
    servo2.write(10);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    // При нажатой 1 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    // При нажатой 1 повернуть серво 2 на 180 и при отсуствии возвратить в середину
    if (incomingByte == '1') {
    servo1.write(10);
    servo2.write(180);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    // При нажатой 3 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    // При нажатой 3 повернуть серво 2 на 10 и при отсуствии возвратить в середину
    if (incomingByte == '3') {
    servo1.write(10);
    servo2.write(10);
    delay(150);
    servo1.write(90);
    servo2.write(90);
    }
    digitalWrite(6, HIGH);// ето в место ШИМ
    digitalWrite(7, HIGH);// еио в место ШИМ
    // При нажатой Q двигатся влево передним ходом
    if (incomingByte == 'Q') {
    digitalWrite(2, HIGH);
    digitalWrite(5, HIGH);
    delay(120);
    digitalWrite(2, LOW);
    digitalWrite(5, LOW);
    }
    // При нажатой W двигатся вперед
    if (incomingByte == 'W') {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    delay(120);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    }
    // При нажатой E двигатся вправопередним ходом
    if (incomingByte == 'E') {
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    delay(120);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    }
    // При нажатой A двигатся влево задним ходом
    if (incomingByte == 'A') {
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    delay(120);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    }
    // При нажатой S двигатся назад
    if (incomingByte == 'S') {
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    delay(120);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    }
    // При нажатой D двигатся вправо задним ходом
    if (incomingByte == 'D') {
    digitalWrite(5, HIGH);
    digitalWrite(2, HIGH);
    delay(120);
    digitalWrite(5, LOW);
    digitalWrite(2, LOW);
    }
    // При нажатой R посигналить
    if (incomingByte == 'R') {
    digitalWrite(10, HIGH);
    delay(120);
    digitalWrite(10, LOW);
    }
    // При нажатой F включить фари
    if (incomingByte == 'F') {
    digitalWrite(11, HIGH);
    }
    // При нажатой G виключить фари
    if (incomingByte == 'G') {
    digitalWrite(11, LOW);
    }
    }
    }

    Зашил. Но ничего не изменилось.Управление как било.
     
    Последнее редактирование: 24 дек 2013
  19. XCB

    XCB Гик

    нужно по какому нибудь коду менять pin*Goal например так
    Код (Text):
    if (incomingByte == 'I') {
    pin6Goal=255;
    pin7Goal=255;
    }
    if (incomingByte == 'K') {
    pin6Goal=0;
    pin7Goal=0;
    }
     
     
  20. По вашему коду выходит так: I старт а K стоп?. А надо так если I тогда старт а если нет ничего тогда стоп.
     
    Последнее редактирование: 24 дек 2013