0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
|
|
1 | |
Универсальный контроллер28.06.2013, 13:39. Показов 66776. Ответов 47
Метки нет (Все метки)
Хочу представить свой "универсальный контроллер" (не хватило фантазии обозвать по-другому). Динный проект образовался спонтанно и развивался в течении нескольких месяцев, так-что получился достаточно объемным. Описать его полностью я не смогу, так-как некоторый функции подзабылись :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
|
28.06.2013, 13:39 | |
Ответы с готовыми решениями:
47
Универсальный адаптер универсальный Arduino Универсальный фильтр Универсальный таймер Универсальный AmbiLight |
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
|
|
28.06.2013, 20:21 | 21 |
На фото беспроводной вариант контроллера :) 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
А для циклического выполнения команд (например, чтение термометра раз в минуту) необходини команда цикла.
0
|
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
|
|
10.08.2013, 18:04 | 28 |
Сообщение от OtyxPM
А для циклического выполнения команд (например, чтение термометра раз в минуту) необходини команда цикла. Можно и подождать полсекунды, да я быстрее и не смогу вбить букавки ) А вообще ожидать должна управляющая программка, через которую и следует наблюдать температуру. Кому он будет слать температуру в цикле ? Контроллер ведомый а не ведущий. Вот если попросят его он пришлет.
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 Команда 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
Сообщение от Sphymx55
Сообщение от Sphymx55
И экономия на кварце для таймера2 - это тоже что-то :-) Кварц подключается даже без конденсаторов, стОит три рубля, и с ним можно себе позволить не Stomdby, а даже суперэкономный Power-save.
0
|
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 36
|
|
24.02.2014, 17:41 | 35 |
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 | |
17.03.2014, 18:07 | |
Помогаю со студенческими работами здесь
40
Универсальный программатор Универсальный терминал на AVR Универсальный JTAG отладчик Универсальный USB JTAG Универсальный блок питания. Универсальный промышленный программатор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |