arduino uno + servo == звуки USB подключения

Тема в разделе "Arduino & Shields", создана пользователем d00m, 19 ноя 2012.

  1. d00m

    d00m Гик

    извините, но вы проверяли этот код ? у вас он работает ?
     
  2. Ваш код:
    [​IMG]при посылании 70.
     
  3. Код nailxx`а не работает и зависает.
    Сейчас запишу видео.
    -------------------------------------


    Смотреть в HD 720p!
     
  4. d00m

    d00m Гик

    он зацикливается - это видно в самом коде где..
    не ребята.. чтото тут не так с этой конвертацией..
    я нагуглил другое решение, которое точно работает:

    while (Serial.available()) {
    char c = Serial.read(); //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2); //slow looping to allow buffer to fill with next character
    }

    и дальше можно эту втроку конвертить с помощью

    int n = readString.toInt();

    но как распарсить строку в которой есть и символы и цифры ? допустим r70 или l50
    если r - крутим right serv на 70
    если l - крутим left на 50
    я пока не придумал..
     
    Злая Птичка нравится это.
  5. Код (Text):
    код убран, т.к. не работает
    для тестов:
    Код (Text):
    недокод убран
    Проверяйте :)
     
  6. Unixon

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

    Код (Text):

    bool parseCommand(String command, int& direction, int& value)
    {
     bool dir_ok = false, val_ok = false;
     direction = 0; value = 0; String val;
     for (int i = 0; i < command.length(); i++)
     {
      if (!dir_ok)
      {
       if (('l'==command[i]) || ('L'==command[i]))
       {
        direction = -1;
        dir_ok = true;
        continue;
       }
       else if (('r'==command[i]) || ('R'==command[i]))
       {
        direction = +1;
        dir_ok = true;
        continue;
       }
      }
      if (dir_ok && !val_ok)
      {
       if ((command[i]>='0') && (command[i]<='9')) val = val+command[i];
       else
       {
        value = val.toInt();
        val_ok = true;
       }
      }
     if (dir_ok && val_ok) return true;
     }
     return false;
    }
     
     
  7. Unixon

    Код полностью, пожалуйста, приведите, если можете.
     
  8. Unixon

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

    Да это я сейчас просто пример парсера в браузере накидал.
    Нет у меня всего остального кота и никогда не было. :D
     
  9. :eek:
    А как этим парсером пользоваться, что посылать в эту функцию?
     
  10. d00m

    d00m Гик

    Right serva:
    0

    Left serva:
    0

    Right serva:
    0

    похоже код не проверяется перед постингом )
     
  11. d00m

    d00m Гик

    ну а вы как думаете ?
    конкретно - букву и цифру. чтотов роде r50 и потом l70
    ведь видно ж в коде что эта буква и цифра суммируется и именно по этому не отрабатывает readString.toInt
    не умеет от символы в int конвертить.


     
    Злая Птичка нравится это.
  12. Unixon

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

    Как как... исходя из синтаксиса.

    Код (Text):

    String command;
    while (command.length()<MAX_COMMAND_LENGTH)
    {
     if (serial.available())
     {
      char c = Serial.read();
      if ((' '==c) || (0==c)) break;
     }
    }
    int direction, value;
    if (parseCommand(command, direction, value))
    {
     // do something
    }
     
    Вы как будто первый раз код на сях видите.
     
  13. В command - команду(l10,r180), да?
     
  14. d00m

    d00m Гик

    кстати, мне кажется что наиболее интерактивное общение через Serial Monitor это когда можно будет вводить команду только для одного серва.
    то есть хочу левый на 50 и ввожу - l50
    а потом хочу правый на 40 - ввожу следующую команду r40
    хотя наверное проще все будет реализовать если вводить шаблоном
    тогда не надо будет буков для выбора серва, нужно будет только придумать каким образом передавать команду серву "чтобы он ничего не делал" ))
    например
    40-0
    левый 40 - правый 0
    *-50
    левый hold - правый 50
    хотя не.. и эту строку тоже надо будет парсить.
     
    Злая Птичка нравится это.
  15. Улыбаемся и машем! :D:D
    Для тестов:
    Код (Text):
    //#include <Servo.h>
    //Servo servo1, servo2;
    int t;
    String readString;
     
    void setup()
    {
      //servo1.attach(10);
      //servo2.attach(9);
      Serial.begin(9600);
    }
    void loop()
    {
     
    while (Serial.available()) {
    char c = Serial.read(); //gets one byte from serial buffer
    if(c=='l'){int l = t; Serial.println("Left:"); Serial.println(l); readString=""; t=0; l=0; goto label;}
    if(c=='r'){int r = t; Serial.println("Right:"); Serial.println(r); t=0; readString=""; r=0; goto label;}
    readString += c; //makes the string readString
    delay(2);
    t = readString.toInt();
    //servo2.write(t);
    label:
    delay(100);
    }
    }
    Для работы:
    Код (Text):
    #include <Servo.h>
    Servo servo1, servo2;
    int t;
    String readString;
    void setup()
    {
    servo1.attach(10);
    servo2.attach(9);
    Serial.begin(9600);
    }
    void loop()
    {
    while (Serial.available()) {
    char c = Serial.read(); //gets one byte from serial buffer
    if(c=='l'){int l = t; servo1.write(l); readString=""; t=0; l=0; goto label;}
    if(c=='r'){int r = t; servo2.write(r); t=0; readString=""; r=0; goto label;}
    readString += c; //makes the string readString
    delay(2);
    t = readString.toInt();
    label:
    delay(100);
    }
    }
    Проверено!
    Передавать так: 10l, 67r, 36r, 78l, 180l
     
  16. По-другому сделал...

     
  17. Программа для тестирования работы: (ссылка не работает)
    (Visual Studio 2012, C#)
     
  18. Вот так-с. Проверяйте.
    1l - левая серва угол 1
    170r - правая серва угол 170
     
  19. d00m

    d00m Гик

    спасибо.. но меня учили что goto это плохая инструкция.. я сделал по своему:
    Код (Text):
    #include <Servo.h>
    Servo servo;
    String readString;
    char c;
    int ang;
    int servo_pin;
     
    void setup()
    {
      Serial.begin(9600);
      Serial.println("Ready");
    }
     
    void loop() {
     
    while (Serial.available()) {
      c = Serial.read(); //gets one byte from serial buffer
      switch (c) {
        case 'l':
          servo_pin = 9;
          servo.attach(servo_pin);
          readString = "";
          Serial.print("Left servo listen. servo pin is: ");
          Serial.println(servo_pin);
          break;
        case 'r':
          servo_pin = 10;
          servo.attach(servo_pin);
          readString = "";
          Serial.print("Right servo listen. pin is: ");
          Serial.println(servo_pin);    
          break;
        default:
          readString += c; //makes the string readString
          delay(2);  //slow looping to allow buffer to fill with next character
    //      Serial.print("readString: ");
    //      Serial.println(readString);  //so you can see the captured string
          ang = readString.toInt();  //convert readString into a number
    //      Serial.print("ang: ");
    //      Serial.println(ang);
          break;
      }
    }
    if (readString.length() >0) {
      Serial.print("ang: ");
      Serial.println(ang);
      readString = "";
     
      servo.write(ang);
     
    }
     
    }
     
  20. Ну и кто вас учил, что goto плохая инструкция?