О сайте

Данный сайт содержит учебные материалы по программировании контроллеров Arduino. Содержит в себе статьи по использовании различных электронных устройств совместно с Arduino, примеры программ и ссылки на необходимые файлы для программирования микроконтроллеров (МК). Схемы, чертежи и платы, а так же инструкции по изготовлении печатных плат несколькими способами. Данный сайт будет полезен для желающих научиться программировать микроконтроллеры и для преподавателей робототехники на основе Arduino.

Наверняка тут есть ошибки, о которых прошу сообщать мне по почте berartvlad@mail.ru. Все замечания, пожелания, вопросы и прочее прошу присылать туда же

Робоплатформа

Данная запись является дополнением к предыдущей записи Разработка робоплатформы , где описывается создание 3D-моделей компонентов, для сборки робоплатформы. Тематика была обновлена и теперь доступна в виде статьи:

Разработка робоплатформы

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

Разработка робоплатформы

Информация данной записи устарела. Актуальная версия доступна в виде статьи:

Разработка робоплатформы

Во время подготовки к соревнованиям по робототехнике, у тех, кто намеревается собрать робота не из готового набора, а из Arduino и китайских движков, возникает проблема в создании шасси и закреплении всех элементов на нем. Существуют огромное количество самых разных вариантов решения данной проблемы. Однако, иногда бывает проще разработать свое решение, чем разбираться с чужими. Прежде всего были созданы 3D-модели крепления двигателей, болты и гайки для их фиксации к куску фанеры, который служит в качестве рамы. На моем примере, размеры фанеры 150х200мм c шестью отверстиями для крепления двигателей диаметром 9мм.

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

Для фиксации двигателя к этому креплению очень хорошо подходят болтики используемые в системных блоках ПК.

Имея двигатели установленные в такие крепления, болты и гайки к нему, его несложно закрепить к основе, например к фанере:

Все это собирается 13-ым гаечным ключем.

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

Ссылки на 3d-модели для самостоятельной распечатки

Болт

Гайка

Крепление для двигателя левое

Крепление для двигателя правое

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

Разработка распознавание изображения (видеозрение)

На данный момент я веду активную разработку библиотеки для delphi7. В этой библиотеке будут (уже есть) типичные функции обработки видеопотока, такие как регулировка контраста, яркости и т.д.. Помимо этого, планируется включить туда элементы распознавания. Надеюсь, скоро здесь выложу исходный код с подробным описанием библиотеки.

Пока поддерживается разрешение камеры 640*480.

Уже есть функция получения кадра из камеры, регулировка контраста, яркости, размытие, выделения границ объектов на картинке и вывод изображения в стандартный компонент TImage.

Но для работы в режиме реального времени необходимо высокое быстродействие. Обработка пикселей картинки в компоненте TImage происходит очень медленно, поэтому картинка храниться в одномерном массиве. Это позволяет быстро производить однотипные операции с пикселями, такие как контраст и яркость картинки.

Тип для хранения кадра из камеры назван TFrame. И это указатель на массив байтов:

type
  mas=array of Byte;
  TFrame=^mas;

Часто приходиться сохранять кадры. Поэтому в наличии имеется функция копирования кадра:

function CopyFrame (Source:TFrame):TFrame;
begin
  New(Result);
  SetLength(Result^, FrameSize);
  CopyMemory(@Result^[0], @Source^[0], FrameSize);
end;

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

Данная функция передает ссылку на область памяти, где храниться скопированный кадр.

Для нахождения различий между двумя кадрами имеется следующая функция:

function DifferenceFrame(frame1, frame2:TFrame):TFrame;
var i:Integer;
  b:Integer;
begin
  New(result);
  SetLength(result^, FrameSize);
  for i:=0 to FrameSize-1 do begin
    Result^[i]:=Abs(Frame1^[i]-Frame2^[i]);
  end;
end;

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

Однако, с картинкой удобнее работать как с двумерным массивом пикселей. Для этого были разработаны две подпрограммы:

function GetPixel(tmp:TFrame; i,j:Integer):TRGB;
procedure PutPixel(tmp:TFrame; i,j:Integer; color:TRGB);

Первая функция из указанного кадра достает пиксел i-го столбца и j-й строки. Вторая функция наоборот записывает пиксель в i-й столбец и j-ой строки.

Ниже представлена реализация функции PutPixel. Аналогично работает и GetPixel.

procedure PutPixel(tmp:TFrame; i,j:Integer; color:TRGB);
var index:integer;
begin
  if tmp=nil then exit;
  if not ((i>=0)and(i<640)and(j>=0)and(j<480)) then exit;
  index:=(i+(479-j)*640)*3;
  tmp^[index+2]:=color.r;
  tmp^[index+1]:=color.g;
  tmp^[index]:=color.b;
end;

В итоге, на данный момент реализованы следующие функции:

function init:Boolean;
function CaptureToImage(image:TImage): HResult;
function GetPixel(tmp:TFrame; i,j:Integer):TRGB;
procedure PutPixel(tmp:TFrame; i,j:Integer; color:TRGB);
function CaptureToFrame(var frame:TFrame): HResult;
function FrameRefresh(frame:TFrame): HResult;
function TRGBToTColor(RGB:TRGB):TColor;
function TColorToTRGB(Color:TColor):TRGB;
Procedure ShowConfig(Handle:THandle);
procedure FrameToImage(frame:TFrame; image:TImage);
procedure blur(tmp:TFrame; k:real);//Смазывание картинки k - Коэффициент смазывания (0 до 1)
function CopyFrame (Source:TFrame):TFrame;
function DifferenceFrame(frame1, frame2:TFrame):TFrame;
function GetBorders(tmp:TFrame; k:Real):TFrame;
procedure contrast(frame:TFrame; value:Real);
procedure brightness(frame:TFrame; value:Integer);
function ConvertToChB(tmp:TFrame; k:Integer):TFrame;
procedure ConvertToChB2(tmp:TFrame);
procedure DestroyFrame(frame:TFrame);
procedure line(frame:TFrame; x1,y1,x2,y2:integer; w:word; color:TRGB);

Дорабатываются следующие функции:

function TRGBToTHSV(color:TRGB):THSV;
function THSVToTRGB(color:THSV):TRGB;

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

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

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