Официальный сайт компании Arduino по адресу arduino.cc
Робот управляемый с любого ИК пульта
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Робот собирается за 10 минут и состоит из следующих деталей
Схема робота простейшая и имеет всего 4 компонента
2-Драйвер двигателя (Motor Shield)
4-Любой динамик или звуковой капсуль с сопротивлением не менее 16ом
После сборки приступаем к программированию робота
Для этого сначала кладем библиотеку CyberLib и Remote в папку /libraries/ и заливаем в скетчь
#include <IRremote.h> #include <CyberLib.h> #include <avr/wdt.h> #define robot_pins D4_Out; D5_Out; D6_Out; D7_Out #define robot_go D4_Low; D5_High; D6_High; D7_Low #define robot_back D4_High; D5_Low; D6_Low; D7_High #define robot_left D4_Low; D5_High; D6_Low; D7_Low #define robot_right D4_Low; D5_Low; D6_High; D7_Low; #define robot_stop D4_Low; D5_Low; D6_Low; D7_Low IRrecv irrecv(8); //вход для ик приемника decode_results results; unsigned long ir_go, ir_back, ir_left, ir_right, ir_stop, ir_tmp; void setup() { robot_pins; //управление мотрами D11_Out; //пищалкка D15_In; //вход кнопки D15_High; //включить подтяжку robot_stop; irrecv.enableIRIn(); // включить приемник irrecv.blink13(true); // включить мигание светодиода при приеме ProgPush() ; //программирование кнопок ir_go=ReadEEPROM_Long(0);//прочитать команду из EEPROM ir_back=ReadEEPROM_Long(1);//прочитать команду из EEPROM ir_left=ReadEEPROM_Long(2);//прочитать команду из EEPROM ir_right=ReadEEPROM_Long(3);//прочитать команду из EEPROM ir_stop=ReadEEPROM_Long(4);//прочитать команду из EEPROM beep(50,100); beep(50,1000); beep(50,500); beep(50,300); beep(50,500); beep(50,600); beep(50,200); beep(50,170); beep(50,900); beep(50,1000); wdt_enable (WDTO_8S); //Сторожевая собака 8сек. } void loop() { Start if (irrecv.decode(&results)) //если был сигнал с пульта { ir_tmp=results.value; if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед { robot_go; beep(100,300); } else if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад { robot_back; beep(100,400); } else if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад { robot_right; beep(100,450); } else if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад { robot_left; beep(100,500); } else if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп { robot_stop; beep(10,300); beep(10,400); beep(10,300); } irrecv.resume(); //очистить входящий буфер } wdt_reset(); //покормить собаку, что бы она не сбежала End } ////////////////////////////////////////////////////////////////////////////////////////////// void SavePush(uint8_t addr) //сохранить нажатие кнопки { delay_ms(400); //задержка для крректной работы for(uint32_t i=0; i<2000000; i++)//ждем нажатия кнопки пульта { if (irrecv.decode(&results)) //если был сигнал с пульта { // то сохраняем результат в EEPROM WriteEEPROM_Long(addr, results.value); break; //прервать цикл } wdt_reset(); //покормить собаку } delay_ms(100); irrecv.resume(); //очистить входящий буфер } void beep(byte dur, word frq) { dur=(1000/frq)*dur; //расчет длительности бипа for(byte i=0; i<dur; i++) { D11_High; delay_us(frq); D11_Low; delay_us(frq); } } ////////////////////////////////////////////////////////////////////////////////////////////////// void ProgPush() { if(D15_Read==0)//если кнопка нажата { beep(30,800); beep(30,900); beep(30,1000); SavePush(0); //сохранить первое кодовое значение пульта beep(50,800); SavePush(1); //сохранить второе кодовое значение пульта beep(50,900); SavePush(2); //сохранить третье кодовое значение пульта beep(50,850); SavePush(3); //сохранить четвертое кодовое значение пульта beep(50,950); SavePush(4); //сохранить пятое кодовое значение пульта beep(30,1000); beep(30,900); beep(30,800); } }
Теперь остается привязать кнопки Вашего пульта к командам робота
Для этого потребуется установить перемычку на пин (A1) и GND Arduino и нажать кнопку сброса,
после сброса прозвучит сигнал готовности.
Вы заранее должны выбрать на пульте удобные для управления роботом кнопки. Теперь после сигнала готовности, последовательно нажимайте выбранные Вами кнопки
Порядок назначения кнопок будет такой:
1-вперед
2-назад
3-влево
4-вправо
5-стоп
После того как контроллер сохранит в памяти все нажатые Вами кнопки, не забудие удалить перемычку с A0
И можете управлять своим роботом
В следующей статье опишу как использовать оптические энкодеры на этом роботе, управление по Bluetooth и подключение к нему видеокамеры
Для кого то готовое решение для игрушки и знакомства с ардуиной. И это ХОРОШО!
Например для меня.
Я люблю программировать, но не люблю пилить и сверлить. Руки у меня не из того места растут :)
Даже не представляю как можно сделать в домашних условиях диск энкодера?
Если бы не готовая платформа, я бы еще 5 лет готовился бы совершить этот подвиг и наврятли бы совершил :)
А с готовой платформой можно практически сразу приступать к программированию робота
Я наоборот люблю мастерить, а вот программировать..., ну незнаю, мне это интересно как все новое, но я непонимаю как что то абстрактное перевести в реальный мир. Наверное поэтому мне туго дается эта наука.
Всё нормально, но вот такие конструкции
лучше писать так:
чтобы не нарваться на проблемы, которые возникнут при написании конструкции типа:
а потом искать проблему.
Хотя еще и по этой причине всегда пишу:
Спасибо.
Я написал код на скорую руку за 1 час и не успел оптимизировать его.
Сейчас смотрю на него и кое что подправил бы. Например сохранение кодов кнопок можно выполнить в цикле for, но вот только нет возможности отредактировать сообщение в шапке темы
А вы его ниже выложите, таким новичкам как я будет очень полезно смотреть и сравнивать различные подходы к реализации решений.
приветствую участников форума. у меня возникла вот такая проблемка в место нано я иполльзую уно на ней нет вывода SPK .По этому я немагу подключить денамик и обучить пульт. Можно как то сделать свето диод для этой цели .Ещё прозьба поподробней описать порядок абучения пульта зарание спосибо запомощ
ура разобрался нодо было внимательней скетч просматреть. Проблемка только в помехах от движков команды срабатывают через рас , пробовал атключать движки вместо них ставил свето диоды , срабатывает прекрасно. Вопрос как избавиться от помех?
У меня нет проблем с помехами, работает стабильно. Если что можно питание ИК приемника отфильтровать с помощью резистора 100ом и конденсаторами керамика 0,1мкф и электролит 10мкф
Можно так же поставить конденсаторы 0,1 мкф на моторы, по 4шт на каждый
первый вариант скандёрами памог спасибо
Перепрограммировал робота для работы с оптическими энкодерами и детектором препядствий
На видео видно что робот едет синхронизируя вращение колес
Компоненты и Инструкция по сборки робота
Посмотреть Видео
Код
Запрограммировал ИК пульт вашей программой (сообщение №7), но при нажатии клавиш пульта выдаются случайные команды. В чем загвоздка?
Для начала программирования розеток, нажимаем на заранее прописанную в скетче кнопку пульта, ИЛИ нажимаем физический кнопку на Arduino, запускается режим программирования, последовательным нажатием на кнопки пульта мы программируем 8 розеток. Arduino Запоминает эти кнопки пульта. Далее мы можем управлять розетками, тем пультом котором мы программировали.
Добрый день.
Я новичок, по этому сильно не пинайте. Для начала фотография (чтобы понимание было)
Ардуино UNO и моторшилд. В программу добавил библиотеку AFMotor. ИК-приёмник переподключил на пин А0, бипер - на пин D10, т.к. сервы не используются и этот контакт не занят. Кнопка ИК программирования осталась на А1.
Теперь программа:
То есть программа не изменилась, лишь изменились переменные для библиотеки AFMotor.
А теперь такая проблема. На мотор шилде две L293D. Одна управляет М1 и М2, вторая М3 и М4. Чтобы микросхемы меньше грелись, я решил раскидать моторы на М2 и М3. Но при таком раскладе работает только М3. Если в программе прописать:
AF_DCMotor motorA(3) AF_DCMotor motorB(4)
ну и соответсвенно переподключить моторы на эти контакты - то всё прекрасно работает. Если запрограммировать М1 и М2 - то не работает (при соответсвующем подключении).
Сначала подумал, что может быть не исправна L293D которая управляет М1 и М2, но при таком коде работают все моторы:
Вопрос снимается, ответ нашёл здесь на форуме (конфликт библиотек)
[quote=carduino.ru]
два вопроса новичка!
1. подходит ли код на ардуино уно
2. в каой пин на уно подключить спикер?
по спикеру не актуально, по коду д11
но робот не пашет, хотя запускал тестовый код с монитором порта, ик датчик работает, сама платформа ездила на этих же портах с датчико расстояния, замыкаю а1 сброс, спикер пишит один раз, если разомкнуть то мелодия, тоесть в режим програмирования входит, куды капать?
судя по коду при нажатии кнопки пульта, должен гореть светодиод, но он не горит, хотя тестовой прогой прогонял, команды идут.
два вопроса новичка!
1. подходит ли код на ардуино уно
2. в каой пин на уно подключить спикер?
1-Подойдет
2-на D11, но желательно через транзистор
судя по коду при нажатии кнопки пульта, должен гореть светодиод, но он не горит, хотя тестовой прогой прогонял, команды идут.
убери из кода строки
wdt_enable (WDTO_8S);
и
wdt_reset();
Возможно что у тебя прошивка не поддерживает работу с WDT
Добрый день!
Требуется помощь форумчан. Собрал робота на ардуино уно _ мотор шилд Motor Shield V1 для Arduino. + плата расширения. Все это бутербродом собрано. На моторшилд напаял гнезда для проводов как и на ардуино уно и все собрал одним бутербродам.
Код
Ничем особо не отличается, но один мотор не крутится AF_DCMotor motorC(3);. В чем может быть проблема? Где моя ошибка?
Добрый день или ночи
возможноли добавить в скеч чтобы при включении пин3 и пи4 мигали а 5 пин срабатывал на удержание
плиз очень надо!
#include <IRremote.h> // это скачанная библиотека
048
049
int
RECV_PIN = 11;
//вход ИК приемника
050
051
IRrecv irrecv(RECV_PIN);
052
053
decode_results results;
054
055
056
unsigned
long
Value100 = 0xEE008FC0;
// переменная для хранения кода кнопки пульта
057
058
//Этот блог дает возможность физический прописывать коды кнопок своего пульта
059
// (как альтернатива программирования на лету с пульта)
060
// ВАЖНО !!! (1000809) это код кнопки - моего пульта - у вашего пульта будет другой код - замените на свой
061
062
unsigned
long
Value2 = 0x1000809;
063
unsigned
long
Value3 = 0x1008889;
064
unsigned
long
Value4 = 0x1004849;
065
unsigned
long
Value5 = 0x100C8C9;
066
unsigned
long
Value6 = 0x1002829;
067
unsigned
long
Value7 = 0x100A8A9;
068
unsigned
long
Value8 = 0x1006869;
069
unsigned
long
Value9 = 0x100E8E9;
070
unsigned
long
Value10 = 0x1001819;
071
unsigned
long
Value0 = 0x1009899;
072
073
074
unsigned
long
Value11 = 0x180C041;
075
unsigned
long
Value12 = 0x180A021;
076
unsigned
long
Value13 = 0x1801091;
077
unsigned
long
Value14 = 0x1809011;
078
unsigned
long
Value15 = 0x1000E0F;
079
unsigned
long
Value16 = 0x1008E8F;
080
unsigned
long
Value17 = 0x1004E4F;
081
unsigned
long
Value18 = 0x100CECF;
082
083
084
085
086
//можно подать положительный сигнал на пин 14 (A0) для начала программирования
087
//(как альтернатива начала программирования на лету с пульта)//unsigned long Value100 = 0xEE008FD4;
088
089
int
butpin = 14;
090
091
092
//Даем имена пинам
093
int
pultpin2 = 2;
094
int
pultpin3 = 3;
095
int
pultpin4 = 4;
096
int
pultpin5 = 5;
097
int
pultpin6 = 6;
098
int
pultpin7 = 7;
099
int
pultpin8 = 8;
100
int
pultpin9 = 9;
101
//***
102
103
int
ledpin[] = {
104
2, 3, 4, 5, 6, 7, 8, 9};
// номера задействованных пинов, количество можно уменьшить или увеличить (по желанию)
105
int
ledstate[] = {
106
0, 0, 0, 0, 0, 0, 0, 0};
//количество задействованных пинов, количество можно уменьшить или увеличить (по желанию)
107
int
butrec = 0;
108
long
prevcode[] = {
109
1, 1, 1, 1, 1, 1, 1, 1};
//количество задействованных пинов, количество можно уменьшить или увеличить (по желанию)
110
long
prevM = 0;
111
long
prevM1 = 0;
112
long
timeEx = 0;
113
boolean expr =
true
;
114
115
void
setup
()
116
117
118
{
119
for
(
int
i=0; i <= 8; i++){
// цифру 8 и все восьмёрки ниже заменяем на цифру задействованных пинов (по желанию)
120
pinMode(ledpin[i],OUTPUT);
121
}
122
for
(
int
i=0; i <= 8; i++){
123
}
124
pinMode(butpin, INPUT);
125
digitalWrite(butpin, LOW);
126
127
128
129
pinMode(2, OUTPUT);
130
pinMode(3, OUTPUT);
131
pinMode(4, OUTPUT);
132
pinMode(5, OUTPUT);
133
pinMode(6, OUTPUT);
134
pinMode(7, OUTPUT);
135
pinMode(8, OUTPUT);
136
pinMode(9, OUTPUT);
137
138
139
{
140
Serial
.begin(9600);
141
irrecv.enableIRIn();
// Start the receiver. включить приемник
142
}
143
}
144
145
void
loop
()
146
147
148
{
149
if
(irrecv.decode(&results)) {
150
Serial
.println(results.value, HEX);
151
irrecv.resume();
// Receive the next value
152
}
153
154
155
{
156
if
(irrecv.decode(&results)) {
157
Serial
.println(results.value, HEX);
158
}
159
}
160
161
162
{
163
if
(results.value == Value100)digitalWrite(butpin, HIGH);
164
digitalWrite(butpin, LOW);
// кнопкой от пульта запускаем режим программируемые на лету
165
166
167
168
169
170
//Управляем с заранее записанных кодов кнопок своего пульта
171
//unsigned long Value2 = 0xF7283C77;
172
173
174
if
(results.value == Value2)digitalWrite(pultpin2, HIGH);
175
if
(results.value == Value3)digitalWrite(pultpin3, HIGH);
176
if
(results.value == Value4)digitalWrite(pultpin4, HIGH);
177
if
(results.value == Value5)digitalWrite(pultpin5, HIGH);
178
if
(results.value == Value6)digitalWrite(pultpin6, HIGH);
179
if
(results.value == Value7)digitalWrite(pultpin7, HIGH);
180
if
(results.value == Value8)digitalWrite(pultpin8, HIGH);
181
if
(results.value == Value9)digitalWrite(pultpin9, HIGH);
182
183
184
if
(results.value == Value10)digitalWrite(pultpin2, LOW);
185
if
(results.value == Value0)digitalWrite(pultpin3, LOW);
186
if
(results.value == Value11)digitalWrite(pultpin4, LOW);
187
if
(results.value == Value12)digitalWrite(pultpin5, LOW);
188
if
(results.value == Value13)digitalWrite(pultpin6, LOW);
189
if
(results.value == Value14)digitalWrite(pultpin7, LOW);
190
if
(results.value == Value15)digitalWrite(pultpin8, LOW);
191
if
(results.value == Value16)digitalWrite(pultpin9, LOW);
192
193
194
//вКлючаем все
195
if
(results.value == Value17)digitalWrite(pultpin9, HIGH)
196
,digitalWrite(pultpin2, HIGH),digitalWrite(pultpin3, HIGH)
197
,digitalWrite(pultpin4, HIGH),digitalWrite(pultpin5, HIGH)
198
,digitalWrite(pultpin6, HIGH),digitalWrite(pultpin7, HIGH)
199
,digitalWrite(pultpin8, HIGH),digitalWrite(pultpin9, HIGH);
200
201
//вЫключаем все
202
if
(results.value == Value18)digitalWrite(pultpin9, LOW)
203
,digitalWrite(pultpin2, LOW),digitalWrite(pultpin3, LOW)
204
,digitalWrite(pultpin4, LOW),digitalWrite(pultpin5, LOW)
205
,digitalWrite(pultpin6, LOW),digitalWrite(pultpin7, LOW)
206
,digitalWrite(pultpin8, LOW),digitalWrite(pultpin9, LOW);
207
208
209
210
211
212
213
214
{
215
if
(irrecv.decode(&results)){
216
delay(150);
217
for
(
int
i=0; i<8; i++)
218
if
(results.value == prevcode[i]){
219
ledstate[i] = !ledstate[i];
220
digitalWrite(ledpin[i], ledstate[i]);
221
}
222
223
}
224
butrec = digitalRead(butpin);
225
if
(butrec == HIGH){
226
for
(
int
i=0; i<8; i++){
227
ledstate[i] = 0;
228
digitalWrite(ledpin[i], ledstate[i]);
229
}
230
timeEx = millis() - prevM1;
231
for
(
int
i=0; i<8; i++){
232
expr =
true
;
233
timeEx = 0;
234
prevM1 = millis();
235
// < 5000)время ожидания сигнала с пульта, для перехода к следующему пину (в момент программирования)
236
while
(expr ==
true
&& timeEx < 5000){
237
timeEx = millis() - prevM1;
238
if
(millis() - prevM > 250){
239
prevM = millis();
240
int
ledstate1 = !ledstate1;
241
digitalWrite(ledpin[i], ledstate1);
242
}
243
if
(irrecv.decode(&results)) {
244
delay(150);
245
prevcode[i] = results.value;
246
irrecv.resume();
247
expr = !expr;
248
prevM1 = millis();
249
250
}
251
}
252
253
digitalWrite(ledpin[i], LOW);
254
255
}
256
}
257
}
258
}
259
}
Здарова!парни подскажите как правильно подать тему чтобы умы сего форума помогли я новичёк и с ардуино
и написанием скеча несправляюсь!нужна помощ в написании скеча плиз!
задача вкл выкл 8и светодиодов
пин2 вкл выкл с пульта одной кнопка1 код кнопки/ FD00FF
пин3вкл мигание выкл с пульта кнопка 2/ FD807F
пин4вкл мигание выкл с пульта кнопка 3/FD40BF
пин5вкл при удержании выкл 4/ FD20DF
пин6вкл при удержании выкл 5/ FDA05F
пин7вкл выкл с кнопки6/ FD609F
пин8вкл выкл с кнопки7/ FD10EF
пин9вкл выкл с кнопки8/ FDB04F