Easyelectronics.ru

Электроника для всех
Текущее время: 26 апр 2018, 12:43

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 11 авг 2013, 17:10 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Подключение микросхемки термометра DS1621.
С печатной платой даже не стал заморачиваться, подключить проще некуда.
Припаял 4 проводочка - VCC, GND, SCL, SDA и засунул ее в термоусадку.
Вложение:
ds1621.png
ds1621.png [ 178.3 Кб | Просмотров: 15005 ]

Для работы с микросхемой создадим 2 макроса: на запуск преобразования и на чтение результата.
Запуск преобразования SC (Start Convert):
MACRO NEW SC "I2C SWWP $90 $EE ;" ;
Чтение результата RT (Read Temperature):
MACRO NEW RT "I2C SWWSWRP $90 $AA $91 ;" ;
Теперь вводим .SC и через пол секунды .RT и получаем в ответ 27.
В сочетании с режимом отключения мк получаем маломощный блютус термометр (энергию пожирает в основном блютус модуль, но в режиме ожидания это ток порядка 2-3 мА ).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 11 авг 2013, 17:26 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Sphynx55 писал(а):
Теперь вводим .SC и через пол секунды .RT и получаем в ответ 27.
А эти полсекунды самому отмерять/ждать? Должна быть команда ожидания временнОго интервала!

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 11 авг 2013, 17:51 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
AlexPM писал(а):
Sphynx55 писал(а):
Теперь вводим .SC и через пол секунды .RT и получаем в ответ 27.
А эти полсекунды самому отмерять/ждать? Должна быть команда ожидания временнОго интервала!

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


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

Кому он будет слать температуру в цикле ? Контроллер ведомый а не ведущий. Вот если попросят его он пришлет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 08 сен 2013, 16:26 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Появилось свободное время, решил немного покатать бота.
Клавиатурное управление вполне удобно т.к. играю в танчики :)
Из недостатков можно выделить отсутствие стабилизатора вращения колес, из-за этого приходиться "подгазовывать".
Тронуться с места бот может только со 2ой "скорости". Так-же получилась крайне нелинейная зависимость между значением ШИМ и скоростью движения.
http://youtu.be/eUENN_eGvuM


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 01 дек 2013, 20:04 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Как уже было написано контроллер может засыпать, с пробуждением от внешнего сигнала (получение любого символа через последовательный порт). Функция решает 2 задачи - в случае потери связи контроллер (бот) уснет и прекратит любое движение, а также сохраняет заряд батарей. А вот электроника сервомашинок оказалась достаточно прожорливой, и даже без сигналов управления сжирает батарею за 3-4 дня. Для отключения сервоприводов от питания подключил их через ключик на IPS511G.
Вложение:
keys.jpg
keys.jpg [ 4.19 Кб | Просмотров: 14527 ]

Ключик распаял на небольшой платке и засунул в термоусадку.
Вложение:
key.jpg
key.jpg [ 10.76 Кб | Просмотров: 14527 ]

Работает это так:
Управляющий сигнал ключа вешается например на выход P0. Чтобы подать питание на сервомашинки нужно установить P0 в единичку(PORT DDR 1 OR 1 ;).
Разрешаем засыпать если команды не поступают к примеру 2 секунды.(TIMEOUT 2000 ENABLE ;)
Если в течении двух секунд не приходит никаких команд, то контроллер засыпает, и подвешивает все ноги в воздух (режим входа без подтяжки),при этом прежнее состояние всех портов сохраняется. Вход ключика притянут к земле, поэтому он закроется и сервомашики отключатся. Как только пришла любая команда контроллер восстанавливает состояние портов и на выходе P0 опять появится единичка.
В таком режиме бота можно вообще не отключать, он может спать больше месяца. При этом для пробуждения требуется лишь подцепиться к блютусине.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 08 дек 2013, 10:50 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Подключение 8-битного расширителя ввода – вывода I2C-шины PCF8574T.
Макросы:
Запись в порт:
MACRO NEW WP "I2C SWWP $40 % ;" ;
Чтение из порта:
MACRO NEW RP "I2C SWRP $41 ;" ;

Подключение LCD WH2004 на основе HD44780 через PCF8574T.

LCD D4 -> P0
LCD D5 -> P1
LCD D6 -> P2
LCD D7 -> P3
LCD RS -> P4
LCD RW -> P5
LCD E -> P6


Вложение:
lcd.jpg
lcd.jpg [ 37.05 Кб | Просмотров: 14415 ]


Программка на Delphi крутит текст и выводит текущее время.
Компилится через Delphi Portable.
Вложение:
LCD.zip [224.17 Кб]
Скачиваний: 353


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 21 дек 2013, 21:27 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Немного о прошивке.
В текущей прошивке (3.1а) крутятся 2 задачи: "основная" и "интерпретатор".
Из каждых 16мс времени работы мк 1мс отводится интерпретатору (6.25%), причем если интерпретатору нечего делать, то переключения вообще не будет. Переключение происходит прозрачно для основной программы. Это было сделано для возможности приклеивания интерпретатора к различным программкам.
Основная программка:
Код:
mainloop:
      sleep
      rjmp      mainloop

Как несложно посчитать, не менее чем 90% времени контроллер спит. В данной прошивке это позволяет понизить энергопотребление, но значительно ограничивает быстродействие интерпретатора. Если же требуется максимальная скорость работы интерпретатора, то имеется возможность блокировать переключение на основную программу. Конечно было бы лучше менять процентное соотношение, но такой механизм пока не доделан. Основная программа полностью остановится, но с возможностью возобновления работы.
Команда STOP - запрещает переключение, RUN - разрешает.
Наличие "прозрачного" интерпретатора на борту позволяет использовать его как простенький отладчик, и в некоторых случаях отказаться например от JTAG.
Команда DUMP адрес - выведет содержимое озу (табличка 8*16 байт).
Команда RAM позволяет побайтно читать и писать в ОЗУ мк.

В качестве пробы в прошивке имеется простой генератор. Программка циклично выводит таблицу значений в порт мк.
Таблица состоит из байтиков и оформлена в следующем виде:
'Время_ожидания','Значение_в_порт',.....,'Время_ожидания=0'.
Время ожидания задается в микросекундах, значение в порт - это байт, который будет выведен в порт мк.
Для интервалов времени более 255 мкс предусмотрен постоянный множитель, для всей таблицы.
К примеру, для получения меандра 1 кГц на выводе P0, необходимо 500мкс подержать нолик, и 500мкс подержать единичку. Множитель пускай будет 100, тогда получается такая табличка: 5,0,5,1,0 .
Для управления программкой "генератор" (я назвал ее LOOP_MACHINE) используется все тот-же интерпретатор.
Команда LOOP_MACHINE SET_DELAY 100 SET_TABLE 5 0 5 1 0 START ; запустит генератор и на выводе P0 появится меандр 1 кГц.
Важно отметить что генератор не откалиброван, и рассчитывать на особую точность не следует. Кроме того, если слать в контроллер другие команды, то свои 6.25% времени он съест, что естественно скажется на работе генератора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 25 фев 2014, 16:48 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Защита батареи от глубокого разряда.
В период новогодних праздников бот остался без внимания, и видимо от обиды, сожрал батарею в ноль :)
Зарядить ее удалось, но по всей видимости, она потеряла значительную часть емкости. Для предотвращения порчи батареи решил немного доработать схемку и прошивку.
Вложение:
mcu3.4a_m16.zip [7.56 Кб]
Скачиваний: 313

Вложение:
gdcgh.GIF
gdcgh.GIF [ 61.4 Кб | Просмотров: 13910 ]

Как видно на схеме между DC/DC стабилизатором и батареей находится ключ (IPS511G). Контроллер при включении удерживает этот ключ открытым, выставляя в порт PA6 единичку. Резистор R8, R9 образуют делитель, чтобы максимальное напряжение на входе АЦП не превышало 2,56В. В прошивку добавлен модуль защиты батареи, который периодически измеряет напряжение на входе ADC7, и если значение окажется ниже порогового, то вывод PA6 переключится в нолик, и ключ закроется. Для управления модулем добавлена команда BAT_PROT THRESHOLD x ;, x - пороговое значение. Измерение производится относительно IREF, независимо от настроек ADC. При включении контроллера пороговое значение устанавливается в 0, поэтому нужное значение желательно задавать через макрос AUTORUN. Если макрос AUTORUN уже создан, то дописать в него можно командой MACRO APPEND AUTORUN "..." ;
Модуль защиты батареи работает и в режиме Standby. К моему большому удивлению из этого режима сна мега16 может выйти только используя внешние источники (даже таймер2 требует внешнего кварца). Для решения проблемы в схему добавлен конденсатор С3 емкостью несколько мкф. В обычном режиме вывод PD2 используется для мигания светодиодом, а в режиме глубокого сна как источник пробуждения. Перед засыпанием конденсатор C3 заряжается, далее происходит разряд через резистор R2 и светодиод VD1. Сопротивление диода нелинейно, и при низких напряжениях может достигать нескольких МОм, поэтому разряд конденсатора будет происходить достаточно долго (около 20с). Проснувшись по низкому уровню контроллер измеряет напряжение на батарее в режиме ADC Noise Reduction, заряжает конденсатор и опять идет спать.
Сопротивление делителей напряжения я рискнул выбрать очень большим R8 1.3 МОм, R9 200 КОм, R6 и R7 по 910 КОм. Для проверки работы ADC в таких тяжких условиях написал тестовую программку. Работать с Excel через Delphi оказалось намного удобнее чем через VBA.
Вложение:
gfdt.gif
gfdt.gif [ 69.03 Кб | Просмотров: 13910 ]

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 25 фев 2014, 17:06 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Похоже, не любите Вы watchdog :-)

Sphynx55 писал(а):
Модуль защиты батареи работает и в режиме Standby. К моему большому удивлению из этого режима сна мега16 может выйти только используя внешние источники (даже таймер2 требует внешнего кварца).
Во-первых, watchdog timer способен вывести из любой спячки, даже самой глубокой.

Sphynx55 писал(а):
В прошивку добавлен модуль защиты батареи, который периодически измеряет напряжение на входе ADC7, и если значение окажется ниже порогового, то вывод PA6 переключится в нолик, и ключ закроется.
Во-вторых, при программном контроле разряда батареи случайное зависание МК опять приведёт к гибели батареи. А от зависаний спасает только... см.выше.

Sphynx55 писал(а):
Сопротивление делителей напряжения я рискнул выбрать очень большим R8 1.3 МОм, R9 200 КОм, R6 и R7 по 910 КОм.
Ну и для чего? Якобы экономия на токе делителя? Этот ток можно свести к нулю при любых значениях сопротивлений. Сделайте коммутацию верхней точки делителя только на момент измерения. Коммутировать можно даже непосредственно ногой AVR.

И экономия на кварце для таймера2 - это тоже что-то :-) Кварц подключается даже без конденсаторов, стОит три рубля, и с ним можно себе позволить не Standby, а даже суперэкономный Power-save.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 25 фев 2014, 17:28 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Цитата:
Похоже, не любите Вы watchdog :-)

Как я понял из даташита watchdog может только ресетнуть мк, а значит все модули придется настраивать заново.
Цитата:
Во-вторых, при программном контроле разряда батареи случайное зависание МК опять приведёт к гибели батареи. А от зависаний спасает только... см.выше.

С этим согласен, но если случайного зависания не произойдет, то батарея будет спасена, ценой допайки 1 кондера и пары резисторов.
Цитата:
Ну и для чего? Якобы экономия на токе делителя? Этот ток можно свести к нулю при любых значениях сопротивлений. Сделайте коммутацию верхней точки делителя только на момент измерения. Коммутировать можно даже непосредственно ногой AVR.

И экономия на кварце для таймера2 - это тоже что-то :-) Кварц подключается даже без конденсаторов, стОит три рубля, и с ним можно себе позволить не Standby, а даже суперэкономный Power-save.

Вопрос очевидно не в деньгах, а в отсутствии свободных выводов.
Цитата:
суперэкономный Power-save
я не использую, так как очень важно успеть проснуться и поймать все символы через UART.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 25 фев 2014, 17:35 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Есть вариант слежения за разрядом батареи вообще с одной дешёвой деталью, с практически нулевым собственным потреблением, и не боящийся зависаний (т.к.способ не программный). Взгляните, может пригодится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 25 фев 2014, 18:04 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Ну попробую пока так, если батарея все-таки сдохнет буду искать другие способы :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 03 мар 2014, 13:19 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Установил на боте поворачиваемую платформу с креплением для телефона.
Вложение:
IMG.jpg
IMG.jpg [ 30.83 Кб | Просмотров: 13835 ]

