сервопривод через comport

Тема в разделе "Проводная и беспроводная связь", создана пользователем stikoff, 4 янв 2019.

Метки:
  1. stikoff

    stikoff Нерд

    Код (C++):
    #include <Servo.h>


    Servo myservo;
    int val;



    void setup(){
      Serial.begin(9600);
      myservo.attach(9);
    }

    void loop() {
      serialEvent();
    }

    void serialEvent(){
      val = Serial.parseInt();
      if(val !=0){
        myservo.write(val);

     
     
     
      }
    }

    подскажите что нужно дописать в скейче чтоб можно было управлять через компорт 2 или больше сервоприводами. Как подключить 2 или более я знаю, проблема в том что они все работают синхронно а мне нужно каждой по отдельности
     
  2. Daniil

    Daniil Гуру

    Нужно парсить текст, который приходит по ком порту.
    У вас приходит сообщение и вы его превращаете в число.
    Назову новое сообщение "командой":
    команда должна включать в себя идентификатор к какой серве вы сейчас обращаетесь и само число.
    Например - "A155", где "А" это идентификатор 1ой сервы, а "155" число которое нужно передать серве.
    Или "В056" - "В" идентификатор 2ой сервы, "056" - код, который превратится в "56". (нуль я написал, чтобы команда была фиксированной длины, кажется, так проще по-началу)

    Можно проще - посмотреть ASCII таблицу и отправлять не числа "0", "5" и "6", а ASCII символ с кодом "56".

    Смотрите работу со строками, в ардуине это есть (вычисление кода симола).

    Еще вариант: числа от 0 до 255 соответствуют серве 1, а числа от 256 до 512 соответствуют 2ой. Когда делаете parseInt проверяете больше 255 или нет.

    И есть вариант с разделением во времени, но он сложен из-за синхронизации времени, но на всякий случай опишу. Для мк заводится 2 интервала времени. Если во время 1ого интервала приходит команда, то она передается серве1, если во время 2ого интервала, то серве2.
     
  3. stikoff

    stikoff Нерд

    это мне понятно. я не могу понять что писать чтоб servo1 принимал A50 а servo2 B50.
    Код (C++):
    #include <Servo.h>


    Servo myservo;
    Servo myservo1;
    int val1;
    int val;



    void setup(){
      Serial.begin(9600);
      myservo.attach(9);
      myservo1.attach(10);
    }

    void loop() {
      serialEvent();
    }

    void serialEvent(){
      val = Serial.read();
      if(val !=0){
        myservo.write(val);

      val1 = Serial.read();
      if(val1 !=0)
      myservo1.write(val1);

     
       
       
      }
    }

    думал так. Но получилось что при отправке числа servo1 поворачивается при повторной отправке обе поворачиваются одновременно.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Есть волшебные слова if()
    else if()
    else;
    А еще есть волшебное слово
    switch case();
     
    Daniil нравится это.
  5. Daniil

    Daniil Гуру

    Именно! Как написали выше ifelseif и switch-case.
    Нужно принять "команду", вычленить из нее номер сервы и число (сохранить в переменные), после этого управлять сервами.
    Аккуратно и последовательно.
     
    Airbus нравится это.
  6. Airbus

    Airbus Радиохулиган Модератор

    Ну да.
     
  7. stikoff

    stikoff Нерд

    блин ребята я понимаю вам легко и просто. А мне пример можно ?
     
  8. stikoff

    stikoff Нерд

    Код (C++):
    void serialEvent(){
      val = Serial.parseInt();
      if(val !=0){
        myservo.write(val);
      }
      else  (val );{
        myservo2.write(val);
      }

    в правильную сторону думаю ?
     
  9. Daniil

    Daniil Гуру

    Примеры есть в ардуино иде (example, если она на англ.), они читабельные, откомментированные и простые.
    Не хочу конфликтовать, прошу понять, я не буду писать ровный откомпилированный код.

    Обратите внимание на пример SerialEvent. В нём собирается массив из приходящих символов. В данном примере последний символ это "\n" - перенос каретки на след. строку (так символ называется).
    Т.е. вы будете отправлять:
    "A", "0", "5" и "6", а в конце обязательно отправить "\n".
    Именно после "\n" флаг stringComplete станет true и в loop'e выполнится условие.

    После того как это станет понятным, задача станет такой:
    Как inputString распарсить.

    Мы знаем, что это строка это массив чаров, тогда код станет примерно таким
    Код (C++):
    switch inputString[0]
    case 'A': работа с 1ой сервой
    case 'B': работа со 2ой сервой
    Теперь задача вынуть из inputString код, который надо отправить на серву. Как я предлогал, с фиксированным массивом можно пробежаться в цикле по строке и вычислить ваш val
    Код (C++):
    power=100;
    val=0;
    for i от 1 до 3
    {
    val=val+inputString[i]*power
    power=power/10;
    }
    Собственно, теперь надо отправить на нужную серву код.
    Ошибки есть, синтаксис наизусть не знаю.
     
  10. stikoff

    stikoff Нерд

    Код (C++):
    #include <Servo.h>


    Servo myservo;
    Servo myservo2;
    int val;



    void setup(){
      Serial.begin(9600);
      myservo.attach(9);
      myservo2.attach(10);
    }

    void loop() {
      serialEvent();
    }

    void serialEvent(){
      val = Serial.parseInt();
      switch (val){
        case 1: myservo2.write(180);
        break;
        case 2: myservo2.write(90);
        break;
        case 3: myservo.write(10);
        break;
      }

    }

    Разобрался САМ )))) Спасибо Airbus за наводку
     
  11. parovoZZ

    parovoZZ Гуру

    Нафига ерундой заниматься, если по уарту все равно числа бегают? Нафига их переводить в текст, а потом его парсить? Для чего все эти лишние действия???
     
  12. Daniil

    Daniil Гуру

    Потому что ардуино.
    Мне на пальцах проще объяснить так как объяснил, про оптимальность ТС ничего не говорил