Помогите со скетчем, управление двигателями
- Войдите на сайт для отправки комментариев
Вс, 25/02/2018 - 02:11
Всем доброго дня!
Возникла такая проблема не могу никак заставить крутится движки на плате Romeo BLE mini В ней используется драйвер двигателя DRV8833PWR В котором по два входа на канал, один из которых ШИМ для управления скорость вращения.
Имеется скетч: в котором используется L298N
У меня не получается адаптировать скетч под драйвер двигателя DRV8833PWR
Помогите пожалйста
Сам скетч:
/*
Arduino Wireless Control using the NRF24L01 Transceiver module
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define enA 2 // Note: Pin 9 in previous video ( pin 10 is used for the SPI communication of the NRF24L01)
#define in1 4
#define in2 5
#define enB 3 // Note: Pin 10 in previous video
#define in3 6
#define in4 7
RF24 radio(8, 9); // CE, CSN
const byte address[6] = "00001";
char receivedData[32] = "";
int xAxis, yAxis;
int motorSpeedA = 0;
int motorSpeedB = 0;
void setup() {
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) { // If the NRF240L01 module received data
radio.read(&receivedData, sizeof(receivedData)); // Read the data and put it into character array
xAxis = atoi(&receivedData[0]); // Convert the data from the character array (received X value) into integer
delay(10);
radio.read(&receivedData, sizeof(receivedData));
yAxis = atoi(&receivedData[0]);
delay(10);
}
// Y-axis used for forward and backward control
if (yAxis < 470) {
// Set Motor A backward
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
// Set Motor B backward
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
}
else if (yAxis > 550) {
// Set Motor A forward
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
// Set Motor B forward
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 550, 1023, 0, 255);
motorSpeedB = map(yAxis, 550, 1023, 0, 255);
}
// If joystick stays in middle the motors are not moving
else {
motorSpeedA = 0;
motorSpeedB = 0;
}
// X-axis used for left and right control
if (xAxis < 470) {
// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
int xMapped = map(xAxis, 470, 0, 0, 255);
// Move to left - decrease left motor speed, increase right motor speed
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
// Confine the range from 0 to 255
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
if (motorSpeedB > 255) {
motorSpeedB = 255;
}
}
if (xAxis > 550) {
// Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
int xMapped = map(xAxis, 550, 1023, 0, 255);
// Move right - decrease right motor speed, increase left motor speed
motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped;
// Confine the range from 0 to 255
if (motorSpeedA > 255) {
motorSpeedA = 255;
}
if (motorSpeedB < 0) {
motorSpeedB = 0;
}
}
// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
if (motorSpeedA < 70) {
motorSpeedA = 0;
}
if (motorSpeedB < 70) {
motorSpeedB = 0;
}
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}
Например ошибки в 53 и 132 строках. А теперь посчитайте стоки и найдите указанные:)
на форуме не просто так есть правила публикации кода !
прочтите и выложите код по-правилам форума.
чтобы было проще Вам помогать приведите схему подключений.
Datasheet смотрели? В частности страницу 9, таблицу 2.
Да смотрел даташит!
Что вы поняли из этой таблицы, какие модификации исходного скетча производили?
Думаю, что вы понимаете, что раздел форума "Программирование" - это не отдел выполнения заказов и вам необходимо 90% работы сделать самому?
Внёс изменение согласно таблице, но по чему то не работает?
Таблицу №1 я видел. Посмотрите на Таблицу №2.
Видите, что PWM нужно подавать на разные ноги, в зависимости от того, в какую сторону надо крутить мотор?
За реверс же отвечает логическое значение 1 0 на одном из каналов. А за скорость другой канал PWM? т.е PWM в направлении вращении не участвуют, как я понял. Или я ошибаюсь?
Я ориентируюсь на ваше описание: " два входа на канал, один из которых ШИМ для управления скорость вращения".
Т.е. полагаю, что именно так на ардуину вы и заводите. Данной ситуации соответствует таблица 2.
Я бы для проверки сделал простой скетч, который на один выход давал PWM, а на другом менял HIGH/LOW раз в несколько секунд. Думаю, что это должно заставить мотор крутиться в разные стороны. Если это сработает, то перестраиваете исходный скетч с учетом таблицы 2.
PS. Да, в сущности для реверса, упрощенно, PWM перекидывать не надо. Однако, обратите внимание, что при этом меняются режимы работы двигателя (fast decay/slow decay). Если вам нужно оставаться в одном режиме, то придется еще и PWM перекидывать на другую ногу.
у LN298N сигнал PWM обычно подают на вход EN, а направление вращения задают комбинацией сигналов IN 0/1.
Тут, согласно тбл1. при обоих отключенных входах мотор предоставлен сам себе ибо его выходы в состоянии Z. Вот это Вам и надо.
Соответственно IN1=0, IN2=PWM -- едем в одну сторону, IN1=PWM, IN2=0 -- едем в другую сторону. А уж где там перед, где зад - как моторы подключите. Приятно то, что можно подать обе единицы и получить торможение коротко-замкнутым ротором.
Так какие нужно изменения внести? А то я что-то не пойму ни как
Чтобы понять - нужно написать маленький тестовый скетч. Завести в нем движок - несколько строчек.
Вы это сделали или ждете ЕвгенияП, который за всех код пишет?
const int pwm = 3; // вывод ШИМ const int in_1 = 5; // вывод направления двигателя void setup() { pinMode(pwm,OUTPUT); // Настраиваем ШИМ вывод на выход pinMode(in_1,OUTPUT); // Настраиваем логический выход } void loop() { // Вращение по часовой стрелки digitalWrite(in_1,HIGH); analogWrite(pwm,95); // установка pwm в значение 95 // Вращение двигателя по часовой стрелке 3 секунды. delay(3000); // Для вращения против часовой стрелки digitalWrite(in_1,LOW); analogWrite(pwm,95); // установка pwm в значение 95 delay(3000); // Вращение двигателя по часовой стрелке 3 секунды. }Скетч работает, но как реализовать остановку двигателя?
А вот Архат вам написал в #12: если подать через digitalWrite() LOW в оба входа - движок вращается по инерции, если HIGH - активно тормозит ротором.
const int pwm = 3; // вывод ШИМ const int in_1 = 5; // вывод направления двигателя const int in_2 = 3; void setup() { pinMode(pwm,OUTPUT); // Настраиваем ШИМ вывод на выход pinMode(in_1,OUTPUT); // Настраиваем логический выход } void loop() { // Вращение по часовой стрелки digitalWrite(in_1,HIGH); analogWrite(pwm,95); // установка pwm в значение 95 // Вращение двигателя по часовой стрелке 3 секунды. delay(3000); // Остановка digitalWrite(in_1,HIGH); digitalWrite(in_2,HIGH); delay(3000) ; // Для вращения против часовой стрелки digitalWrite(in_1,LOW); analogWrite(pwm,95); // установка pwm в значение 95 delay(3000); // Вращение двигателя по часовой стрелке 3 секунды. }Скетч работает! Останвка 3 сек.
Отлично.
Осталось только разобраться с перекидыванием PWM на разные INx, чтобы режим работы двигателя сохранять и можно интегрировать в логику первоначального скетча.
А вы подскажите как это можно сделать?
Подсказать как IN1 навесить на один PWM-пин, а IN2 на другой и по очереди писать в них через analogWrite?
Как в скетч это завести, в самый первый?
Вот те здрасте. Находите условие в кода, срабатывающее за движение в какую-то сторону и пишете туда свой код, как в тестовом скетче:
// Движение моторов вперед // Преобразуйте уменьшающиеся показания оси Y для обратного хода с 470 до 0 В значение от 0 до 255 для сигнала PWM для увеличения скорости двигателяПреобразуйте уменьшающиеся показания оси Y для обратного хода с 470 до 0 В значение от 0 до 255 для сигнала PWM для увеличения скорости двигателя motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); >>> сюда пишем команды из тестового скетча для движения вперед со скоростями motorSpeedA и motorSpeedB <<< ... // Движение моторов вперед >>> И сюда тоже пишем команды ... >>> И так далееНе получается!
Вы можете по скетчу моему накидать как правильно?
Да я-то могу, но вы же хотите научиться самостоятельно это делать, как я понимаю, раз вы написали в раздел "Программирование"? В противном случае есть раздел "Ищу исполнителя", который сэкономит вам время, но отберет некоторую сумму денег.
Вот вы сейчас запостили опять скетч, но я не вижу там никаких изменений. Давайте сначала определим, какие движения осуществляются и в каких строках. Пишите.
Я хочу чтобо мне помогли понять как это правильно сделать! Я по этому и написал в раздел программирование.
В скетче есть motorSpeedA = 0; его нужно менять?
Если считаете, что я вам не помогаю, то давайте подождем еще кого-нибудь, более отзывчивого.
Если вы знаете как можно сделать, почему не можете помочь?
Помочь ничего не делать?
Помощь подразумевает, что делаете все-таки Вы, а кто-то Вам помогает в этом. Но не делает вместо Вас, т.к. это уже не помощь.
А я сделал, написал мини скетч работы двигателя А дальше попросил помочь связать его с основным скетче. А что вы подразумеваете сделать за меня?
Да! Походу помощи не от кого ждать! Ладно, значит будем сами искать и думать как решить данный вопрос.
И это - правильно. Все что Вам было необходимо, Вы уже разобрались. Остальное - "как вписать это в мой (ли?) код?" - только ваших рук дело. Успеха! :)
Да! Походу помощи не от кого ждать! Ладно, значит будем сами искать и думать как решить данный вопрос.
Можем поменяться: вы вместо меня переписываете драйвер сетевого модуля, а я в ваш скетч моторы добавляю. Идет?
Да! Походу помощи не от кого ждать! Ладно, значит будем сами искать и думать как решить данный вопрос.
Можем поменяться: вы вместо меня переписываете драйвер сетевого модуля, а я в ваш скетч моторы добавляю. Идет?
нифига, - как только драйвер осилишь сразу за моторы...
?
Да! Походу помощи не от кого ждать! Ладно, значит будем сами искать и думать как решить данный вопрос.
Можем поменяться: вы вместо меня переписываете драйвер сетевого модуля, а я в ваш скетч моторы добавляю. Идет?
Если бы я знал как вам помочь, я помог бы вам переписать драйвер для сетевого модуля. Но так как, я не особо селен в среде программирования ардуино, то толку от меня 0. А если вы принципиально никому не хотите помогать, то какой смысл в ваших пустых комментариев и ответах?
Но так как, я не особо селен в среде программирования ардуино
А в какой среде программирования Вы сильны?
К теме это ни как не относится!
Почему не относится? Вот Вы написали фразу: "но так как, я не особо селен в среде программирования ардуино". Эта фраза подразумевает, что сложности у Вас именно со средой программирования Ардуино (Arduino IDE). То бишь проблем с самим языком программирования С/С++ у Вас нет? Или всё же Вам надо было написать так? - "но так как, я не особо силен в программировании".
Я как бы намекаю, что сложности у Вас не со "средой программирования ардуино", а с программированием в целом.
Если бы я знал как вам помочь, я помог бы вам переписать драйвер для сетевого модуля. Но так как, я не особо селен в среде программирования ардуино, то толку от меня 0. А если вы принципиально никому не хотите помогать, то какой смысл в ваших пустых комментариев и ответах?
Может вы сумеете назовать хотя бы одну причину, по которой мне нужно бросить всё своё и кинутся исправлять и отлаживать ваше?
Впрочем, действительно, что я сюда пишу. Надо было вообще не начинать. Глядишь - занимались бы сейчас тем, в чем сильны, а не ардуиной.
Почему не относится? Вот Вы написали фразу: "но так как, я не особо селен в среде программирования ардуино". Эта фраза подразумевает, что сложности у Вас именно со средой программирования Ардуино (Arduino IDE). То бишь проблем с самим языком программирования С/С++ у Вас нет? Или всё же Вам надо было написать так? - "но так как, я не особо силен в программировании".
Я как бы намекаю, что сложности у Вас не со "средой программирования ардуино", а с программированием в целом.
Язык программирования Arduno построен на C++ Соответственно если у меня есть проблемы с программированием в среде Arduino значит у меня есть проблемы с C++ Я надеюсь этот ответ удовлетворит вас?
Если бы я знал как вам помочь, я помог бы вам переписать драйвер для сетевого модуля. Но так как, я не особо селен в среде программирования ардуино, то толку от меня 0. А если вы принципиально никому не хотите помогать, то какой смысл в ваших пустых комментариев и ответах?
Может вы сумеете назовать хотя бы одну причину, по которой мне нужно бросить всё своё и кинутся исправлять и отлаживать ваше?
Впрочем, действительно, что я сюда пишу. Надо было вообще не начинать. Глядишь - занимались бы сейчас тем, в чем сильны, а не ардуиной.
Я вас заставлял писать мне код? Нет! Если для вас это не посильная и трудновыполнимая задача. И вы Сами не особо сильны в программировании Arduino. То какой смысл вам здесь показывать Свою значимость и "превосоходство", над тем что Вы сами не знаете?
И вы Сами не особо сильны в программировании Arduino.
Так что вы от меня тогда хотите-то?
.
И вы Сами не особо сильны в программировании Arduino.
Так что вы от меня тогда хотите-то?
Нет, от вас мне точно ничего не надо)
Vladimir555, вы тактически не правильно повели себя на этом форуме с самого начала.
а теперь, ещё и после препираний с людьми, которые хотели вам помочь, думаю вы не получите ни безвоздмездной, ни платной
помощи.
хотя задача ваша совсем не сложная.
если бы вы приложили хоть какое то усилие в программировании, а не копирование чужих кодов и пустую полемику, то давно радовались и управляли своей игрушкой.