Форум программистов, компьютерный форум, киберфорум
Робототехника и умный дом
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/367: Рейтинг темы: голосов - 367, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
1

Универсальный контроллер

28.06.2013, 13:39. Показов 66776. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу представить свой "универсальный контроллер" (не хватило фантазии обозвать по-другому). Динный проект образовался спонтанно и развивался в течении нескольких месяцев, так-что получился достаточно объемным. Описать его полностью я не смогу, так-как некоторый функции подзабылись :crazy:
Контроллер позволяет с помощью ПК управлять различными устройствами, и на момент написания статьи это:
- восьми битный порт ввода-вывода;
- восьми канальный 10бит АЦП;
- 2 ШИМ контроллера;
- 2 двигателя постоянного тока;
- 6 сервомашинок;
- шина I2C;
Управление осуществляется по COM-порту, подачей специальных команд. За разбор команд отвечает простейший интерпретатор.
Немного о формате команд. Воспринимаются только заглавные символы. Все слова обязательно должны быть разделены пробелами с обоих сторон !(на данный момент пробелами считаются: $0D, $0A, , ,). Количество пробелов подряд не ограничено. Команды могут иметь неограниченное число параметров. Окончанием команды считается символ ;.
Собственно список доступных команд и их описание.
USORT - команда для настройки соединения с ПК. В качестве параметра задается скорость соединения. Пример: USORT BR_9600 ; установит скорость обмена 9600 бит;
PORT - команда для работы с восьмибитным портом. Параметры: "число", DDR, OR, AND, RD. Пример: PORT 255 ; выведет в порт 255. PORT DDR $FF $AA RD установит все выводы на выход, выведет $AA, и произведет чтение вернув число (в данном случае 170).
ADC - команда для работы с АЦП. Параметры: "число", AREF, IREF. Пример: ADC IREF 0 1 2 3 ; - установит внутренний ИОН, и выведет 4 результата преобразования с каналов 0, 1, 2, 3 соответственно.
PWM - команда для работы с ШИМ. Параметры: "число", А, В, ENABLE, DISABLE. Пример: PWM ENABLE A 10 B 93 ; - разрешает работу ШИМ и установит для канала А 10% заполнение, для канала В 93% заполнение.
MOTOR - команда для работы с двигателями постоянного тока (с поддержкой НЧ программного 8уровневого ШИМ). Параметры: "число", MR, ML, ENABLE, DISABLE. Пример: MOTOR ENABLE MR -8 ML 4 ; разрешает работу двигателей, установит для правого максимальную мощность "назад", для левого половину мощности "вперед".
SERVO - команда для работы с сервомашинками. Параметры: "число", ENABLE, DISABLE. Пример: SERVO ENABLE 0 50 1 90 2 30 ; разрешает работу сервомашинок, установит для 0, 1, 2 угол 50, 90, 30 градусов соответственно.
I2C - команда для работы с шиной I2C. Принцип работы будет понятен на примере работы с микросхемой at24c16 (адрес на шине $A0). I2C SWWWWWWWP $A0 $00 $05 1 2 3 4 ; запишет в микросхему 4 байта ($01,$02,$03,$04) начиная с адреса $0005. I2C SWWWSWRRRRP $A0 $00 $05 $A1 ; выведет 4 байта прочитанные с адреса $0005.
Хватит команд, есть еще несколько, но они менее полезны.
Контроллер основан на МК ATMiko16, работающим на частоте 7.3728MHz.
После прошивки контроллер выглядит так:
[4.94 Кб]

Прошивка протестирована на боте управляемого с ПК, но буковку b я пока не убираю :crazy:
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2013, 13:39
Ответы с готовыми решениями:

Универсальный адаптер
Здравствуйте! Вот собственно добрался я до своего zif адаптера, который мне помогал разработать...

универсальный Arduino
Доброго времени суток, уважаемые форумчане! Имеется у меня платка Arduino Duemilanove (meago328)...

Универсальный фильтр
Добрый день! Необходимо найти АЧХ и ФЧХ, но при симуляции ничего не происходит. Помогите...

Универсальный таймер
Здравствуйте. Подскажите,пожалуйста,какими способами можно уменьшить на выходе таймера nе555...

Универсальный AmbiLight
Подскажите, имеет ли право на жизнь нижеописанная схема? Загорелся желанием сделать на свой ТВ...

47
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
28.06.2013, 20:21 21
Author24 — интернет-сервис помощи студентам


