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

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

  1. Тут нашол код http://podoroj.com/?page_id=91 но там нет серво, но есть двигатели.
    Помогите разобратся.

    Скетч для ардуины:

    Кривоват [​IMG] но работает.


    //WI-FI BOT v. 1.0a

    #include
    #include

    Servo myservo;
    AF_DCMotor motor(3); // Используем 3-тий мотор на моторшилде.

    int ledflag =1;
    int led = 13;
    int incomingByte = 0;
    int action = 0;
    int pos = 100;

    boolean o,m,h = 0;

    void setup() {
    Serial.begin(115200); // Настраиваем порт на скорость 115200.
    pinMode(led, OUTPUT);
    // Включаем сервомашинку
    myservo.attach(9);
    // Включаем двигатель
    motor.setSpeed(200);

    motor.run(RELEASE);
    }

    void loop() {
    uint8_t i;

    if (Serial.available() > 0) { //если есть доступные данные// считываем байт
    incomingByte = Serial.read();

    if(incomingByte == 99) // C
    {

    myservo.write(104);
    pos = 104;

    while(Serial.available()>0) Serial.read();

    }

    if(incomingByte == 97) // A
    {
    if (pos > 77){
    pos=pos-4;
    }
    myservo.write(pos);

    delay(5);
    while(Serial.available()>0) Serial.read();
    // Serial.println("Left");
    }
    if(incomingByte == 100) // D
    {
    if (pos < 135){
    pos=pos+4;
    }
    myservo.write(pos);

    delay(5);
    while(Serial.available()>0) Serial.read();
    // Serial.println("Right");
    }
    if(incomingByte == 115) // S
    {
    motor.run(BACKWARD);

    for (i=0; i<255; i++) {
    motor.setSpeed(i);
    delay(1);
    }
    for (i=255; i!=0; i--) {
    motor.setSpeed(i);
    delay(1);
    }
    delay(5);
    while(Serial.available()>0) Serial.read();
    // Serial.println("BWok");
    }
    if(incomingByte == 119) // W
    {
    motor.run(FORWARD);

    for (i=0; i<255; i++) {
    motor.setSpeed(i);
    delay(1);
    }
    for (i=255; i!=0; i--) {
    motor.setSpeed(i);
    delay(1);
    }
    delay(5);
    while(Serial.available()>0) Serial.read();
    // Serial.println("FWok");
    }

    if(incomingByte == 98) // b
    {
    motor.run(FORWARD);

    motor.setSpeed(0);

    while(Serial.available()>0) Serial.read();
    }

    if(incomingByte == 111) // o
    {

    motor.run(FORWARD);

    if (o == 0){
    motor.setSpeed(100);
    o = 1;
    }
    else {
    motor.setSpeed(0);
    o = 0;
    }
    while(Serial.available()>0) Serial.read();
    }

    if(incomingByte == 109) // m
    {

    motor.run(FORWARD);

    if (m == 0){
    motor.setSpeed(200);
    m = 1;
    }
    else {
    motor.setSpeed(0);
    m = 0;
    }
    while(Serial.available()>0) Serial.read();
    }

    if(incomingByte == 104) // h
    {

    motor.run(FORWARD);

    if (h == 0){
    motor.setSpeed(255);
    h = 1;
    }
    else {
    motor.setSpeed(0);
    h = 0;
    }
    while(Serial.available()>0) Serial.read();
    }

    if(incomingByte == 108) // l
    {
    if (ledflag == 1) {
    digitalWrite(led, HIGH);
    ledflag = 0;
    }
    else {
    digitalWrite(led, LOW);
    ledflag = 1;
    }
    }

    }

    }
     
  2. XCB

    XCB Гик

    я всетаки еще раз по предыдущему коду
    обратил внимание что все все работает в
    if (Serial.available() > 0) {
    а что если после
    incomingByte = Serial.read();
    этот if закрыть , перенести одну из фигурных скобок с самого конца...
    а после всех проверок incomingByte
    delay(10);
    incomingByte = '?'
    и пусть все время цикл крутится?
     
  3. Чето я не вёду. Можно наглядно код.
     
  4. XCB

    XCB Гик

    может както так? только в if'ах delay меня смущают
    Код (Text):
    #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;
    const int PWM_STEP = 10;

    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()
    {
      incomingByte = '?';
      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);
        };
        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);

        // При нажатой 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);
        }
      if (incomingByte == 'I') {
    pin6Goal=255;
    pin7Goal=255;
    }
    if (incomingByte == 'K') {
    pin6Goal=0;
    pin7Goal=0;
    }
      delay(10);
    }
     
  5. Megakoteyka

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

    Код (Text):
    // При нажатой 8 повернуть серво 1 на 180 и при отсуствии возвратить в середину
        if (incomingByte == '8') {
          servo1.write(130);
          delay(150);
          servo1.write(90);
        }
    На самом деле написано: при нажатой "8" повернуть серво 1 и через 150мс повернуть обратно. В коде нет ни слова о "при отсутствии возвратить в середину".
    Стоит начать с составления алгоритма работы программы и только затем писать код.
     
  6. Неа нет управления. Не реагирует.
     
  7. Значит с камерой разобрался.
    Поворот медленный и плавный...
    Вот:
    int pos=90;
    void loop()
    {
    if (Serial.available() > 0) {
    incomingByte = Serial.read();

    if (incomingByte == '5') {
    pos = 90;
    servo1.write(pos);
    servo2.write(pos);
    }
    else if (incomingByte == '8') {
    pos--;
    servo1.write(pos);
    }
    else if (incomingByte == '2') {
    pos++;
    servo1.write(pos);
    }
    else if (incomingByte == '4') {
    pos++;
    servo2.write(pos);
    }
    else if (incomingByte == '6') {
    pos--;
    servo2.write(pos);
    }
    }
    Подскажыта как реализовать ШИМ управление двигателями........ ? плавный старт...
    pinMode(2, OUTPUT); // L298N
    pinMode(3, OUTPUT); // L298N
    pinMode(4, OUTPUT); // L298N
    pinMode(5, OUTPUT); // L298N
     
  8. Turder

    Turder Нуб

    Здравствуйте!

    я решил не плодить темы, спрошу тут.

    уже создал вполне себе ездящего робота, захотел теперь, чтобы он стоял в "ожидании", а при нажатии кнопки начинал ездить, а при повторном нажатии снова в ожидании замирал. Ну, взял готовый код свой, успешно опробованный, добавил в код инпут-пин, прописал все булеаны и условия как во втором уроке Джереми, начал совмещать коды.... бился-бился, мозгов не хватило - робот все время сразу ехал и не останавливался, плюнул, поменял кнопку на тупой тумблер "вкл-выкл", выкинул все булеаны, поставил примитивнейший цикл:

    void loop ()
    {
    if (digitalRead (8), LOW)
    {IDLE ();}
    else
    {RIDE ();}
    }

    - одну ногу тумблера на 5 вольт, другую на 8 пин. И... ВСЕ РАВНО робот выполняет сразу void RIDE, вне зависимости от положения тумблера! Я уже и напрямую пин прописывал, и назначал переменную, и менял пин, стягивающий резистор поставил на землю, тумблер прозвонил... все в норме, но робот все равно едет (даже если я намудрил в блоке IDLE и моторы там не застопорены - все равно не загорается диод на 10 пине - это я так привык, блоки кода снабжать диодами, чтобы понимать, что в какой момент работает). Либо я чего-то ТОТАЛЬНО не понимаю и мне надо проспаться, либо... ну в общем, помогите, пожалуйста : )
    Полный код - вот:
    Код (Text):
    void loop ()
    int irsl = 1; // Левый ИК - сенсор: сигнал поступает на аналоговый вход 1
    int irsr = 2; // Правый ИК - сенсор: сигнал поступает на аналоговый вход 2

    int disl = 0; // Задаем переменную для условного расстояния с левого сенсора
    int disr = 0; // Задаем переменную для условного расстояния с правого сенсора

    // Следующие 4 строки задают пины на Motor Shield как управляющие моторами.
    // цифрой 1 обозначены правые моторы, цифрой 2 - левые. E - аналоговая
    // переменная - cкорость, М - цифровая переменная - направление вращения колес.
    int E1 = 5;
    int M1 = 4;
    int E2 = 6;  
    int M2 = 7;






    void CORNER ()
    {
     
      digitalWrite(9,LOW); // гасим зеленый диод
      digitalWrite(10,HIGH); // зажигаем красный диод
     
      digitalWrite(M1,LOW);  // правые моторы включают задний ход
      digitalWrite(M2, LOW);  // левые моторы едут вперед и разворачивают робота
      analogWrite(E1, 250);  //PWM Speed Control
      analogWrite(E2, 250);  //PWM Speed Control
      delay (150);  // на выполнение маневра отводим полсекунды - достаточно для разворота
       
      }
     
    void LTURN ()

    {
      digitalWrite(9,LOW);
      digitalWrite(10,HIGH);
       
    digitalWrite(M1, HIGH);  
      digitalWrite(M2, LOW);  
      analogWrite(E1, 250);  //PWM Speed Control
      analogWrite(E2, 250);
      delay(100);
    }

    void RTURN ()

    {
      digitalWrite(9,LOW);
      digitalWrite(10,HIGH);
       
    digitalWrite(M1, LOW);  
      digitalWrite(M2, HIGH);  
      analogWrite(E1, 250);  //PWM Speed Control
      analogWrite(E2, 250);
      delay(100);
    }

    void FORWARD ()

    {
     digitalWrite(9,HIGH); // включаем зеленый диод
      digitalWrite(10,LOW); // выключаем красный диод
       
      digitalWrite(M1,HIGH);  //едем
      digitalWrite(M2, HIGH);  // вперед  
      analogWrite(E1, 250);  //PWM Speed Control
      analogWrite(E2, 250);
    }

    void IDLE ()

    {
      digitalWrite(9,LOW);
      digitalWrite(10,HIGH);
       
    digitalWrite(M1, LOW);  
      digitalWrite(M2, LOW);  
      analogWrite(E1, 0);  //PWM Speed Control
      analogWrite(E2, 0);
       
    }


    void RIDE()
    {
     
      disl = analogRead(irsl); // в придуманные нами переменные для условного расстояния
      disr = analogRead(irsr); // записываем аналоговые данные с ИК-сенсоров
    digitalWrite(9,LOW); // гасим светодиод
    digitalWrite(10,LOW); // гасим светодиод
     
    if

    (disr > 250 && disl > 250) // если расстояние с правого И левого сенсора малое, то
      {
      tone(11, 3000, 100);  // издаем звук
      CORNER ();
      if (disr>disl)
      {
      RTURN ();
      delay (500);}
      else
      {
      LTURN ();
      delay (500);}
      noTone (11);
       
      }
       
     
     
     
      else
     
      {
       
      if (disl > 300) // если слева препятствие согласно ИК-сенсору
    {

      RTURN ();
      }
     
    else
    {
      if (disr > 300) // аналогично предыдущему блоку - но помеха справа, зеркально
    {
    LTURN ();
    }
     
     
      else // это "иначе" относится к отсутствию препятствий
      // сналала прописано попадание в угол - иначе робот будет выполнять один из
      //циклов поворота вправо или влево и застрянет, так как не дойдет до
      // блока проверки условия помехи на обоих сенсорах. случай езды по прямой можно
      // приравнять к идеальному, поэтому он поставлен в конец кода, чтобы убедиться
      // на 100% в отсутствии препятствий
      {
      FORWARD ();
      delay (200); // раз в 0,2 секунды возвращаемся в начало кода для проверки
      // наличия впереди препятствий
    }
    }
    }
    }



    void setup ()

    {
      pinMode(M1, OUTPUT); // назначаем пин M1 как выдающий напряжение для моторов
      pinMode(M2, OUTPUT); // назначаем пин M1 как выдающий напряжение для моторов
      pinMode (9, OUTPUT); // пины 9 и 10 также назначаем как выдающие напряжение,
      pinMode (10, OUTPUT); //их используем для светодиодов
    pinMode (8, INPUT);

    }
    void loop ()
    {
      if (digitalRead (8), LOW)
      {IDLE ();}
      else
      {RIDE ();}
     }
     
     
  9. Megakoteyka

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

    А что должна делать строка if(digitalRead(8), LOW) ?
    Оператор сравнения там разве не должен присутствовать?