На ведроид есть замечательная программка IP WebCAM способная передавать видео через WiFi.
Запись видео с экрана.
http://youtu.be/5izwhMkmrb4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 05 мар 2014, 02:41 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Sphynx55 писал(а):
Запись видео с экрана.
А чего он просто так ездит? Пусть отрабатывает съеденное электричество - пылюку под столом протирает или тапочки приноситпривозит :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 18 мар 2014, 17:54 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Модуль защиты батареи натолкнул на идею создать некий более общий объект, который должен поддерживать заданный режим работы независимо от внешних команд. То есть работать самостоятельно, и определенным образом реагировать на внешние события, своего рода "рефлексы бота". Это придаст боту большую самостоятельность, а также позволит уменьшить трафик.
Вариантов объектов можно придумать очень много, но решил начать с самого простого.
Вложение:
GHJGJ.gif
GHJGJ.gif [ 1.79 Кб | Просмотров: 13696 ]

Берется исходная величина (например значение АЦП), пропускается через функцию OUT=f(IN), и отправляется в исполнительное устройство (например двигатель).
Реализация тоже самая простая - все величины приводятся к байту, а чтобы не городить сложные формулы функция задается в виде таблицы y=tab[x]. Но даже в таком случае на один элемент потребовалось бы 256 байт, что для меги16 четверть ОЗУ, поэтому таблица задается в сжатом виде, как набор ключевых точек (не более 7), а все промежуточные значения вычисляются интерполяцией. Например инверсию можно описать двумя точками 0,255 255,0.
Для описания всего того что я нагородил добавил новую команду LINK. В текущей прошивке новых модулей 8 штук (0..7). Для того чтобы задействовать модуль нужно указать откуда брать данные, куда их слать, и через какую таблицу пропускать.
Пример:
LINK ENABLE ;
Разрешает работу модулей.
LINK MODULE 0 CONNECT PIN 0 SERVO 0 TABLE 0 0 255 255 ENABLE ;
Эта команда делает SERVO 0 зависимой от состояния входа PORT0, с помощью MODULE 0, а также разрешает его работу. Таблица фактически описывает функцию Y=X, это означает что если состояние входа будет минимальным (PIN=0), то и положение вала сервомашинки будет тоже минимальным (0), и наоборот (PIN=1 -> угол 180).
Связывать можно: MR - правый двигатель, ML - левый двигатель, PORT - порт вв (PB мега16), PIN - отдельные выводы порта, SERVO - сервомашинки, ADC - АЦП.
Очевидный недостаток текущей реализации это статичность: не изменяется входная величина значит и выходная тоже. Также предыдущие состояния не играют никакой роли, что сильно ограничивает применение.
Собственно прошивка.
Вложение:
MCU v3.5a.zip [8.56 Кб]
Скачиваний: 325


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 21 мар 2014, 22:15 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Прикупил фототранзистор 32p3c, и опробовал модули в действии.
В первом случае создается связь между фототранзистором (АЦП) и сервоприводом, во втором сервопривод меняется на двигатель.
Таблица одна и та-же 0,0 255,255 ;
http://youtu.be/Rtrjk9YaaHw
Модуль даже в текущем виде может стать простым регулятором, правда теорию САУ никто не отменял, и как видно, могут возникать устойчивые колебания (хотя если видоизменить таблицу, то в данном случае, от них можно избавиться).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 21 мар 2014, 23:53 
Старожил

Зарегистрирован: 04 янв 2014, 01:30
Сообщения: 208
Цитата:
что для меги16 четверть ОЗУ

У меги16 16К ПЗУ. Хранить эти значения надо в ПЗУ, а не ОЗУ. Я это делал так:
Код:
CRCtable:
; таблица сигнатур для быстрого расчета контрольной суммы CRC-8
   .db      0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65
   .db    157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220
   .db    35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98
   .db    190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255
   .db    70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7
   .db    219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154
   .db    101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36
   .db    248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185
   .db    140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147,205
   .db    17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80
   .db    175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238
   .db    50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115
   .db    202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139
   .db    87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22
   .db    233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168
   .db    116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 03 апр 2014, 14:28 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Цитата:
У меги16 16К ПЗУ. Хранить эти значения надо в ПЗУ, а не ОЗУ. Я это делал так:

Если хранить таблицы в ПЗУ , то изменить их можно будет только с перепрошивкой, а мне так не подходит. Я уже писал, что таблица (функция) сжимается до нескольких точек, и занимает единицы байт.
Вложение:
fghf.png
fghf.png [ 4.7 Кб | Просмотров: 13488 ]

Такая функция может быть описана всего 3 точками, и "весит" 6 байт.
Если же сжатая функция, при некоторых значениях, дает слишком большую ошибку, то можно добавить дополнительную точку.
Кроме того в планах есть собрать регулятор способный самостоятельно корректировать функцию и подбирать точки, а это возможно только если таблица хранится в ОЗУ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 19 авг 2014, 20:49 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Немного апну темку. Запилил новую платку - Mega16L + 2 х 74HC595.
Вложение:
mcu.jpg
mcu.jpg [ 51.89 Кб | Просмотров: 12523 ]

Получилось не очень удачно - некоторые дорожки протравились, но не фатально.
Нарисованная в Proteus схемка + прошивка прилагается.
Вложение:
MCU.zip [37.43 Кб]
Скачиваний: 297

Show

Для обращения к регистрам предусмотрена команда HC595.
Пример HC595 ON $1234 ; - включить регистры, и установить 16 битное значение $1234;
U2 - младшие разряды (LO), U3 - старшие (HI).
HC595 HI 123 LO $67 ; - в старший порт отправит 123, в младший $67 ;
Сервомашинки переехали на регистры 74НС595, и теперь контроллер поддерживает их до 16 штук.
SERVO MAX 7 ; - указывает, что используются только 8 сервомашинок (0..7), и соответственно весь LO порт занят, а HI порт можно использовать для других целей.
Двигатели теперь подключаются к старшим разрядам HI порта: 4,5 разряд - ML; 6,7 - MR.
MOTOR ENABLE ; - включает драйвер двигателей, и соответственно занимает с 4 по 7 разряды HI порта.
Выводы аппаратного ШИМа теперь свободны. (PWM ENABLE ; теперь не отключит двигатели);
Измерение напряжения питания теперь осуществляется через подключаемые делители.
BAT_SAVE ADC_BAT ; - выдает значение адц через делитель R11-R6.
BAT_SAVE ADC_VCC ; - выдает значение адц через делитель R5-R6.
Макросы теперь хранятся во внешней EEPROM at24c512. Для этого запилена простенькая файловая система по типу FAT.
Память делится на 256 блоков по 256 байт. 1 блок занимает корневая папка, 1 блок таблица FAT, 254 блока доступно для использования. Итого: максимальное количество файлов - 254; максимальный размер файла - 65024 байт.
Binary Angle Modulation - доступно 8 каналов, используется порт B мк.
BAM ON 5 127 ; включает драйвер BAM, и устанавливает для канала 5 (вывод PB5) значение 127.

В протеусе не работают режимы сна мк, непонятно себя ведет и2ц еепромка (иногда читаются FFки, хотя в железе такого не наблюдается), некорректно работает SPI (в железе пока не тестировал).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 08 сен 2014, 21:46 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Не совсем робототехника, конечно, зато красиво :)
Нашел применение BAM - подсветка как у телевизоров Philips.
2 кусочка RGB ленты приклеил на монитор. К контроллеру лента подключается ключиками IRL110 (6 шт).
Show

Show

Show

Управляющая программка просто копирует цвет пикселя из ScreenDC.
Для просмотра видео с такой ленточкой нужно чуть усложнить вычисление цвета, так-как яркость меняется очень резко, и вместо оттенка получаются вспышки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 08 сен 2014, 21:47 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Собственно программка на Delphi lite.
Вложение:
LEDRGB.zip [228.04 Кб]
Скачиваний: 302


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 04 окт 2014, 21:27 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Простенькая оболочка на ПК плюс небольшое изменение.
Вложение:
main.png
main.png [ 136.4 Кб | Просмотров: 11890 ]

На первой вкладке можно установить соединение, и убедиться что контроллер живой.
Вкладка Terminal говорит сама за себя, главное не забыть включить капс.
На вкладке EEPROM пока можно только читать содержимое микросхемы at24c512.
На вкладке Ошибки отображаются все некорректные посылки. Основная причина их появления недостаточная скорость обмена, приводящая к рассинхронизации. В текущей версии синхронизация восстанавливается ожиданием и очисткой буфера сообщений, но для надежности надо будет добавить контроллеру команду для очистки внутренних буферов.
Под новую оболочку не поленился вытравить новую платку, на этот раз почти без косяков xD
Вложение:
mcu9.jpg
mcu9.jpg [ 67.48 Кб | Просмотров: 11890 ]

На платке распаяна FT232RL, Mega16, 24C512, 74HC595 х 2.
Предусмотрены светодиоды RX и TX, а также возможность выбора напряжения питания, либо 5В от USB, либо 3.3В через встроенный в FT232RL стабилизатор.
В прошивке ничего нового, только исправлен один небольшой косячок, и переименована пара команд
(BAT_SAVE VCC ; BAT_SAVE PWR ;).
В архиве прошивка (v3.8d), исходник оболочки на Delphi, а также платка в формате lay.
Вложение:
MCU.zip [88.58 Кб]
Скачиваний: 312


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 01 дек 2016, 21:00 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Доброго времени суток. Сумел все-таки реализовать очередную итерацию и сваял новую платку, которая объединяет все мои ранние идеи, и, можно сказать, приобретает внятные черты.
Вложение:
P1020322.JPG
P1020322.JPG [ 109 Кб | Просмотров: 3066 ]
Вложение:
P1020320.JPG
P1020320.JPG [ 188.13 Кб | Просмотров: 3066 ]

Плата позволяет непосредственно подключить 8 сервомашинок, 2 двигателя, питается от одного источника напряжением +8В..+15В, и совместима со всем предыдущим описанием. +3.3В для микроконтроллера и +6В для сервомашинок формируются на DC/DC преобразователях на MC34063. Выбор деталек обусловлен их присутствием на старом барахле, из которого они успешно выпаиваются :). Из покупных только полевики IRF7319, на которых собран драйвер двигателя (поэтому распаян только один драйвер).
Программная часть осталась практически без изменений, с необходимыми доработками. Например команды "SERVO ENABLE" и "MOTOR ENABLE" теперь включают не только программную, но и аппаратную часть. Добавлен контроль за напряжениями: если на драйвере двигателя менее ~6В он будет принудительно отключен. Для сервомашинок установлен порог в ~3В. Места на плате для 74HC595 не хватило и они были полностью выпилены.
Добавлен режим кодового обращения к интерпретатору. Для того чтобы не переписывать код, пришлось накрутить этот режим поверх, сохранив полную совместимость сверху вниз. При получении команды, например "PORT 55 ;" интерпретатор по таблице преобразует слово "PORT" в код команды 0x0B, и передает этот код на обработку. Далее определяет что "55" это число, и преобразует в байт 0x37, и соответственно выводит эти данные в порт. Чтобы исключить все эти преобразования и проверки добавлены маркеры явно указывающие на тип данных. Символ "*" означает что далее следует байт непосредственно код команды, "b" - байт данных, "w" - слово данных (2 байта). Кодовая последовательность: '*',0x0B,'b',0x37,';' равнозначна "PORT 55 ;", "PORT $0037 ;", "PORT ",'b',0x37,";". Осталась полная совместимость, интерпретатор спокойно переварит любую кашу из этих ингредиентов.
Если отправить "DATA_OUT CODE ;" то отвечать контроллер начнет кодами. '*',0x00 означает ОК, '*',0xFF - Error, 'b',0xXX - байт данных, 'w',0xXX,0xXX - слово данных. Правда тут не все так удачно, такие ответы будут только если программные модули отвечают через общую функцию вывода.
В общем тем для творчества в электронике и робототехнике выше крыши, но меня, в данный момент, заинтересовала тема управления через WEB интерфейс. В моей старой доброй Mega16 еще осталось целых 8КБ памяти, всего-то нужно запихать туда TCP/IP стек и веб сервер xD


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 25 ноя 2017, 11:35 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Подключение микроконтроллера к сети через ENC29J60.
На али была куплена платка с распаяным ENC29J60, которая содержит все необходимое для подключение к сети. Подключение стандартное - SPI шину микросхемы к одноименной шине микроконтроллера. Микросхема ENC28J60 умеет передавать и отправлять только Ethernet фрэймы, поэтому весь TCP\IP стек пришлось делать программно. В качестве основного источника информации по работе с микросхемой и с сетевыми протоколами была использована статья http://easyelectronics.ru/ethernet-modul-na-enc28j60.html.
Написал драйвер микросхемы, затем разбор Ethernet фрейма, ARP, IP, ICMP. Настройки микросхемы использовал как в статье, с незначительными изменениями. При желании, есть возможность изменить любой параметр через команды SPI. Например так можно вычитать ревизию чипа:
SPI MODE 0 ENABLE ; - включаем SPI.
SPI $FF END ; - Сброс микросхемы.
SPI $5F $03 END ; SPI $12 R END ; - Чтение ревизии.
Передача любого байта переводит ногу SS (CS ENC) микроконтроллера в 0, END возвращает к единичке.
Разбор Ethernet фрейма происходит в отдельном потоке. Чтобы его запускать добавлены команды по управлению сервером.
NET SET_MAC 00:11:22:33:44:55 ; - Задает MAC адрес в сети (по умолчанию 00:22:33:44:55:66).
(Задавать MAC адрес следует до запуска сервера, поскольку он используетсяя при инициализации ENC28J60.)
NET SET_IP 192.168.34.56 ; - задает IP адрес в сети (по умолчанию 192.168.0.100). Можно менять "на лету". По сути просто строка для сравнения. Все пакеты с другим адресом будут игнориться.
NET SERVER START ; - запус сервера. При этом происходит инициализация SPI и микросхемы ENC28J60.
Далее последовал разбор UDP - очень простой протокол, особых проблем не возникло. Для начала, реализовал проброс данных в UART - все что приходит на порт 50001 уходит туда, все что лежит в 32 байтном буфере микроконтроллера возвращается обрано. Поскольку интерпретатор тянет байты с UART буфера в поисках команд для выполнения, буфер будет всегда пуст, и в ответ по UDP ничего не придет. USART DISABLE ; - после этой команды можно читать буфер по UDP, но микроконтроллер станет неуправляемый по COM порту.
Порт 50002 открыт для интерпретатора. Команды переданные через UDP воспринимаются также как и по COM порту. В ответ будет сформирован UDP пакет содержащий ответ на все распознанные команды.
Вложение:
nc1.png
nc1.png [ 63.8 Кб | Просмотров: 525 ]

Передача команды DUMP $160 ; и ответ в программе netcat. (По адресу $160 располагается буфер приема пакетов). Строки у меня заканчиваются символом $0D, поэтому происходит "наезд".
FILE LIST ; тоже отработала без проблем. Все выглядит также как и при обмене через COM порт.
Отвечает контроллер всегда одним пакетом размером не более 512 байт.

Изучая протокол TCP/IP становится понятно что у разработчиков было много оперативки. Реализовать протокол на 100% в ОЗУ объемом 1024 байт, довольно проблематично, поэтому получилась весьма порезанная версия. Для начала, хотелось чтобы он хотя бы просто хоть как-нибудь заработал, а том можно и подкрутить по ходу дела. Ради упрощения кода, TCP пакет формируется в ОЗУ, и ограничен 512 байтами. Доступен только один порт/сокет.
Из ENCшки в ОЗУ микроконтроллер копирует только заголовки пакетов, поэтому входящих данных может быть более 512 байт. Контрольная сумма считается прямо из ENC, перед передачей на дальнейшую обработку. На всякий случей добавлена команда отключения расчета, но на время ответа это практически не влияет.
NET SERVER CS ENABLE/DISABLE ; На исходящие пакеты контрольная сумма расчитывается всегда.
Протокол HTTP.
Для меня осталось неясным, почему при TCP соединении в качестве ACK отправляется пустой пакет.
Как обычно идет соединение:
SYN-SYN+ACK-ACK-ACK(GET)-!ACK-ACK(HTTP_OK).
Пакеты !ACK и ACK(HTTP_OK) идентичны, просто первый !ACK не содержит данных. Я этот !ACK не слал, узнал о нем случайно, когда посмотрел лог обмена с роутером. Для чего он нужен непонятно, но все нормально работает и с ним и без него. На всякий случай: NET SERVER ACK ENABLE/DISABLE ; - управление этим пустым ACK.
HTTP реализован тоже очень упрощенно - понимает только команду GET. Если запрашиваемый файл существует, то формируется пакет "HTTP/1.0 200 OK Content-Type: text/html; charset=windows-1251" и прикрепляется содержимое файла. При запросе "/" будет отправлен файл INDEX.
Запрос /MCU передает всю последующую строку на обработку интерпретатору. Вся процедура обработки происходит по аналогии с UDP запросом. Единственное что пришлось научиться - понимать закодированные символы в формате %ХХ.
Создал файлик командой:
FILE NEW INDEX "<BR>HELLO !<BR>" ; , постучался браузером и страничка открылась, но выявились 2 проблемы.
Файловая система рассчитывалась на создание небольших макросов и набрать его таким способом вполне нормально, но набирать так HTML страничку 5-6 Кб не вариант. Вторая проблема частично связана с первой - это побайтная запись в EEPROM с временем записи одного байта 10мс (максимальная скорость 100 байт в секунду). Пришлось перепилить драйверы EEPROM под страничный режим. Теперь данные пишутся/читаются блоками по 32 байта что дает максимальную скорость записи ~3Кб/c, чего в принципе достаточно, учитывая обьем памяти в 64Кб.
Для заливки файлов запилил простой TFTP сервер, благо с UDP уже дело имел.
Сервер понимает PUT и GET запросы, но только в формате "octet".
Тест скорости записи и чтения.
Вложение:
tftp_TEST.png
tftp_TEST.png [ 45.37 Кб | Просмотров: 525 ]

