Здравствуйте! в наличии Arduino Uno R3 + L298N + 2DC мотора + Джойстик помогите, пожалуйста, допилить код, возможно за небольшое вознаграждение. рулится только один мотор в одну сторону с одинаковой скоростью при положении джойстика в левый верхний угол, т.е. наискосок. Влево или вправо, вверх или вниз - результата никакого, Хотелось бы, чтобы джойстик управлял как направлением вращения моторов, так и скоростью. Помогите, кто чем может Заранее огромное СПАСИБО! Код (C++): 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(in1, HIGH); digitalWrite(in2, LOW); } else if (xValue > 101 && xValue <149) { digitalWrite(in1, LOW); digitalWrite(in2, LOW); } if (xValue >= 150) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } else if (xValue > 101 && xValue <149) { digitalWrite(in1, LOW); digitalWrite(in2, LOW); } /////////////////////////////////////////////////////////////////////////////////////////////// if (yValue <= 100) { digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } else if (yValue > 101 && yValue <149) { digitalWrite(in3, LOW); digitalWrite(in4, LOW); } if (yValue >= 150) { digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } else if (yValue > 101 && yValue <149) { digitalWrite(in3, LOW); digitalWrite(in4, LOW); } } схема подключения прилагается
Первое -- посмотрите внимательней на этот участок кода: Код (C++): int ENA = 8; int in1 = 9; int in2 = 10; int ENB = 13; int in3 = 11; int in4 = 12; и на схему подключения. Второе -- пины 'ENA' и 'ENB' по задумке должны управлять включением/выключением каналов, но в коде нет этого "управления". Нужно добавить что-то вроде: Код (C++): ..... digitalWrite(ENA, LOW); // выключаем канал A ..... digitalWrite(ENB, HIGH); // включаем канал B .....
Еще раз спасибо! Действительно, схема подключения была не правильна, я тупо слизал оттуда где нашел) сейчас соединил все правильно, добавил в код ваши рекомендации, теперь движки работают как надо, но вот скорость не регулируется : ( посоветуйте, пожалуйста, что можно подправить чтобы скорость регулировалась от джойстика, спасибо) Код (C++): 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); } }
Первое, что приходит в голову -- это ШИМ (PWM). Читайте про функцию 'analogWrite()'. В случае с L298 возможны два варианта: сигнал ШИМ подавать на контакты ENA, ENB драйвера -- потребуется два канала ШИМ; ШИМ подавать на контакты 'in1' .. 'in4' -- потребуется четыре канала. В чём особенности этих способов можно посмотреть в документации к драйверу L298.
GGV, если не составит труда - поделитесь еще соображениями по скетчу.. С вашим скетчем у меня происходит следующее.. Стоит только перевести джойстик с нейтрального положения в направлении управления Мотором2, то: 1. Один мотор крутится постоянно "назад". 2. Мотор2 управляется джойстиком, но только при движении рычага вверх(вперед) и влево (назад) Вы изменяли еще как-то свой скетч? Схема та же - все соединения несколько раз перепроверил..
Код (C++): int xValue, yValue; int xValue1, yValue1; int xValue2, yValue2; int in1 = 9; int in2 = 10; int in3 = 11; int in4 = 6; int xPin = A1; int yPin = A0; // Ось Y подключена к Analog 0 void setup() { 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); xValue1 = map(xValue, 117, 0, 0, 252); yValue1 = map(yValue, 117, 0, 0, 252); xValue2 = map(xValue, 129, 252, 0, 252); yValue2 = map(yValue, 129, 252, 0, 252); if (xValue <= 114) { analogWrite(in1, xValue1); analogWrite(in2, LOW); } else if (xValue > 115 && xValue <129) { analogWrite(in1, LOW); analogWrite(in2, LOW); } if (xValue >= 131) { analogWrite(in1, LOW); analogWrite(in2, xValue2); } else if (xValue > 115 && xValue <129) { analogWrite(in1, LOW); analogWrite(in2, LOW); } /////////////////////////////////////////////////////////////////////////////////////////////// if (yValue <= 114) { analogWrite(in3, yValue1); analogWrite(in4, LOW); } else if (yValue > 115 && yValue <129) { analogWrite(in3, LOW); analogWrite(in4, LOW); } if (yValue >= 131) { analogWrite(in3, LOW); analogWrite(in4, yValue2); } else if (yValue > 115 && yValue <129) { analogWrite(in3, LOW); analogWrite(in4, LOW); } }
ПравИльно - перед тем как постить что-то на форум, ознакомиться с его правилами. В каждом разделе вверху прикреплена тема "Как пользоваться редактором" Ну и в 33 года можно было бы уже выучить, как пишутся слова "правИльно", "гусЕничный" - или хотя б начать пользоваться словариком.. ЗЫ Если русский - неродной, последнее замечание снимается..
ну в принципе русский язык это мой минус я особо не вдаюсь в тонкости как меня поймут, тем что я не поэт я особо не расстраиваюсь. я знаю свои сильные стороны. я увидел в первые ардуино в утубе загорелся-> купил-> пришло-> взял с первого форума и понял как все работает и не пойму почему же ты гуру, что не смог помочь нубу, или ты наверное все таки не за содержанием следишь своих мысли, а за качеством исполнения в передачи их. ну тем немение увидеть толку по теме от такого гуру не представилось. ты наверное модератор, ну так возьми да исправь. полезнее будет для форума.
Господа сори за офтоп, НО после таких вот постов, волей не волей вспоминаешь песенку Вани Воробья "..поколение пепси сменилось поколением, ЯГУАР...", а фильм "Идиократия" становится пророческим...
покумекал есчо часик и решил сделать чтобы одним джойстиком управляться машинка одновременно в перед и при наклоне в лево или вправо одно из колесиков притормаживает и при этом получается поворот. задача решина, небольшое неудобство нужна калибровка. Код (C++): int xValue, yValue; int in1 = 9; int in2 = 10; int in3 = 11; int in4 = 6; int xPin = A1; int yPin = A0; // Ось Y подключена к Analog 0 void setup() { 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); if (xValue <= 114) { int xVa1, yVa1; xVa1 = map(xValue, 114, 0, 0, 252); //функция для масштабирования можно изменять для изменения скорости yVa1 = map(yValue, 114, 0, 0, 252); //функция для масштабирования можно изменять для изменения скорости if (yValue <= 114) { int xV; xV = xVa1-yVa1; //притормаживание левого колеса во время движения в перед можно по другой формуле analogWrite(in1, xV); analogWrite(in3, xVa1); } else if (yValue > 115 && yValue <129) { analogWrite(in1, xVa1); analogWrite(in3, xVa1); analogWrite(in2, LOW); analogWrite(in4, LOW); } if (yValue >= 131) { int xV; xV = xVa1-yVa1;//притормаживание правого колеса во время двежения в перед можно по другой формуле analogWrite(in1, xVa1); analogWrite(in3, xV); } else if (yValue > 115 && yValue <129) { analogWrite(in1, xVa1); analogWrite(in3, xVa1); analogWrite(in2, LOW); analogWrite(in4, LOW); } } else if (xValue > 115 && xValue <129) { analogWrite(in1, LOW); analogWrite(in2, LOW); analogWrite(in3, LOW); analogWrite(in4, LOW); } if (xValue >= 131) { int xVa2, yVa2; xVa2 = map(xValue, 129, 252, 0, 252); //функция для масштабирования можно изменять для изменения скорости yVa2 = map(yValue, 129, 252, 0, 252); //функция для масштабирования можно изменять для изменения скорости if (yValue <= 114) { int xV; xV = xVa2-yVa2; //притормаживание правого колеса во время движения назад можно по другой формуле analogWrite(in2, xV); analogWrite(in4, xVa2); } else if (yValue > 115 && yValue <129) { analogWrite(in1, LOW); analogWrite(in3, LOW); analogWrite(in2, xVa2); analogWrite(in4, xVa2); } if (yValue >= 131) { int xV; xV = xVa2-yVa2; //притормаживание левого колеса во время движения назад можно по другой формуле analogWrite(in2, xVa2); analogWrite(in4, xV); } else if (yValue > 115 && yValue <129) { analogWrite(in1, LOW); analogWrite(in3, LOW); analogWrite(in2, xVa2); analogWrite(in4, xVa2); } } else if (xValue > 115 && xValue <129) { analogWrite(in1, LOW); analogWrite(in2, LOW); analogWrite(in3, LOW); analogWrite(in4, LOW); } }