Пропорциональная аппаратура управления

Тема в разделе "Arduino & Shields", создана пользователем Sergey991, 16 июн 2013.

  1. Sergey991

    Sergey991 Нерд

    Итак я решил заняться проектом по созданию приемника, передатчика для управления на пример моделью самолета.. Вот. У меня сразу возникла проблема с отправкой 4-х значений для управлением серво с передатчика (естественно после микширования (данные о точной настройке хранятся естественно в еепром)),
    пара идей конечно есть.. я напишу все, а вы скажите мне что будет лучше
    1) Отправлять будем значения вот такие ABCDE, где A=100, B=10, C=1,E метка окончания командной посылки и D метка переходу к следующему серво, работа будит как в римской сс т.е. там нужно передать значения от 0 до 180 для 4х серв вот пример BADABCDBBBACDACE что равно 1=90, 2=111, 3=71, 4=101.
    Может ктонибудь идейку получше знает? поделитесь;)
     
  2. Unixon

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

    В чем выгода от такой системы кодирования и почему передача данных вдруг стала проблемой?
     
  3. Sergey991

    Sergey991 Нерд

    Дело в том что передача такого значения как 180 воспринимается дуиной как 1,8,0, а не 180. А какой способ передачи и приема 4 х значений от 0 до 180 предложите вы? Выгоды я сам пока не вижу:(
     
  4. Unixon

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

    Передавать можно и в двоичном представлении и в виде текста, как угодно. Что и как передадите, то так и примете. По каналу передаются просто безликие байты.
     
  5. roggedhorse

    roggedhorse Гик

    Вот бабушка собрала вам посылку:
    - шерстяные носки
    - конфеты
    - книга

    Есть по крайней мере 2 способа отправить вам гостинец:
    1) все по отдельности: один носок, другой, конфетку, еще конфетку, остальные конфетки поштучно, книгу (книгу можно отправить тоже: сначала обложку, потом страничку за страничкой) - это ваш метод
    2) сложить все в одну коробку и отправить сразу все

    Коробка в языке C (C++) - это тип struct.

    Бабушкина посылка выглядела бы так (для примера):
    Код (C):
    struct TBox {
       TNosok noski[2];
       TKonfeta konfety[100];
       TKniga knigi[1];
    };
     
    в свою очередь каждый элемент содержимого посылки - отдельный объект, например
    Код (C):
    struct TNosok {
       int type; // 0 - без разницы, 1 - левый, 2 - правый
       int color; // цвет
    };

    struct TKniga {
       char title[20]; // название
       char author[20]; // автор
       int pageCount; // число страниц
       int type; // тип переплета
    };
     
    Бабушка собирает вам посылку:

    Код (C):
    TBox posylkaVnuku;
    posylkaVnuku.noski[0].type = 1; // левый носок сложила
    posylkaVnuku.noski[1].type = 2; // правый носок положила

    send(posylkaVnuku); // отправила
     
    вы приняли посылку
    Код (C):
    TBox posylkaOtBabushki;
    recv(&posylkaOtBabushki);
     
    и заглядываете в ее содержимое:
    Код (C):
    if (posylkaOtBabushki.noski[0].type == 1) Serial.print("Левый носок");
    else if (posylkaOtBabushki.noski[0].type == 2) Serial.print("Правый носок");
     
    и т.д.
     
    nailxx, HighDigital и Megakoteyka нравится это.
  6. XCB

    XCB Гик

    может конечно я не в тему и поломаю автору весь fun но увидев знакомое "управления на пример моделью самолета" сразу хочется спросить читали ли вы чтото про то как происходит управление в наиболее распространенных системах в частности что такое PPM сигнал. например можно почитать тут http://www.rcdesign.ru/articles/radio/ppm_pcm
     
  7. Sergey991

    Sergey991 Нерд

    Да типо я пол года работал в модельном магазине=) Знаком и с настройкой углов, для 3д верта.
     
  8. Unixon

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

    XCB, а вы не путаете пакетный уровень передачи информации с канальным? Речь идет о формате пакета, а не о способе его передачи...
     
  9. Sergey991

    Sergey991 Нерд

    Ну типа да.
     
  10. XCB

    XCB Гик

    может и путаю
    ну какбы почитав про стандартные системы можно понять примерное содержимое пакетов
    нужно передать пакет примерно следующего формата
    3-8 (колво каналов управления, серв)
    * 1024 (до 1024 уровней , 10 бит на серву)
    и сделать это примерно 50 раз в секунду да еще не забыть про всякого рода служебную информацию (синхросигнал, возможно контрольная сумма и проч)
    да еще учесть что связь может быть и двунаправленной (так называемая телеметрия, например заряд батарей)
     
  11. Sergey991

    Sergey991 Нерд

    Итак вот обновление программы... ПРОШУ ПРОВЕРИТЬ ЕЕ РАБОТОСПОСОБНОСТЬ ИБО У МЕНЯ НЕТ ВОЗМОЖНОСТИ=(

    Передатчик
    Код (C):
    int a=0;
    int b=0;
    int c=0;
    int d=0;

    int Array[12];

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

    void loop() {
      a = map(analogRead(0), 0, 1023, 0, 180);
      b = map(analogRead(1), 0, 1023, 0, 180);
      c = map(analogRead(2), 0, 1023, 0, 180);
      d = map(analogRead(3), 0, 1023, 0, 180);
     
      Array[0]=a/100; // Наше число всегда 3х значно (153,090..) Нам нужны значения 1го.
      Array[1]=a/10%10; // 2го
      Array[2]=a%10; // 3го числа и записываем их в наш массив
     
      Array[3]=b/100;
      Array[4]=b/10%10;
      Array[5]=b%10;
     
      Array[6]=c/100;
      Array[7]=c/10%10;
      Array[8]=c%10;
     
      Array[9]=d/100;
      Array[10]=d/10%10;
      Array[11]=d%10;
             // Далее нам нужно вывести все элементы массива и метку.
      for (int i=0; i < 12; i++) {
         Serial.println(Array[i]);
        }
    }
     
  12. Sergey991

    Sergey991 Нерд

    И приемник
    Код (C):

    #include <Servo.h>
    Servo Servo1;
    Servo Servo2;
    Servo Servo3;
    Servo Servo4;
    int buff=0;
    int i=0;
    int Array[12];

    int a=0;
    int b=0;
    int c=0;
    int d=0;

    void setup() {
      Servo1.attach(3);
      Servo2.attach(7);
      Servo3.attach(9);
      Servo4.attach(11);
      Serial.begin(9600);
    }

    void loop() {
      while(i<12) {               // Записываем значения в массив
            if(Serial.available()>0) {
               Array[i]=Serial.read();
             }
           }
      a=Array[0]*100+Array[1]*10+Array[2];
      b=Array[3]*100+Array[4]*10+Array[5];
      c=Array[6]*100+Array[7]*10+Array[8];
      d=Array[9]*100+Array[10]*10+Array[11];
     
      Servo1.write(a);
      Servo2.write(b);
      Servo3.write(c);
      Servo4.write(d);
    }
     
  13. Mitrandir

    Mitrandir Гуру

    Приемник мне не очень нравится. И я бы в байтовом виде слал
     
  14. Sergey991

    Sergey991 Нерд

    Ауу может ктонибудь код проверить на наличие ошибок или недаработок
     
  15. Unixon

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

    Может :)
     
  16. Unixon

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

    Передатчик
    Код (C):

    byte buf[4];

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

    void loop()
    {
     buf[0] = map(analogRead(0), 0, 1023, 0, 180);
     buf[1] = map(analogRead(1), 0, 1023, 0, 180);
     buf[2] = map(analogRead(2), 0, 1023, 0, 180);
     buf[3] = map(analogRead(3), 0, 1023, 0, 180);
     Serial.write(0xff); // synchronize
     for (int i=0; i < sizeof(buf); i++)
     {
      Serial.write(buf[i]);
     }
    }
     
     
  17. Unixon

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

    Приемник
    Код (C):

    #include <Servo.h>
    Servo servo[4];

    void setup()
    {
     servo[0].attach(3);
     servo[1].attach(7);
     servo[2].attach(9);
     servo[3].attach(11);
     Serial.begin(9600);
    }

    void loop()
    {
     if (Serial.available()>sizeof(buf))
     {
      byte x = Serial.read();
      if (0xff == x) // sync byte
      {
       for (int i =0; i < sizeof(buf); i++)
       {
        x = Serial.read();
        servo[i].write(x);
       }
      }
     }
    }
     
  18. Unixon

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

    Не самый красивый код, можно еще подшаманить, но идея должна быть понятна.
     
    Sergey991 нравится это.
  19. Sergey991

    Sergey991 Нерд

    Спасибо большое!
     
  20. Sergey991

    Sergey991 Нерд

    Компилятор ругается на фразе if (Serial.available()>sizeof(buf))
    ошибка
    Priemnic_4_CH.ino: In function 'void loop()':
    Priemnic_4_CH:15: error: 'buf' was not declared in this scope

    Если честно я пока ваш код не до конца обработал=(