перевернутый ШИМ на motor shield-е (минимум 255, максимум 0) - как вернуть?
- Войдите на сайт для отправки комментариев
Доброго времени! Собственно ситуация:
Мотор-шилд от adafruit, с библиотекой AF-Motor. Управляю мотором постоянного тока (компьютерный куллер).
Проблема в том, что по какой-то причине, значение setSpeed(255) - равносильно выключению кулера, а значение 0 - максимальные обороты. Хотя по логике вещей (и во всех описаниях бибилиотеки) должно быть наоборот. Вопрос: как вернуть все на свои места?
Менять местами контакты подключения кулера к шилду пробовал - не помогло (т.к. крутится он тольк ов одну сторону, то просто стоит). Так же пробовал менять местами отдельные пины управляющие скоростью и направлением вращения (12, 11, 8, 7, 4).
Я помню что сталкивался с этой проблемой раньше, и вроде решил её ( а может и забил), но найти прошлых наработок не смог...
Может как-то можно обратить эти значения в библиотеке или в одном месте скетча, так чтобы потом пользоваться привычным подходом (255 -максимум, 0 - минимум).
На всякий случай ссылка на библиотекку https://github.com/adafruit/Adafruit-Motor-Shield-library/
и код скетча (урезанный код примера из библиотеки):
// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
#include <AFMotor.h>
AF_DCMotor motor(1);
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Motor test!");
// turn on motor
motor.setSpeed(200);
motor.run(RELEASE);
}
void loop() {
uint8_t i;
Serial.print("tick");
motor.run(FORWARD);
for (i=0; i<255; i++) { //тут скорость падает, а должна расти
motor.setSpeed(i);
Serial.println(i);
delay(200);
};
Serial.print("tech"); // остановка
motor.run(RELEASE);
delay(1000);
Serial.print("tock"); //тут идет разгон, а должно быть наоборот.
for (i=255; i!=0; i--) {
motor.setSpeed(i);
Serial.println(i);
delay(200);
};
Serial.print("tech"); // остановка
motor.run(RELEASE);
delay(1000);
}
Ну, в библиотеке, в методе setSpeed поставьте первой строкой типа n = 255 - n; (вместо n испольуйте то имя параметра, которое там в библиотеке исполуется) - делов-то.
чтобы не ломать библиотеку можно использовать map() , наверное.....
i = map( i , 0 , 255 , 255 , 0 ) , нет ?
map само собой можно, но каждый раз городить такое в коде как-то моветон.
В библиотеке, ка ни странно, в этом месте стояло (255-speed); оставил просто speed - все зработало как надо.
Благодарю!)
map само собой можно, но каждый раз городить такое в коде как-то моветон.
В библиотеке, ка ни странно, в этом месте стояло (255-speed); оставил просто speed - все зработало как надо.
Благодарю!)
согласен !
Спасибо , ЕвгенийП !