roboforum.ru

Технический форум по робототехнике.

Охотник

Re: Охотник

Angel71 » 05 июл 2012, 03:22

:shock: ай. зря я похоже от телика избавился, новости не читаю и как в бункере замуровался. :cry: у вас там столько нового и интересного, а я всё пропустил.

Re: Охотник

Nesenin » 20 июл 2012, 17:48

про IMU. тот проект который и назван был в честь комплектующих Wii контроллера, сейчас имеет самостоятельные продукты достаточно низкие по цене
плата в сборе под квадракоптеры MultiWii SE V0.2 $31.99
отдельные платы с цифровыми 3осевыми гироскопом,акселерометром,магнитометром и барометром
$24.71 http://www.goodluckbuy.com/10dof-nine-a ... mp085.html
$24.04 + $1.94 http://www.sunsky-online.com/view/25895 ... ?source=cj
размеры минимальны, что в небольших роботах оч. ценно. надо будет заказать.
штука очень полезная, не только для стабилизации положения (наведение ствола,камеры; управление движением ракеты), но и для вычислений движения в пространстве.
например
при достаточной точности и своевременном устранение набегающих ошибок, можно использовать как систему локального позиционирования.
PS про интерес российских военных к роботам post244909.html#p244909
по проекту продвижений никаких, за исключением турели
SAM_1257.JPG

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

Re: Охотник

Nesenin » 02 авг 2012, 00:48

Не прошло и года :) "железная" часть турели с гаус пушкой готова (то есть экспериментальная модель. необходимые изменения будут выясняться в ходе работ)!
SAM_1364.JPG
SAM_1367.JPG
SAM_1368.JPG

вышло довольно компакто (соизмеримо с танками масштаба 1:24). а самое главное, нагрузка от отдачи передается на платформу через прочные элементы. достигнутая точность наведения\скорость будет выяснена чуть позже .

вопрос по ардуино. я тут глядя в пример накидал по-быстрому управление ШИМом, разбив на несколько значений см.
Код: Выделить всёРазвернуть
 
int command;
...
    command = Serial.read();
...
    if(command == 'q')
    {    analogWrite(5, 0);   Serial.println("levo 0");  }
    if(command == 'w')
    {    analogWrite(5, 51);  Serial.println("levo 51"); }
    if(command == 'e')
    {    analogWrite(5, 102);  Serial.println("levo 102");  }
    if(command == 'r')
    {    analogWrite(5, 153);  Serial.println("levo 153");  }
    if(command == 't')
    {    analogWrite(5, 204);  Serial.println("levo 204");  }
    if(command == 'y')
    {    analogWrite(5, 255);  Serial.println("levo 255");  }

а как сделать чтоб в команде передавалось числом конкретное состояние ШИМ 0-255 ?

Re: Охотник

Kitam1n » 03 авг 2012, 13:22

Привет!
У меня так в начале было как у тебя сейчас, серва скачет как ненормальная :) и точно наводить пушку нельзя, только если кнопок делать как на пианино все 255 штук :)
Сейчас пороюсь скину тебе как это сделать, там все просто...

Добавлено спустя 4 минуты 55 секунд:
Ты кстати чем будешь управлять сервой? ползунком или потенциометром каким? Или джойстиком?

Добавлено спустя 21 минуту 40 секунд:
Ну вот смотри, не знаю из чего управляешь ты, я управляю из С#. Отправляю значит два байта, первый байт устанавливает какую серву двигать, второй байт показывает на какое значение:
Это кусок кода C#, он тебе наверно не нужен, просто пример:

Код: Выделить всёРазвернуть
            byte[] buffer = new byte[2];  // создаем два байта для отправки
            buffer[0] = 9;  // первый байт - номер сервы, в моем случае 9 или 10 (как и их номер пинов на Ардуине)
            buffer[1] = Convert.ToByte(trackBar2.Value); //значение ползунка от 0 до 255
            try //попытка отправки байтов
            {
                serialPort1.Write(buffer, 0, 3);
            }
            catch
            {
            }


