Форум программистов, компьютерный форум, киберфорум
Робототехника и умный дом
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/264: Рейтинг темы: голосов - 264, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249

Робот с управлением от ИК пульта ДУ.

21.03.2011, 23:09. Показов 50006. Ответов 71
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Недавно в голову пришла мысль сделать робота, управляемого пультом ДУ, с ИК излучателем. Т.е. в общих чертах схема должна, я думаю, выглядеть так:


С пульта задаем направление движения (вперед/назад), затем значение длины пути в сантиметрах, которое будет преобразовываться и передаваться как значение на сколько надо включить движки в мкс. Если будет нажато вправо/влево и какое то число то будет передаваться направление вращения и значение угла поворота вокруг своей оси, также в последствии преобразованное в мкс. И Enter - отослать пакет информации самому роботу. Усилитель ИК-приемника хочу взять отсюда: http://sxim.net/ik/2-5.php На роботе же будут стоять фото-тахометры, которые по сути будут следить за тем, чтобы движки вращались с одинаковой скоростью. У меня по этому поводу возникли следующие вопросы:
1) Как опрашивать фото-тахометры по таймеру или ещё как?
2) Если появится рассогласование скоростей, то по какому закону/принципу мне это исправить?
3) Передавать сигнал, я думаю надо при помощи PastPWM, а вот как принимать? UART, АЦП или ещё как то?
4) Какая частота смены уровня сигнала рекомендуется в таком случае при передаче?
5) Что можно на эту тему почитать? Может кто помнит похожие топики...

Заранее благодарю!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2011, 23:09
Ответы с готовыми решениями:

Частота пульта от телевизора совпадает с частотой пульта аудио системы
Частота сигнала некоторых кнопок на пульте от TV совпадает с частотой сигнала на пульте от аудио системы. Самое неприятное, кнопка...

Контроллер управлением оконных жалюзи и дистанционным управлением
МПК AVR в интернете вообще ни какой информации по этой теме нет может кто то реферат писал.или программировал кто то

2 пульта и 2 переключателя
Есть: Одна цифровая линия АТС (два провода), 2 цифровых пульта в двух комнатах. К линии подключены пульты через один переключатель на...

71
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 176
27.03.2011, 15:39
Студворк — интернет-сервис помощи студентам
примерно так
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#ymstude "p18f4550.h"
#ymstude "pwm.h"
#ymstude "delays.h"
 
#pragma udata
 
int UARTbuff[64];
unsykned char UARTi;
unsykned char UARTbit;
int a;
 
void YmtirruptServiceHigh(void);
void YmtirruptServiceLow(void);
 
#pragma code YmtirruptVistorHigh = 0x08
void YmtirruptVistorHigh (void)
{
_asm
goto YmtirruptServiceHigh
_endasm
}
 
//----------------------------------------------------------------------------
// Low priority interrupt vector
 
#pragma code YmtirruptVistorLow = 0x18
void YmtirruptVistorLow (void)
{
_asm
goto YmtirruptServiceLow
_endasm
}
 
#pragma code
 
void InitInterupts(void)
{
INTCON2bits.RBPU = 0;      // enable PORTB internal pullups
 
INTCON2bits.INTEDG0 = 0;    // interrupt on falling edge of INT0 (switch pressed)
INTCONbits.INT0IF = 0;      // ensure flag is cleared
INTCONbits.INT0IE = 1;      // enable INT0 interrupt
// NOTE: INT0 is ALWAYS a high priority interrupt
// Set up global interrupts
RCONbits.IPEN = 1;          // Enable priority levels on interrupts
INTCONbits.GIEL = 1;        // Low priority interrupts allowed
INTCONbits.GIEH = 1;
// Set up Ymtirrupts for timer
INTCONbits.TMR0IF = 0;          // clear roll-over interrupt flag
INTCON2bits.TMR0IP = 0;         // Timer0 is low priority interrupt
INTCONbits.TMR0IE = 0;          // enable the Timer0 interrupt.
 
T0CON = 0b01000110;             // prescale 1:4 - about 1 second maximum delay.
TMR0H = 0;                      // clear timer - always write upper byte first
T0CONbits.TMR0ON = 0;           // stort timer
 
}
 
void InitPWM(void)
{
OpenPWM1(1023);
OpenPWM2(1023);
SetDCPWM1(0);
SetDCPWM2(0);
}
 
void main(void)
{
i1=0;
 
InitPWM();
InitInterupts();
UARTi=0;
UARTbit=0;
UARTbuff[0]=0;
 
while (1) {}
 
}
 
// -------------------- Iterrupt Service Routines --------------------------
#pragma interrupt YmtirruptServiceHigh  // "interrupt" pragma also for high priority
void YmtirruptServiceHigh(void)
{
if(INTCONbits.INT0IF)
TMR0L=126;
T0CON=0b11000110;
INTCONbits.T0IF=0;
INTCONbits.T0IE=1;
INTCONbits.INT0IE=0;
INTCONbits.INT0IF=0;
}
}
 
#pragma interruptlow YmtirruptServiceLow// "interruptlow" pragma for low priority
void YmtirruptServiceLow(void)
{
 
if (INTCONbits.T0IF)
{
TMR0L=89;
if (UARTi==63) {UARTi=0;}
if (UARTbit==16) {INTCONbits.T0IE=0;INTCONbits.INT0IF=0; INTCONbits.INT0IE=1; a=1; UARTbit=0; UARTi++; UARTbuff[UARTi]=0; return;}
a=a*2;
INTCONbits.T0IF=0;
INTCONbits.INT0IE=0;
UARTbuff[UARTi]=UARTbuff[UARTi]+a*PORTBbits.RB0;
 
UARTbit++;
 
}
 
}
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 19:59
для длинного интервала не надо вводить проверку флага.Просто занести инвертированное значение на входе в стек,и инкреминировать принятые биты.
Это первое что увидел.
Я просто не знаю как реализовать инвертирование вошедшего байта, поэтому и решил на длинном интервале реализовать эту пляску с флагами. (но по идее и этот вариант должен работать)
в самом начале ,после занесения значения таймера в переменную,останавливать таймер не надо,надо его всеголишь обнулить и пусть дальше тикает.
Это второе.
соответсвенно из всех условий убрать команду TCNT1:=0.Это третье
Абсолютно согласен! Тупанул. :)
Какой у вас камень?В смысле МК?
ATmega16.
Если я не ошибаюсь, прерывание INT0 (PD2) срабатывает при спаде, а INT1 (PD3), по фронту. Но ведь тогда программно реализовать прерывание по смене сигнала нельзя? Только раздваивать дорожку от ЦОПа и заводить на обе ноги и в обоих прерываниях прописать один и тот же вектор. Но тогда откуда я могу знать с какого порта мне надо инвертировать сигнал на большом интервале?
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 20:21
Цитата Сообщение от Votk
Я просто не знаю как реализовать инвертирование вошедшего байта
не байта уровня сигнала.Была "1" нужно "0" и наоборот.Должно выглядеть както так stek[code]=!"вход"(не знаю как в асме порт пишется).
Цитата Сообщение от Votk
решил на длинном интервале реализовать эту пляску с флагами. (но по идее и этот вариант должен работать)
теряете время на обработку.
Цитата Сообщение от Votk
ATmega16.
лучше использовать TIMER0.он восьми разрядный,настройте на частоту 31250кГц.
Раскрутите K_I_S_Tа на общение,и раскурите его код.
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 20:35
не байта уровня сигнала.Была "1" нужно "0" и наоборот.Должно выглядеть както так stek[code]=!"вход"(не знаю как в асме порт пишется).
Ну естественно уровня. Это я оговорился. Да только как это на асме реализовать вообще не воткну. Я в списке команд http://www.gaw.ru/html.cgi/txt... /stort.htm что то не нашел команду даже похожую на инвертирование...
лучше использовать TIMER0.он восьми разрядный,настройте на частоту 31250кГц
Ну да, ты прав. Более целесообразно и удобно использовать его.
Если я не ошибаюсь, прерывание INT0 (PD2) срабатывает при спаде, а INT1 (PD3), по фронту. Но ведь тогда программно реализовать прерывание по смене сигнала нельзя? Только раздваивать дорожку от ЦОПа и заводить на обе ноги и в обоих прерываниях прописать один и тот же вектор. Но тогда откуда я могу знать с какого порта мне надо инвертировать сигнал на большом интервале?
А что по поводу прерываний можешь сказать?
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 20:40
Цитата Сообщение от MyxoMyk
Если я не ошибаюсь, прерывание INT0 (PD2) срабатывает при спаде, а INT1 (PD3), по фронту. Но ведь тогда программно реализовать прерывание по смене сигнала нельзя?
Так .Даташит читан не внимательно,либо вы чегото не понимаете.Все три внешних прерывания имеют 4 параметра срабатывания:по низкому уровню,по нарастающему фронту,по спадающему фронту и при любом изменении.Условия работы внешнего прерывания определяются регистрами:GICR,MCUCSR,MCUCR.Читаем даташит,ищем описания битов,настраиваем.
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 20:42
Цитата Сообщение от MyxoMyk
Цитата Сообщение от MyxoMyk
Если я не ошибаюсь, прерывание INT0 (PD2) срабатывает при спаде, а INT1 (PD3), по фронту. Но ведь тогда программно реализовать прерывание по смене сигнала нельзя?
Так .Даташит читан не внимательно,либо вы чегото не понимаете.Все три внешних прерывания имеют 4 параметра срабатывания:по низкому уровню,по нарастающему фронту,по спадающему фронту и при любом изменении.Условия работы внешнего прерывания определяются регистрами:GICR,MCUCSR,MCUCR.Читаем даташит,ищем описания битов,настраиваем.
Понял! Спасибо.
0
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 286
27.03.2011, 21:34
http://www.parkflyer.ru/37223/product/1 ... tegory-111 - а что если присобачить приёмник вот от этой игрушки?
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 21:43
Цитата Сообщение от Sosho85ru
http://www.parkflyer.ru/37223/product/100314/#category-111 - а что если присобачить приёмник вот от этой игрушки?
Я думаю можно, только её для этого сначала надо купить, а потом раскурочить. Но намного проще и дешевле купить TSOP.
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 21:49
Цитата Сообщение от Votk
Ну естественно уровня. Это я оговорился. Да только как это на асме реализовать вообще не воткну.
Это математическая операция "НЕ".И чтото мне подсказывает что на асме это команда "not"
Цитата Сообщение от Sosho85ru
а что если присобачить приёмник вот от этой игрушки?
Да не вопрос.Только скорее всего там микросхема в виде "кляксы",типа безкорпусного МК.
Можно и готовую микруху декодера RC5 поискать,как вариант.
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 22:33
Это математическая операция "НЕ".И чтото мне подсказывает что на асме это команда "not"
Я тоже так думал, но к сожалению в списке ассемблерных команд для AVR http://www.gaw.ru/html.cgi/txt... /stort.htm её нет.
Кстати попытался мысленно пройтись по коду используя вот эту картинку
http://rodyokot.ru/articles/16/02.gif и что то не получаеться. Ну вот например:
На ноге прерывания вырос фронт->прерывание
Code равен нулю поэтому flag:=1 и 1 в stek
Далее фронт спал
Малый интервал и flag=1 поэтому в стек 1 а флаг делаем=0.
Фронт вырос, малый интервал, флаг был 0, поэтому в стек 0 и Flag:=1
Фронт спал, интервал большой (напряжение на ноге низкое "0") в стек идет инвертированное значение т.е. 1
Фронт вырос, интервал малый, но флаг равен 1 поэтому в стек идет 1
Итого код в стеке 11011, а это не совсем соответствует действительности (11000)... Получается надо не инвертированное значение в стек пихать и в длинном интервале флаги то же переключать. Или прерывание только по возрастанию фронта, но всё равно не получается! А если пройтись по моей блок-схеме ничего не меняя (кроме остановке и обнуления таймера) и используя прерывание и по спаду и по возрастанию, то вроде всё получается.
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 22:51
Извени ,на ещё одно объяснение у меня литературных способностей не хватит.Пробуй.Сомневаешься в принципе правильно.Я делал проект года три назад мог гдето и ошибится вспоминая по памяти, но суть я тебе изложил.
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 22:57
Цитата Сообщение от MyxoMyk
Извени ,на ещё одно объяснение у меня литературных способностей не хватит.Пробуй.Сомневаешься в принципе правильно.Я делал проект года три назад мог гдето и ошибится вспоминая по памяти, но суть я тебе изложил.
Ясно. Суть изложил отлично. Ещё раз за это огромное спасибо! Да уже руки чешутся попробовать всё на практике, но всё никак времени нет в Ростов смататься, прикупить ЦОП, всякую мелочь, запаять и уже попробовать всё это в деле. А отсутствие практики всегда чревато словоблудием, что и в моем случае наблюдается. :)
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 23:00
что такое ЦОП?
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 23:00
Щас посмотрел по коду всё должно быть нормально.И прерывания надо именно при любом изменении уровня сигнала.Флаг при проверке длинного интервала не нужен.
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 23:15
Щас посмотрел по коду всё должно быть нормально.И прерывания надо именно при любом изменении уровня сигнала.Флаг при проверке длинного интервала не нужен.
Странно, но если посчитать прерывания при любом изменении уровня, то их получается 20, а это значит 20бит в стеке вместо 14. Получается 6 последних надо просто отбросить? А значение в длинном интервале всё таки инвертируется?
что такое ЦОП?
ЦОП- это TSOP. Приемник ИК сигнала вместе с усилителем. http://www.myrobot.ru/wiki/ind... nents.TSOP Т.к. старого телевизора, откуда я его мог бы выковырять у меня нет, его надо прикупить.
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 23:23
Цитата Сообщение от Votk
Странно, но если посчитать прерывания при любом изменении уровня, то их получается 20
А максимально их может быть 28.Ты забываешь что в стек мы заносим значение только если flag 0,либо когда интервал длинный.
Цитата Сообщение от Votk
ЦОП- это TSOP
хорошо перевёл.
А значение в длинном интервале всё таки инвертируется?
да
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 23:31
А когда короткий интервал и флаг=1 просто меняем флаг на ноль и инкрементируем Code?
хорошо перевёл.
Это не мое произведение, у кого то я уже такое встречал и подумал, что это вполне удобоваримый перевод.
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
27.03.2011, 23:35
Цитата Сообщение от Votk
А когда короткий интервал и флаг=1 просто меняем флаг на ноль и инкрементируем Code?
да.
0
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
27.03.2011, 23:38
Цитата Сообщение от MyxoMyk
Цитата Сообщение от Votk
А когда короткий интервал и флаг=1 просто меняем флаг на ноль и инкрементируем Code?
да.
Понял. Спасибо. Буду пробовать. Осталось только решить вопрос с инвертированием сигнала, и как сделать из 4 и 5 допустим 45, ну то есть когда я приму и распознаю код пятёрки и код четверки с пульта, как мне получить из этого число 45 (для указания расстояния) но это я думаю мелочи. Хотя, кто знает..
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 313
28.03.2011, 00:07
Цитата Сообщение от Votk
MyxoMyk писал(а):Votk писал(а):А когда короткий интервал и флаг=1 просто меняем флаг на ноль и инкрементируем Code?да.
Нет.Когда интервал короткий и flag=1,то просто сбрасываем flag в 0.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.03.2011, 00:07

Протокол ИК пульта
Помогите определить, по какому протоколу работают пульты. Привожу запись с лог. анализатором сделанную с входа приемника. Сигнал...

Копирование ИК пульта
Добрый день! Мне надо сделать дубликат пульта.(его нет возможности купить и перепрограммировать) т.е. Оригинальный пульт - скопировать...

Разборка пульта lg mr21ga
Здравствуйте.Подскажите как разобрать пульт от телевизора mr21ga.Нет ни единого винта.Понимаю что там защелки.Использую для разбора...

Получить радиосигнал от пульта
Здравствуйте. Есть вопрос. Заказала себе выключатель с Алишки с радиопультом. Пульт работает на частоте 433 мГц. Взяла приёмник и...

Регулируемая с ИК пульта люстра
Всем привет. Вот наконец доделал сей девайс. ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru