#1 2015-01-21 10:18:16

pv_serg
Учасник
Зареєстрований: 2014-12-06
Повідомлень: 6

Помехи при ШИМ или ошибка?

Такое дело. Где-то пол года назад сделал ребенку машинку-робота на ультразвуковом сенсоре объезжавшая препятствия. Тогда  с ардуино только начинал знакомство. полистав просторы интернета-написал код (половину естественно стырил), пошлифовал его с месяц) - все. Работала машинка безукоризненно. Но захотелось присобачить модуль блютуз. Не вдаваясь в подробности-присобачил. Заработал (после пляски с бубном). Казалось бы все, дети играйтесь и не трожте меня больше. Но не тут то было. У машинки не было реализовано такое чувство как скорость движения. Ну тут, собственно, проблем не возникло. При работе через сенсор-изменение скорости нафиг не нужно, реализовал только в функции управления через блютуз.Вот и начались проблемы. При максимальной скорости движения-все четко, но стоить мне уменьшить скорость -как начинает непонятным образом крутиться серва. Еду вперед на 50% скорости-нормально, еду назад-серва с ума сходит, поворачиваю налево - нормально, направо-с ума сходит. В функции управлением через блютуз-серва никаким образом не проскакивает в коде. Вывод - помехи?  (менял пин подключения сервы- 0 результат). Кто что подскажет? Фрагмент кода с функцией управления по блютуз.

#include <Servo.h>   
const int motor1APin = 3;
const int motor2APin = 5;
const int motor3APin = 6;
const int motor4APin = 9;
const int vbtn = 2;
int vcmd;
Servo vservo;
const int vservo_array[5]={
  0,45,90,135,180};
byte vspeed;
int vservo_int;
int vmode;


//***************************************
void setup() {
  pinMode( motor1APin, OUTPUT);
  pinMode( motor2APin, OUTPUT);
  pinMode( motor3APin, OUTPUT);
  pinMode( motor4APin, OUTPUT);
  Serial.begin(9600);
vservo.attach(17); // МЕНЯЛ РАЗНЫЕ ПИНЫ
  vservo.write(90);
  pinMode(vbtn, INPUT);
     vspeed=0;
    }
//********************************************************************


void loop() {
      vmode = digitalRead(vbtn);
      switch (vmode) {
        case 0:
NoBT();
        break;
      case 1:
        // Режим управления через Bluetooth
BT();
        break;
      }
}

//*******************



void vforward() {

  analogWrite(motor1APin, vspeed);
  analogWrite(motor2APin, 0);
  analogWrite(motor3APin, vspeed);
  analogWrite(motor4APin, 0);
 
}
void back() {
  analogWrite(motor1APin,0);
  analogWrite(motor2APin, vspeed);
  analogWrite(motor3APin, 0);
  analogWrite(motor4APin, vspeed);

}
void vforwardRL() {
  analogWrite(motor1APin, vspeed);
  analogWrite(motor2APin, 0);
  analogWrite(motor3APin, 0);
  analogWrite(motor4APin, vspeed);
}
void vforwardL(){
  analogWrite(motor1APin, 0);
  analogWrite(motor2APin, vspeed);
  analogWrite(motor3APin, vspeed);
  analogWrite(motor4APin, 0);
}
void vbackwardRL() {
  analogWrite(motor1APin, 0);
  analogWrite(motor2APin, 0);
  analogWrite(motor3APin, 0);
  analogWrite(motor4APin, vspeed);
}

void vbackwardL() {
  analogWrite(motor1APin, vspeed);
  analogWrite(motor2APin, 0);
  analogWrite(motor3APin, 0);
  analogWrite(motor4APin, 0);
}
void left() {
  analogWrite(motor1APin, vspeed);
  analogWrite(motor2APin, 0);
  analogWrite(motor3APin, 0);
  analogWrite(motor4APin, vspeed);
}
void right() {
  analogWrite(motor1APin, 0);
  analogWrite(motor2APin, vspeed);
  analogWrite(motor3APin, vspeed);
  analogWrite(motor4APin, 0);
}
void vstop(){
  analogWrite(motor1APin, 0);
  analogWrite(motor2APin, 0);
  analogWrite(motor3APin, 0);
  analogWrite(motor4APin, 0);
}

//********************************************************
void BT(){
    if (Serial.available()) 
  vcmd = (char)Serial.read();
//vservo_int = LOW;  Пытался устанавливать пин сервы в 0-не помогло. Крутится зараза!!!
if (vcmd == '1') {
  vspeed = 25; }
if (vcmd == '2') {
  vspeed = 50; }
if (vcmd == '3') {
  vspeed = 75; }
if (vcmd == '4') {
  vspeed = 100; }
if (vcmd == '5') {
  vspeed = 125; }
if (vcmd == '6') {
  vspeed = 150; }
if (vcmd == '7') {
  vspeed = 175; }
if (vcmd == '8') {
  vspeed = 200; }
if (vcmd == '9') {
  vspeed = 225; } 
  if (vcmd == 'q') {
  vspeed = 255; }

  if (vcmd == 'F') {
      vforward();
    }
    if (vcmd == 'B')
    {
      back();
    }   
    if (vcmd == 'L')
    {
      left();
    }   
    if (vcmd == 'R')
    {
      right();
    }     
    if (vcmd == 'J')
    {
      vbackwardRL();
    }
    if (vcmd == 'H')
    {
      vbackwardL();
    } 
    if (vcmd == 'G')
    {
      vforwardRL();
    }   
      if (vcmd == 'I')
    {
      vforwardL();
    }   
   
      if (vcmd == 'S')
    {
      vstop();
    }   

     
}

Неактивний

#2 2015-01-21 11:10:59

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помехи при ШИМ или ошибка?

привет,
не факт, но -
500_digital_and_analog_servos_diagram.jpg
добавили задержку в линейный код, появились глюки. код линейный? всё в void loop()

Неактивний

#3 2015-01-21 11:21:32

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помехи при ШИМ или ошибка?

где то так сделано?

void loop()
{
  digitalWrite(13, HIGH);
  delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz
  digitalWrite(13, LOW);
  delayMicroseconds(1000 - 100);
}

переведите на аппаратный, пример :
Secrets of Arduino PWM

  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS22);
  OCR2A = 180;
  OCR2B = 50;
On the Arduino Duemilanove, these values yield:

Output A frequency: 16 MHz / 64 / 256 = 976.5625Hz
Output A duty cycle: (180+1) / 256 = 70.7%
Output B frequency: 16 MHz / 64 / 256 = 976.5625Hz
Output B duty cycle: (50+1) / 256 = 19.9%

и хватит ли ресурсов, помнится не много там ШИМов аппаратных.

Неактивний

#4 2015-01-21 11:57:11

pv_serg
Учасник
Зареєстрований: 2014-12-06
Повідомлень: 6

Re: Помехи при ШИМ или ошибка?

NoName пише:

где то так сделано?

void loop()
{
  digitalWrite(13, HIGH);
  delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz
  digitalWrite(13, LOW);
  delayMicroseconds(1000 - 100);
}

У меня управление скоростью задается переменной vspeed, которая меняется 0-255 в зависимости от команды которая приходит с блютуз.

if (vcmd == '1') {
  vspeed = 25; }
if (vcmd == '2') {
  vspeed = 50; }
if (vcmd == '3') {
  vspeed = 75; }
и т.д.

Что касается аппаратного ШИМ-сдается мне, что сложновато будет, хотя может и правильно. Но!!! Вопрос то остается: Каким макаром ШИМ на одних выводах влияют на совсем левый выход, который практически не используется в данный момент?

Неактивний

#5 2015-01-21 13:01:53

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помехи при ШИМ или ошибка?

если работаете с железом, купите осцилограф, или в гости сходите к челу у которого есть такая штука ) думаю много прояснится что не так с Вашим кодом.
по хорошему нужно просмотреть код библиотеки servo
с PWM работал, с сервой нет, но думаю что данные штуки (серво) чувствительны к срыву частоты.

Неактивний

#6 2015-01-21 13:33:54

pv_serg
Учасник
Зареєстрований: 2014-12-06
Повідомлень: 6

Re: Помехи при ШИМ или ошибка?

В общем большое спасибо, что откликнулись. Решение нашел:  При переходе на управления блютуз-пин, который привязан к серве, нужно отключать командой servo.detach(); И всего-то лишь.

Остання редакція pv_serg (2015-01-21 13:34:20)

Неактивний

#7 2015-01-21 13:49:54

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помехи при ШИМ или ошибка?

вообще не понял, общие ноги для BT и сервы?

Неактивний

#8 2015-01-21 14:07:54

pv_serg
Учасник
Зареєстрований: 2014-12-06
Повідомлень: 6

Re: Помехи при ШИМ или ошибка?

Нет, ноги разные, но не понятно по каким причинам, при servo.attach(номер_пина); на этом пине при ШИМ импульсы фигачат (смотрел осциллографом) пока его не отключишь servo.detach(); Может что-то в библиотеке сервы как-то связано-не вникал. Проще отключить при неиспользовании.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму