Сервомашинка: исследование

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

Куплена она была здесь: http://ru.aliexpress.com/item/F02433-Corona-Digital-Tail-Servo-Metal-Gear-DS-919MG-DS-919MG-for-Trex-250-450-V2/1651459058.html

Заявленные характеристики:

Цифровая микро-серво DS919MG
 Рабочее напряжение: 4.8 В/6.0 В
 Рабочий ток: 200mA/240mA
 Рабочая скорость: 0.07sec.60o/0.06sec.60o
 крутящий момент: 1.5kg.cm/1.7kg.cm
 Мертвая зона: 3 USEC
 Рабочая скорость: 40o/одной стороны Пульс  400US
 Рабочая температура Диапазон:-20 до + 60
 -Шариковый подшипник
 -Программируемый цифровой усилитель MOSFET езды
 -Шестерни металла
 -Вес: 12.5 г-0.44 унц.
 -Размер: 22.5x11.5x24.6 мм (0.88 "x 0.45" x 0.96 ")
 -Крутящий момент на 4.8 В: 20.8 унц. (1.5Kg.cm)
 -Скорость 4.8 В: 0.07 сек на 60 °

Ни слова про люфт.

Измерение люфта

Для измерения люфта понадобится лазер и экран (любая картонка). Чем больше плечо тем точнее измерение люфта.

Сервомашинка жестко устанавливается на неподвижное основание. На ротор машинки прикрепляется лазер. Направление лазера задается в сторону экрана. На машинку подается постоянный сигнал. Ротор машинки может свободно вращаться  в пределах небольшого угла. Это и есть люфт. Измерить его можно отводя в крайнее свободное левое и правое положение робота, замечая где находится луч лазера.

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

Расстояние до экрана 9 метров и расстояние 28 см.

Получается arctg(28/900)=1,782 градуса = 7 делений.

Постоянная времени

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

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

Входное воздействие будет гармоническим: ServoPWM=A0+A*sin( w*t ). В нашем случае сервомашинка управляется ШИМ который генерируется с первого таймера у Arduino. Благодаря использованию первого таймера разрядность ШИМ не 8 бит а 10. Соответственно диапазон положений сервомашинки от -90 до +90 градусов. Экспериментально было проверено, что минимальный угол соответствует значению 220, а максимальный 950. Можно вычислить коэффициент связи входа с выходом сервомашинки:

Kc=(950-220)/180=4 [ед/градус]

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

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

Код программы выглядит следующим образом:

#include <TimerOne.h>
void setup()
{
 Timer1.initialize(2500);
 //Timer1.pwm(9,560);
 Timer1.pwm(10,600);
 delay(1000);
}
float a=0;
void loop()
{
 a=600+25*sin( ((float)micros())/100000*30 );
 Timer1.pwm(10,(int)round(a)); 
}

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

заданное число X рад/с полученная амплитуда Y в см отн. амплитуда 20 log A
1 10 151 1 0
2 20 150 0,9933774834 -0,05771376475
3 30 150 0,9933774834 -0,05771376475
4 40 150 0,9933774834 -0,05771376475
5 50 110 0,7284768212 -2,751685243
6 60 97 0,642384106 -3,844104261
7 70 76 0,5033112583 -5,9632671
8 80 66 0,4370860927 -7,188660235
9 90 57 0,3774834437 -8,462041832
10 100 47 0,3112582781 -10,13758179
11 110 43 0,2847682119 -10,91016983
12 120 34 0,2251655629 -12,94996061
15 150 13 0,08609271523 -21,3006719

Построим график зависимости затухания колебаний от частоты. Это и есть Амплитудно Частотная Характеристика.

По сути эта характеристика почти полностью описывает поведение устроства. Зная ее мы можем построить модель такого устройства.

По АЧХ видно, что данное устройство повторяет частотную характерситику апериодического звена с частотой среза в 30 рад/сек = 4.77 Гц.

Модель сервопривода состоит из 2х апериодических звеньев насыщения (-90/+90) и люфта в 2 градуса. частотный анализ модели показывает:

Что в большей степени соответствует характеристике снятой экспериментально.

 Чувствительность

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

На фото видно способ измерения чувствительности. Изначально был задано значение  600. Далее 601, 603, 605, 610. И измерены положения луча с люфтом. То есть крайнее левое и правое положение.

  • Для разницы для значения (600 – 610)=10 получается 39 см (8.6).
  • Для разницы для значения (600 – 605)=5 получается 21 см ( 5/10=0.5 | 21/39=0.538 ).
  • Для разницы для значения (600 – 601)=1 получается 4.5 см ( 1/10=0.1 | 4.5/39=0.115 ).

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

 

Список публикаций

  1. Андронова А.И., Бурдинов К.А. «Высокочастотная фильтрация как способ повышения контраста изображения» //  Материалы IX международной молодежной научной конференции  по естественнонаучным и техническим дисциплинам. [Текст],: материалы конференции / Йошкар-Ола: Поволжский государственный технический университет, 2014 – Ч.2. – С. 131-132 – ISBN 978-5-8158-1409-7
  2. Бурдинов К.А. «Высокочастотная фильтрация как способ повышения контраста изображения» //  XL Международная молодежная научная конференция Гагаринские Чтения. [Текст],  материалы конференции / Москва: Москва, 2014 – T.4. – С. 62-63 – ISBN 978-5-93271-665-6
  3. Андронова А.И., Бурдинов К.А. «Исследование возможностей спектроанализатора СИРИУС для определения тяжелых металлов в пищевых продуктах» //  “Прикладная электродинамика, фотоника и живые системы – 2013” (ПРЭЖС – 2013). [Текст],  материалы конференции / Казань: «Новое знание», 2013 – С. 50 – ISBN 978-5-89347-719-1
  4. Бурдинов К.А. «Динамика систем виброзащиты оптико-электронных приборов» //  Предпринимательство в современной России и за рубежом: проблемы, опыт, перспективы развития. [Текст],  материалы конференции / Казань: Печать-Сервис XXIвек, 2013 – С. 212 – ISBN 978-5-91838-093-2
  5. Бурдинов К.А. «Исследование возможностей спектроанализатора СИРИУС для определения тяжелых металлов в пищевых продуктах» //  XXIТуполевские чтения (школа молодых ученых). [Текст],  материалы конференции / Казань: Изд-во Казан. гос. тех. ун-та., 2013 – T.1. – С. 240 – ISBN 978-5-7579-1930-0
  6. Молин Д.А., Смирнов А.Е., Бурдинов К.А. «К задаче моделирования формирования поверхности составного параболического зеркала и оценке качества изображения» //  Труды Xмеждународной Четаевской конференции. [Текст],  материалы конференции / Казань: Изд-во Казан. гос. тех. ун-та., 2012 – T.3. – С. 182-188 – ISBN 987-5-7579-1730-6
  7. Бурдинов К.А. «К задаче моделирования динамики формирования поверхности составного параболического зеркала» //  XXXVIII Международная молодежная научная конференция Гагаринские Чтения. [Текст],  материалы конференции / Москва: Москва, 2012 – T.3. – С. 43-44 – ISBN 978-5-93-271-641-0
  8. Бурдинов К.А. «Разработка и исследование алгоритмов управления бортовой ОЭС, реализованных на микроконтроллерах» //  XXТуполевские чтения: Международная молодежная научная конференция. [Текст],  материалы конференции / Казань: Изд-во Казан. гос. тех. ун-та., 2013 – T.4. – С. 10-13 – ISBN987-5-7579-1876-1
  9. Бурдинов К.А. «Исследование динамики управления аэрофотоаппаратом и оценка влияния динамических погрешностей систем, обеспечивающих его работу, на качество изображения» //  XIXТуполевские чтения: Международная молодежная научная конференция. [Текст],  материалы конференции / Казань: Изд-во Казан. гос. тех. ун-та., 2011 – T.4. – С. 30-31 – ISBN 978-5-7579-1655-2

Использование библиотек Arduino в AVR Studio

 

Оказывается уже сравнительно давно есть возможность программировать Arduino через нормальную IDE как AVR Studio.

Делается это довольно таки легко.

Есть такая великолепная компания http://www.visualmicro.com/. Она сделала расширение для AVR Studio которое позволяет без особых усилий использовать гигантское количество библиотек написаны под Arduino IDE.

Поставив новую AVR Studio 6.2 я увидел там интересную закладочку

Решил посмотреть и увидел это:

Решил установить это расширение и вот что получил в итоге.

В закладке Tools появилась вкладка с возможностями которые предоставляла Arduino IDE.

Из особенностей здесь 2 вещи галка Upload Using Programmer и Automatic Debugging. Плюс внизу помощь и настройки в которых указывается путь к папке с Arduino IDE.

Platform Explorer представляет собой несколько закладок, которые могут пригодиться. Закладка с примерами теперь находится здесь.

Кроме этого появилась панель в меню:

В ней можно быстро выбрать порт плату и открыть терминал. Собственно вещи которыми пользуешься чаще всего.

Подсказки и подсветка!!!

А вот и самое главное! Сбылась моя мечта. Теперь все подсказки и подсветка работают нормально!

Последнее, как создать новый проект:

Соответственно Sketch Project создается в папке с проектами Arduino.

 

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

Hello world для ПЛИС на языке Verilog

Наконец-то пришла макетная плата с ПЛИС. Вот ссылка  на нее на ebay. Называется она EP4CE6E22 FPGA Dev Board + USB Blaster Programmer.

Это мой первый опыт с ПЛИС`ами так, что взял по совету именно эту макетку.

Что здесь есть

  • программатор
  • плата
    • 8 светодиодов
    • 2 кнопки
    • питание от USB
    • выведенные все ноги
    • 3 регулятора напряжения
    • резонатор на 25 МГц
  • 2 USB кабеля

Ниже показана обратная сторона платы.

С чего начать

Если подключить плату к USB, то запустится стартовая прошивка. Вы увидите как 1 светящийся СД продвигается вправо. При нажатии на кнопки будет происходить смена направления движения.

И все же хотелось бы сделать что-то свое.

Hello world.

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

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

Я все делал по инструкции в последней ссылке за исключением некоторых моментов:

  • Шаг 9. Код программы я адаптировал под свою плату. Хочу чтобы один СД светился, когда нажимаешь хотя бы одну кнопку из двух (ИЛИ), а второй когда обе нажаты (И).
module test_wires(
     input wire key1,
     input wire key2,
     output wire led1,
     output wire led2
     );
assign led1 = key1 & key2;
assign led2 = key1 | key2;

endmodule

На деле все получилось наоборот. Они светились по умолчанию и когда нажимаешь соответствующее комбо гасли.

  • Шаг 22 – 24. Вместо непонятной таблички использовал красивую картинку Assignment/Pin Planner (Ctrl+Shift+N)

С ней намного проще. Просто нажимаешь на вывод который хочешь использовать и  в окне (справа) указываешь провод или регистр который хочешь подцепить.

После этого в табличке снизу заполняется соответствующая строка. Все. Можно закрывать.

  • Шаг 26-28. Вообще странно. Как-то все по другому. + Драйвера пришлось искать непонятно где.

Открываем этот Programmer делаем поиск оборудования, все норм, а вот потом надо найти нашу плату. Это делается нажатием на кнопку Auto Detect.

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

Это не все. После этого появится какая-то строка в табличке а столбец – файл будет пуст. Надо его заполнить. Я делаю это так:

В папке с проектом есть папка output_files. Именно в ней лежит нужный файл.

Ну и все. После того как все графы заполнены ставим галку Programm/… Нажимаем Start. Все!

Про прошивку в ОЗУ и в EEPROM

http://we.easyelectronics.ru/plis/osvoenie-plis-s-ispolzovaniem-yazyka-verilog.html

Должно работать.

Дальше будем разбираться с работой регистров, тем как обрабатывать тактирование от резонатора, как сделать делитель частоты и как сделать ШИМ.

Генерируем изображение на телеке с помощью Arduino

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

http://www.instructables.com/id/TV-Out-with-Arduino/

и соответственно библиотеку которая там используется https://code.google.com/p/arduino-tvout/downloads/detail?name=TVout_R5.91.zip&can=2&q= .

Создатели библиотеки хорошо постарались над ее созданием и написали довольно таки подробный вики: https://code.google.com/p/arduino-tvout/wiki/Useage .

Предлагаю рассмотреть сначала функции библиотеки, а затем саму начинку библиотеки.

Библиоткеа

Рассмотрим работу библиотеки сразу на простом примере:

#include <TVout.h>
#include <fontALL.h>
TVout TV;
 
void setup ( )
{
  TV.begin(NTSC,120,96);
  TV.select_font(font6x8);
  TV.println("Sainquake");
  TV.delay ( 1000 );
}
int i=0;
void loop ( )
{
  TV.clear_screen ( );
  //TV.println("Sainquake");
  TV.draw_rect(0,0,119,95,WHITE);
  TV.print(10,40,"Happy new Year!!!");
  TV.draw_line(10,50,110,50,WHITE);
  TV.print(80,1,i);
  TV.delay ( 10 );
  i++;
}

 

В проекте подключены 2 библиотеки которые скачиваются по ссылке выше. Соответственно содержимое архива надо положить в папку Arduino/libraries/

Итак. В setup у нас стандартная конструкция инициализации: begin. В ней мы указываем стандарт телевидения NTSC или PAL. PAL вам нужен будет только, если вы захотите подключиться к старому ламповому телевизору. Далее задается количество строк и столбцов в будущем изображении. Может быть я что-то каряво сделал, но изменение этих параметров не дало никаких результатов. К сожалению разрешение изображение ограничивается тактовой частотой самой Arduino.

Ну и собственно сразу после инициализации мы можем подключить шрифт и писать текст на экране.

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

TV.clear_screen ( );

Очистка экрана.

TV.draw_rect(0,0,119,95,WHITE);

Рисуем квадрат. Соответственно аргументы: x0, y0, width, height, color (WHITE || BLACK || INVERT)

TV.draw_line(10,50,110,50,WHITE);

Рисуем линию. Аргументы такие же, только не ширина и высота, а координаты конечной точки.

По большому счету больше функций то и не понадобится.

Теперь о HW части.

По сути это все что вам нужно.

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

Эти 2 вывода по распиновке Arduino UNO будут 7 – Video и 9 – Sync.

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

О том как работает библиотека

При инициализации работы (begin) в памяти занимается место под буфер экрана.

А дальше идет только работа с таймером. В функции render_setup запускается таймер1.

Во момент прерывания от переполнения таймера вызывается функция по ссылке line_handler();. В свою очередь эта ссылка меняется на разные функции. Вот тут то и начинается магия.

Далее последовательно по таймеру выполняются несколько функций:

  • vsync_line() – генерирует синхроимпульс
  • blank_line() – вызывает либо синхронизацию либо прорисовку строки.
  • active_line() – прорисовывает строку вызывая функцию render_line();

Содержимое render_line(); зависит от разрешения, в инициализации выбирается соответствующая функция выполняемая здесь. Эта функция отписана на асме, чтобы точно знать момент поднятия или опускания вывода. По сути в этой функции идет подсчет тактов и дергание ногой.

 Бонус

Сделал на основе этой библиотеки следующий проект. По сути создание 3D кубика взято из примера к той же библиотеке.

Описание: Ардуинка считывает с АЦП напряжение на потенциометре и вращает кубик со скоростью пропорционально считанному значению. + идет счет времени (левый верхний угол) + выводится откалиброванное считанное значение с АЦП (Правый верхний угол).

Ставим софт под Altera Cyclone 4

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

1.Качаем Web Edition отсюда http://dl.altera.com/14.0/?edition=web

В какой то момент будет такое окно:

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

ОК.

Запускаем Quartus II открываем закладку tools->Install Devices…

Открывается диалоговое окно, где выбираем место куда вы загружали все. (В частности файлы с расширением .qdz ).

Next – Next – Next… Устанавливается вся эта хрень.

И вуаля. Создаем новый прожект:

Теперь можно выбрать необходимый девайс.

На этом все.

 

Следовал этой статье: http://we.easyelectronics.ru/plis/quartus-ii-nachalo-znakomstva.html

 

Еще полезная ссылка “Hello world”: http://we.easyelectronics.ru/plis/chto-takoe-vhdl-prosteyshiy-primer-sozdaniya-logicheskogo-elementa-v-plis.html

Bluetooth выключатель света

Подключение Bluetooth к Arduino UNO

По сути все это было описано уже много раз например:

Рассмотрим только код:

/*
 The circuit: 
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)
 */
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()  
{
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
}
char incomingByte;
void loop()
{
  if (mySerial.available()){
    incomingByte = mySerial.read();
    if(incomingByte == '0') {
       pinMode(13, INPUT); 
       mySerial.println("LED OFF. Press 1 to LED ON!");
    }
    if(incomingByte == '1') {
       pinMode(13, OUTPUT);
       mySerial.println("LED ON. Press 0 to LED OFF!");
    }
  }
}

Чтобы не было проблем подключаем Bluetooth через софтварный UART на других ногах.

Подключение реле

Чтобы не мучатся с разводкой купил следующие готовые платки http://ru.aliexpress.com/item/5V-One-1-Channel-Relay-Module. Там 3 вывода. Земля, питание и дата. На выходе общая точка и 2 вывода. И вот здесь самый главный нюанс – принцип работы ключа.

При подключении ее к любой ноге контроллера замыкание реле происходит при установке ее как вывод. Ввод – реле разомкнуто.

pinMode(13, INPUT);

Как видно на рисунке реле держит до 10А, то есть через него можно подключать электрочайник или пылесос. В моем случае лампочку.

Тест

Скачал https://play.google.com/store/apps/details?id=Qwerty.BluetoothTerminal. Особых проблем нет, только при поиске не определяются имена устройств, так что пришлось перебирать.

Вот собственно как это работает.

Документация на HC-XX: http://www.exp-tech.de/service/datasheet/HC-Serial-Bluetooth-Products.pdf

Запускаем Cubieboard2 UART

Для работы с UART на Cubieboard2 под Android необходимо:

  1. Поставить Android Terminal Emulator
  2. Поставить например Serial Port API Sample или любую другую программу для работы с UART
  3. Иметь на компе любой терминал. Я использую такой терминал

Теперь собственно мы готовы к работе.

Запускаем Терминал эмулятор

Пишем в нем:

$ su
# ls -l /dev/ttyS*

Получаем список UART портов. У меня ttyS0, ttyS2. У них нет прав на запись и чтение, даем их им (по этому поводу моно почитать здесь):

# chmod 666 /dev/ttyS*

ОК. Идем дальше. Запускаем Serial Port:

Setup -> Device -> /dev/ttyS0
Setup -> Baud rate -> 115200

Нажимем Loopback.

Соединяемся

Теперь требуется каким-либо образом соединить UART компа с устройством.

Для этого можно использовать FT232RL или плату о которой я говорил в прошлый раз. Если используете DVK521 то не забудьте подключить проводок:

На Cubie и на DVK521 соединить UART.

Переходим к компу

К USB порту на расширительной плате подключаем комп. Драйверы для платы PL2303 можно установить здесь.

Запускаем Terminal на компутере. Выбираем соответствующий COM порт и скорость 115200, соединяемся. Если на Cubie запустить Loopback то в Терминале сразу польется поток хрени. Это значит что все работает.

Более вразумительной проверкой работоспособности можно в Console