Как стать автором
Обновить

Комментарии 19

А зачем нужно UNO, если ESP8266/ESP32 — уже сами по себе достаточно мощные МК? Есть, например, плата WEMOS D1 mini, которая при стоимости в ~400р позволит сделать все вышеперечисленное, также интегринуется с arduino IDE, да еще и гораздо меньше места занимает.
ESP32 бесспорно замечательная вещь, но в дело пошло то, что было в арсенале. На текущий момент для передвижения хватает и этого. Если «повешать» на робота камеру, то скорее всего UNО не потянет передачу картинки в хорошем качестве и будет причина использовать более мощный процессор. Но код, который работал под UNO, без проблем заработает и на его более мощных «соплеменниках».
Ардуино с видео не вариант, пробовал. Забив память получается снять изображение с камеры (ov7670), но вот передавать или обрабатывать нереально.

Я тоже как-то построил паука с небольшими серво-приводами на ардуино. К сожалению, моторам не хватило мощности чтобы он нормально двигался.
Приобрел точно такую же камеру, но пока только познакомился с ней в теории. Судя по мануалам и обзорам коллег она требовательна к скорости процессора. А вы на какой ардуине пробовали работать с камерой?
Ардуино мега 2560. У меня была камера без буфера: мега успевала снять изображение путём работы с портами напрямую, но способа передать изображение быстро я не нашёл. Скорее всего, у процессора не хватит времени хватать кадры и передавать их для более-менее качественного видео.
MEGA в отличие от UNO обладает большим объемом оперативной памяти(8 Кб против 2 Кб), но рабочая частота одинаковая: 16 мГц. На такой скорости, судя по сторонним источникам, невозможно без смазывания передать информацию. ESP32 работает на частоте 160 или 240 мГц (разные варианты процессора) и имеет на борту 520 Кб оперативной памяти.
Думаю этого вполне хватит для передачи изображения, если хватает выводов для подключения к камере. У меня вроде даже остался код где я с помощью bit bang настраивал камеру.

Есть даже варианты с уже подключенной камерой: ESP32-CAM
Качество не сказать, чтобы супер. Но для технических нужды хватает за глаза (брал для слежения за 3D принтером, когда из дома отлучиться надо).

Можно использовать камеру с аппаратным FIFO, куда быстро сохраняется кадр с камеры, а затем считывается медленной ардуиной. Это наверное единственный вариант получить картинку в движении и без смазывания.
Еще можно уменьшить разрешение картинки, тогда и FPS подрастет. У меня выходило где-то 10 FPS при разрешении 300х400, но там все упиралось в пропускную способность UARTa (1 MBod/s).

у вас уже есть есп8266 в качестве шилда, и от этого прекрасного мощного мк вы используете только его коммуникационные возможности. Зачем еще к этому — уно? у вас никакой особой математики нет, все прекрасно бы пошло на самом есп.

ESP8266 в нашем случае интегрирован в плату и выполняет только коммуникационные функции, имея в наличие только UART-интерфейс. I2C шина и остальной функционал находится в распоряжении UNO.

Интересно насколько это все шустро работает. Есть ли какое-нибудь видео?

Работает ))). Видео будет в следующей статье.
Добрый день. Очень рад что у Вас пошла работа в этом направлении и есть положительные результаты!

Движения как планируете реализовывать в плане математики, на вход будет подаваться вектор или команды «повернись», «вперед» и тд. Я сейчас работаю над мат. частью с вектором, но пока идет туго. Возможно вместе мы осилим это :)
Здравствуйте, Алексей! Для реализации движения в проекте определено два класса:

class LinearMotion
class LinearMotion: public Motion {
  Vector3D m_Pose0[FOOTS_COUNT];   // положение конечности в начале (и конце) шага
  Vector3D m_Offset;               // вектор перемещения в результате шага
  int m_Heigth;                    // высота подъема конечностей
public:  
  LinearMotion(int heigth, Vector3D pose0[FOOTS_COUNT], Vector3D speed, long maxTime, long totalTime = -1, Motion* pNext = NULL);
  int getPose(long time, Vector3D points[FOOTS_COUNT]);
};


class RotateMotion
class RotateMotion: public Motion {
  Vector3D m_Pose0[FOOTS_COUNT]; // положение конечности в начале (и конце) шага
  Vector3D m_Angles;             // углы поворота в результате шага
  int m_Heigth;                  // высота подъема конечностей
public:  
  RotateMotion(int heigth, Vector3D pose0[FOOTS_COUNT], Vector3D rotor, long maxTime, long totalTime = -1, Motion* pNext = NULL);
  int getPose(long time, Vector3D points[FOOTS_COUNT]);
};



Оба класса в конструкторе принимает начальное положение лап робота и вектор скорости определяющий направление движения. Только для прямолинейного движения — это вектор линейной скорости, а для поворота — вектор угловой скорости.
Описание этих классов и исходный код самого ПО постараюсь изложить в следующей статье.
Только для прямолинейного движения — это вектор линейной скорости, а для поворота — вектор угловой скорости.
Я правильно понимаю что эти векторы задаются относительно центра туловища гексапода?

Описание этих классов и исходный код самого ПО постараюсь изложить в следующей статье.
Да, было бы очень классно почитать. Особенно клёво будет если подробно опишите математику :)
Вы совершено правы: вектора скорости задаются относительно центра туловища гексапода.
У вашего гексапода есть имя? Видео движения?
Имя есть — Гекса. Видео будет в следующей статье.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации