Аватар для TEXNIKK
1 / 1 / 0
Регистрация: 15.08.2024
Сообщений: 5

Помехи на сервоприводы

29.03.2025, 00:51. Показов 1881. Ответов 7

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.
Собираю робота на arduino, nrf24l01, драйвера мотора bts7960, fpv камеры и сервоприводах(танк с манипулятором). Сервы, когда робот находится не в движении дергаются(но не сильно), но когда я даю газ в пол, то происходит полная жесть: сервы начинают сходить с ума и дергаться почти на весь свой оборот. Дергания доходят до того, что он может просто сломаться(манипулятор) или ардуино потеряет сигнал.
Я так понимаю проблема здесь в помехах от моторов, на осциллографе я мерил серву и когда машина в движении, то шим там скачет. Сервы я питаю через понижайки, на каждую из них я поставил конденсатор 1000мкф, но не помогло. Я также пробовал пины серво соединить с землей при помощи резисторов 10кОм. Еще ставил кондеры на моторы, но успеха это тоже не принесло...
Кто знает в чем проблема или как ее решить, помогите пожалуйста.

Файлы с кодом и схему я прикрепил.
Миниатюры
Помехи на сервоприводы  
Вложения
Тип файла: txt Пульт.txt (7.3 Кб, 7 просмотров)
Тип файла: txt Робот 2.txt (9.3 Кб, 7 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2025, 00:51
Ответы с готовыми решениями:

Подскажите мощные сервоприводы для передвижения от 50-100 кг
Ребята кто может подсказать статью или сервоприводы мощные для передвижения от 50-100 кг Спасибо!

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

Сервоприводы и светодиоды AVR ATmega 328p
Помогите пожалуйста написать код и собрать схему Cветодиоды должны подключаться через токоограничивающие резисторы необходимо...

7
284 / 60 / 12
Регистрация: 15.05.2019
Сообщений: 293
29.03.2025, 05:45
Цитата Сообщение от TEXNIKK Посмотреть сообщение
сервы начинают сходить с ума и дергаться почти на весь свой оборот.
У Вас, похоже, одна явная ошибка (я её закоментирую в коде). не х а у должен быть (помоему). - это похоже основная ошибка.
И потом, между 120 и 140 (последнее else) там фиксированное значение - тоже может дёргать. И ещё проверьте - когда с пульта сигнала нет...

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
// -------------------  ЧАСТЬ ОСИ Y  -------------------
      if (valueOneY > 140)
      {
        valueTwoY = map(valueOneY, 140, 255, 0, 255);
        // Левая часть
        digitalWrite(OL_PWM, LOW ); 
        digitalWrite(OR_PWM, HIGH);  
        analogWrite (OEN, valueTwoY );    
 
        // Правая часть 
        digitalWrite(TL_PWM, HIGH ); 
        digitalWrite(TR_PWM, LOW);  
        analogWrite (TEN, valueTwoY );
      }
    
      else if (valueOneY < 120)
      {
      valueTwoY = map(valueOneY, 120, 0, 0, 255);
 
        // Левая часть
        digitalWrite(OL_PWM, HIGH ); 
        digitalWrite(OR_PWM, LOW);  
        analogWrite (OEN,  valueTwoX); // здесь должно быть valueTwoY. 
 
        // Правая часть
        digitalWrite(TL_PWM, LOW);  
        digitalWrite(TR_PWM, HIGH );  
        analogWrite (TEN, valueTwoY);
      }
 
      else if (valueOneX > 140)
      {
        valueTwoX = map(valueOneX, 140, 255, 0, 255);
 
        // Левая часть
        digitalWrite(OL_PWM, LOW);  
        digitalWrite(OR_PWM, HIGH );  
        analogWrite (OEN, valueTwoX);
 
        // Правая часть
        digitalWrite(TL_PWM, LOW);  
        digitalWrite(TR_PWM, HIGH );  
        analogWrite (TEN, valueTwoX);
      }
 
      else if (valueOneX < 120)
      {
        valueTwoX = map(valueOneX, 120, 0, 0, 255);
 
        // Левая часть
        digitalWrite(OL_PWM, HIGH);  
        digitalWrite(OR_PWM, LOW );  
        analogWrite (OEN, valueTwoX);
 
        // Правая часть
        digitalWrite(TL_PWM, HIGH);  
        digitalWrite(TR_PWM, LOW );  
        analogWrite (TEN, valueTwoX);
      }
    
      else
      {
        // Левая часть
        digitalWrite(OL_PWM, HIGH);  
        digitalWrite(OR_PWM, HIGH);  
        analogWrite (OEN,    100 );
 
        // Правая часть
        digitalWrite(TL_PWM, HIGH);  
        digitalWrite(TR_PWM, HIGH);  
        analogWrite (TEN,     100);
      }
1
 Аватар для TEXNIKK
1 / 1 / 0
Регистрация: 15.08.2024
Сообщений: 5
29.03.2025, 12:53  [ТС]
Спасибо большое, сделал то, что вы закомментировали, стало заметно лучше, но проблема полностью не исчезла.
1) Вы также написали что в последнем else фиксированное значение. В этом else идет торможение( то есть если ничего не тронуто то торможу ), а как это можно сделать не фиксированным?
2) По поводу сигнала с пульта(я так понял выключить пульт): дергания остаются
0
284 / 60 / 12
Регистрация: 15.05.2019
Сообщений: 293
29.03.2025, 18:41
я имел ввиду что джойстик когда по центру, то должен выдавать возможно 128, но он не может точно всегда выдавать такое значение - колебания всегда есть. А драйвера робота тут же обрабатывают, потому что у Вас всё время опрос в цикле без особой обработки сигнала. Видите у Вас 140 и 120 - а внутри ничего нет - это что-то вроде deadzone, на которую контроллер не реагирует.
Я думаю, что может поможет поставить фильтр чтобы подавал сигнал на моторы, если отклонение не более чем 2-4, то сигналы не меняются, и возможно это предотвратит дёргания.

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
// Переменные для джостика
int valueTwoY; 
int valueTwoX; 
int lastY = 128; // надеюсь что джойстик по центру даёт 128 *****
int lasyX = 128;
//////////////////////////
 // Левая часть
        digitalWrite(OL_PWM, LOW ); 
        digitalWrite(OR_PWM, HIGH);  
       // analogWrite (OEN, valueTwoY );    
       if (abs(valueTwoY - lastY) > 2) {                 // 2 - это дрейф джойстиков, можно увеличить до 5
            analogWrite(OEN, valueTwoY);
            lastY = valueTwoY;
        }
 
        // Правая часть 
        digitalWrite(TL_PWM, HIGH ); 
        digitalWrite(TR_PWM, LOW);  
        //analogWrite (TEN, valueTwoY );
        if (abs(valueTwoY - lastY) > 2) {               // и везде где такое тоже поменять соответственно
            analogWrite(TEN, valueTwoY);
            lastY = valueTwoY;
        }
//////////////////////////
 else
      {
        // Левая часть
        digitalWrite(OL_PWM, HIGH);  
        digitalWrite(OR_PWM, HIGH);  
        analogWrite (OEN,    100 );  //*** здесь возможно не 100, а 0 должен быть (или 128 ??? ) 
 
        // Правая часть
        digitalWrite(TL_PWM, HIGH);  
        digitalWrite(TR_PWM, HIGH);  
        analogWrite (TEN,     100); //*** здесь возможно не 100, а 0 должен быть (или 128 - попробуйте)
      }
.////////////////////////
 // -------------------  Сервоприводы  -------------------
      // Управление сервоприводами только, если тумблер 0
      if (recieved_data[2] == 0 && recieved_data[4] == 0)
      {
        
        servoOne.write(map(recieved_data[5], 0, 255, 0, 180));  // везде по коду где 270 поставьте 180 
        servoTwo.write(map(recieved_data[6], 0, 255, 0, 270));  // для проверки какие у вас step motors
        servoThree.write(map(recieved_data[7], 0, 255, 0, 270));
        servoFive.write(map(recieved_data[10], 0, 255, 0, 270));
      }
////////////////////////////////
0
 Аватар для TEXNIKK
1 / 1 / 0
Регистрация: 15.08.2024
Сообщений: 5
29.03.2025, 19:23  [ТС]
Я изменил код(надеюсь что правильно), помехи остались. Роботу конечно стало легче, но когда моторы на полную работают, то его все равно начинает трясти. Но воть с этим кодом при движении назад сначала срабатывает одна гусеница а потом вторая(странное явление). А deadzone я как раз и делал для того, чтобы убрать колебания в стартовом положении джостиков. Но вроде как значения джостика не колеблются. Я постарался кинуть код в c++, но у меня он его не выделяет. Сервы у меня на 270 градусов, но попробую поменять. А у вас нет телеграма?
И может быть такой фильтр стоит на сервы поставить, если такое вообще возможно.

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
       int lastY = 129;
       int lastX = 126;
 
       if (valueOneY > 130)
      {
        valueTwoY = map(valueOneY, 130, 255, 0, 255);
        
        // Левая часть
        digitalWrite(OL_PWM, LOW ); 
        digitalWrite(OR_PWM, HIGH);  
        // analogWrite (OEN, valueTwoY );    
        if (abs(valueTwoY - lastY) > 2) 
        {
          analogWrite(OEN, valueTwoY);
          lastY = valueTwoY;
        }
 
        // Правая часть 
        digitalWrite(TL_PWM, HIGH ); 
        digitalWrite(TR_PWM, LOW);  
        //analogWrite (TEN, valueTwoY );
        if (abs(valueTwoY - lastY) > 2) 
        {
          analogWrite(TEN, valueTwoY);
          lastY = valueTwoY;
        }
      }
    
      else if (valueOneY < 125)
      {
        valueTwoY = map(valueOneY, 125, 0, 0, 255);
 
        // Левая часть
        digitalWrite(OL_PWM, HIGH); 
        digitalWrite(OR_PWM, LOW );  
        // analogWrite (OEN, valueTwoY );    
        if (abs(valueTwoY - lastY) > 2) 
        {
          analogWrite(OEN, valueTwoY);
          lastY = valueTwoY;
        }
 
        // Правая часть 
        digitalWrite(TL_PWM, LOW ); 
        digitalWrite(TR_PWM, HIGH);  
        //analogWrite (TEN, valueTwoY );
        if (abs(valueTwoY - lastY) > 2) 
        {
          analogWrite(TEN, valueTwoY);
          lastY = valueTwoY;
        }
      }
 
      else if (valueOneX > 130)
      {
        valueTwoX = map(valueOneX, 130, 255, 0, 255);
 
        // Левая часть
        digitalWrite(OL_PWM, LOW ); 
        digitalWrite(OR_PWM, HIGH);  
        // analogWrite (OEN, valueTwoY );    
        if (abs(valueTwoX - lastX) > 2) 
        {
          analogWrite(OEN, valueTwoX);
          lastX = valueTwoX;
        }
 
        // Правая часть 
        digitalWrite(TL_PWM, LOW ); 
        digitalWrite(TR_PWM, HIGH);  
        //analogWrite (TEN, valueTwoY );
        if (abs(valueTwoX - lastX) > 2) 
        {
          analogWrite(TEN, valueTwoX);
          lastX = valueTwoX;
        }
 
      }
 
      else if (valueOneX < 125)
      {
        valueTwoX = map(valueOneX, 125, 0, 0, 255);
        // Левая часть
        digitalWrite(OL_PWM, HIGH ); 
        digitalWrite(OR_PWM, LOW);  
        // analogWrite (OEN, valueTwoY );    
        if (abs(valueTwoX - lastX) > 2) 
        {
          analogWrite(OEN, valueTwoX);
          lastX = valueTwoX;
        }
 
        // Правая часть 
        digitalWrite(TL_PWM, HIGH ); 
        digitalWrite(TR_PWM, LOW);  
        //analogWrite (TEN, valueTwoY );
        if (abs(valueTwoX - lastX) > 2) 
        {
          analogWrite(TEN, valueTwoX);
          lastX = valueTwoX;
        }
      }
    
      else
      {
        // Левая часть
        digitalWrite(OL_PWM, HIGH);  
        digitalWrite(OR_PWM, HIGH);  
        analogWrite (OEN,    128 );
 
        // Правая часть
        digitalWrite(TL_PWM, HIGH);  
        digitalWrite(TR_PWM, HIGH);  
        analogWrite (TEN,     128);
      }
0
284 / 60 / 12
Регистрация: 15.05.2019
Сообщений: 293
30.03.2025, 03:16
Цитата Сообщение от TEXNIKK Посмотреть сообщение
И может быть такой фильтр стоит на сервы поставить, если такое вообще возможно.
Можно конечно. Даже можно сделать проверку на 270 или 180 и уменьшить дёргание при повороте. Стоп для нуля, но поменяйте сами (я смотрю вы 128 на стоп поставили).

******
Пояснения (решил добавить). Улучшения с:
- мёртвой зоной (DEADZONE) для джойстика ;
- защитой от дрожания (abs(...) > 2) ; (это когда-то в 92м я от дребезга контактов такое придумал на ассемблере для ВМ80, вот теперь и для джойстика понадобилось на Си. можете от 2 до 5 пробовать увеличить, может получше будет)
- автостопом, если сигнал не приходит (signalTimeout),
- функцией stopMotors(), (это просто в отдельной функции)
- защитой сервоприводов (writeClamped), (эта функция помягче).
- отдельной функцией lineFollow(). ('nj тоже в отдельной функции)

// Если серво до 180°, то перепишите везде так
writeClamped(servoFour, map(recieved_data[8], 0, 255, 0, 180), 180);

// Если до 270° , то перепишите везде так
writeClamped(servoFour, map(recieved_data[8], 0, 255, 0, 270), 270);

// вариант что в коде - просто обрезает до 180
writeClamped(servoFour, map(recieved_data[8], 0, 255, 0, 270), 180);
********

Попробуйте вот так:
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
// === TEXNIK Робот с улучшениями ===
 
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
 
// --- Сервоприводы ---
Servo servoOne, servoTwo, servoThree, servoFour, servoFive;
int s1, s2, s3, s4, s5;
 
// --- Линия ---
const int datL = 18;
const int datR = 19;
 
// --- Моторы ---
const uint8_t OEN = 3;
const uint8_t OL_PWM = 4;
const uint8_t OR_PWM = 5;
const uint8_t TEN = 6;
const uint8_t TL_PWM = 7;
const uint8_t TR_PWM = 8;
 
int lastY = 0; // 128 ???
int lastX = 0; // 128 ???
 
// --- NRF24 ---
RF24 radio(9, 10);
byte recieved_data[13];
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
 
unsigned long lastPacketTime = 0;
const unsigned long signalTimeout = 500;
const int DEADZONE = 10;
 
void setup() {
  Serial.begin(9600);
 
  servoOne.attach(A0);
  servoTwo.attach(A1);
  servoThree.attach(A2);
  servoFour.attach(A3);
  servoFive.attach(2);
 
  pinMode(OEN, OUTPUT);
  pinMode(OL_PWM, OUTPUT);
  pinMode(OR_PWM, OUTPUT);
  pinMode(TEN, OUTPUT);
  pinMode(TL_PWM, OUTPUT);
  pinMode(TR_PWM, OUTPUT);
 
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.setChannel(0x60);
  radio.setPALevel(RF24_PA_MAX);
  radio.setDataRate(RF24_250KBPS);
  radio.powerUp();
  radio.startListening();
}
 
void loop() {
  byte pipeNo;
  while (radio.available(&pipeNo)) {
    radio.read(&recieved_data, sizeof(recieved_data));
    lastPacketTime = millis();
 
    if (recieved_data[3] == 0) {
      int valueOneX = recieved_data[11];
      int valueOneY = recieved_data[12];
 
      if (recieved_data[2] == 0 && recieved_data[4] == 0) {
        writeClamped(servoFour, map(recieved_data[8], 0, 255, 0, 270), 180);
        writeClamped(servoOne, map(recieved_data[5], 0, 255, 0, 270), 180);
        writeClamped(servoTwo, map(recieved_data[6], 0, 255, 0, 270), 180);
        writeClamped(servoThree, map(recieved_data[7], 0, 255, 0, 270), 180);
        writeClamped(servoFive, map(recieved_data[10], 0, 255, 0, 270), 180);
      }
 
      if (recieved_data[4] == 1) {
        writeClamped(servoFour, map(105, 0, 255, 0, 270), 180);
        writeClamped(servoOne, map(84, 0, 255, 0, 270), 180);
        writeClamped(servoTwo, map(25, 0, 255, 0, 270), 180);
        writeClamped(servoThree, map(147, 0, 255, 0, 270), 180);
      }
 
      bool moved = false;
 
      if (abs(valueOneY - 128) > DEADZONE) {
        int power = map(abs(valueOneY - 128), 0, 127, 0, 255);
 
        if (valueOneY > 128) {
          digitalWrite(OL_PWM, LOW);
          digitalWrite(OR_PWM, HIGH);
          digitalWrite(TL_PWM, HIGH);
          digitalWrite(TR_PWM, LOW);
        } else {
          digitalWrite(OL_PWM, HIGH);
          digitalWrite(OR_PWM, LOW);
          digitalWrite(TL_PWM, LOW);
          digitalWrite(TR_PWM, HIGH);
        }
 
        if (abs(power - lastY) > 2) {
          analogWrite(OEN, power);
          analogWrite(TEN, power);
          lastY = power;
        }
 
        moved = true;
      }
      else if (abs(valueOneX - 128) > DEADZONE) {
        int power = map(abs(valueOneX - 128), 0, 127, 0, 255);
 
        if (valueOneX > 128) {
          digitalWrite(OL_PWM, LOW);
          digitalWrite(OR_PWM, HIGH);
          digitalWrite(TL_PWM, LOW);
          digitalWrite(TR_PWM, HIGH);
        } else {
          digitalWrite(OL_PWM, HIGH);
          digitalWrite(OR_PWM, LOW);
          digitalWrite(TL_PWM, HIGH);
          digitalWrite(TR_PWM, LOW);
        }
 
        if (abs(power - lastX) > 2) {
          analogWrite(OEN, power);
          analogWrite(TEN, power / 2);
          lastX = power;
        }
 
        moved = true;
      }
 
      if (!moved) {
        stopMotors();
      }
    }
    else {
      lineFollow();
    }
  }
 
  if (millis() - lastPacketTime > signalTimeout) {
    stopMotors();
  }
}
 
void stopMotors() {
  digitalWrite(OL_PWM, HIGH);
  digitalWrite(OR_PWM, HIGH);
  analogWrite(OEN, 0);
 
  digitalWrite(TL_PWM, HIGH);
  digitalWrite(TR_PWM, HIGH);
  analogWrite(TEN, 0);
}
 
void writeClamped(Servo& servo, int value, int maxDegrees) {
  value = constrain(value, 0, maxDegrees);
  servo.write(value);
}
 
void lineFollow() {
  servoTwo.write(map(95, 0, 255, 0, 180));
  servoThree.write(map(100, 0, 255, 0, 180));  
  servoFour.write(map(130, 0, 255, 0, 180));
  servoFive.write(map(73, 0, 255, 0, 180));
 
  int valLeftDat = digitalRead(datL);            
  int valRightDat = digitalRead(datR);
 
  Serial.print(valLeftDat); Serial.print("  ");
  Serial.print(valRightDat); Serial.println();
 
  int speed = 77;
 
  if (valLeftDat == 0 && valRightDat == 0) {
    digitalWrite(TL_PWM, LOW);
    digitalWrite(TR_PWM, HIGH);
    analogWrite(TEN, speed);
 
    digitalWrite(OL_PWM, LOW);
    digitalWrite(OR_PWM, HIGH);
    analogWrite(OEN, speed);
  }
  else if (valLeftDat == 0 && valRightDat == 1) {
    digitalWrite(TL_PWM, HIGH);
    digitalWrite(TR_PWM, LOW);
    analogWrite(TEN, speed);
 
    digitalWrite(OL_PWM, LOW);
    digitalWrite(OR_PWM, HIGH);
    analogWrite(OEN, speed);
  }
  else if (valLeftDat == 1 && valRightDat == 0) {
    digitalWrite(TL_PWM, LOW);
    digitalWrite(TR_PWM, HIGH);
    analogWrite(TEN, speed);
 
    digitalWrite(OL_PWM, HIGH);
    digitalWrite(OR_PWM, LOW);
    analogWrite(OEN, speed);
  }
  else {
    digitalWrite(TL_PWM, LOW);
    digitalWrite(TR_PWM, HIGH);
    analogWrite(TEN, speed);
 
    digitalWrite(OL_PWM, LOW);
    digitalWrite(OR_PWM, HIGH);
    analogWrite(OEN, speed);
  }
}
ну как-то так, в общем.
телеграм есть конечно, но меня там часто нет. ))
0
 Аватар для TEXNIKK
1 / 1 / 0
Регистрация: 15.08.2024
Сообщений: 5
30.03.2025, 13:07  [ТС]
Попробовал все как вы написали. Моторы только странно реагируют на джостик. Иногда влево и в право не работает и моторы включаются по одному, НО дребезг серв исчез на 99% и это ОЧЕНЬ КРУТО! Сервы у меня должны быть по заверениям китайцев дот 270, но что-то походу пошло не так) Я также вместо A0 A1 поставил 14 15(заменил типо на цифровые и дребезга почти и нет). Ваш алгоритм с 92 года работает до сих пор и это круто. Я бы сам хотел освоить c++, если знаете крутые курсы или что-то похожее, то расскажите) Я вот думаю, а есть ли смысл поставить кондер между пинами серв и земли? Я на ослике мерил и там шим скакал жутко
1
284 / 60 / 12
Регистрация: 15.05.2019
Сообщений: 293
30.03.2025, 14:22
Цитата Сообщение от TEXNIKK Посмотреть сообщение
Иногда влево и в право не работает и моторы включаются по одному, НО дребезг серв исчез на 99%
добавьте минимальную мощность (может маленькое значение возвращает иногда и не едет). (можно ещё уменьшить deadzone до 5, чтобы повысить чувствительность при малых отклонениях джойстика).
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
bool moved = false;
 
      if (abs(valueOneY - 128) > DEADZONE) {
          // вперёд/назад
        int power = map(abs(valueOneY - 128), 0, 127, 0, 255);
        power = constrain(power, 40, 255); // ***** добавьте минимальную мощность
 
        if (valueOneY > 128) {
            // вперёд
          digitalWrite(OL_PWM, LOW);
          digitalWrite(OR_PWM, HIGH);
          digitalWrite(TL_PWM, HIGH);
          digitalWrite(TR_PWM, LOW);
        } else {
            // назад
          digitalWrite(OL_PWM, HIGH);
          digitalWrite(OR_PWM, LOW);
          digitalWrite(TL_PWM, LOW);
          digitalWrite(TR_PWM, HIGH);
        }
 
        if (abs(power - lastY) > 2) {
          analogWrite(OEN, power);
          analogWrite(TEN, power);
          lastY = power;
        }
 
        moved = true;
      }
      else if (abs(valueOneX - 128) > DEADZONE) {
          // поворот влево/вправо
        int power = map(abs(valueOneX - 128), 0, 127, 0, 255);
        power = constrain (power, 40, 255); // добавьте минимальную мощность
 
        if (valueOneX > 128) {
            // поворот вправо
          digitalWrite(OL_PWM, LOW);
          digitalWrite(OR_PWM, HIGH);
          digitalWrite(TL_PWM, LOW);
          digitalWrite(TR_PWM, HIGH);
        } else {
            // поворот влево
          digitalWrite(OL_PWM, HIGH);
          digitalWrite(OR_PWM, LOW);
          digitalWrite(TL_PWM, HIGH);
          digitalWrite(TR_PWM, LOW);
        }
 
        if (abs(power - lastX) > 2) {
          analogWrite(OEN, power);
          analogWrite(TEN, power / 2);
          lastX = power;
        }
 
        moved = true;
      }
ps: слово "дребез" было тогда применимо к клавише клавиатуры. Тогда они были с посеребренными контактами. А к сервомоторам пожалуй нужно применять слово "рыскание", хотя не уверен.

Цитата Сообщение от TEXNIKK Посмотреть сообщение
есть ли смысл поставить кондер между пинами серв и земли?
Это лучше в интернете поискать. У Вас там на первом рисунке очень трудно читать Ваши каракули.

Добавлено через 59 минут
Цитата Сообщение от TEXNIKK Посмотреть сообщение
Я вот думаю, а есть ли смысл поставить кондер между пинами серв и земли?
Лучше поставить диод - между двумя импульсами шима мотор отдаёт энергию в сеть (направление тока обратно), а диод будет срезать - ну это как в реле, так реле включают обычно.

ps: Я только что посмотрел в интернете, там действительно ставят диод (в некоторых схемах). Хотя, по идее, на плате драйвера должен был бы быть уже...
pps: не перепутайте полярность диода, чтобы выходной транзистор не вылетел....

Добавлено через 8 минут
Цитата Сообщение от TEXNIKK Посмотреть сообщение
Я бы сам хотел освоить c++, если знаете крутые курсы или что-то похожее, то расскажите)
та нет, не знаю. Я просто электроникой увлёкся с 11,5 лет, а программирование само как-то "прицепилось"....
ppps: вспомнил как. ))) Я не мог долго понять (вопрос возник в 88м (хотя годя два до этого нам Фортран преподавали ))) ), и я тогда же, составил первую свою схему управления памятью на двух дешифаратора к155ид3), а ещё через пару лет попала в руки книга, и несколько месяцев изучал эту книгу Самофалова "Микропроцессоры") каким образом программа (написанная) управляет железом, и в результате меня прорвало - - я понял как текст управляет железом...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2025, 14:22
Помогаю со студенческими работами здесь

Помехи в бортовой сети при использовании DC-DC для питания GSM модуля
Задался питанием модуля GSM (4В, до 2А) питанием в условиях автомобиля - 12-16В. Для этого были опробованы схемы на многих Step-Down'ах под...

Блок питания создает помехи
При включении в розетку блока питания от настольной LED лампы (на вид как обычная зарядка) на экране телевизора появляются заметные помехи....

Как избавится от импульсной помехи?
Уважаемые форумчане! Столкнулся со следующей проблемой: дом в садоводстве оборудован многочисленной светодиодной подсветкой (в...

Помехи на землю от ADM660
Добрый день. В схеме стоит вот такой инвентор http://lib.chipdip.ru/143/DOC000143991.pdf Частота выбрана 120кГц, конденсаторы -...

Помехи в кабельном ТВ из-за Wi-Fi роутера
Доброго времени суток.простите если я обратилась не по адресу но у меня серьезная проблема.в меня дома есть 3 телевизора.каждый стоит в...


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

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

Новые блоги и статьи
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Полностью асинхронный счётчик на логике (сумматорах) трёх состояний и асинхронных регистрах трёх состояний. Структура "электронный Buttom Up"
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru