перевернутый ШИМ на motor shield-е (минимум 255, максимум 0) - как вернуть?

Draghkon
Offline
Зарегистрирован: 17.09.2013

Доброго времени! Собственно ситуация:

Мотор-шилд от 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);
  
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, в библиотеке, в методе setSpeed поставьте первой строкой типа n = 255 - n; (вместо n испольуйте то имя параметра, которое там в библиотеке исполуется) - делов-то.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

чтобы не ломать библиотеку можно использовать map() , наверное.....
i = map( i , 0 , 255 , 255 , 0 ) , нет ?

Draghkon
Offline
Зарегистрирован: 17.09.2013

map само собой можно, но каждый раз городить такое в коде как-то моветон. 

В библиотеке, ка ни странно, в этом месте стояло (255-speed); оставил просто speed  - все зработало как надо.

Благодарю!)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Draghkon пишет:

map само собой можно, но каждый раз городить такое в коде как-то моветон. 
В библиотеке, ка ни странно, в этом месте стояло (255-speed); оставил просто speed  - все зработало как надо.
Благодарю!)

согласен !
Спасибо , ЕвгенийП !