Теперь в скетче Ардуино:

Код: Выделить всёРазвернуть
#include <Servo.h> // включаем библиотеку Серво  

Servo myservo9; // вводим myservo9
Servo myservo10; // вводим myservo10

void setup()
  {
  myservo9.attach(9);    //присваиваем myservo9 9-й пин
  myservo10.attach(10);  //присваиваем myservo10 10-й пин

  Serial.begin(9600);        // устанавливаем последовательное соединение, скорость 9600
  }

void loop ()
{
  if (Serial.available() > 1) //если есть доступные данные больше 1 байтов
  {
    byte a,b;  // принимаем байты и разбиваем их
    a = Serial.read();  // первый байт
    b = Serial.read();  // второй байт

// УПРАВЛЯЕМ СЕРВАМИ
    if(a==9) // если первый байт 9, управляем 9-й сервой
    {
      myservo9.write(b);  // b это значение ползунка
    }

    if(a==10)
    {
      myservo10.write(b);
    }
  }


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

Re: Охотник

Nesenin » 03 авг 2012, 15:08

Kitam1n , спасибо! Суть передачи инфы в нескольких байтах понял. Попробовал - получилось.

В турели я использую моторчики с редукторами Gekko MR12-298 передаточное соотношение 298:1 должно помочь для точного наведения (а я собирался по мышам стрелять, хоть они и кончились; буду стрелять в яблоки).
Подключение через H мост на IRF7309 по схеме из http://www.openservo.com/moin.cgi/Schematic2 (оч. простая и компактная).
Для возможности регулирования скорости вращения желательно использовать ШИМ. Что я и сделал, задействовав выходы на плате arduino с аппаратным ШИМ.
Собственно команда для записи analogWrite(a, b), где a выход с ШИМ (3,5,6,10,11), b - значение от 0 до 255.
Сейчас проверил, в моем случае двигатель начинает крутится при значении от 35.Крутит довольно медленно.
Теперь буду выяснять каков минимальный промежуток времени включения, и мерить минимальный шаг поворота ствола. Это и даст предельную точность наведения. Потом буду мерить максимальную скорость вращения (при значении ШИМ 255).

Управление из ПО в LabVIEW. В принципе могу реализовать управления на основе данных с клавы\мыши, ради забавы сделаю на основе данных с контроллера Wii motion. Ну а главное то это реализовать машинное зрение и отдать задачу наведения на откуп ПК.
Вот примерно так.

ГЫ производитель Samsung

Только вот мне не охота камеру вешать на ствол. Хоть это и очень удобно, в том отношении что данные о положении ствола всегда известны (это как стрельба в игре от первого лица. где в центре картинки перекрестие - место попадание пуль и задача прицеливания сводится к наведению камеры на врага). Я надеюсь мне удастся получать данные о наведении ствола по отражению луча лазерной указки. То есть камера неподвижно следит и за местом положения цели и за местом отражения луча лазера. Программка же , управляя турелью, будет пытаться совместить одно с другим. Возможно будет и стрелять. В итоге получится автоматическая турель для охраны припасов от мышей. ну или не получится.
Вообщем буду пробовать, а там посмотрим. Может в ходе работ все сгорит (что ни раз уже было)и я брошу эту хрень.

Re: Охотник

Kitam1n » 03 авг 2012, 19:40

Приятно что даже я могу что-то подсказать :)
Так у тебя там не серва, а я то подумал серва. :( Мне всегда казалось что обычные моторы не предназначены для таких работ, тем более когда необходима точность поворота.
Фиг ее знает на сколько она повернется при разных условиях(наклон охотника на кочке, боковой ветер :) ) при одном и том же ШИМе.

Re: Охотник

Nesenin » 05 авг 2012, 19:45

Kitam1n
в серве тот же "обычный" мотор с редуктором. в серве обратная связь на основе потенциометра. двигатель крутит через редуктор выход и потенциометр, контроллер меряет напряжения с потенциометра и как только оно становится равно нужному уровню двигатель останавливается. минимальный угол поворота зависит от всех составляющих. во что она упирается надо разбираться. возможно в "шаг" управляющих сигналов или ПО. но в любом случае минимальный угол поворота на сервах слишком велик. поэтому я делаю "свои" сервы.в этом вся сложность.
в моем случае обратная связь это луч лазера. программка будет крутить двигатель пока луч лазер не придет в нужное место. точность обратной связи я считаю неограниченной. меня интересует минимальный угол поворота с тем двигателем\редуктором что есть. передаточное соотношение даже больше чем, я указывал 298:1 (см. картинка используется дополнительная зубчатая передача, а не прямой привод поворота).

по проекту. передачу команд в ардуино я сделал таки на основе 6 байт.
предусмотрел "защиту" от включения 2х управляющих линий на "H мостах" двигателей (а вот скорость переключения ограничивать не стал).
Код: Выделить всёРазвернуть
void setup() {                
  Serial.begin(9600);
  Serial.println("TURRET ON");
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop()
{
  if(Serial.available() > 5)
  {
    byte a,b,c,d,e,f;  // принимаем байты и разбиваем их
    a = Serial.read();  // первый байт
    b = Serial.read();  // второй байт
    c = Serial.read();
    d = Serial.read();
    e = Serial.read();
    f = Serial.read();
    //вкл выкл
    if(a == 1)
    {    digitalWrite(2, HIGH);   Serial.println("power on");  }
    if(a == 0)
    {    digitalWrite(2, LOW);   Serial.println("power off"); }
    //выстрел
    if(b == 1)
    {    digitalWrite(3, HIGH);  Serial.println("shot on");  }
    if(b == 0)
    {    digitalWrite(3, LOW);  Serial.println("shot off");  }
        //влево
    if(c == 1)
    {   analogWrite(6, 0);
        analogWrite(5, d);   Serial.println("left");Serial.println(d);  }
       //вправо
    if(c == 0)
    {   analogWrite(5, 0);
        analogWrite(6, d);   Serial.println("right");Serial.println(d);  }
        //верх
    if(e == 1)
    {   analogWrite(11, 0);
        analogWrite(10, f);   Serial.println("up"); Serial.println(f); }   
        //вниз
    if(e == 0)
    {   analogWrite(10, 0);
        analogWrite(11, f);   Serial.println("down"); Serial.println(f); }
       
Serial.flush();
  }
}

все работает. все прекрасно.
управление с клавы и даже с Wii moto я быстро "прикрутил". Неприятности возникли с питанием.
Мне очень сильно хотелось запитать управляющую часть с USB. А это 2 реле(по70мА), 2 двигателя(по20мА). Вроде сильных нагрузок быть не должно.
Вывел 5В с ножки платы и началось... При быстром вкл\выкл\перекл двигателей ребутится контроллер и мешается порядок поступающих байтов. В итоге начинает вкл\выкл не то что надо.
Повесил конденсаторы 47мкФ на питание двиг. Полегчало. При управлении с клавы значения ШИМ фиксированы, быстрой скорости перезаписи нет (а отправка управляющих команд с ПК идет только если есть новые данные).
Начал было с Wii moto пытаться управлять. Малейшая дрожь провоцирует перезапись управляющих сигналов (значение ШИМ меняется пропорционально наклону за исключением "мертвой зоны"). Контроллер снова начинает ребутится. :( Повесил 1000мкФ на общее питание. Еще стало устойчивей. Провозился весь вчерашний день. И пришел к выводу "ну его нафик". Сейчас запитал отдельно. Вроде как сбоев не было. Надо будет еще погонять. Возможно когда включу высоковольтную часть случится страшное.

По поводу Asus Xtion Live. Месяц наверно не прикасался. Вчера вот глянул. Нашел я как настройки менять.
Поковырял проги в LabVIEW. Теперь выводит как положено в разрешении 480*320 30fps
Снимок.JPG
качесво камеры, нужно заметить паршивенькое.
в режиме 60fps 320*240 какая то хрень выходит. надеюсь найду как пофиксить.
Снимок2.JPG

и карта расстояний (в зеркале расстояние до отраженной стены :lol: )
Снимок1.JPG

Картинка не столь наглядна как тут post243102.html#p243102
Так как програмка рисующая картинку тут использует серые тона и расстояния интерпритируются по освещенности наоборот(дальше-светлее). Но это не важно. Ибо картинка вообще не нужна. В ПО поступает матрица числовых значений, которые уже есть вычисленные расстояния.
Можно, например, выделить строку параллельную горизонту и строить по ней 2D карту расстояний. Что в будущем я и опробую.
Снова возвращаясь к "образцу"
Тут Kinect на поворотной серве. Я все больше убеждаюсь что это для получении "поправочных" данных (к данным с LIDAR'а)о расстоянии до препятсвий. То есть. Используемый LIDAR выдает данные только в 1 плоскости. Но в случае с предметами сложной формы, можно натолкнуться на что-то отличающееся от строго вертикальных стен. По сути если предмет лежит ниже это плоскости (или выступающая часть) LIDAR бесполезен. Да и лабиринт разработчики построили по той же причине. Не реализовав построения 3D карты им остается только кататься по плоскому полу с строго вертикальными препятсвиями.
Последний раз редактировалось Nesenin 05 авг 2012, 21:35, всего редактировалось 1 раз.

Re: Охотник

Kitam1n » 05 авг 2012, 20:54

Если нужно то можно уменьшить к-во байтов.
На первый байт повесить два реле и направление вращения и в верх в низ, ведь в байте от 0 до 255, значит можно придумать 256 комбинаций (если наврал с цифрами извиняйте, я не программист, не помню сколько там точно, да и не суть)
Например первый байт :
1 - влево,
2 - вправо,
3 - вверх,
4 - в низ,
13 одновременно в влево и в верх,
14 одновременно влево и в низ

ну и т.д. до 255.

а второй байт ШИМ.

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

Re: Охотник

Nesenin » 05 авг 2012, 21:33

да не и так норм. а то кучу условий надо ваять. особенно на стороне моего ПО. я бы и 3,5 байт оставил под прямую запись ШИМ значений, если б не боялся одновременного включения. а так, код на ардуино постоянно выключает соседний ШИМ, даже если с компа не пришло команды на выключение.

Re: Охотник

Kitam1n » 06 авг 2012, 09:38

Куча условий это да, придется добавить пару строк в код :) , зато уменьшается длина байтов. Правда я не знаю играет ли это уменьшение байтов роль в скорости передачи или в надежности..?
А вот про защиту от одновременного включения я не понял, в моем способе точно так же делаешь защиту, прежде чем включать реверс принудительно отключаешь тот предыдущий пин.

Re: Охотник

Nesenin » 08 авг 2012, 00:02

во я дурак! сколько всего пожег. Два раза "пробило" с катушки на лазерную указку.
в первый раз (несколько дней назад) поменял сгоревшие компоненты, отодвинул подальше лазер\провода.
Второй раз пробило вчера. Все перебрал. И доперло - ствол металлический, корпус лазера металлический... :)
Перебрал основательно конструкцию. отодвинул все высоковольтные части как мог, заизолировал ствол и пр. Заодно добавил стабилизатор на 5В для управляющей части (раз уж с питаением с USB не вышло). На освободившуюся линию повесил логический сигнал о включении режима заряда конденсаторов. Можно будет мониторить через arduino в ПО это дело (а не гадать зарядились или нет).

Проверил управление с компа. Наконец то! Ничего не пробивает ничего не ребутится. Все пока работает как надо. Вот с котом поиграл (на кнопки жал. ШИМ фиксированный).

Re: Охотник

dccharacter » 08 авг 2012, 00:26

Изображение

Добавлено спустя 53 секунды:
Изображение

Добавлено спустя 1 минуту 27 секунд:
Изображение

Re: Охотник

Nesenin » 08 авг 2012, 14:26

дописал код отвечющий за мониторинг заряда (аппаратно контроль сделан на оптроне, который фиксирует факт включения схемы заряда).
Код: Выделить всёРазвернуть
int charg = 4;
boolean lastchart = false;


void setup() {               
  Serial.begin(9600);
  Serial.println("TURRET ON");
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, INPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);

}

void loop()
{
  if (digitalRead(charg) == HIGH && lastchart == false)
  {   lastchart = true;
      Serial.println("chart on");   }
 
    if (digitalRead(charg) == LOW && lastchart == true)
  {   lastchart = false;
      Serial.println("chart off");   }
 
  if(Serial.available() > 5)
  {
    byte a,b,c,d,e,f;  // принимаем байты и разбиваем их
    a = Serial.read();  // первый байт
    b = Serial.read();  // второй байт
    c = Serial.read();
    d = Serial.read();
    e = Serial.read();
    f = Serial.read();
    //вкл выкл
    if(a == 1)
    {    digitalWrite(2, HIGH);   Serial.println("power on");  }
    if(a == 0)
    {    digitalWrite(2, LOW);   Serial.println("power off"); }
    //выстрел
    if(b == 1)
    {    digitalWrite(3, HIGH);  Serial.println("shot on");  }
    if(b == 0)
    {    digitalWrite(3, LOW);  Serial.println("shot off");  }
        //влево
    if(c == 1)
    {   analogWrite(6, 0);
        analogWrite(5, d);   Serial.println("left");Serial.println(d);  }
       //вправо
    if(c == 0)
    {   analogWrite(5, 0);
        analogWrite(6, d);   Serial.println("right");Serial.println(d);  }
        //верх
    if(e == 1)
    {   analogWrite(11, 0);
        analogWrite(10, f);   Serial.println("up"); Serial.println(f); }   
        //вниз
    if(e == 0)
    {   analogWrite(10, 0);
        analogWrite(11, f);   Serial.println("down"); Serial.println(f); }
       
Serial.flush();
  }
}

проверил. В ПО инфа с arduino выглядит так
chart.png

повторяющиеся строчки "chart on","chart off" это не "дребезг" как часто бывает с кнопками. Это работа схемы контролирующей заряд на конденсаторах. Как только саморазряд понижает напряжение до некоторого порога, схема снова подзаряжает конденсаторы до нужного значения.
Ну вот. вроде весь задуманный функционал, необходимый для работы ИИ, реализован. Есть инфа о включении, о заряде (а стало быть о готовности к выстрелу по окончанию заряда), управляются все вещи с защитой от всех возможных неприятностей (например включение тиристора(выстрел) реализуется на реле, которое разрывает цепь схемы контроля заряда, дабы она не включалась во время выстрела).
Ствол крутится, вертится без всяких сбоев. Буду надеяться больше ничего не сгорит))

Re: Охотник

Kitam1n » 09 авг 2012, 11:49

Nesenin, привет!
Слушай, я тут встал в тупик че то на ерунде:

Nesenin писал(а):предусмотрел "защиту" от включения 2х управляющих линий на "H мостах" двигателей (а вот скорость переключения ограничивать не стал).


А как собственно ограничить скорость переключения? Просто delay(1000) ставить нельзя, Ардуино начинает делать пазу после каждого изменения ШИМ, а в случае когда ШИМ меняется очень динамично Ардуино вообще как виснет.

Добавлено спустя 46 секунд:
Нужно как то сделать что бы пауза делалась только один раз между переключениями.

Re: Охотник

Nesenin » 09 авг 2012, 12:04

в mege328 есть встроенный таймеры (счетчики). их вроде как 3шт. 2 восмиразрядных и 1 16 разрядных. вот их надо завести и следить за временными промежутками (число которое они насчитают. частоту можно настраивать с определенным делителем от частоты работы контроллера). и\или на стороне ПО на компе делать паузы, опираясь на встроенные часы.
примеры использования счетчиков в сети должны быть .


cron
Rambler\'s Top100 Mail.ru counter