Robot ship 4х4 miniQ НС-12, IMU, GPS/GLONASS, SD картридер, INA-219, 3x Arduino Nano

Тема в разделе "Глядите, что я сделал", создана пользователем issaom, 11 сен 2017.

Метки:
  1. issaom

    issaom Гик

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

    корпус.JPG

    приемник вид сверху.JPG

    приемник вид сбоку.JPG



    Во время испытаний чайки закидали конструкцию рыбой :D
     
    Igor68, ИгорьК и Tomasina нравится это.
  2. Tomasina

    Tomasina Иномирянин

    А зачем три МК? У Меги в итоге было бы больше преимуществ.
     
  3. issaom

    issaom Гик

    Ну это такая идея "фикс" - построить 3 ядерную Ардуино для реализации полноценной многозадачности (связка по протоколу SPI) - где каждый МК будет выполнять свой узкий круг задач - чуть позже выложу структурную схему девайса.
    NANO мастер будет отвечать за связь с внешним миром, контролировать АКБ, писать трек на карточку, в дальнейшем управлять сервоприводами и возможно еще чем нибудь.
    NANO IMU будет отвечать за управление двигателями и работу гироскопа
    NANO GPS будет заниматься только геодезий-навигацией и выдавать мастеру готовые данные
    Этим летом делал ремонт некогда особо было заниматься проектом и пока есть еще некоторые нерешенные технические проблемы.... (надо запилить освещение, модинг и увеличить с дальностью связи (похоже что коллекторные моторы глушат сигнал с модулей HC-12))
    Понятно что все это скорее всего возможно реализовать на прерываниях, но хрен знает как это все увязывать - в программировании я не разбираюсь, поэтому мне пока проще сделать лишнее движение паяльником благо наны стоят копейки.
     
    Igor68 и Tomasina нравится это.
  4. ИгорьК

    ИгорьК Давно здесь

    Лайк поставил...

    Но выбор типа движителя и форма корпуса вызывает вопросы. При такой скурпулезной проработке - это имеет какой-то особый смысл?

    И да, три нано - это необычно. Можно заменить одной мегой. Если религия позволяет, а Си жутко нравится - поставить железо из серии mbed.

    Ну и совсем радикально - Espruino в оболочке Iskra JS.
     
    Последнее редактирование: 11 сен 2017
  5. ИгорьК

    ИгорьК Давно здесь

    Это можно (с огромной долей вероятности) реализовывать и без прерываний - любимым всеми Сишниками case/switch подходом.

    Вы сознательно делаете шаг назад? Зачем - это игрушка, а не рабочее усройство. Это когда надо сделать что-то "здесь и немедленно" - тогда любые способы хороши. А так - потратите время (бесценный ресурс) и мало чему научитесь.
     
  6. Tomasina

    Tomasina Иномирянин

  7. ИгорьК

    ИгорьК Давно здесь

  8. issaom

    issaom Гик

    Выбор типа движителя был обусловлен тем что конструкцию планируется запускать в водоемах где есть мели подводные водоросли, куски рыболовных сетей и прочая сопуствующая лобудень. Понятно что практичнее было бы поставить винты но - это вариант для бассейнов и чистых водоемов. Как показали ходовые испытания этой конструкции пофиг волна, ветер, мель и трава, а самое главное она очень хорошо держит курс по прямой линии без применения дополнительных рулей которые кстати тоже находятся под водой и могут за что-то зацепиться - из минусов только маленькая скорость - но конечная цель была не она а надежность.
    На счет всего остального (железо и програмщина пока говорить рано пока - проект ведь еще не реализован полностью) - у меня пока есть общий концепт того что я хотел бы получить в итоге и отдельные отлаженные кусочки кода которые еще предстоит объединить вместе. Это для Вас отдельный МК, а для меня это законченное автономное устройство для управления моторами со своими мозгами и интерфейсом SPI (по принципу написал и забыл) - я их так воспринимаю в своем проекте :)
     
    ИгорьК нравится это.
  9. ИгорьК

    ИгорьК Давно здесь

    То есть - это не игрушка? Тогда респект! :)
     
  10. issaom

    issaom Гик

    Для просто игрушек вообще нет смысла делать р.у. на ардуино - проще купить в Китае готовые платы передатчика и приемника и засунуть в корпус - конечная цель данной конструкции чтобы она могла принимать какие-то решения самостоятельно - этакий водный автономный робот ))) в конечном итоге планируется как девайс для фотографий )))
     
  11. issaom

    issaom Гик

    Первый более менее за конченый вариант:
    Блок схема:
    01.jpg
    Протоколы обмена данными:
    протоколы.jpg
    Информация на текстовом дисплее:
    дисплей.jpg

    Принципиальная передатчика:

    передатчик.jpg

    Монтажная плата приемника:
    приемникjpg.jpg

    Передатчик - экран А:
    А.JPG

    Передатчик экран B:
    B.JPG

    Приемник вид сверху:
    пр1.JPG

    Приемник вид с боку:

    пр2.JPG

    Пошатался по городу (у нас уже почти сугробы так что на р/у самоделку теперь уже не поставить) и поснимал данные с экрана на фотик - буду начинать пилить GPS-трекер (до картридера пока руки так и не дошли)

    прогулка.JPG

    Вот такое простенькое универсальное р/у на Arduino получилось )))
     
    ИгорьК нравится это.
  12. issaom

    issaom Гик

    Довольно долго искал этот материал..... "GPS. Расчет дистанции между двумя точками по GPS координатам. Расчет курса на точку." - Стырил две функции для вычисления дистанции и вычисления курса и чуть чуть допилил их для Arduino. (так как библиотека от Амперки уже выдает координаты в десятичных градусах) Используя первую можно считать пройденную дистанцию, используя вторую можно вычислять направление движения. (глючный "компас" в топку, остальные датчики IMU пригодятся для определения угла поворота на месте....

    Код (C++):
    //http://www.garmin.com.ua/tools/calc.php  -  здесь можно проверить
    //http://www.avislab.com/blog/gps-distance/ - потырено отсюда
    #define EATH_RADIUS 6372795

    // расчет дистанции по двум точкам (метры) !!!
    // значения в десятичных градусах
    double gps_distance(double lat1, double long1, double lat2, double long2) {
        double lat1_cos, lat2_cos, lat1_sin, lat2_sin;
        //double lat1, long1, lat2, long2;
        double sin_delta_long, cos_delta_long;
        double y, x;    
        lat1 = lat1*PI/180;     //конвертируем десятичные градусы в радианы
        long1 = long1*PI/180;
        lat2 = lat2*PI/180;
        long2 = long2*PI/180;
        lat1_cos = cos(lat1);
        lat2_cos = cos(lat2);
        lat1_sin = sin(lat1);
        lat2_sin = sin(lat2);
        sin_delta_long = sin(long2-long1);
        cos_delta_long = cos(long2-long1);
        y=sqrt(pow(lat2_cos*sin_delta_long, 2)+pow(lat1_cos*lat2_sin-lat1_sin*lat2_cos*cos_delta_long,2));
        x=lat1_sin*lat2_sin+lat1_cos*lat2_cos*cos_delta_long;
        return (atan2(y,x) * EATH_RADIUS); // (если нужны км /1000)
    }

    // куда идем мы с пятачком !!!
    // расчет курса !!!
    double gps_angle(double lat1, double long1, double lat2, double long2) {
        // double lat1, long1, lat2, long2;
        double dlon_W, dlon_E, dphi, atn2, dlon, tc;
        int sign;
        lat1 = lat1*PI/180;     //конвертируем десятичные градусы в радианы
        long1 = long1*PI/180;
        lat2 = lat2*PI/180;
        long2 = long2*PI/180;
        dlon_W = (long2 - long1) - (2*M_PI*(floor((long2 - long1)/(2*M_PI))));
        dlon_E = (long1 - long2) - (2*M_PI*(floor((long1 - long2)/(2*M_PI))));
        dphi = log((tan((lat2/2) + (M_PI/4)))/(tan((lat1/2) + (M_PI/4))));
        if (dlon_W < dlon_E) {
            dlon_W = -1*dlon_W;
            //get sign
            if (dlon_W >= 0)
                sign = 1;
            else
                sign = -1;
            if (abs(dlon_W) >= abs(dphi)) {
                atn2 = (sign * M_PI/2) - atan(dphi / dlon_W);
            }
            else {
                if (dphi > 0) {
                    atn2 = atan(dlon_W / dphi);
                }
                else {
                    if ((-1*dlon_W) >= 0) {
                        atn2 = M_PI + atan(dlon_W / dphi);
                    }
                    else {
                        atn2 = (-1*M_PI) + atan(dlon_W / dphi);
                    }
                }
            }
        }
        else {
            //get sign
            if (dlon_W >= 0)
                sign = 1;
            else
                sign = -1;
            if (abs(dlon_E) >= abs(dphi)) {
                if (dlon_E > 0)
                    atn2 = sign * M_PI/2 - atan(dphi / (dlon_E));
                else
                    atn2 = 0;
            }
            else {
                if (dphi > 0) {
                    atn2 = atan((dlon_E) / dphi);
                }
                else {
                    if ((dlon_E) >= 0) {
                        atn2 = M_PI + atan((dlon_E) / dphi);
                    }
                    else {
                        atn2 = (-1*M_PI) + atan((dlon_E) / dphi);
                    }
                }
            }
            dlon = dlon_E;
        }
        tc = atn2 - (2*M_PI*(floor((atn2)/(2*M_PI))));
        return 360-((tc*180)/M_PI);
    }



    void setup() {

    Serial.begin(9600);

    // X3
    // 59.119423°
    // 37.902022°
    // X4
    // 59.127193°
    // 37.905936°

    // 4 аргумента широта и долгота начальной точки, широта и долгота конечной точки
    // возвращает дистанцию в метрах
    Serial.print("distance:");
    Serial.println(gps_distance( 59.119423, 37.902022,  59.127193 ,37.905936 ));

    // 4 аргумента широта и долгота начальной точки, широта и долгота конечной точки
    // возвращает направление движения (градусы)
    Serial.print("angle:");
    Serial.println(gps_angle( 59.119423, 37.902022,  59.127193 ,37.905936 ));

    }

    void loop() {
    }
    Google Earth практически согласен с расчетами выполненными Arduino

    Google Earth Pro.JPG
     
  13. issaom

    issaom Гик

    Написал код для SD карт-ридера. У Амперковского GPS-модуля отличная точность.
    Отметка о местонахождении записывается только если конструкция где он установлен переместилась
    от исходной точки более 7м. - получаются вот такие симпотные картинки. Процесс записи трека управляется с пульта. Плавать самостоятельно (без р/у) по предварительно загруженным координатам я думаю эта штука будет вполне способна....
    Осталось победить температурные глюки IMU, написать скетч и дождаться весны )))

    трек.JPG
    Краткое видео полевых испытаний:



    Промежуточная версия кода от всех 4 дунь:
    GPS+IMU_v7.zip

    Содержимое дисплея:

    дисплей.jpg
     

    Вложения:

    • GPS+IMU_v7.zip
      Размер файла:
      14 КБ
      Просмотров:
      4
    ИгорьК нравится это.