На Motor shield пищат двигатели. Ardino CAR

Skaper
Offline
Зарегистрирован: 24.06.2012

Пищат двигатели на Motor shield, когда пытаюсь изменить скорость ниже 255, и чем ниже тем громче писк. На скорости в 255 все нормально... Может проблемы в частоте ШИМ? Как её изменит используя библиотеку AFMotor? Пробовал вот так, нет изменений:

AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);

 фото машинки. Управляю через bluetooth с планшета. Arduino UNO R3, питание напрямую к  Motor shield с бп 12в 1000мА.


maksim
Offline
Зарегистрирован: 12.02.2012

Собственно, именно так она и меняется, странно что вы слышите писк.

А попробуйте снизить частоту, бует ли слышна разница?

AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);

 

Skaper
Offline
Зарегистрирован: 24.06.2012

1, 8, 64 пробовал, то же самое писк на 200 слышен и до 0 усиливается. 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы вопроса не поняли - тональность писка меняется при изменении частоты ШИМа?

Skaper
Offline
Зарегистрирован: 24.06.2012

Да, на 1 - писк, на 64 как гудок. Но громкость почти одинаковая.

madmax96
Offline
Зарегистрирован: 22.09.2011

Там у вас в машинке, вероятно, дроссели стоят. Они и пищат. Подайте на моторы постоянное напряжение - писк пройдет

madmax96
Offline
Зарегистрирован: 22.09.2011

Skaper пишет:

Пищат двигатели на Motor shield, когда пытаюсь изменить скорость ниже 255, и чем ниже тем громче писк. На скорости в 255 все нормально... Может проблемы в частоте ШИМ? Как её изменит используя библиотеку AFMotor? Пробовал вот так, нет изменений:

AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);

 фото машинки. Управляю через bluetooth с планшета. Arduino UNO R3, питание напрямую к  Motor shield с бп 12в 1000мА.

255 - это постоянно 5В на выходе. Потому и не пищит. 

maksim
Offline
Зарегистрирован: 12.02.2012

madmax96 пишет:

Там у вас в машинке, вероятно, дроссели стоят. Они и пищат. 

На фото нет дросселей. Пищат двигатели.

madmax96 пишет:

Подайте на моторы постоянное напряжение - писк пройдет

Великолепный подход - зачем решать проблему, можно просто забить и не пользоваться ШИМом.

maksim
Offline
Зарегистрирован: 12.02.2012

madmax96 пишет:

Skaper пишет:

Пищат двигатели на Motor shield, когда пытаюсь изменить скорость ниже 255, и чем ниже тем громче писк. На скорости в 255 все нормально... Может проблемы в частоте ШИМ? Как её изменит используя библиотеку AFMotor? Пробовал вот так, нет изменений:

AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);

 фото машинки. Управляю через bluetooth с планшета. Arduino UNO R3, питание напрямую к  Motor shield с бп 12в 1000мА.

255 - это постоянно 5В на выходе. Потому и не пищит. 

Думаю, ТС больше интересует почему пищит, а не почему не пищит.

maksim
Offline
Зарегистрирован: 12.02.2012

Skaper пишет:

Да, на 1 - писк, на 64 как гудок. Но громкость почти одинаковая.

То есть с увеличением частоты тон звука становится ниже? Покажите весь код.

Skaper
Offline
Зарегистрирован: 24.06.2012

Писк идет независимо от кода

когда устанавливаю например motor.setSpeed(100) и при движении в любом направлении идет этот  писк.

Вот например такой для теста делал:

#include <AFMotor.h>
#include <SoftwareSerial.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);
SoftwareSerial BTSerial(0,1); //RX, TX
char vcmd; //Для команд с BT
int vspeedL, vspeedR; //Скорость
int vspeedr = 200;
int s=0;
void setup(){
BTSerial.begin(9600);
}
void loop(){
  
if(BTSerial.available()){
  vcmd=(char)BTSerial.read();
  inBACKWARD();
  switch(vcmd){
    case 'F': //команда Вперед с планшета 
  motor1.setSpeed(s+=50);
  motor2.setSpeed(s+=50);
  motor3.setSpeed(s+=50);
  motor4.setSpeed(s+=50);
     if(s>255){s=0;}
      break;
  }
  
}
void inBACKWARD(){
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD); 
}

 

madmax96
Offline
Зарегистрирован: 22.09.2011

Почему пищит я выше написал

maksim
Offline
Зарегистрирован: 12.02.2012

Вы предположили ЧТО может пищать, а вот ПОЧЕМУ слышен писк двигателей при расчетной частоте ШИМа 64кГц вопрос остается открытым. Можно конечно предположить что ТС сверх-человек и может слышать звуки частотой свыше 20кГц и(или) посоветовать ему просто заткнуть уши и не париться.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну для начала - зачем вы на выводах, на которых присутствует хардовый UART, пользуете программный UART ?

#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);
char vcmd; //Для команд с BT
int vspeedL, vspeedR; //Скорость
int vspeedr = 200;
int s=0;
void setup(){
  Serial.begin(9600);
}
void loop(){

  if(Serial.available()){
    vcmd=(char)Serial.read();
    inBACKWARD();
    switch(vcmd){
    case 'F': //команда Вперед с планшета 
      motor1.setSpeed(s+=50);
      motor2.setSpeed(s+=50);
      motor3.setSpeed(s+=50);
      motor4.setSpeed(s+=50);
      if(s>255){
        s=0;
      }
      break;
    }
  }

}
void inBACKWARD(){
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD); 
}

SoftwareSerial.h не использует таймеров, но зато она запрещает при вызове available() все прерывания - в этом может и быть причина писка.

maksim
Offline
Зарегистрирован: 12.02.2012

Так что попробуйте пример кода выше ,а дальше будем думать...

madmax96
Offline
Зарегистрирован: 22.09.2011

1) Подло переписывать свои ранние коменты. Это меняет смысл диалога.

2) Чего ты так накинулся? Некуда пар выпустить?

maksim
Offline
Зарегистрирован: 12.02.2012

1) Что я переписал от чего поменялся смысл диалога? Хотите верну назад ? Обычно поправляю ошибки и могу что-нить добавить, перефразировать, но смысла не меняю.

2) Да не накинулся совсем, просто не ясен ваш подход - "уводите тему в непонятное русло",а я пытаюсь помочь решить проблему ТС.

maksim
Offline
Зарегистрирован: 12.02.2012

Специально для вас пишу дополнение к посту выше отдельным постом.

...проблему ТС, вместо того что бы советовать не пользоваться ШИМом.

madmax96
Offline
Зарегистрирован: 22.09.2011

Молодец.

Я, конечно, библиотеку эту первый раз в жизни вижу. Тонкостей ее не знаю, но тем не менее. Отвечая на колкий постфактум дописанный максимом комментарий про сверчеловека - даже если шим там и 64кГц - ок. Ухом его не услышишь, конечно. Потому, вероятнее всего, что попимо модуляции шимом, все это дело еще модулиется звуковой частотой. И, чтобы это подтвердить - надо вырубить все(передачу данных на компорт и т.д.) и, тупо запустить мотор на постоянное вращение в одну сторону  с какой-то постоянной скажностью (не 255).

А, касательно кода, что приведен автором поста и подправлен максимом. Если смотреть бегло и, если в библиотеке нет каких-то особых фич, то он как-минимум, странен.

1) не понятно, зачем после приема данных в компорт используется функция заднего хода. Чтобы застопорить мотор таким образом, или что?

2) Мотор - инерционный прибор.Он мгновенно не срабатывает, а у вас в коде ни одного делая нет.  

Интересно было бы узнать, к каким ногам ардуины подключаются моторы

madmax96
Offline
Зарегистрирован: 22.09.2011

Я бы воткнул в конце лупа секундный делай, так как, скорее всего, дело в приеме данных. И да, странно, что он инициализирован программно. 

maksim
Offline
Зарегистрирован: 12.02.2012

Вот это уже по делу, только уж не секундную, а например 100 миллисекундную. Тогда и с софтовым UARTом будет нормально работать.

#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);
char vcmd; //Для команд с BT
int vspeedL, vspeedR; //Скорость
int vspeedr = 200;
int s=0;
void setup(){
  Serial.begin(9600);
}
void loop(){

  if(Serial.available()){
    vcmd=(char)Serial.read();
    inBACKWARD();
    switch(vcmd){
    case 'F': //команда Вперед с планшета 
      motor1.setSpeed(s+=50);
      motor2.setSpeed(s+=50);
      motor3.setSpeed(s+=50);
      motor4.setSpeed(s+=50);
      if(s>255){
        s=0;
      }
      break;
    }
    delay(100);
  }

}
void inBACKWARD(){
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD); 
}

 

Skaper
Offline
Зарегистрирован: 24.06.2012

Вот, написал такой код, для проверки, с комметариями, писк не пропал...

#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ); //На 64кГц самый тонкий, но слышен всеравно... 
AF_DCMotor motor2(2, MOTOR12_64KHZ); //А громкость писка меняеться от наприжения, 6В-тише, 12-громче  от того сколько 
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);
int _speed;
int motor_speed;

void setup(){
Serial.begin(9600);
}

void loop(){
 _speed= analogRead(A0); //переменный резистор
 motor_speed = map(_speed, 0, 1023, 0, 255);
 //Моторы заводяться на скорости 110, а писк пропадает на 130-145
 //А останавливаются, после разгона, на 90
 motor1.setSpeed(motor_speed);
 motor2.setSpeed(motor_speed);
 motor3.setSpeed(motor_speed);
 motor4.setSpeed(motor_speed);
 
 motor1.run(BACKWARD);
 motor2.run(BACKWARD);
 motor3.run(BACKWARD);
 motor4.run(BACKWARD);
 //Вывод скорости на монитор:
 Serial.println( motor_speed);
 //delay(100); - никакого воздействия при любой паузе...
 }

 

madmax96
Offline
Зарегистрирован: 22.09.2011

А если сериал порт закомментить?

maksim
Offline
Зарегистрирован: 12.02.2012

Значит все таки писк стал менне слышен и более высокий. А конденсаторы, которые параллельно двигателям у вас стоят, убирать пробовали?

madmax96
Offline
Зарегистрирован: 22.09.2011

Кстати, если не ошибаюсь, на шилде конденсаторы уже предусмотрены. Надо по схеме проверить