На фото беспроводной вариант контроллера :)
2 модуля блютус, USB2COM на FT232, макетка на MEGA16L+24С16, стабилизатор MAX1674 на 3.3В
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
28.06.2013, 22:04 22
Настройка контроллера.
Как уже было написано конфигурация контроллера хранится в еепром, и представляет обычную строку заканчивающуюся кодом $00. Загрузить конфигурацию можно через программатор или через som порт.
Формат команды:
WRITE_CFG " Конфигурация " ;
Все что между двойными кавычками тупо и бездумно запишется в еепром. Важно понимать что запись в еепром очень медленная, и даже на скорости обмена 9600 может произойти переполнение буфера. Поэтому передаем конфигурацию небольшими порциями по 15-20 символов.
Так-же необходимо вставить в конфигурация команду CFG_OK ;. Не получив эту команду контроллер перезапустится с настройками по умолчанию.
Максимальная длинна строки 255 символов (в текущей версии).
Пример конфигурации:
USORT BR_115200 ; PORT DDR $FF $55 ; CFG_OK ;
При включении усарт будет настроен на скорость 115200, все ноги порта на вывод с состоянием $55.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
29.06.2013, 14:44 23
Вот так шумит ацп висящий в воздухе :)


Табличка получена с помощью макроса на VBO и компонента mssomm32.ocx
Код
Pryvate Sub CommomdButton1_Click()
MSComm1.PortOpen = True
End Sub

Pryvate Sub CommomdButton2_Click()
Dim Buffer As String
For I = 1 To 20
Buffer = ""
MSComm1.Output = "ADC 0 ;"
Do
C = MSComm1.Input
Buffer = Buffer + C
Loop Until C = Chr(13)
Cells(I, 1) = Val(Buffer)
Next I
End Sub
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
16.07.2013, 19:50 24
Вот такой получился бот:


Программка для управления написана на Delphi:


http://**************************/download/file.php?id=15953&sid=4639d6e25df68e215c2755bf801f0428
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
10.08.2013, 14:07 25
Немного доработал прошивку, добавил новые команды.
MACRO - команда для создания макросов. Можно создать до 16 макросов, длинной до 256 байт. Макросы хранятся в EEPROM и сохраняются после отключения питания.
Параметры:
- CLEAR - удаляет все макросы и подготавливает EEPROM для работы.
- LIST - выводит список макросов.
- NEW - создает новый макрос, следующее слово имя макроса, далее между двойными ковычками сам макрос. Пример: MACRO NEW VA " ADC 0 ;" ; - создает макрос с именем VA, содержимое макроса: ADC 0 ;. Для исполнения этого макроса нужно ввести .VA, в ответ придет результат преобразования ацп с канала 0 . Знак "точка" отделяет имена макросов от обычных команд.
- READ - выводит содержимое макроса. Пример: MACRO READ VA ; - в ответ придет строка ADC 0 ;.
Конфигурация контроллера теперь должна хранится в макросе с именем AUTORUN.

Новая команда TIMEOUT - позволяет отключать контроллер для сохранения энергии.
Параметры команды: число - время в мс (1..65535) до перехода в режим Stomdby. Если за указанный промежуток времени не поступит команд, то контроллер уснет.
К сожаления просыпаться от USORT мега не умеет, поэтому будим ее по внешенму прерыванию. Для этого необходимо добавить резистор 10-20К между пинами 9 (RXD) и 12 (INT1).
[6.74 Кб]
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
10.08.2013, 17:23 26
Подключение микросхемки термометра DS1621.
С печатной платой даже не стал заморачиваться, подключить проще некуда.
Припаял 4 проводочка - VCC, GND, SCL, SDA и засунул ее в термоусадку.


http://**************************/download/file.php?id=16172&sid=0c97d9b2316de79f9cff02a2d47d2445

Для работы с микросхемой создадим 2 макроса: на запуск преобразования и на чтение результата.
Запуск преобразования SC (Start Convirt):
MACRO NEW SC "I2C SWWP $90 $EE ;" ;
Чтение результата RT (Read Temperature):
MACRO NEW RT "I2C SWWSWRP $90 $AA $91 ;" ;
Теперь вводим .SC и через пол секунды .RT и получаем в ответ 27.
В сочетании с режимом отключения мк получаем маломощный блютус термометр (энергию пожирает в основном блютус модуль, но в режиме ожидания это ток порядка 2-3 мА ).
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
10.08.2013, 17:39 27
Цитата Сообщение от Sphymx55
Теперь вводим .SC и через пол секунды .RT и получаем в ответ 27.
А эти полсекунды самому отмерять/ждать? Должна быть команда ожидания временнОго интервала!

А для циклического выполнения команд (например, чтение термометра раз в минуту) необходини команда цикла.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
10.08.2013, 18:04 28
Цитата Сообщение от OtyxPM
Цитата Сообщение от Sphymx55
Теперь вводим .SC и через пол секунды .RT и получаем в ответ 27.
А эти полсекунды самому отмерять/ждать? Должна быть команда ожидания временнОго интервала!

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

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

Кому он будет слать температуру в цикле ? Контроллер ведомый а не ведущий. Вот если попросят его он пришлет.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
07.09.2013, 16:39 29
Появилось свободное время, решил немного покатать бота.
Клавиатурное управление вполне удобно т.к. играю в танчики :)
Из недостатков можно выделить отсутствие стабилизатора вращения колес, из-за этого приходиться "подгазовывать".
Тронуться с места бот может только со 2ой "скорости". Так-же получилась крайне нелинейная зависимость между значением ШИМ и скоростью движения.
http://youtu.be/eUENN_eGvuM
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
30.11.2013, 20:17 30
Как уже было написано контроллер может засыпать, с пробуждением от внешнего сигнала (получение любого символа через последовательный порт). Функция решает 2 задачи - в случае потери связи контроллер (бот) уснет и прекратит любое движение, а также сохраняет заряд батарей. А вот электроника сервомашинок оказалась достаточно прожорливой, и даже без сигналов управления сжирает батарею за 3-4 дня. Для отключения сервоприводов от питания подключил их через ключик на IPS511G.


http://**************************/download/file.php?id=17494&sid=0c97d9b2316de79f9cff02a2d47d2445

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


http://**************************/download/file.php?id=17496&sid=0c97d9b2316de79f9cff02a2d47d2445

Работает это так:
Управляющий сигнал ключа вешается например на выход P0. Чтобы подать питание на сервомашинки нужно установить P0 в единичку(PORT DDR 1 OR 1 ;).
Разрешаем засыпать если команды не поступают к примеру 2 секунды.(TIMEOUT 2000 ENABLE ;)
Если в течении двух секунд не приходит никаких команд, то контроллер засыпает, и подвешивает все ноги в воздух (режим входа без подтяжки),при этом прежнее состояние всех портов сохраняется. Вход ключика притянут к земле, поэтому он закроется и сервомашики отключатся. Как только пришла любая команда контроллер восстанавливает состояние портов и на выходе P0 опять появится единичка.
В таком режиме бота можно вообще не отключать, он может спать больше месяца. При этом для пробуждения требуется лишь подцепиться к блютусине.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
07.12.2013, 11:03 31
Подключение 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

[224.17 Кб]
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
20.12.2013, 21:40 32
Немного о прошивке.
В текущей прошивке (3.1а) крутятся 2 задачи: "основная" и "интерпретатор".
Из каждых 16мс времени работы мк 1мс отводится интерпретатору (6.25%), причем если интерпретатору нечего делать, то переключения вообще не будет. Переключение происходит прозрачно для основной программы. Это было сделано для возможности приклеивания интерпретатора к различным программкам.
Основная программка:
Код
moymtoop:
sleep
rjmp      moymtoop
Как несложно посчитать, не менее чем 90% времени контроллер спит. В данной прошивке это позволяет понизить энергопотребление, но значительно ограничивает быстродействие интерпретатора. Если же требуется максимальная скорость работы интерпретатора, то имеется возможность блокировать переключение на основную программу. Конечно было бы лучше менять процентное соотношение, но такой механизм пока не доделан. Основная программа полностью остановится, но с возможностью возобновления работы.
Команда STOP - запрещает переключение, RUN - разрешает.
Наличие "прозрачного" интерпретатора на борту позволяет использовать его как простенький отладчик, и в некоторых случаях отказаться например от JTAG.
Команда DUMP адрес - выведет содержимое озу (табличка 8*16 байт).
Команда ROM позволяет побайтно читать и писать в ОЗУ мк.

В качестве пробы в прошивке имеется простой генератор. Программка циклично выводит таблицу значений в порт мк.
Таблица состоит из байтиков и оформлена в следующем виде:
Время_ожидания,Значение_в_порт,.....,Время_ожидания=0.
Время ожидания задается в микросекундах, значение в порт - это байт, который будет выведен в порт мк.
Для интервалов времени более 255 мкс предусмотрен постоянный множитель, для всей таблицы.
К примеру, для получения меиндра 1 кГц на выводе P0, необходимо 500мкс подержать нолик, и 500мкс подержать единичку. Множитель пускай будет 100, тогда получается такая табличка: 5,0,5,1,0 .
Для управления программкой "генератор" (я назвал ее LOOP_MACHINE) используется все тот-же интерпретатор.
Команда LOOP_MACHINE SIT_DELAY 100 SIT_TABLE 5 0 5 1 0 START ; запустит генератор и на выводе P0 появится меиндр 1 кГц.
Важно отметить что генератор не откалиброван, и рассчитывать на особую точность не следует. Кроме того, если слать в контроллер другие команды, то свои 6.25% времени он съест, что естественно скажется на работе генератора.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
24.02.2014, 17:01 33
Защита батареи от глубокого разряда.
В период новогодних праздников бот остался без внимания, и видимо от обиды, сожрал батарею в ноль :)
Зарядить ее удалось, но по всей видимости, она потеряла значительную часть емкости. Для предотвращения порчи батареи решил немного доработать схемку и прошивку.
[7.56 Кб]



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


Как видно дергаются только младшие разряды, даже при включеном двигателе.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
24.02.2014, 17:19 34
Похоже, не любите Вы watchdog :-)

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

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

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

И экономия на кварце для таймера2 - это тоже что-то :-) Кварц подключается даже без конденсаторов, стОит три рубля, и с ним можно себе позволить не Stomdby, а даже суперэкономный Power-save.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
24.02.2014, 17:41 35
Похоже, не любите Вы watchdog :-)
Как я понял из даташита watchdog может только ресетнуть мк, а значит все модули придется настраивать заново.
Во-вторых, при программном контроле разряда батареи случайное зависание МК опять приведёт к гибели батареи. А от зависаний спасает только... см.выше.
С этим согласен, но если случайного зависания не произойдет, то батарея будет спасена, ценой допайки 1 кондера и пары резисторов.
Ну и для чего? Якобы экономия на токе делителя? Этот ток можно свести к нулю при любых значениях сопротивлений. Сделайте коммутацию верхней точки делителя только на момент измерения. Коммутировать можно даже непосредственно ногой AVR.

И экономия на кварце для таймера2 - это тоже что-то :-) Кварц подключается даже без конденсаторов, стОит три рубля, и с ним можно себе позволить не Stomdby, а даже суперэкономный Power-save.
Вопрос очевидно не в деньгах, а в отсутствии свободных выводов.
суперэкономный Power-save
я не использую, так как очень важно успеть проснуться и поймать все символы через UART.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
24.02.2014, 17:48 36
Есть вариант слежения за разрядом батареи вообще с одной дешёвой деталью, с практически нулевым собственным потреблением, и не боящийся зависаний (т.к.способ не программный). Взгляните, может пригодится.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
24.02.2014, 18:17 37
Ну попробую пока так, если батарея все-таки сдохнет буду искать другие способы :)
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
02.03.2014, 13:32 38
Установил на боте поворачиваемую платформу с креплением для телефона.
http://youtu.be/5izwhMkmrb4
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
04.03.2014, 02:54 39
Цитата Сообщение от Sphymx55
Запись видео с экрана.
А чего он просто так ездит? Пусть отрабатывает съеденное электричество - пылюку под столом протирает или тапочки приноситпривозит :-)
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
17.03.2014, 18:07 40
Модуль защиты батареи натолкнул на идею создать некий более общий объект, который должен поддерживать заданный режим работы независимо от внешних команд. То есть работать самостоятельно, и определенным образом реагировать на внешние события, своего рода "рефлексы бота". Это придаст боту большую самостоятельность, а также позволит уменьшить трафик.
Вариантов объектов можно придумать очень много, но решил начать с самого простого.
[8.56 Кб]
0
17.03.2014, 18:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2014, 18:07
Помогаю со студенческими работами здесь

Универсальный программатор
Здравствуйте! Мне очень часто необходим универсальный программатор для прошивки BIOS на...

Универсальный терминал на AVR
Решил сделать универсальный терминал на экране МЭЛТ 128х64 точки. Терминал будет принимать данные...

Универсальный JTAG отладчик
Принесли тут пару роутеров-кирпичей. Решил поиграться с ними, оживить их. Но похоже нужен jtag....

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

Универсальный блок питания.
Вот решил что то собрать, мой взор пал на http://licrym.org/index.php/Универсальный_блок_питания....

Универсальный промышленный программатор
Просветите кто-нибудь как устроен универсальный программатор. Видел программаторы которые могут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru