Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 10.08.2018
Сообщений: 14
1

Дистанционное управление роботом. Ардуино. Эвольвектор

03.04.2019, 09:18. Просмотров 729. Ответов 3
Метки нет (Все метки)


Добрый день! Нужна помощь... Пишем программу для управлением роботом с помощью пульта с инфракрасным приёмником. На выходе несколько предупреждений, программа не работает. Набор Эвольвектор (уровень №2, Часть3, работа 30), плата DaVinci...
Первая программа 30_1 по распознаванию кодов с пульта отлична работает, а вот 30_2 увы... не работает...

Код:

C++ (Qt)
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
#define M11 5
#define M12 6
#define M21 9
#define M22 10
#include "IRremote.h"
IRrecv irrecv(11); // Указываем пин, к которому подключен приемник
decode_results results;
int res;
float time; 
void setup()
{Serial.begin(9600); 
pinMode(M11, OUTPUT);
pinMode(M12, OUTPUT);
pinMode(M21, OUTPUT);
pinMode(M22, OUTPUT);
irrecv.enableIRIn(); // Запускаем прием
}
 
void loop() {
 if (irrecv.decode(&results)) // Если данные пришли 
  {
  res=results.value;
  time = millis();
   switch (res) {
        
     case 0x629D:// Если нажата кнопка 
      goPered(255);
     break;
     
     case 0xFFFFA857:// Если нажата кнопка 
      goNazad(255);
     break;
     
     case 0x22DD:// Если нажата кнопка 
      goLevo(255);
     break;
     
     case 0xFFFFC23D:// Если нажата кнопка 
      goPravo(255);
     break;
    }
  
     irrecv.resume(); // Принимаем следующую команду
}
else { 
if (millis()-time > 200){
goStop();
}}}
 
int goPered(int Skorost){analogWrite(M12,LOW);
    analogWrite(M21,LOW);
    analogWrite(M11,Skorost);
    analogWrite(M22,Skorost);}
int goNazad(int Skorost){analogWrite(M11,LOW);
    analogWrite(M22,LOW); 
      analogWrite(M12,Skorost);
    analogWrite(M21,Skorost);}
int goLevo(int Skorost){analogWrite(M12,LOW);
   analogWrite(M22,LOW); 
    analogWrite(M11,Skorost);
    analogWrite(M21,Skorost);}
int goPravo(int Skorost){analogWrite(M11,LOW);
    analogWrite(M21,LOW); 
    analogWrite(M12,Skorost);
   analogWrite(M22,Skorost);}
void goStop(){digitalWrite(M12,LOW);
    digitalWrite(M21,LOW);
    digitalWrite(M11,LOW);
    digitalWrite(M22,LOW);}
выходят следующие предупреждения:

D:\Ардуино\Примеры и библиотеки\00. Evolvector\YPOK_30_2\YPOK_30_2.ino: In function 'void loop()':

D:\Ардуино\Примеры и библиотеки\00. Evolvector\YPOK_30_2\YPOK_30_2.ino:30:11: warning: overflow in implicit constant conversion [-Woverflow]

D:\Ардуино\Примеры и библиотеки\00. Evolvector\YPOK_30_2\YPOK_30_2.ino:38:11: warning: overflow in implicit constant conversion [-Woverflow]

Несколько библиотек найдено для "IRremote.h"
Используется: C:\Users\Дмитрий\Documents\Arduino\libraries\IRremote
Не используется: C:\Users\Дмитрий\Desktop\ардуино\Программа Arduino IDE\Для Windows\arduino-IDE\libraries\IRremote

Скетч использует 12 728 байт (44%) памяти устройства. Всего доступно 28 672 байт.
Глобальные переменные используют 381 байт (14%) динамической памяти, оставляя 2 179 байт для локальных переменных. Максимум: 2 560 байт.

Скетч заливается на плату, но управление с пульта не работает (во вложении pdf с уроком)
0
Вложения
Тип файла: pdf Урок_30.pdf (236.8 Кб, 7 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2019, 09:18
Ответы с готовыми решениями:

Дистанционное управление с ноутбука и передача глобальных координат с gps на ноутбук в режиме реального времени
Здравствуйте, очень хочу собрать ру модель танка. Интересует вопрос управления им с ноутбука и...

Управление AD5754 Ардуино
Имеется данная библиотека: https://www.laserlance.com/projects/arduino-dac-library-and-shield/ ...

Alexmos контроллер управление с ардуино
Всем привет. Такой вопрос. Пробовал ли кто-нибудь использовать ардуино мега 2560 для управления...

Дистанционное управление питанием роутера
Хочу себе на роутер присобачить ДУ. Пока {включение, выключение, рестарт} по питанию. Что лучше...

__________________
Помогаю в написании студенческих работ здесь.
3
344 / 280 / 142
Регистрация: 08.04.2013
Сообщений: 1,211
04.04.2019, 23:08 2
Код вроде рабочий, так что посмотрите в мониторе порта код, который вам пульт отправляет
Кликните здесь для просмотра всего текста
C++
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <IRremote.h>
int RECV_PIN = 11;
int BUTTON_PIN = 12;
int STATUS_PIN = 13;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(BUTTON_PIN, INPUT);
pinMode(STATUS_PIN, OUTPUT);
}
// Storage for the recorded code
int codeType = -1; // The type of code
unsigned long codeValue; // The code value if not raw
unsigned int rawCodes[RAWBUF]; // The durations if raw
int codeLen; // The length of the code
int toggle = 0; // The RC5/6 toggle state
// Stores the code for later playback
// Most of this code is just logging
void storeCode(decode_results *results) {
codeType = results->decode_type;
int count = results->rawlen;
if (codeType == UNKNOWN) {
Serial.println("Received unknown code, saving as raw");
codeLen = results->rawlen - 1;
// To store raw codes:
// Drop first value (gap)
// Convert from ticks to microseconds
// Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
for (int i = 1; i <= codeLen; i++) {
if (i % 2) {
// Mark
rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
Serial.print(" m");
}
else {
// Space
rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
Serial.print(" s");
}
Serial.print(rawCodes[i - 1], DEC);
}
Serial.println("");
}
else {
if (codeType == NEC) {
Serial.print("Received NEC: ");
if (results->value == REPEAT) {
// Don't record a NEC repeat value as that's useless.
Serial.println("repeat; ignoring.");
return;
}
}
else if (codeType == SONY) {
Serial.print("Received SONY: ");
}
else if (codeType == RC5) {
Serial.print("Received RC5: ");
}
else if (codeType == RC6) {
Serial.print("Received RC6: ");
}
else {
Serial.print("Unexpected codeType ");
Serial.print(codeType, DEC);
Serial.println("");
}
Serial.println(results->value, HEX);
codeValue = results->value;
codeLen = results->bits;
}
}
void sendCode(int repeat) {
if (codeType == NEC) {
if (repeat) {
irsend.sendNEC(REPEAT, codeLen);
Serial.println("Sent NEC repeat");
}
else {
irsend.sendNEC(codeValue, codeLen);
Serial.print("Sent NEC ");
Serial.println(codeValue, HEX);
}
}
else if (codeType == SONY) {
irsend.sendSony(codeValue, codeLen);
Serial.print("Sent Sony ");
Serial.println(codeValue, HEX);
}
else if (codeType == RC5 || codeType == RC6) {
if (!repeat) {
// Flip the toggle bit for a new button press
toggle = 1 - toggle;
}
// Put the toggle bit into the code to send
codeValue = codeValue & ~(1 << (codeLen - 1));
codeValue = codeValue | (toggle << (codeLen - 1));
if (codeType == RC5) {
Serial.print("Sent RC5 ");
Serial.println(codeValue, HEX);
irsend.sendRC5(codeValue, codeLen);
}
else {
irsend.sendRC6(codeValue, codeLen);
Serial.print("Sent RC6 ");
Serial.println(codeValue, HEX);
}
}
else if (codeType == UNKNOWN /* i.e. raw */) {
// Assume 38 KHz
irsend.sendRaw(rawCodes, codeLen, 38);
Serial.println("Sent raw");
}
}
int lastButtonState;
void loop() {
// If button pressed, send the code.
int buttonState = digitalRead(BUTTON_PIN);
if (lastButtonState == HIGH && buttonState == LOW) {
Serial.println("Released");
irrecv.enableIRIn(); // Re-enable receiver
}
if (buttonState) {
Serial.println("Pressed, sending");
digitalWrite(STATUS_PIN, HIGH);
sendCode(lastButtonState == buttonState);
digitalWrite(STATUS_PIN, LOW);
delay(50); // Wait a bit between retransmissions
}
else if (irrecv.decode(&results)) {
digitalWrite(STATUS_PIN, HIGH);
storeCode(&results);
irrecv.resume(); // resume receiver
digitalWrite(STATUS_PIN, LOW);
}
lastButtonState = buttonState;
}


Добавлено через 2 минуты
можно использовать любой рабочий пульт, от телика тоже пойдет
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,177
05.04.2019, 10:47 3
Предупреждения вы получаете потому, что тип int в avr двухбайтный, а не четырехбайтный, как в x86.
А константа 0xFFFFC23D, с которой сравнивается переменная res четырехбайтная.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,392
Записей в блоге: 29
05.04.2019, 12:13 4
Цитата Сообщение от dimazz33 Посмотреть сообщение
Пишем программу для управлением роботом с помощью пульта с инфракрасным приёмником.
Какая то изначально глупая идея. Стоило сразу смотреть в сторону Вluetooth, Wi-Fi и радио.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2019, 12:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Нечеткое управление роботом на базе AVR
Добрый день уважаемым электронщикам. Сразу скажу, что являюсь практически чистым программистом:...

Автомат освещения день-ночь+дистанционное управление
Добрый день ! Собрал простую схему управления уличным фонарем 250W на Tiny2313 с функциями:...

Компьютер управляет роботом - Ардуино, шина, LPT, другое?
Всем привет! Друзья, если не сложно, просветите по такому вопросу - каким образом управлять...

Дистанционное управление
ремонтирую оборудования. иногда мне просто нужно изменить настройки. так как это оборудование,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.