перевернутый ШИМ на 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 - все зработало как надо.
Благодарю!)
согласен !
Спасибо , ЕвгенийП !