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

Очееень нужен ваш совет с объединением скетчей!

09.03.2018, 00:50. Просмотров 1419. Ответов 21
Метки нет (Все метки)

Приветствую вас, уважаемые форумчане!

Очень нужна ваша помощь.
Племянник написал отдельные скетчи (домашняя работа) и нужно их объединить в один.
Срок у нас до понедельника 13 марта.
Сами справиться не можем(

Будем вам очень благодарны!!!



Первый скетч....................................................... ............................................................ ..........
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
/* Encoder Library - TwoKnobs Example
* [url]http://www.pjrc.com/teensy/td_libs_Encoder.html[/url]
*
* This example code is in the public domain.
*/
 
#include <Encoder.h>
 
// Change these pin numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder knobLeft_ENCO(40, 41);
Encoder knobRight_ENCO(42, 43);
Encoder knobUp_ENCO(34, 35);
Encoder knobDown_ENCO(46, 47);
//   avoid using pins with LEDs attached
 
void setup_ENCO() {
  Serial.begin(9600);
  Serial.println("TwoKnobs Encoder Test:");
}
 
long positionLeft  = -999;
long positionRight = -999;
long positionUp  = -999;
long positionDown = -999;
 
void loop_ENCO() {
  long newLeft, newRight, newUp, newDown;
  newLeft = knobLeft.read();
  newRight = knobRight.read();
  newUp = knobUp.read();
  newDown = knobDown.read();
  if (newLeft != positionLeft || newRight != positionRight || newUp != positionUp || newDown != positionDown) {
    Serial.print("Left = ");
    Serial.print(newLeft);
    Serial.print(", Right = ");
    Serial.print(newRight);
    Serial.print(", Up = ");
    Serial.print(newUp);
    Serial.print(", Down = ");
    Serial.print(newDown);
    Serial.println();
    positionLeft = newLeft;
    positionRight = newRight;
    positionUp = newUp;
    positionDown = newDown;
  }
  // if a character is sent from the serial monitor,
  // reset both back to zero.
  if (Serial.available()) {
    Serial.read();
    Serial.println("Reset both knobs to zero");
    knobLeft.write(0);
    knobRight.write(0);
    knobUp.write(0);
    knobDown.write(0);
  }
}
Второй скетч....................................................... ............................................................ .........
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
#include <Wire.h>
 
/// дальномер синий
 
#include <Ultrasonic.h>
 
 
Ultrasonic us_2_hc(30, 31);
Ultrasonic us_1_hc(50, 51);
 
void setup_hc()
{
  Serial.begin(9600);       // start the serial port
}
 
void loop_hc()
{
  float d_1 = us_1.Ranging(CM);   // get distance
  float d_2 = us_2.Ranging(CM);   // get distance
  
  Serial.print(d_1);
  Serial.print("cm, ");
  Serial.print(d_2);
  Serial.print("cm, ");
   // print the distance
  
  delay(500);                 // arbitrary wait time.
}
Третий скетч....................................................... ............................................................ .........
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
// библиотека для работы I²C
#include <Wire.h>
// библиотека для работы с модулями IMU
#include <TroykaIMU.h>
 
// создаём объект для работы с гироскопом
Gyroscope gyro_IMU;
// создаём объект для работы с акселерометром
Accelerometer accel_IMU;
// создаём объект для работы с компасом
Compass compass_IMU;
// создаём объект для работы с барометром
Barometer barometer_IMU;
 
// калибровочные значения компаса
// полученные в калибровочной матрице из примера «compassCalibrateMatrix»
const double compassCalibrationBias_IMU[3] = {
  524.21,
  3352.214,
  -1402.236
};
 
const double compassCalibrationMatrix_IMU[3][3] = {
  {1.757, 0.04, -0.028},
  {0.008, 1.767, -0.016},
  {-0.018, 0.077, 1.782}
};
 
void setup_IMU()
{
  // открываем последовательный порт
  Serial.begin(115200);
  // выводим сообщение о начале инициализации
  Serial.println("Begin init...");
  // инициализация гироскопа
  gyro.begin();
  // инициализация акселерометра
  accel.begin();
  // инициализация компаса
  compass.begin();
  // инициализация барометра
  barometer.begin();
  // калибровка компаса
  compass.calibrateMatrix(compassCalibrationMatrix, compassCalibrationBias);
  // выводим сообщение об удачной инициализации
  Serial.println("Initialization completed");
  Serial.println("Gyroscope\t\t\tAccelerometer\t\t\tCompass\t\tBarometer");
}
 
void loop_IMU()
{
  // вывод угловой скорости в градусах в секунду относительно оси X
  Serial.print(gyro.readDegPerSecX());
  Serial.print("\t");
  // вывод угловой скорости в градусах в секунду относительно оси Y
  Serial.print(gyro.readDegPerSecY());
  Serial.print("\t");
  // вывод угловой скорости в градусах в секунду относительно оси Z
  Serial.print(gyro.readDegPerSecZ());
  Serial.print("\t\t");
  // вывод направления и величины ускорения в м/с² по оси X
  Serial.print(accel.readAX());
  Serial.print("\t");
  // вывод направления и величины ускорения в м/с² по оси Y
  Serial.print(accel.readAY());
  Serial.print("\t");
  // вывод направления и величины ускорения в м/с² по оси Z
  Serial.print(accel.readAZ());
  Serial.print("\t\t");
  // выводим азимут относительно оси Z
  Serial.print(compass.readAzimut());
  Serial.print(" Degrees\t");
  // вывод значения абсолютного давления
  Serial.print(barometer.readPressureMillibars());
  Serial.print("\t");
  // вывод значения температуры окружающей среды
  Serial.print(barometer.readTemperatureC());
  Serial.print("\t");
  Serial.println("");
  delay(100);
}
Четвертый скетч....................................................... ............................................................ .........
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
// библиотека для работы I²C
#include <Wire.h>
// библиотеку для модуля VL6180X
#include <SparkFun_VL6180X.h>
// адрес датчика приближения по умолчанию
#define VL6180X_ADDRESS 0x29
// создаём объект для работы с модулем
VL6180x sensor_light(VL6180X_ADDRESS);
 
void setup_light()
{
  // открываем монитор Serial-порта
  Serial.begin(9600);
  // проверяем инициализацию модуля
  while (sensor.VL6180xInit()) {
    Serial.println("Failed to initalize");
    delay(1000);
  }
  // загружаем настройки модуля по умолочнию
  sensor.VL6180xDefautSettings();
  // ждём 1 секунду
  delay(1000);
}
 
void loop_light()
{
  // получаем и выводим значения расстояния до объекта
  // и уровень внешнего освещения
  Serial.print("Light = ");
  Serial.print(sensor.getAmbientLight(GAIN_1));
  Serial.print(" Lx\t\t");
  Serial.print("Distance = ");
  Serial.print(sensor.getDistance() );
  Serial.println(" mm");
  delay(100);
}
Пятый скетч....................................................... ............................................................ .........
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
#include <AFMotor.h>
 
 
// создаём объект для работы с датчиком тока
// и передаём ему номер пина выходного сигнала
 
 
 // подключаем библиотеку для работы с платой драйвера двигателя
// Подключаем моторы к клеммникам M1, M2, M3, M4
AF_DCMotor motor1_motor(1);
AF_DCMotor motor2_motor(2);
AF_DCMotor motor3_motor(3);
AF_DCMotor motor4_motor(4);
int velocity_motor = 254;
 
 
 
 
void setup_motor()
{
// Задаем скорость вращения моторов (аналог работы PWM)
motor1.setSpeed(velocity);
motor1.run(RELEASE);
motor2.setSpeed(velocity);
motor2.run(RELEASE);
motor3.setSpeed(velocity);
motor3.run(RELEASE);
 
motor4.setSpeed(velocity);
motor4.run(RELEASE);
}
void loop_motor() 
{
 
int i; // определяем счётчик
motor1.run(FORWARD); // задаем направление движения вперед
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
for (i=0; i<255; i++)
{
motor1.setSpeed(i);
motor2.setSpeed(i);
motor3.setSpeed(i);
motor4.setSpeed(i);
delay(10);
}
motor1.run(RELEASE); // остановка
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
motor1.run(BACKWARD); // задаем направление движения назад
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
for (i=0; i<255; i++)
{
motor1.setSpeed(i);
motor2.setSpeed(i);
motor3.setSpeed(i);
motor4.setSpeed(i);
delay(10);
}
motor1.run(RELEASE); // остановка
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
delay(1000);
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2018, 00:50
Ответы с готовыми решениями:

Нужен ваш совет
Добрый день. Появилась необходимость работы с клиентами не только в офисе, но и через WEB. Пока...

Нужен совет ваш.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Нужен ваш совет
Ребята, помогите мне решить номер, в VBA совсем недавно, не могу решить задание: САМА ЗАДАЧА ---...

Нужен Ваш совет
Ребята,нужен совет.Есть лабораторные работы(методичка прикреплена) и я хочу послушать ваши...

21
Модератор
3310 / 2100 / 334
Регистрация: 13.01.2012
Сообщений: 8,161
09.03.2018, 08:39 2
roheh, и что будет в итоге?
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
09.03.2018, 08:48 3
Хотелось бы узнать что за робот в итоге должен получиться? Лучше опишите для начала список вашего оборудования с моркировкой. Желательено и схема соединения.

Добавлено через 5 минут
может такой стиль объединения подойдет, пока это робот с ультрозвуковым дальномером, вам все равно придется отдельно ваши функции прописать
https://www.cyberforum.ru/robo... 55132.html
0
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
09.03.2018, 16:35  [ТС] 4
marat_miaki,
На всякий случай, все коды взяты с амперкина(там они в открытом доступе, если что). А то уже были попытки обвинить в каком-то воровстве.

Касаемо железа:
1. 2 ультразвуковых датчика hc-sr04

2. Motor shield, к нему подключено 4 движка 12 мм.
http://amperka.ru/product/dc-motor-12mm

3. 4 энкодера на колесах
http://amperka.ru/product/miniq-wheel-encoder

4. Датчик приближения и освещённости
http://amperka.ru/product/troyka-proximity

5. IMU-сенсор на 10 степеней свободы
http://amperka.ru/product/troyka-imu-10-dof

6. Поверх mega стоит Motor shield, и я в оставшиеся свободные digital пины вставлял всё остальное

Добавлено через 32 минуты
marat_miaki,
Робот, который сможет ездить по рельсам и выполнять всякие работы манипулятором, который на него будет установлен в последствии.
Ну а датчики в довесок. Дальномер, датчики света, температуры, угловых скоростей, ну и всё такое.

Добавлено через 18 минут
Есть вот такой код, он по идее общий на всё это, но выдаёт много ошибок почему-то...
https://yadi.sk/d/gDiQ6xPi3TBxR9
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
09.03.2018, 16:36 5
если вы на рельсах, вы энкодер для определения пройденного расстояния от А до Б используете? Изначально объект для манипуляции как находите?
0
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
09.03.2018, 16:43  [ТС] 6
Энкодеры выполняют функцию подсчета угла поворота колёса. А для замера расстояния объекта - дальномер.
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
09.03.2018, 17:00 7
Ошибки в коде выше вернее всего, из за излишне подключенных библиотек, которых у вас пока нет, закомментируйте лишние

Добавлено через 10 минут
Управление пока у вас через сом порт идет?

Добавлено через 6 минут
пока в коде вижу 2 управления через флаг и через порт, надо поэтому движения вперед Назад и все остальное перевести в функции: движение вперед, назад, остановка и использовать функции.
Если код повторяется значит надо писать функцию, и проще код будет
0
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
09.03.2018, 17:03  [ТС] 8
А скажите пожалуйста вы бы могли сделать этот проект полностью корректным (не за просто так, разумеется)?
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
09.03.2018, 17:03 9
вроде этого на милис без delay
Кликните здесь для просмотра всего текста
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
void runForward() {
 
     motor1.setSpeed(SPEED);       // Задаем скорость вращения моторов
    motor2.setSpeed(SPEED);      
    motor1.run(FORWARD);        // Задаем движение вперед
    motor2.run(FORWARD);       
}
 
void steerRight (int offTime) {
    
    if (rightON){rightON=false; rightOnTime =millis();}
  
    motor1.setSpeed(SPEED);       // Задаем скорость вращения моторов
    motor2.setSpeed(SPEED);   
    motor1.run(FORWARD);        // Задаем движение вперед
    motor2.run(BACKWARD);       // Задаем движение назад 
    if(millis() - rightOnTime > offTime) {   state = STATE_FORWARD;   }
 }
 
void steerLeft(int offTime)  {
 
    if (leftON){leftON=false; leftOnTime =millis();}
    motor1.setSpeed(SPEED);       // Задаем скорость вращения моторов
    motor2.setSpeed(SPEED);      
    motor2.run(FORWARD);        // Задаем движение вперед
    motor1.run(BACKWARD);       // Задаем движение назад 
    if(millis() - leftOnTime > offTime) {   state = STATE_FORWARD;   }
}
 
void stopAll() {
    motor1.setSpeed(0);    // motor1.run(RELEASE);        // Останавливаем двигатели
    motor2.setSpeed(0);   
 //   state = STATE_RIGHT;
    rightON = true;
 
}
0
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
09.03.2018, 17:03  [ТС] 10
Просто его знаний не хватает, я вообще не разбираюсь, а дёргать вас на каждом шагу тоже неудобно.
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
09.03.2018, 17:06 11
могу только помочь, у меня под руками ваших оборудовании нет, испытать не на чем
0
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
09.03.2018, 17:08  [ТС] 12
Ну испытывать будет он сам тогда. Вам какие данные вообще нужны?
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
09.03.2018, 18:05 13
Поищу и скачаю нужные библиотеки, пока после небольших переделок ваш код упростился, лишние библиотеки пока не отключил
Кликните здесь для просмотра всего текста
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
#include <Adafruit_Sensor.h>
 
#include <DHT.h>
#include "Ultrasonic.h"
 
#include <GOST4401_81.h>
#include <l3g4200d.h>
#include <lis331dlh.h>
#include <lis3mdl.h>
#include <LPS331.h>
#include <MadgwickAHRS.h>
#include <stmhw.h>
#include <troyka-imu.h>
#include <TroykaIMU.h>
 
#include <AFMotor.h>
 
#include <SoftwareSerial.h>  // библиотека для работы с портами
       // библиотека для аботы с ультразвуковым датчиком растояния
#include <AFMotor.h>          // библиотека для работы с платой драйвера двигателя Motor shield 
              // библиотека для работы с датчиком температуры и влажности
#include <Wire.h>             // библиотека для работы I²C (барометр и компас)
        // библиотека для работы с модулями IMU (барометр и компас)
 
// Работа с барометром
Barometer barometer;          // переменная для работы с барометром
float pressure;               // давление
float altitude;               // высота по барометру
 
// Работа с ультразвуковыми датчиками растояния
int trigPin1 = 51;
int echoPin1 = 53;
int trigPin2 = 43;
int echoPin2 = 45;
int trigPin3 = 27;
int echoPin3 = 25;
 
Ultrasonic ultrasonic1(trigPin1, echoPin1);   // (trigPin, echoPin)
Ultrasonic ultrasonic2(trigPin2, echoPin2);  // (trigPin, echoPin)
Ultrasonic ultrasonic3(trigPin3, echoPin3); // (trigPin, echoPin)
 
float dist1_cm;   // дистанция по 1-му дальномеру (левый)
float dist2_cm;   // дистанция по 2-му дальномеру (центр)
float dist3_cm;   // дистанция по 3-му дальномеру (правый)
 
// Работа с светодиодом
int red = 44;
int blue = 40;
int green = 42;
 
// Работа с датчиком температуры и влажности
#define DHTPIN 52               // пин
#define DHTTYPE DHT11           // тип датчика DHT 11 (альтернатива DHT22 --> DHT 22  (AM2302) или DHT21 --> DHT 21 (AM2301))
DHT dht(DHTPIN, DHTTYPE);
float humidity;                 // влажность
float temperature;              // температура
 
//Список переменных
char readchar;                  // переменная для хранения входных данных (символ)
String readString;              // переменная для хранения входных данных (режим строки)
int flag_regim = 0;             // Флаг переключения режимов
 
// Работа с платой драйвера двигателя Motor shield
// Подключаем моторы к клеммникам M1, M2, M3, M4
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
int velocity = 254;
 
//список структур
struct s_command      //команда
{
    char com;  //команда
    int par;   //параметр
};
// Альтернативный последовательный порт
//SoftwareSerial1 Serial1(11, 5);   // (RX, TX)
 
void setup() 
{
  Serial.begin(9600);         // скорость передачи данных
  while (!Serial);            // проверка открытия порта
 
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  pinMode(green, OUTPUT);
  
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
 
  dht.begin();                //инициализация датчика температуры и влажности
  barometer.begin();          // инициализация барометра
  
// Задаем максимальную скорость вращения моторов (аналог работы PWM) 
  motor1.setSpeed(velocity);
  motor1.run(RELEASE);
  motor2.setSpeed(velocity);
  motor2.run(RELEASE);
  motor3.setSpeed(velocity);
  motor3.run(RELEASE);
  motor4.setSpeed(velocity);
  motor4.run(RELEASE);
}
 
void loop() 
{
  if (Serial.available())   // проверка доступности порта
  {     
    char c;                 // символьная переменная для входных данных
    readchar = -1;
    while (Serial.available()) // пока в порте есть информация 
    {
      delay(10);            // задержка для заполнения буфера
 
      char c = Serial.read();   // побайтовое чтение
      if (c == '\n')            // признак конца строки
      {
        break;
      }  
      readString += c; 
    }  
 
    if (readString.length() >1) 
    {
      Serial.println(readString); // передача в порт
    }
    else
    {
      readchar = readString[0];
    }
    
    if(readchar!=-1)                // если данные не равны -1, т.е. что-то введено
    {
      Serial.print("received : ");  // вывод сообщения
      Serial.println(readchar);     // вывод данных
    }
 
    if(readchar!=-1)                // если данные не равны -1, т.е. что-то введено
    {
      switch (readchar)
      {
        case 'd':
        case 'D':
                  digitalWrite(red, HIGH); //включаем красный
                  delay(500); //ждем 500 Мс
                  digitalWrite(red, LOW); //выключаем красный
                  digitalWrite(green, HIGH); //включаем зеленый
                  delay(500); //ждем 500 Мс
                  digitalWrite(green, LOW); //выключаем зеленый
                  digitalWrite(blue, HIGH); //включаем синий
                  delay(500); //ждем 500 Мс
                  digitalWrite(blue, LOW); //выключаем синий 
                  Serial1.print("test");
                  break;
        
        case '1': runForward();                break;
        case 'f':
                  flag_regim = 1;
                  break;                  
        case '2': ranBack();                   break;
        case 'b':
                  flag_regim = 2;
                  break;                  
        case '3': steerRight ();          break;     
        case 'l':
                  flag_regim = 3;
                  break;                       
        case '4': steerLeft ();                 break;  
        case 'r':
                  flag_regim = 4;
                  break;                                                    
        case 'h':
                  humidity = dht.readHumidity();
                  temperature = dht.readTemperature();
                
                  // Если датчик передал NaN (not a number), то что-то работает не так!
                  if (isnan(temperature) || isnan(humidity)) {
                    Serial1.println("Failed to read from DHT");
                  } else {
                    Serial1.print("Humidity: "); 
                    Serial1.print(humidity);
                    Serial1.print(" %\t");
                    Serial1.print("Temperature: "); 
                    Serial1.print(temperature);
                    Serial1.println(" *C");
                  }
                  break;
        case 'p':     
                  pressure = barometer.readPressureMillibars(); // значение абсолютного давления 
                  altitude = barometer.pressureToAltitudeMeters(pressure); // значение высоты над уровнем море
 
                  // Вывод данных в порт
                  Serial1.print("p: ");
                  Serial1.print(pressure);
                  Serial1.print(" mbar \t");
                  Serial1.print("h: ");
                  Serial1.print(altitude);
                  Serial1.print(" m");
                  break;     
        case 'u':
                  dist1_cm = ultrasonic1.Ranging(CM);   // дистанция
                  dist2_cm = ultrasonic2.Ranging(CM);   // дистанция
                  dist3_cm = ultrasonic3.Ranging(CM);   // дистанция
                  Serial1.print(dist1_cm);                      
                  Serial1.print("\t");
                  Serial1.print(dist2_cm);                      
                  Serial1.print("\t");
                  Serial1.println(dist3_cm);                      
  
                  delay(100);
                  break; 
        
        case 't':
                  flag_regim = 5;
                  break;                   
                                                     
        case 's':
                  digitalWrite(red, LOW);
                  digitalWrite(blue, LOW);
                  digitalWrite(green, LOW);
                  stopAll();                  // Остановка
                                        
                  flag_regim = 0; 
                  break;  
      }
    }
  }
 
  if (flag_regim == 1)
    {  
      runForward();
    }
  
  if (flag_regim == 2)
    {  
      runBack();
    }
 
  if (flag_regim == 3)
  {  
      steerRight ()
  }
  
  if (flag_regim == 4)
  {  
      steerLeft ();
  }
  
  if (flag_regim == 5)
  {
    dist1_cm = ultrasonic1.Ranging(CM);   // дистанция
    dist2_cm = ultrasonic2.Ranging(CM);   // дистанция
    dist3_cm = ultrasonic3.Ranging(CM);   // дистанция
 
  if (dist1_cm < 12 && dist3_cm<12 && dist2_cm <12)
  {
    if (dist1_cm > dist3_cm)
     {
        steerLeft();
     }
     else 
     { 
      steerRight ();
     }
  }
  else{  if (dist1_cm <= 8 && dist3_cm <= 8 && dist2_cm > 8)
    {   // Остановка
        stopAll();
      delay(100);
      Serial1.print("NO!"); 
    }
       if (dist1_cm > 8 && dist3_cm > 8 && dist2_cm > 8)
      { 
        runForward(); //Полный впер
 
       Serial1.print("Forward"); 
      }
      if (dist1_cm > 8 && dist3_cm <=8)
      {
       steerLeft();//влево
       Serial1.print("Left"); 
      delay(10);
      }
 
     if ((dist1_cm < 8 && dist3_cm>8 )||(dist1_cm > 8 && dist2_cm < 8 && dist3_cm > 8))
      {
       steerRight ();  //вправо
       Serial1.print("Right"); 
      delay(10);
      }
  }
      
  }
    readString="";
 //Serial1.print("test");
}
 
void runForward() {
                  motor1.setSpeed(velocity);      // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);  
                  
                  motor1.run(FORWARD);            // Задаем движение вперед
                  motor2.run(FORWARD);
                  motor3.run(FORWARD);
                  motor4.run(FORWARD);
                 
                  delay(1000);
                  motor1.run(RELEASE);            // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
void runBack() {
                  motor1.setSpeed(velocity);    // Задаем скорость движения 
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity); 
                  
                  motor1.run(BACKWARD);         // Задаем движение назад
                  motor2.run(BACKWARD);
                  motor3.run(BACKWARD);
                  motor4.run(BACKWARD);
                  
                  delay(1000);
                  motor1.run(RELEASE);          // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
void steerRight (){
                  motor1.setSpeed(velocity); // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);
                  
                  motor1.run(BACKWARD);         //вправо
                  motor2.run(FORWARD);
                  motor3.run(FORWARD);
                  motor4.run(BACKWARD);
                               
                  delay(1000);
                  motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
void steerLeft (){
                  motor1.setSpeed(velocity); // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);     
                  
                  motor1.run(FORWARD);         //влево
                  motor2.run(BACKWARD);
                  motor3.run(BACKWARD);
                  motor4.run(FORWARD);  
              
                  delay(1000);
                  motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
 
void stopAll() {
                    motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);   
  
};


Добавлено через 23 минуты
откомпилировался, что пока не прошло, отключил
Кликните здесь для просмотра всего текста
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
//#include <Adafruit_Sensor.h>
 
//#include <DHT.h>
#include "Ultrasonic.h"
 
//#include <GOST4401_81.h>
//#include <l3g4200d.h>
//#include <lis331dlh.h>
//#include <lis3mdl.h>
//#include <LPS331.h>
//#include <MadgwickAHRS.h>
//#include <stmhw.h>
//#include <troyka-imu.h>
#include <TroykaIMU.h>
 
#include <AFMotor.h>
 
#include <SoftwareSerial.h>  // библиотека для работы с портами
       // библиотека для аботы с ультразвуковым датчиком растояния
#include <AFMotor.h>          // библиотека для работы с платой драйвера двигателя Motor shield 
              // библиотека для работы с датчиком температуры и влажности
#include <Wire.h>             // библиотека для работы I²C (барометр и компас)
        // библиотека для работы с модулями IMU (барометр и компас)
 
// Работа с барометром
Barometer barometer;          // переменная для работы с барометром
float pressure;               // давление
float altitude;               // высота по барометру
 
// Работа с ультразвуковыми датчиками растояния
int trigPin1 = 51;
int echoPin1 = 53;
int trigPin2 = 43;
int echoPin2 = 45;
int trigPin3 = 27;
int echoPin3 = 25;
 
//Ultrasonic ultrasonic1(trigPin1, echoPin1);   // (trigPin, echoPin)
//Ultrasonic ultrasonic2(trigPin2, echoPin2);  // (trigPin, echoPin)
//Ultrasonic ultrasonic3(trigPin3, echoPin3); // (trigPin, echoPin)
 
float dist1_cm;   // дистанция по 1-му дальномеру (левый)
float dist2_cm;   // дистанция по 2-му дальномеру (центр)
float dist3_cm;   // дистанция по 3-му дальномеру (правый)
 
// Работа с светодиодом
int red = 44;
int blue = 40;
int green = 42;
 
// Работа с датчиком температуры и влажности
#define DHTPIN 52               // пин
#define DHTTYPE DHT11           // тип датчика DHT 11 (альтернатива DHT22 --> DHT 22  (AM2302) или DHT21 --> DHT 21 (AM2301))
//DHT dht(DHTPIN, DHTTYPE);
float humidity;                 // влажность
float temperature;              // температура
 
//Список переменных
char readchar;                  // переменная для хранения входных данных (символ)
String readString;              // переменная для хранения входных данных (режим строки)
int flag_regim = 0;             // Флаг переключения режимов
 
// Работа с платой драйвера двигателя Motor shield
// Подключаем моторы к клеммникам M1, M2, M3, M4
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
int velocity = 254;
 
//список структур
struct s_command      //команда
{
    char com;  //команда
    int par;   //параметр
};
// Альтернативный последовательный порт
//SoftwareSerial1 Serial1(11, 5);   // (RX, TX)
 
void setup() 
{
  Serial.begin(9600);         // скорость передачи данных
  while (!Serial);            // проверка открытия порта
 
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  pinMode(green, OUTPUT);
  
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
 
//  dht.begin();                //инициализация датчика температуры и влажности
//  barometer.begin();          // инициализация барометра
  
// Задаем максимальную скорость вращения моторов (аналог работы PWM) 
  motor1.setSpeed(velocity);
  motor1.run(RELEASE);
  motor2.setSpeed(velocity);
  motor2.run(RELEASE);
  motor3.setSpeed(velocity);
  motor3.run(RELEASE);
  motor4.setSpeed(velocity);
  motor4.run(RELEASE);
}
 
void loop() 
{
  if (Serial.available())   // проверка доступности порта
  {     
    char c;                 // символьная переменная для входных данных
    readchar = -1;
    while (Serial.available()) // пока в порте есть информация 
    {
      delay(10);            // задержка для заполнения буфера
 
      char c = Serial.read();   // побайтовое чтение
      if (c == '\n')            // признак конца строки
      {
        break;
      }  
      readString += c; 
    }  
 
    if (readString.length() >1) 
    {
      Serial.println(readString); // передача в порт
    }
    else
    {
      readchar = readString[0];
    }
    
    if(readchar!=-1)                // если данные не равны -1, т.е. что-то введено
    {
      Serial.print("received : ");  // вывод сообщения
      Serial.println(readchar);     // вывод данных
    }
 
    if(readchar!=-1)                // если данные не равны -1, т.е. что-то введено
    {
      switch (readchar)
      {
        case 'd':
        case 'D':
                  digitalWrite(red, HIGH); //включаем красный
                  delay(500); //ждем 500 Мс
                  digitalWrite(red, LOW); //выключаем красный
                  digitalWrite(green, HIGH); //включаем зеленый
                  delay(500); //ждем 500 Мс
                  digitalWrite(green, LOW); //выключаем зеленый
                  digitalWrite(blue, HIGH); //включаем синий
                  delay(500); //ждем 500 Мс
                  digitalWrite(blue, LOW); //выключаем синий 
                  Serial1.print("test");
                  break;
        
        case '1': runForward();                break;
        case 'f':
                  flag_regim = 1;
                  break;                  
        case '2': runBack();                   break;
        case 'b':
                  flag_regim = 2;
                  break;                  
        case '3': steerRight ();          break;     
        case 'l':
                  flag_regim = 3;
                  break;                       
        case '4': steerLeft ();                 break;  
        case 'r':
                  flag_regim = 4;
                  break;                                                    
 /*       case 'h':
                 humidity = dht.readHumidity();
                 temperature = dht.readTemperature();
                
                  // Если датчик передал NaN (not a number), то что-то работает не так!
                  if (isnan(temperature) || isnan(humidity)) {
                    Serial1.println("Failed to read from DHT");
                  } else {
                    Serial1.print("Humidity: "); 
                    Serial1.print(humidity);
                    Serial1.print(" %\t");
                    Serial1.print("Temperature: "); 
                    Serial1.print(temperature);
                    Serial1.println(" *C");
                  }
                  break;
   */               
        case 'p':     
                  pressure = barometer.readPressureMillibars(); // значение абсолютного давления 
                  altitude = barometer.pressureToAltitudeMeters(pressure); // значение высоты над уровнем море
 
                  // Вывод данных в порт
                  Serial1.print("p: ");
                  Serial1.print(pressure);
                  Serial1.print(" mbar \t");
                  Serial1.print("h: ");
                  Serial1.print(altitude);
                  Serial1.print(" m");
                  break;     
        case 'u':
//                  dist1_cm = ultrasonic1.Ranging(CM);   // дистанция
 //                 dist2_cm = ultrasonic2.Ranging(CM);   // дистанция
 //                 dist3_cm = ultrasonic3.Ranging(CM);   // дистанция
                  Serial1.print(dist1_cm);                      
                  Serial1.print("\t");
                  Serial1.print(dist2_cm);                      
                  Serial1.print("\t");
                  Serial1.println(dist3_cm);                      
  
                  delay(100);
                  break; 
        
        case 't':
                  flag_regim = 5;
                  break;                   
                                                     
        case 's':
                  digitalWrite(red, LOW);
                  digitalWrite(blue, LOW);
                  digitalWrite(green, LOW);
                  stopAll();                  // Остановка
                                        
                  flag_regim = 0; 
                  break;  
      }
    }
  }
 
  if (flag_regim == 1)
    {  
      runForward();
    }
  
  if (flag_regim == 2)
    {  
      runBack();
    }
 
  if (flag_regim == 3)
  {  
      steerRight ();
  }
  
  if (flag_regim == 4)
  {  
      steerLeft ();
  }
  
  if (flag_regim == 5)
  {
//    dist1_cm = ultrasonic1.Ranging(CM);   // дистанция
 //   dist2_cm = ultrasonic2.Ranging(CM);   // дистанция
 //   dist3_cm = ultrasonic3.Ranging(CM);   // дистанция
 
  if (dist1_cm < 12 && dist3_cm<12 && dist2_cm <12)
  {
    if (dist1_cm > dist3_cm)
     {
        steerLeft();
     }
     else 
     { 
      steerRight ();
     }
  }
  else{  if (dist1_cm <= 8 && dist3_cm <= 8 && dist2_cm > 8)
    {   // Остановка
        stopAll();
      delay(100);
      Serial1.print("NO!"); 
    }
       if (dist1_cm > 8 && dist3_cm > 8 && dist2_cm > 8)
      { 
        runForward(); //Полный впер
 
       Serial1.print("Forward"); 
      }
      if (dist1_cm > 8 && dist3_cm <=8)
      {
       steerLeft();//влево
       Serial1.print("Left"); 
      delay(10);
      }
 
     if ((dist1_cm < 8 && dist3_cm>8 )||(dist1_cm > 8 && dist2_cm < 8 && dist3_cm > 8))
      {
       steerRight ();  //вправо
       Serial1.print("Right"); 
      delay(10);
      }
  }
      
  }
    readString="";
 //Serial1.print("test");
}
 
void runForward() {
                  motor1.setSpeed(velocity);      // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);  
                  
                  motor1.run(FORWARD);            // Задаем движение вперед
                  motor2.run(FORWARD);
                  motor3.run(FORWARD);
                  motor4.run(FORWARD);
                 
                  delay(1000);
                  motor1.run(RELEASE);            // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
void runBack() {
                  motor1.setSpeed(velocity);    // Задаем скорость движения 
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity); 
                  
                  motor1.run(BACKWARD);         // Задаем движение назад
                  motor2.run(BACKWARD);
                  motor3.run(BACKWARD);
                  motor4.run(BACKWARD);
                  
                  delay(1000);
                  motor1.run(RELEASE);          // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
void steerRight (){
                  motor1.setSpeed(velocity); // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);
                  
                  motor1.run(BACKWARD);         //вправо
                  motor2.run(FORWARD);
                  motor3.run(FORWARD);
                  motor4.run(BACKWARD);
                               
                  delay(1000);
                  motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
void steerLeft (){
                  motor1.setSpeed(velocity); // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);     
                  
                  motor1.run(FORWARD);         //влево
                  motor2.run(BACKWARD);
                  motor3.run(BACKWARD);
                  motor4.run(FORWARD);  
              
                  delay(1000);
                  motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
 
void stopAll() {
                    motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);   
  
};
1
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
09.03.2018, 18:17  [ТС] 14
Спасибо вам огромное! Возможно ещё это вам поможет.

Полное Наименование деталей:
1. Arduino Mega 2560
2. Bluetooth-модуль HC-06
3. Датчик приближения и освещённости (Troyka-модуль)
4. Гироскоп (Troyka-модуль)
5. Датчик тока (Troyka-модуль)
6. Силовой ключ (Troyka-модуль)
7. Мотор 12 мм
8. Troyka Shield
9. L293D Arduino Motor Shield(4 канала)
10. Датчик наклона (Troyka-модуль)
11 Инфракрасный дальномер Sharp (20-150 см)
12. Ультразвуковой дальномер HC-SR04
13. Ультразвуковой дальномер URM37
14. Power Shield (Li-Ion, 2000 мА·ч)
15. Ролики (4 шт. в упаковке)
0
Эксперт С++
8330 / 6082 / 605
Регистрация: 10.12.2010
Сообщений: 28,267
Записей в блоге: 29
09.03.2018, 20:12 15
Цитата Сообщение от roheh Посмотреть сообщение
скажите пожалуйста вы бы могли сделать этот проект полностью корректным (не за просто так, разумеется)?
Фриланс
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
09.03.2018, 21:34 16
Немного подправил, отказался от библиотеки Ultrasonic.h мне как то он не понравился, сделал просто без него
Кликните здесь для просмотра всего текста
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
//#include <Adafruit_Sensor.h>
 
//#include <DHT.h>
//#include "Ultrasonic.h"
 
//#include <GOST4401_81.h>
//#include <l3g4200d.h>
//#include <lis331dlh.h>
//#include <lis3mdl.h>
//#include <LPS331.h>
//#include <MadgwickAHRS.h>
//#include <stmhw.h>
//#include <troyka-imu.h>
#include <TroykaIMU.h>
 
#include <AFMotor.h>
 
#include <SoftwareSerial.h>  // библиотека для работы с портами
       // библиотека для аботы с ультразвуковым датчиком растояния
#include <AFMotor.h>          // библиотека для работы с платой драйвера двигателя Motor shield 
              // библиотека для работы с датчиком температуры и влажности
#include <Wire.h>             // библиотека для работы I²C (барометр и компас)
        // библиотека для работы с модулями IMU (барометр и компас)
 
// Работа с барометром
Barometer barometer;          // переменная для работы с барометром
float pressure;               // давление
float altitude;               // высота по барометру
 
// Работа с ультразвуковыми датчиками растояния
int trigPin1 = 51;
int echoPin1 = 53;
int trigPin2 = 43;
int echoPin2 = 45;
int trigPin3 = 27;
int echoPin3 = 25;
 
//Ultrasonic ultrasonic1(trigPin1, echoPin1);   // (trigPin, echoPin)
//Ultrasonic ultrasonic2(trigPin2, echoPin2);  // (trigPin, echoPin)
//Ultrasonic ultrasonic3(trigPin3, echoPin3); // (trigPin, echoPin)
 
float dist1_cm;   // дистанция по 1-му дальномеру (левый)
float dist2_cm;   // дистанция по 2-му дальномеру (центр)
float dist3_cm;   // дистанция по 3-му дальномеру (правый)
 
// Работа с светодиодом
int red = 44;
int blue = 40;
int green = 42;
 
// Работа с датчиком температуры и влажности
#define DHTPIN 52               // пин
#define DHTTYPE DHT11           // тип датчика DHT 11 (альтернатива DHT22 --> DHT 22  (AM2302) или DHT21 --> DHT 21 (AM2301))
//DHT dht(DHTPIN, DHTTYPE);
float humidity;                 // влажность
float temperature;              // температура
 
//Список переменных
char readchar;                  // переменная для хранения входных данных (символ)
String readString;              // переменная для хранения входных данных (режим строки)
int flag_regim = 0;             // Флаг переключения режимов
 
// Работа с платой драйвера двигателя Motor shield
// Подключаем моторы к клеммникам M1, M2, M3, M4
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
int velocity = 254;
 
//список структур
struct s_command      //команда
{
    char com;  //команда
    int par;   //параметр
};
// Альтернативный последовательный порт
//SoftwareSerial1 Serial1(11, 5);   // (RX, TX)
 
void setup() 
{
  Serial.begin(9600);         // скорость передачи данных
  while (!Serial);            // проверка открытия порта
 
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  pinMode(green, OUTPUT);
  
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
 
//  dht.begin();                //инициализация датчика температуры и влажности
//  barometer.begin();          // инициализация барометра
  
// Задаем максимальную скорость вращения моторов (аналог работы PWM) 
  motor1.setSpeed(velocity);
  motor1.run(RELEASE);
  motor2.setSpeed(velocity);
  motor2.run(RELEASE);
  motor3.setSpeed(velocity);
  motor3.run(RELEASE);
  motor4.setSpeed(velocity);
  motor4.run(RELEASE);
}
 
void loop() 
{
  if (Serial.available())   // проверка доступности порта
  {     
    char c;                 // символьная переменная для входных данных
    readchar = -1;
    while (Serial.available()) // пока в порте есть информация 
    {
      delay(10);            // задержка для заполнения буфера
 
      char c = Serial.read();   // побайтовое чтение
      if (c == '\n')            // признак конца строки
      {
        break;
      }  
      readString += c; 
    }  
 
    if (readString.length() >1) 
    {
      Serial.println(readString); // передача в порт
    }
    else
    {
      readchar = readString[0];
    }
    
    if(readchar!=-1)                // если данные не равны -1, т.е. что-то введено
    {
      Serial.print("received : ");  // вывод сообщения
      Serial.println(readchar);     // вывод данных
    }
 
    if(readchar!=-1)                // если данные не равны -1, т.е. что-то введено
    {
      switch (readchar)
      {
        case 'd':
        case 'D':
                  digitalWrite(red, HIGH); //включаем красный
                  delay(500); //ждем 500 Мс
                  digitalWrite(red, LOW); //выключаем красный
                  digitalWrite(green, HIGH); //включаем зеленый
                  delay(500); //ждем 500 Мс
                  digitalWrite(green, LOW); //выключаем зеленый
                  digitalWrite(blue, HIGH); //включаем синий
                  delay(500); //ждем 500 Мс
                  digitalWrite(blue, LOW); //выключаем синий 
                  Serial1.print("test");
                  break;
        
        case '1': runForward();                break;
        case 'f':
                  flag_regim = 1;
                  break;                  
        case '2': runBack();                   break;
        case 'b':
                  flag_regim = 2;
                  break;                  
        case '3': steerRight ();          break;     
        case 'l':
                  flag_regim = 3;
                  break;                       
        case '4': steerLeft ();                 break;  
        case 'r':
                  flag_regim = 4;
                  break;                                                    
 /*       case 'h':
                 humidity = dht.readHumidity();
                 temperature = dht.readTemperature();
                
                  // Если датчик передал NaN (not a number), то что-то работает не так!
                  if (isnan(temperature) || isnan(humidity)) {
                    Serial1.println("Failed to read from DHT");
                  } else {
                    Serial1.print("Humidity: "); 
                    Serial1.print(humidity);
                    Serial1.print(" %\t");
                    Serial1.print("Temperature: "); 
                    Serial1.print(temperature);
                    Serial1.println(" *C");
                  }
                  break;
   */               
        case 'p':     
                  pressure = barometer.readPressureMillibars(); // значение абсолютного давления 
                  altitude = barometer.pressureToAltitudeMeters(pressure); // значение высоты над уровнем море
 
                  // Вывод данных в порт
                  Serial1.print("p: ");
                  Serial1.print(pressure);
                  Serial1.print(" mbar \t");
                  Serial1.print("h: ");
                  Serial1.print(altitude);
                  Serial1.print(" m");
                  break;     
        case 'u':
               //  dist1_cm = ultrasonic1.Ranging(CM);   // дистанция
               //  dist2_cm = ultrasonic2.Ranging(CM);   // дистанция
               //  dist3_cm = ultrasonic3.Ranging(CM);   // дистанция
                 dist1_cm = triger(trigPin1,echoPin1);   // дистанция
                 dist2_cm = triger(trigPin2,echoPin2);   // дистанция
                 dist3_cm = triger(trigPin3,echoPin3);   // дистанция
 
               
                  Serial1.print(dist1_cm);                      
                  Serial1.print("\t");
                  Serial1.print(dist2_cm);                      
                  Serial1.print("\t");
                  Serial1.println(dist3_cm);                      
  
                  delay(100);
                  break; 
        
        case 't':
                  flag_regim = 5;
                  break;                   
                                                     
        case 's':
                  digitalWrite(red, LOW);
                  digitalWrite(blue, LOW);
                  digitalWrite(green, LOW);
                  stopAll();                  // Остановка
                                        
                  flag_regim = 0; 
                  break;  
      }
    }
  }
 
  if (flag_regim == 1)
    {  
      runForward();
    }
  
  if (flag_regim == 2)
    {  
      runBack();
    }
 
  if (flag_regim == 3)
  {  
      steerRight ();
  }
  
  if (flag_regim == 4)
  {  
      steerLeft ();
  }
  
  if (flag_regim == 5)
  {
//    dist1_cm = ultrasonic1.Ranging(CM);   // дистанция
 //   dist2_cm = ultrasonic2.Ranging(CM);   // дистанция
 //   dist3_cm = ultrasonic3.Ranging(CM);   // дистанция
    dist1_cm = triger(trigPin1,echoPin1);   // дистанция
    dist2_cm = triger(trigPin2,echoPin2);   // дистанция
    dist3_cm = triger(trigPin3,echoPin3);   // дистанция
 
 
  if (dist1_cm < 12 && dist3_cm<12 && dist2_cm <12)
  {
    if (dist1_cm > dist3_cm)
     {
        steerLeft();
     }
     else 
     { 
      steerRight ();
     }
  }
  else{  if (dist1_cm <= 8 && dist3_cm <= 8 && dist2_cm > 8)
    {   // Остановка
        stopAll();
      delay(100);
      Serial1.print("NO!"); 
    }
       if (dist1_cm > 8 && dist3_cm > 8 && dist2_cm > 8)
      { 
        runForward(); //Полный впер
 
       Serial1.print("Forward"); 
      }
      if (dist1_cm > 8 && dist3_cm <=8)
      {
       steerLeft();//влево
       Serial1.print("Left"); 
      delay(10);
      }
 
     if ((dist1_cm < 8 && dist3_cm>8 )||(dist1_cm > 8 && dist2_cm < 8 && dist3_cm > 8))
      {
       steerRight ();  //вправо
       Serial1.print("Right"); 
      delay(10);
      }
  }
      
  }
    readString="";
 //Serial1.print("test");
}
 
void runForward() {
                  motor1.setSpeed(velocity);      // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);  
                  
                  motor1.run(FORWARD);            // Задаем движение вперед
                  motor2.run(FORWARD);
                  motor3.run(FORWARD);
                  motor4.run(FORWARD);
                 
                  delay(1000);
                  motor1.run(RELEASE);            // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
void runBack() {
                  motor1.setSpeed(velocity);    // Задаем скорость движения 
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity); 
                  
                  motor1.run(BACKWARD);         // Задаем движение назад
                  motor2.run(BACKWARD);
                  motor3.run(BACKWARD);
                  motor4.run(BACKWARD);
                  
                  delay(1000);
                  motor1.run(RELEASE);          // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
void steerRight (){
                  motor1.setSpeed(velocity); // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);
                  
                  motor1.run(BACKWARD);         //вправо
                  motor2.run(FORWARD);
                  motor3.run(FORWARD);
                  motor4.run(BACKWARD);
                               
                  delay(1000);
                  motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
void steerLeft (){
                  motor1.setSpeed(velocity); // Задаем скорость движения
                  motor2.setSpeed(velocity); 
                  motor3.setSpeed(velocity); 
                  motor4.setSpeed(velocity);     
                  
                  motor1.run(FORWARD);         //влево
                  motor2.run(BACKWARD);
                  motor3.run(BACKWARD);
                  motor4.run(FORWARD);  
              
                  delay(1000);
                  motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);
};
 
 
void stopAll() {
                    motor1.run(RELEASE); // Остановка
                  motor2.run(RELEASE);
                  motor3.run(RELEASE);
                  motor4.run(RELEASE);   
  
};
float triger(int trigPin,int echoPin)  {
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2); 
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trigPin, LOW); 
   return  (pulseIn(echoPin, HIGH)) / 58;
  };
0
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
10.03.2018, 08:19  [ТС] 17
А скажите пожалуйста, тут есть код, который отвечает за то, чтобы информация с датчиков выводилась на дисплей монитора?
И как вообще это сделать можно?

Добавлено через 7 минут
А ещё мы запутались, в этом коде есть все те функции, что были а 4х первых кодах, которые я скидывал?
Или вместе с библиотеками и они были удалены?
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
10.03.2018, 09:21 18
Лучший ответ Сообщение было отмечено roheh как решение

Решение

Этот код немного подправленный с яндекс диска, отключен датчик температуры и влажности. Естественно это не объединение всех 4 х скетчей. Для этого нужно знать что вы пытаетесь сделать, и какие действия должен совершать ваш робот в определеный момент времени и по определенной компнде. В скетче который я подправил, по моим предположениям идет команда с сом порта, и робот на нее может реагировать определенным образом. Вперед Назад Поворот, пока не понятен в принципе для чего стоят 2-3 ультрозвуковых дальномера, и что они меряют? и как на них должен отреагировать ваш робот? И вернее всего с поворотом тоже не все в порядке. При скорости 254 за 1 сек по видимому он повернется не на 90 гр. а на все 180 или более.
Если хотите чтоб я смог чем либо помочь, опишите полностью действия робота своими словами. Включили, поехал по команде "1" вперед 1 сек, остановился, осмотрелся( определил расстояние 3 дальномерами до чего то ) и так далее...
Я пока не знаю даже для чего дальномеры и как они расположены. ( могу тоже предположить что это скетч может быть для прохождения лабиринта)

Добавлено через 6 минут
А скетчи выложенные вами, только для того чтобы определить, как работать с прибором в ардуино, их объединение в принципе нечего не даст
1
0 / 0 / 0
Регистрация: 09.03.2018
Сообщений: 10
10.03.2018, 22:14  [ТС] 19
marat_miaki, а всё, спасибо Вам огромное за помощь. Можете написать свой номер в личку, чтобы мы вас отблагодарили за потраченное время и помощь?
0
313 / 255 / 136
Регистрация: 08.04.2013
Сообщений: 1,128
11.03.2018, 06:49 20
Не стоит благодарностей, просто и мне было интересно. Просто поделитесь,что в итоге у вас получается,многим то тоже интересен итог.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2018, 06:49

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

Нужен ваш совет
Ребят, почему не выходит елочка? var num = 4; var a = ; var b = ; var ce = a.push('*'); var d...

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

Нужен ваш совет
у меня есть компьютер, старенький. Процессор intel dual core 2.0 Ghz. ОЗУ 1 GB. Можно ли установить...

Нужен ваш совет
Вот делал свое дитё месяц и пару дней назад запустил Нужна ваша оценка дизайна. Дайте пожалуйста...

нужен ваш совет!
господа,помогите плиз Печать таблиц операций сложения и умножения для троичных чисел. таблица...

Цикл, нужен ваш совет.
Readln (N); c:=1; For i:=1 to N do begin c:=c*i; Writeln(c); end; Если в...


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

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

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