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

Есть скетч, но не могу понять , где ошибка. Машина ехать не хочет

14.06.2018, 05:04. Показов 3186. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При всём при этом крутится только два колеса, машина не едет, а сервопривод с ультрасоником болтаются в конвульсиях. Что не так?!
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <Servo.h>
Servo myservo;
int enableA = 5;
int IN1 = 4;
int IN2 = 3;
 
int servposnum = 0;
int servpos = 0;
 
int enableB = 6;
int IN4 = 7;
int IN3 = 2;
#define PIN_TRIG 12
#define PIN_ECHO 11
 
 
void setup() {
  // put your setup code here, to run once:
  //configure pin modes for the drive motors
   pinMode (enableA, OUTPUT);
   pinMode (IN1, OUTPUT);
   pinMode (IN2, OUTPUT);
 
   pinMode (enableB, OUTPUT);
   pinMode (IN4, OUTPUT);
   pinMode (IN3, OUTPUT); 
 
   //configure pin modes for the ultrasonci se3nsor
   pinMode(PIN_TRIG, OUTPUT);
   pinMode(PIN_ECHO, INPUT);
 
   //Servo pins
   myservo.attach(10);
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
     car();
     avoid();
     
}
 
//Defining functions so it's more easy
//motor functions
void motorAforward() {
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
}
void motorBforward() {
 digitalWrite (IN4, LOW);
 digitalWrite (IN3, HIGH);
}
void motorAbackward() {
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
}
void motorBbackward() {
 digitalWrite (IN4, HIGH);
 digitalWrite (IN3, LOW);
}
void motorAstop() {
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, HIGH);
}
void motorBstop() {
 digitalWrite (IN4, HIGH);
 digitalWrite (IN3, HIGH);
}
void motorAcoast() {
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, LOW);
}
void motorBcoast() {
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, LOW);
}
void motorAon() {
 digitalWrite (enableA, HIGH);
}
void motorBon() {
 digitalWrite (enableB, HIGH);
}
void motorAoff() {
 digitalWrite (enableA, LOW);
}
void motorBoff() {
 digitalWrite (enableB, LOW);
}
// Movement functions
void forward (int duration) {
 motorAforward();
 motorBforward();
 delay (duration);
}
void backward (int duration) {
 motorAbackward();
 motorBbackward();
 delay (duration);
}
void right (int duration) {
 motorAbackward();
 motorBforward();
 delay (duration);
}
void left (int duration) {
 motorAforward();
 motorBbackward();
 delay (duration);
}
void coast (int duration) {
 motorAcoast();
 motorBcoast();
 delay (duration);
}
void breakRobot (int duration) {
 motorAstop();
 motorBstop();
 delay (duration);
}
void disableMotors() {
 motorAoff();
 motorBoff();
}
void enableMotors() {
 motorAon();
 motorBon();
}
 
int distance() {
  int duration, distance;
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(1000);
  digitalWrite(PIN_TRIG, LOW);
  duration = pulseIn(PIN_ECHO, HIGH);
  distance = (duration/2) / 29.1;
  return distance;
}
 
 
void car() {
int distance_0;
distance_0 = distance();
  while(distance_0 > 15)
  {
     
     if(servposnum == 0)
     {
      myservo.writeMicroseconds (1900);
      servposnum = 1;
      delay(500);     
     }
     else if(servposnum == 1)
     {
      myservo.writeMicroseconds (2200);
      servposnum = 2;
     delay(500);
     }
     else if(servposnum  == 2)
     {
      myservo.writeMicroseconds (1900);
      servposnum = 3;
      delay(500);
     }
     else if(servposnum == 3)
     {
      myservo.writeMicroseconds (1600);
      servposnum = 1;
      delay(100);
     }
     motorAon();
     motorBon();
     forward(1);    
     distance_0 = distance();
     
 
  }
  breakRobot(0);
 
}
void avoid()
{
    backward(500);
    right(360);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2018, 05:04
Ответы с готовыми решениями:

Есть ошибка не не могу понять где она и как исправить
Здравствуйте мне дали дали задание для создание программы которая будет как каталог . То есть...

Странная ошибка не могу понять что она хочет)
#include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Двусвязные списки. Программа написана, но есть ошибки - не могу понять где!!!
вот задача: Программа содержит информацию про авиа билеты, каждая заявка содержит: - пункт...

Не могу понять где ошибка
Вот код программы: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { ...

15
2 / 2 / 0
Регистрация: 06.05.2018
Сообщений: 18
14.06.2018, 06:04  [ТС] 2
Вот так нарисовать получилось. Прошу понять и простить - мой первый опыт
Миниатюры
Есть скетч, но не могу понять , где ошибка. Машина ехать не хочет  
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
16.06.2018, 07:50 3
Это для начала, с остальными функциями надо разбираться, предположим вы остановились, скорость 0, вам надо ехать, без изменения скорости вы не поедете, хотя вызовете функцию вперед
C++
1
2
3
4
5
6
void motorAon() {
 digitalWrite (enableA, HIGH);
}
void motorBon() {
 digitalWrite (enableB, HIGH);
}
Код ошибочный, вы задаете скорость равный 1, а у него диапозон до 255
Нормальная скорость где то 150
C++
1
2
3
4
5
6
void motorAon() {
 digitalWrite (enableA, 150);
}
void motorBon() {
 digitalWrite (enableB, 150);
}
для остановки и low сайдет, это же 0

Добавлено через 5 минут
5 и 6 пины это ШИМ и поэтому выставляем значения от 0 до 255

Добавлено через 12 часов 25 минут
C++
1
2
3
4
5
6
7
int distance() { int duration, distance;
 digitalWrite(PIN_TRIG, HIGH);
 delayMicroseconds(1000);
 digitalWrite(PIN_TRIG, LOW);
 duration = pulseIn(PIN_ECHO, HIGH);
 distance = (duration/2) / 29.1;
 return distance; }
Посмотрите ваш код, лучше ниже,
без лишних переменных и не 1000 микросекунд задержки
C++
1
2
3
4
5
6
7
8
int distance()  {
    digitalWrite(PIN_TRIG, LOW); 
    delayMicroseconds(2); 
    digitalWrite(PIN_TRIG, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(PIN_TRIG, LOW); 
   return  (pulseIn(PIN_ECHO, HIGH)) / 58;
  }
C++
1
void car() { int distance_0; distance_0 = distance(); while(distance_0 > 15)
можно тоже кучу лишнего убрать
C++
1
[void car() { while(distance() > 15)
0
2 / 2 / 0
Регистрация: 06.05.2018
Сообщений: 18
17.06.2018, 03:03  [ТС] 4
Цитата Сообщение от marat_miaki Посмотреть сообщение
Это для начала, с остальными функциями надо разбираться, предположим вы остановились, скорость 0, вам надо ехать, без изменения скорости вы не поедете, хотя вызовете функцию вперед
C++
1
2
3
4
5
6
void motorAon() {
 digitalWrite (enableA, HIGH);
}
void motorBon() {
 digitalWrite (enableB, HIGH);
}
Код ошибочный, вы задаете скорость равный 1, а у него диапозон до 255
Нормальная скорость где то 150
C++
1
2
3
4
5
6
void motorAon() {
 digitalWrite (enableA, 150);
}
void motorBon() {
 digitalWrite (enableB, 150);
}
для остановки и low сайдет, это же 0

Добавлено через 5 минут
5 и 6 пины это ШИМ и поэтому выставляем значения от 0 до 255

Добавлено через 12 часов 25 минут
C++
1
2
3
4
5
6
7
int distance() { int duration, distance;
 digitalWrite(PIN_TRIG, HIGH);
 delayMicroseconds(1000);
 digitalWrite(PIN_TRIG, LOW);
 duration = pulseIn(PIN_ECHO, HIGH);
 distance = (duration/2) / 29.1;
 return distance; }
Посмотрите ваш код, лучше ниже,
без лишних переменных и не 1000 микросекунд задержки
C++
1
2
3
4
5
6
7
8
int distance()  {
    digitalWrite(PIN_TRIG, LOW); 
    delayMicroseconds(2); 
    digitalWrite(PIN_TRIG, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(PIN_TRIG, LOW); 
   return  (pulseIn(PIN_ECHO, HIGH)) / 58;
  }
C++
1
void car() { int distance_0; distance_0 = distance(); while(distance_0 > 15)
можно тоже кучу лишнего убрать
C++
1
[void car() { while(distance() > 15)
Сделал всё как вы и сказала, но зверёк не едет, а голова конвульсивно дёргается((
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
17.06.2018, 07:17 5
Цитата Сообщение от venom877 Посмотреть сообщение
При всём при этом крутится только два колеса
Это ваше сообщение, все таки колеса крутились или нет?
Протестируйте сперва драйвер на работоспособность, код для одной стороны, перепишете и проверите вторую,
посмотрим итог
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
int ENA = 5;
int IN1 = 4; // Input1 подключен к выводу 4 
int IN2 = 3;
int ENB = 6;
int IN4 = 7;
int IN3 = 2;
void setup()
{
 pinMode (ENA, OUTPUT); 
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
}
void loop()
{
  // На пару выводов "IN" поданы разноименные сигналы, мотор готов к вращению
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  // подаем на вывод ENB управляюший ШИМ сигнал 
  analogWrite(ENA,85);
  delay(2000);
  analogWrite(ENA,115);
  delay(2000);
  analogWrite(ENA,255);
  delay(2000);
  // Останавливаем мотор подаем на вывод ENB сигнал низкого уровня. 
  // Состояние выводов "IN" роли не играет.
  analogWrite(ENA,0);
  delay(5000);
}
0
2 / 2 / 0
Регистрация: 06.05.2018
Сообщений: 18
17.06.2018, 11:59  [ТС] 6
Цитата Сообщение от marat_miaki Посмотреть сообщение
Это ваше сообщение, все таки колеса крутились или нет?
Протестируйте сперва драйвер на работоспособность, код для одной стороны, перепишете и проверите вторую,
посмотрим итог
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
int ENA = 5;
int IN1 = 4; // Input1 подключен к выводу 4 
int IN2 = 3;
int ENB = 6;
int IN4 = 7;
int IN3 = 2;
void setup()
{
 pinMode (ENA, OUTPUT); 
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
}
void loop()
{
  // На пару выводов "IN" поданы разноименные сигналы, мотор готов к вращению
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  // подаем на вывод ENB управляюший ШИМ сигнал 
  analogWrite(ENA,85);
  delay(2000);
  analogWrite(ENA,115);
  delay(2000);
  analogWrite(ENA,255);
  delay(2000);
  // Останавливаем мотор подаем на вывод ENB сигнал низкого уровня. 
  // Состояние выводов "IN" роли не играет.
  analogWrite(ENA,0);
  delay(5000);
}
похоже что и самой uno проблема. Залил этот скетч. Итог: ничего не крутится кроме болтания сервопривода)

Добавлено через 2 минуты
Залил еще раз. Колеса не крутит. Сервопривод притих. Буду покупать новый драйвер(
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
17.06.2018, 12:10 7
venom877,не надо цитировать все сообщение
достаточно выделить нужный кусок и нажать на появившейся кнопочке "Цитата"
правила п 5.17
Запрещено избыточное цитирование. Цитируйте только необходимые части сообщений, на которые отвечаете.
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
17.06.2018, 12:15 8
Работает уно или нет можно на простых скетчах со светодиодами проверять, светодиоды простой способ увидеть работоспособность
0
2 / 2 / 0
Регистрация: 06.05.2018
Сообщений: 18
17.06.2018, 12:21  [ТС] 9
Заменил АА все 4 штуки на свеже заряженные. Крутит два колеса из 4 с паузой и в промежутке драйвер пищит.

Добавлено через 3 минуты
Цитата Сообщение от marat_miaki Посмотреть сообщение
Работает уно или нет можно на простых скетчах со светодиодами проверять, светодиоды простой способ увидеть работоспособность
надо еще вместо АА использовать 18650 видимо. Питания не хватает моторам. Ну или еще блок батарей прицепить.
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
17.06.2018, 20:32 10
Последний код он на два колеса , чтобы особо не переписывать меняйте 5,4,3 на 6, 7 , и 2 соответственно и проверяете вторую пару моторов или продублируйте для второй половинки

Добавлено через 3 минуты
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
int ENA = 5;
int IN1 = 4; // Input1 подключен к выводу 4 
int IN2 = 3;
int ENB = 6;
int IN4 = 7;
int IN3 = 2;
void setup()
{
 pinMode (ENA, OUTPUT); 
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
 pinMode (ENB, OUTPUT); 
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);
}
void loop()
{
  // На пару выводов "IN" поданы разноименные сигналы, мотор готов к вращению
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  // подаем на вывод ENB управляюший ШИМ сигнал 
  analogWrite(ENA,85);
analogWrite(ENB,85);
  delay(2000);
  analogWrite(ENA,115);
analogWrite(ENB,115);
  delay(2000);
  analogWrite(ENA,255);
analogWrite(ENB,255);
  delay(2000);
  // Останавливаем мотор подаем на вывод ENB сигнал низкого уровня. 
  // Состояние выводов "IN" роли не играет.
  analogWrite(ENA,0);
analogWrite(ENB,0);
  delay(5000);
}
0
2 / 2 / 0
Регистрация: 06.05.2018
Сообщений: 18
17.06.2018, 22:03  [ТС] 11
Эти колеса тоже крутятся. Но в любом случае драйвер почему-то пищит. Причем крутит, когда подниму. Видимо мощности батареек не хватает.
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
18.06.2018, 07:04 12
Драйвер он сам такой, еще и греется.
Лучше использовать аккомуляторные батареи на 3,7 2-3 шт.
https://ru.aliexpress.com/item... autifyAB=0
У меня в комплекте с машинкой был и зарядник к нему
Эти аккомуляторы есть в ноутбуках по 6-8 шт. Вполне работоспособные остаются даже, если на ноутбуке не работают
0
2 / 2 / 0
Регистрация: 06.05.2018
Сообщений: 18
18.06.2018, 07:38  [ТС] 13
Цитата Сообщение от marat_miaki Посмотреть сообщение
Драйвер он сам такой, еще и греется.
Лучше использовать аккомуляторные батареи на 3,7 2-3 шт.
https://ru.aliexpress.com/item... autifyAB=0
У меня в комплекте с машинкой был и зарядник к нему
Эти аккомуляторы есть в ноутбуках по 6-8 шт. Вполне работоспособные остаются даже, если на ноутбуке не работают
Но почему же тогда сервопривод дергается конвульсивно? С драйвером понятно, что ему питания не хватает, а с датчиком расстояния и серво что не так?
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
18.06.2018, 08:05 14
А вы их по отдельности тоже проверьте для начала. Мы пока только с драйвером разобрались, она рабочая.
В программе каждую функцию тоже надо проверить, и проверить потом в связке, в вашей программе функции слишком много, аж 24 шт. Мне бы хватило 7, вперед, направо, налево, назад, стоп, серво, дальномер
0
2 / 2 / 0
Регистрация: 06.05.2018
Сообщений: 18
18.06.2018, 08:27  [ТС] 15
Цитата Сообщение от marat_miaki Посмотреть сообщение
А вы их по отдельности тоже проверьте для начала. Мы пока только с драйвером разобрались, она рабочая.
В программе каждую функцию тоже надо проверить, и проверить потом в связке, в вашей программе функции слишком много, аж 24 шт. Мне бы хватило 7, вперед, направо, налево, назад, стоп, серво, дальномер
Для серво тоже писал отдельную программу, где он просто крутится вправо и влево на 180С. Как проверить датчик расстояния я не знаю. Поможете мне совсем этим разобраться? Я его купил сыну на день рождения и думал, что вместе разберемся, но тут даже я для него маловат) а сын на робототехнике до этого еще не дошел.

Добавлено через 3 минуты
в наборе еще есть bluetoth - он работает, потому что телефон его находил. Есть ИК-порт и какие-то спаренные датчики с двумя диодами на каждом - 4 шт, выходит по три контакта.
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
18.06.2018, 16:57 16
Код для проверки дальномера
С bluetoth и ИК не пользовался, пока такой необходимости не было, в комплекте есть датчики линии, очень нечувствительные, ( вроде 0,5 -1.5 см)есть получше до 3 см. Это машинка чтобы ваш ребенок что то сам учился делать, программировать , изучать как все по отдельности работает, ну и на последок собрать из этого всего робота
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
#define PIN_TRIG 12
#define PIN_ECHO 11
 
void setup() {
   //configure pin modes for the ultrasonci se3nsor
   pinMode(PIN_TRIG, OUTPUT);
   pinMode(PIN_ECHO, INPUT);
     // initialize serial communications at 9600 bps:
  Serial.begin(9600);
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
   Serial.println(distance());// Выводим значения в ком порт
   // На правом верхнем углу IDE Ардуино есть Монитор порта, там смотрим резкльтат
delay(500);// небольшая задержка
}
// Функция отвечает за работу дальномера, возвращает расстояние в см до объекта до 4,5 м работает
int distance()  {
    digitalWrite(PIN_TRIG, LOW); 
    delayMicroseconds(2); 
    digitalWrite(PIN_TRIG, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(PIN_TRIG, LOW); 
   return  (pulseIn(PIN_ECHO, HIGH)) / 58;
  }
Добавлено через 14 минут
Как раз после всех проверок вам будет подсилу и скетч с соседней темы с автомобильного комплекта
0
18.06.2018, 16:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2018, 16:57
Помогаю со студенческими работами здесь

Не могу понять где ошибка
Здравствуйте, пытаюсь просто вывести форму и jQuery обработчик к нему, но сайт не загружается из-за...

Не могу понять, где ошибка
Здравствуйте, программисты Java. Я решил написать программу, которая должна будет вычислять...

Где ошибка не могу понять
Привет. Выдает такую ошибку. Unclosed &quot;&quot;&quot; in &quot;blocks/userprofile.twig&quot; at line 73 Помогите...

Не могу понять где ошибка
Класс треугольник. Считается площадь по формуле Герона. Напротив строки &quot;w=ploshad();&quot; пишет &quot;was...

не могу понять где ошибка
он бесконечно просит ввести числа и не выводит, не могу найти ошибку #include &lt;iostream&gt; #include...

не могу понять где ошибка
Задание: Задан массив действительных чисел. Переставить в обратном порядке элементы, расположенные...


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

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