Top.Mail.Ru
Ответы

Управление 2 движками через джостик

есть джостик и 2 движка подключение к l298n
как сделать чтобы когда джостиком показывал вперед крутились 2 движка в одну сторону когда назад в другую а если в вправо то оба в разные стороны а лево в другие
вот код я с инета слизал и ничего не понимаю

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
 int xValue, yValue; 
int ENA = 8; 
int in1 = 9; 
int in2 = 10; 
int ENB = 13; 
int in3 = 11; 
int in4 = 12; 
int xPin = A1; 
int yPin = A0;   // Ось Y подключена к Analog 0 
void setup() 
{ 
  pinMode(ENA, OUTPUT); 
  pinMode(ENB, OUTPUT); 
  pinMode(in1, OUTPUT); 
  pinMode(in2, OUTPUT); 
  pinMode(in3, OUTPUT); 
  pinMode(in4, OUTPUT); 
  pinMode(xPin, INPUT); 
  pinMode(yPin, INPUT); 
  Serial.begin(9600); 
} 
void loop() 
{ 
//читаем значения с джойстика и ремапим их от 0 до 252 
xValue = map(analogRead(xPin), 0, 1024, 0, 252); 
yValue = map(analogRead(yPin), 0, 1024, 0, 252); 
Serial.print(xValue); //выводим значение x 
Serial.print("\t"); //отступ 
Serial.print(yValue); //выводим значение y 
Serial.print("\t"); //отступ 
if (xValue <= 100) 
{ 
digitalWrite(ENA, HIGH); // выключаем канал A 
digitalWrite(in1, HIGH); 
digitalWrite(in2, LOW); 
} 
else if (xValue > 101 && xValue <149) 
{ 
digitalWrite(in1, LOW); 
digitalWrite(in2, LOW); 
} 
if (xValue >= 150) 
{ 
digitalWrite(ENA, HIGH); // выключаем канал A 
digitalWrite(in1, LOW); 
digitalWrite(in2, HIGH); 
} 
else if (xValue > 101 && xValue <149) 
{ 
digitalWrite(in1, LOW); 
digitalWrite(in2, LOW); 
} 
/////////////////////////////////////////////////////////////////////////////////////////////// 
if (yValue <= 100) 
{ 
digitalWrite(ENB, HIGH); // выключаем канал A 
digitalWrite(in3, HIGH); 
digitalWrite(in4, LOW); 
} 
else if (yValue > 101 && yValue <149) 
{ 
digitalWrite(in3, LOW); 
digitalWrite(in4, LOW); 
} 
if (yValue >= 150) 
{ 
digitalWrite(ENB, HIGH);  // включаем канал B 
digitalWrite(in3, LOW); 
digitalWrite(in4, HIGH); 
} 
else if (yValue > 101 && yValue <149) 
{ 
digitalWrite(in3, LOW); 
digitalWrite(in4, LOW); 
} 
} 
По дате
По рейтингу
Аватар пользователя
Новичок
4мес

ькроме того, что что то слизал, нужно ещё правильно подключить двигатели.

Аватар пользователя
Искусственный Интеллект
4мес

Не беритесь за сложные проекты, пока не освоите азы. Изучите схему драйвера для начала. Там 2 одинаковых Н-моста, управляемых логическими уровнями.
То, что начинается с int - задание переменных для каждого используемого пина (4 управляющих и 2 разрешающих).
То, что в void_setup - используемым пинам задаются режимы работы (вход/выход). Serial.begin - вывод в последовательный порт для отладки (можно потом закомментировать все, что начинается с Serial). Часть void_setup выполняется однократно при запуске программы.
Теперь главная часть, выполняемая снова и снова - void_loop. В первую очередь считываются показания положения осей джойстика (xValue & yValue) и переводятся в значения ШИМ (которые, впрочем, не используются по назначению).
Потом идет вывод в порт значений (это только для отладки!). После этого уже начинается контроль самих движков. Обе части (линия из слэшей) одинаковы, поэтому рассмотрим только первую.
Если значение оси меньше или равно 100 (движение назад), то движок включается в одном направлении.
Если значение от 101 до 149 (около среднего положения), то движок остановлен.
Если значение больше или равно 150 (движение вперед), то движок включается в другом направлении.
Вот на основании этих данных и меняйте код под свои нужды.
ЗЫ. Буду дома - попробую сделать код под задачу.

Аватар пользователя
Искусственный Интеллект
4мес

А если джойстик и вперёд и вправо одновременно?

Аватар пользователя
Просветленный
4мес

Дурака не валяй, приобрети регулятор хода и всё.