Самодельный робот-пылесос.

gppsoft
Offline
Зарегистрирован: 13.10.2014

Отличный проект! А поиск станции зарядки планируется? Я сейчас делаю этот "модуль" для своего робота. Пока не очень успешно. 

SLOM
Offline
Зарегистрирован: 06.11.2014

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

а моя зарядка для ли ион заряжает их до 4,55 - 4,6 как то так. 

 

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

gppsoft пишет:

Отличный проект! А поиск станции зарядки планируется? Я сейчас делаю этот "модуль" для своего робота. Пока не очень успешно. 

Скорее всего нет. Реализация трудная, да и ненужная и вот почему:

1. Допустим 2х комнатная квартира без порогов, тогда придется ставить три станции, в одной комнате, в другой и на кухне, иначе он просто одну не найдет.

2. Допустим квартира с порогами, тогда тем более надо ставить станции везде. Не будешь же таскать станцию из комнаты в комнату.

Поэтому от этой идеи я отказался, проще воткнуть штекер от зарядки.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

SLOM пишет:

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

а моя зарядка для ли ион заряжает их до 4,55 - 4,6 как то так. 

 

Странно.

Может это не литий ион, или тестер врет?

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Илья73 пишет:

Заряжайте в режиме полимера, реально ионы заряжают до 4.2в. Почему  в аймаксе сделали для иона 4.1 мне не понятно, возможно раньше такая химия была. Я полимеры заряжаю в режиме ион, так они долше живут, заряд получается в районе около 90%.

Зарядил в режиме литий полимер, влил на 100 мА больше и зарядил как положено до 8,4 вольта, но процесс зарядки идет по другому.

Илья73
Offline
Зарегистрирован: 06.09.2013

nitrior пишет:

 В Сочи 1метр на 1,5 метра купил за 850 рублей, толщина 4мм.

Хорошая цена. В Севастополе в местном сторительном нашел лист 1х2 метра 2тыс. с копейками.

Наверно раззорюсь на листик, у меня был кусочек такого материала, удобно с ним работать, для последующих поделок пригодится.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

здравствуйте, подскажите какие пины на ардуино отвечают за ик датчики

 //пины ик датчиков на вход
041   pinMode(14, INPUT);
042   pinMode(15, INPUT);
043   pinMode(16, INPUT);
044   pinMode(17, INPUT);
045   //------------------------------------------

 

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Подключены к аналоговым пинам.

14, 15, 16, 17 они же A0, A1, A2, A3

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

nitrior пишет:

Подключены к аналоговым пинам.

14, 15, 16, 17 они же A0, A1, A2, A3

spasibo

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Еще раз здравствуйте. Тоже решил собрать такой пылесос на базе ардуино. Но задача была попроще Вашей, так как мне достался йробот роомба с выгоревшей платой, а вся механника осталась целой. подскажите пожалуйста как Вы подключали кнопки на прямую или через резистор на землю или плюс. Зарание спасибо.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Подключал по такой схеме.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Добрый всем вечер!

Почти доделал версию 2.0, но возникли трудности в составлении алгоритма прямолинейного движения.

Имеются два мотор редуктора со встроенными энкодерами. Энкодеры повесил на прерывания, за один оборот колеса каждый дает примерно 1000 тиков+- 150 тиков. Моторы подключил через L298N, я понимаю , что надо сравнивать количество тиков от энкодеров и в зависимости от разницы, выравнивать скорость моторов ШИМом, но не могу составить алгоритм этих действий.

Если кто знает, как организовать такой алгоритм, помогите пожалуйста.

Поиск по интернету ничего не дал, там какие-то уж очень замудренные алгоритмы, которые на Ардуино не получится организовать.

Заранее благодарю!

a5021
Offline
Зарегистрирован: 07.07.2013

nitrior пишет:

Энкодеры повесил на прерывания, за один оборот колеса каждый дает примерно 1000 тиков+- 150 тиков.

А вас не смущает, откуда берутся эти дополнительные +- 150 тиков, если принцип работы энекодера вроде бы не подразумевает появления блуждающих сигналов из ниоткуда? Каждый оборот колеса должен давать одинаковое и всегда точное количество тиков, без всяких +-.

Если с одного колеса приходит больше тиков, то уменьшайте коэффициент заполнения в ШИМ-сигнале управления мотором этого колеса. Так до тех пор, пока количество тиков с обоих колес не выравняется. Чтобы скорость не падала, можно, наоборот, добавить мощи противоположному колесу.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Я имел ввиду одно колесо крутится быстрее другого примерно на 150 тиков. Если левый энкодер выдает 950 тиков в секунду, то правый 1100. поставил на пол, пылесос уходит в сторону. Уменьшил ШИМ на правом моторе до 230, стали крутится примерно одинаково. А вот как это реализовать в программе, чтобы автоматически выравнивал скорость, пока думаю. Ведь надо еще как-то обрабатывать сигналы с шести инфракрасных датчиков препятствий и двух датчиков столкновения, да еще управление с пульта. Мне кажется одна ардуина не потянет.

 

a5021
Offline
Зарегистрирован: 07.07.2013

Задача не самая сложная, если проявить смекалку. Так как смекалки у меня нет, а на ум приходят только дубовые решения, то я бы задействал режим захвата таймера, если бы у атмеги328 было два канала на захват. Идея заключается в том, чтобы не считать импульсы, а измерять время между ними. Причем, МК позволяет делать это с высокой точностью. В этом случае скорость колес можно было бы выровнять еще задолго до того, как каждое из них сделает полный оборот.

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

Только беда не в том, что вычислительной мощи не хвататет, а в том, что нет достаточных ресурсов у периферии. Вот у STM8S, даже у младших моделей, на таймере по четыре канала, которые могут работать на захват или генерацию ШИМ независимо друг от друга. Если бы этот пылесос ездил на STM8S, то там бы все управление движением можно было организовать средствами одного таймера. Но в нашем случае это нереализуемые хотелки, т.ч. надо смотреть в другую сторону.

В принципе, можно задействовать единственный канал захвата таймера атмеги, но попеременно подключать его то к одному, то к другому колесу. Это потребует большего числа телодвижений в плане алгоритма, но так же позволит точно измерять время между импульсами энкодера, как если бы каналов захвата было два. Единственная сложность заключается в том, что нужно как-то коммутировать выходы энкодеров на один и тот же пин ардуины. Это можно было бы сделать посредством подключения некоторой внешней электронной схемы, но я не уверен, насколько такое решение вам подходит.

Захват можно делать не только аппаратно, но и программно. Это даст небольшую потерю в точности, но позволит отказаться от внешней схемы коммутации. Механизм такого захвата может выглядеть следующим образом: ловим на пине приход тика, запускаем таймер. Дожидаемся прихода следующего тика, программно вызываем захват. Время между импульсами берем из регистра захвата. Повторяем операцию для другого колеса. Далее осталось, как и в случае с двумя каналами, сравнить значения и выдать управляющую команду на корректировку шим-сигнала спешащему или отстающему колесу.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

здравствуйте. а если их поменять местами (пины моторы энкодеры). может это ошибка ардуины.

 

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Vallu пишет:

здравствуйте. а если их поменять местами (пины моторы энкодеры). может это ошибка ардуины.

 

Проверил моторы по отдельности.

Взял мотор подключил энкодер к Ардуино и подал питание на мотор напрямую от аккумуляторов.

В одну сторону энкодер выдает больше тиков, чем в другую. Да и на глаз видно, что колесо в одну сторону крутится быстрее, чем в другую.

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

Задача усложняется, ведь надо еще делать, чтобы робот поворачивал ровно на 90 градусов, когда подъезжает к стене.

Буду мучать Ардуину.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

a5021 пишет:

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

Спасибо за такой обширный ответ.

Не получится захватить этот таймер, он уже захвачен библиотекой IrRemote.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

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

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Vallu пишет:

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

Я тоже над этим думал, но в андроиде не силен. Делал как-то программку на AppInvertor, для управления RGB лентой, но она жутко тормозила на телефоне.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

если подскажите как можно здесь выложить фото то покажу своего зверя.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

nitrior пишет:

Vallu пишет:

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

Я тоже над этим думал, но в андроиде не силен. Делал как-то программку на AppInvertor, для управления RGB лентой, но она жутко тормозила на телефоне.

прога пишется за 5 мин в инете есть видео инструкция

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Vallu пишет:

если подскажите как можно здесь выложить фото то покажу своего зверя.

Вот:

http://arduino.ru/forum/obshchii/sokhranenie-kartinok-na-forume

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

электронная часть

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Vallu пишет:

 

электронная часть

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Круто.

Вечером постарабсь выложить то, что я уже сделал.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

родная батарея сдохла сделал парочку таких

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

родная батарея сдохла сделал пару таких

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Простейшая прога на андройде

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

вид снизу

a5021
Offline
Зарегистрирован: 07.07.2013

nitrior пишет:

Не получится захватить этот таймер, он уже захвачен библиотекой IrRemote.

Все-таки ИК-управление не самый удачный способ для взаимодействия с этим аппаратом. Это даже не касаясь вопроса высвобождения таймера.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Вот набросал алгоритм выравнивания оборотов моторов.

 

поправте если, что не так. 

Вроде прогнал все возможные варианты, должен работать.

 

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Самодельный робот-пылесос

Вот мой v.2.0

Без крышки и без бампера. На месте макетки будет мусоросборник. Вместо УНЫ будет Pro mini, все это будет спаяно на плате,

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Вот с полловинкой крышки и с бампером. На бампере 6 ИК-датчиков препятствия (два просто не видно).

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

Чтобы колеса ушли в корпус надо на каждое колесо вес 1,2 кило, итого 2,4 килограмма, а у него вес около 2 килограмм.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

a5021 пишет:

nitrior пишет:

Не получится захватить этот таймер, он уже захвачен библиотекой IrRemote.

Все-таки ИК-управление не самый удачный способ для взаимодействия с этим аппаратом. Это даже не касаясь вопроса высвобождения таймера.

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

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

очень даже симпатично даже прекрасно получилось

 

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

а если батарей добавить в паралель? моя пол кило весит без нее не осаживается

 

 

a5021
Offline
Зарегистрирован: 07.07.2013

Vallu пишет:

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

Блютуз здесь действительно лучше подходит, причем, сразу по многим критериям. А насчет ардуиновской ИрДы, я как-то пилил эту библиотеку под свои нужды, так исплевался весь. И ресурсов она жрет немеряно.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Vallu пишет:

а если батарей добавить в паралель? моя пол кило весит без нее не осаживается

Стоит 4 литиевых акк. места уже не хватит. А свинцовыми вставками думаю заполнить некоторые пустоты.

Подумал и решил отказаться от ик-пульта, благо модуль блютуса есть.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

a5021 пишет:

Vallu пишет:

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

Блютуз здесь действительно лучше подходит, причем, сразу по многим критериям. А насчет ардуиновской ИрДы, я как-то пилил эту библиотеку под свои нужды, так исплевался весь. И ресурсов она жрет немеряно.

Да, чет я сразу затупил с этим ик. Попробую сделать на блютуз.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

nitrior пишет:

Vallu пишет:

а если батарей добавить в паралель? моя пол кило весит без нее не осаживается

Стоит 4 литиевых акк. места уже не хватит. А свинцовыми вставками думаю заполнить некоторые пустоты.

Подумал и решил отказаться от ик-пульта, благо модуль блютуса есть.

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

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

Вот написал код для прямолинейного движения, но он не работает.

В мониторе показывает, что значения энкодеров выравнивается, шим на одном колесе уменьшается, а робота всеравно утягивает в сторону.

Помогите пожалуйста разобраться.

#define mot_ena 9 //пин ШИМа левого мотора
#define mot_in1 8 //пин левого мотора
#define mot_in2 7 //пин левого мотора
#define mot_in3 5 //пин правого мотора
#define mot_in4 4 //пин правого мотора
#define mot_enb 6 //пин ШИМа правого мотора

volatile int lev_enc = 0; // переменная для левого энкодера
volatile int pra_enc = 0; // переменная для правого энкодера

byte skor_lev = 255; // ШИМ на левом моторе
byte skor_pra = 255; // ШИМ на правом моторе

byte max_skor = 254; // Не менять


void setup() {

  // пины энкодеров на вход
  pinMode(3, INPUT);
  pinMode(2, INPUT);
  //-------------------------

  //----------временно----------
  Serial.begin(9600);

  //-----------------------------

  // пины для левого и правого моторов на выход  
  pinMode(mot_ena, OUTPUT);
  pinMode(mot_in1, OUTPUT);
  pinMode(mot_in2, OUTPUT);
  pinMode(mot_in3, OUTPUT);
  pinMode(mot_in4, OUTPUT);
  pinMode(mot_enb, OUTPUT);  
  //-------------------------------------------

  delay(3000);

  // левый мотор вперед
  digitalWrite(mot_in1, HIGH);
  digitalWrite(mot_in2, LOW);
  analogWrite(mot_ena, 255);
  //---------------------------

  // правый мотор вперед
  digitalWrite(mot_in3, HIGH);
  digitalWrite(mot_in4, LOW);
  analogWrite(mot_enb, 255);
  //---------------------------

}


void loop() {

  // прямолинейное движение
  lev_enc = 0;
  pra_enc = 0;
  attachInterrupt(0, ENC_LEV, FALLING);
  attachInterrupt(1, ENC_PRA, FALLING);
  delay(100);
  detachInterrupt(0);
  detachInterrupt(1);  

  if (lev_enc != pra_enc)
  {
    if (pra_enc > lev_enc)
    {
      if (skor_pra > max_skor)
      {
        skor_pra--;
      }
      else
      {
        if (skor_lev > max_skor)
        {
          skor_pra--;
        }
        else
        {
          skor_lev++;
        }
      }   

    }
    else
    {
      // правая часть
      if (pra_enc < lev_enc)
      {
        if (skor_lev > max_skor)
        {
          skor_lev--;
        }
        else
        {
          if (skor_pra > max_skor)
          {
            skor_lev--;
          }
          else
          {
            skor_pra++;
          }
        }
      }

    }

  }
  else
  {
    // пусто
  }

  analogWrite(mot_ena, skor_lev); 
  analogWrite(mot_enb, skor_pra); 
  //-----------------------
//---------------------------
   Serial.print("Lev: ");
   Serial.print(lev_enc);
   Serial.print("   Pra: ");
   Serial.println(pra_enc);

   Serial.print("Lev sh: ");
   Serial.print(skor_lev);
   Serial.print("   Pra sh: ");
   Serial.println(skor_pra);

}

// функция считающая тики левого энкодера
void ENC_LEV () {
  lev_enc++;
}
//---------------------------------------

// функция считающая тики правого энкодера
void ENC_PRA () {
  pra_enc++;
}
//---------------------------------------

















 

bwn
Offline
Зарегистрирован: 25.08.2014

Таки может колеса чуть разные? Сцепление, прямолинейность, угол наклона? Оборот один, а пройденное  расстояние в итоге разное.

a5021
Offline
Зарегистрирован: 07.07.2013

Прокатить его руками по прямой, а показания энкодеров записать. Станет ясно.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

a5021 пишет:

Прокатить его руками по прямой, а показания энкодеров записать. Станет ясно.

Не получается, колеса туго крутятся, виляет.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

bwn пишет:

Таки может колеса чуть разные? Сцепление, прямолинейность, угол наклона? Оборот один, а пройденное  расстояние в итоге разное.

Скорее всего моторы г..но. Грешил на редукторы, но нет. Разобрал, снял редукторы, моторы крутят с разной скоростью, причем она меняется то больше, то меньше и в одну сторону крутят быстрее, чем в другую.

Запитал от стабилизатора, та же история.

А колеса сравнил, один в один.

Короче намучался я с этими моторами, не знаю даже что делать.

a5021
Offline
Зарегистрирован: 07.07.2013

Тупо и без фантазии: выставляйте разный коэффициент заполенения на разных колесках. Если поворачивает направо, убавляйте на левом колесе или добавляйте на правом и наоборот, если поворачивает налево. В каком положении поедет прямо, то и используйте.

nitrior
nitrior аватар
Offline
Зарегистрирован: 02.02.2015

a5021 пишет:

Тупо и без фантазии: выставляйте разный коэффициент заполенения на разных колесках. Если поворачивает направо, убавляйте на левом колесе или добавляйте на правом и наоборот, если поворачивает налево. В каком положении поедет прямо, то и используйте.

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

Может все дело в фильтрах, которые стоят внутри и до которых чтобы добраться надо разворотить весь корпус.