Файловая система не понимает расширений файлов, но не запрещает использовать точку в имени.
Итак, для тестирования всего хозяйства пришлось немного поразбираться еще и в Javascript.
Написал страничку
Код:
<head>
<script type="text/javascript">

var ds1621_flag = 0 ;
var re = /(\$\{.*?\}|\w+)/g;

function init(){
   setInterval("getadc()", 2000);
   setInterval("gettemp()", 3000);
}

function getadc(){
   var x = new XMLHttpRequest();
   x.open("GET", "/MCU BAT VCC PWR ;", true);
   x.onload = function (){
      var found = x.responseText.match(re);
      document.getElementById("mcu_vcc").innerHTML = (found[0]*0.0049).toFixed(2)+" V";
      document.getElementById("bat_pwr").innerHTML = (found[1]*0.017).toFixed(2)+" V";
   }
   x.send(null);
}

function gettemp(){
   var x = new XMLHttpRequest();
   if(ds1621_flag==0){
      x.open("GET", "/MCU I2C SWWP $90 $EE ;", true);
      x.onload = function (){   
         var found = x.responseText.match(re);
         if(found[0]=='OK')
            {ds1621_flag=1;}
         else
            {document.getElementById("ds1621").innerHTML = "N/A";}
      }
   } else {
      ds1621_flag=0;
      x.open("GET", "/MCU I2C SWWSWRP $90 $AA $91 ;", true);
      x.onload = function (){
         var found = x.responseText.match(re);
         document.getElementById("ds1621").innerHTML = found[0]+" C";
      }
   }
   x.send(null);
}

</script>

<style type="text/css">
   .power {color: #fff;background: #000; font-weight: bold; align: center}
   .text {color: #04f;}
</style>
</head>

<body onload="init()">
<b>Test ADC</b>
<table>
   <td width="100"><img src="bat.png"></td>
   <td width="100" class="text">Battery : </td>
   <td width="100" id="bat_pwr" class="power" align="center">0</td>
</table>
<table>
   <td width="100"><img src="mcu.png"></td>
   <td width="100" class="text">MCU power : </td>
   <td width="100" id="mcu_vcc" class="power" align="center">0</td>
</table>
<table>
   <td width="100"><img src="temp.png"></td>
   <td width="100" class="text">DS1621 : </td>
   <td width="100" id="ds1621" class="power" align="center">N/A</td>
</table>
</body>

В пэинте нарисовал 3 картинки, залил через tftp, все заработало в Firefox, но скорость получилась не слишком высокая. Я посылаю один 512 байтный TCP пакет, затем жду ACK подтверждения. Перехватчик пакетов показывает что ACK приходит через 0.2с, что дает скорость 5 пакетов в сек. или 2.5Кб/с. Firefox работает нормально, а вот IE очень сильно тупит. Оказалось что все браузеры пытаются вытянуть файлы картинок создавая новые TCP соединения. Естественно получают в тык битом RST, так как сокет у меня всего один. Лисичка не отчаивается и сразу предпринимает новые попытки, а вот ослик входит в ступор на 1-2 секунды.
Вложение:
HTM_ADC.png
HTM_ADC.png [ 31.49 Кб | Просмотров: 525 ]

Так выглядит страничка в Firefox.
Запросы интерпретатору отправляются javascript через XMLHttpRequest. К датчику температуры DS1621 обращаюсь напрямую, через запросы к I2C шине. Первый цикл шлем "/MCU I2C SWWP $90 $EE ;" - запрос на измерение. Второй цикл "/MCU I2C SWWSWRP $90 $AA $91 ;" - чтение результатов измерения.
Код:
var re = /(\$\{.*?\}|\w+)/g;
var found = x.responseText.match(re);

Функция найдена на просторах интернета позволяет очень легко читать ответы контроллера, нарезая строку на слова.
Сейчас прошивка занимает 80% FLASH памяти мк, получается что вся серверная часть занимает 4-5Кб.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Универсальный контроллер
СообщениеДобавлено: 26 ноя 2017, 10:02 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 875
Откуда: Китай, Пекин
спасибо за проект,только что его обнаружил.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB