проблема с кодом

ALEXHEX
Offline
Зарегистрирован: 12.12.2013

скомпелировал без ошибок.
но выполняется только одна команда, подскажите, где не прав.

#define Trig 12
#define Echo 11
#define MLa 10
#define MLb 9
#define MRa 8
#define MRb 7
#define LEDPIN 13
long randNumber;
unsigned long time1;
unsigned long time2;
 
 
 void VPERED ()
 {
 digitalWrite(MLa,HIGH);
 digitalWrite(MRa,HIGH);
 }
 void LEVO ()
 {
 digitalWrite(9,HIGH);
 digitalWrite(8,HIGH);
 }
  void PRAVO ()
 {
 digitalWrite(10,HIGH);
 digitalWrite(7,HIGH);
 }
 
 
 
void setup() 
{  
  pinMode(Trig, OUTPUT); //инициируем как выход 
  pinMode(Echo, INPUT); //инициируем как вход 
  pinMode(MLa, OUTPUT); //выход левого мотора "а"
  pinMode(MLb, OUTPUT); //выход левого мотора "б"
  pinMode(MRa, OUTPUT); //выход правого мотора "а"
  pinMode(MRb, OUTPUT); //выход правого мотора "б"
  
  Serial.begin(9600); 
  /* задаем скорость общения. В нашем случае с компьютером */
  randomSeed(analogRead(0));
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 
unsigned long time;
 
void loop() 
{  
  time1 = millis();
  randNumber = random(10);
 
 
digitalWrite(Trig, HIGH); 
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10); // равный 10 микросекундам 
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
  Serial.println(distance_sm); // Выводим на порт 
    
  if (distance_sm>= 19) VPERED (); // Если расстояние более 19 сантиметром, включаем блок VPERED 
  if ((distance_sm<= 19) && (randNumber>=5)) LEVO (); // Если расстояние менее 19 сантиметром, и, случайное число более 5, включаем блок LEVO
  if ((distance_sm<= 19) && (randNumber<=5)) PRAVO (); // Если расстояние менее 19 сантиметром, и, случайное число менее 5, включаем блок  PRAVO
 
 delay(25); 
}

 

 
ALEXHEX
Offline
Зарегистрирован: 12.12.2013

забыл добавить - работает толкь блок VPERED

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Там логические ошибки - у вас рано или поздно на всех выходах будет состояние HIGH, потому что вы только устанавливаете высокий уровень и нигде его не снимаете.

ALEXHEX
Offline
Зарегистрирован: 12.12.2013

NeiroN пишет:

Там логические ошибки - у вас рано или поздно на всех выходах будет состояние HIGH, потому что вы только устанавливаете высокий уровень и нигде его не снимаете.

я к этому тоже пришёл. Только дальше идти не могу - подскажите решение проблемы. Сам не справлюсь, я  и этот код с других пособирал

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Без схемы сложно сказать что там нужно, и каким "сферическими конями в вакуме" вы пытаетесь управлять.

ALEXHEX
Offline
Зарегистрирован: 12.12.2013

NeiroN пишет:

Без схемы сложно сказать что там нужно, и каким "сферическими конями в вакуме" вы пытаетесь управлять.

нужна принципиальная схема? Она у меня на л293д. 2 мотора, УЗ-дальномер. Всё очень просто.
я вот думаю так попробывать

void VPERED ()
 {
 digitalWrite(MLa,HIGH);
 digitalWrite(MRa,HIGH);
delaymicroseconds(25); 
 digitalWrite(MLa,LOW);
 digitalWrite(MRa,LOW);
}
Вот только думаю как это на плавности движений отразиться.

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

похоже ваше непонимание глубже, чем я предполагал. Вы не правильно управляете данной микросхемой. Почитайте соответвующий материал в интернете например тут http://robocraft.ru/blog/arduino/170.html

ALEXHEX
Offline
Зарегистрирован: 12.12.2013

Я управлял данной схемой по заданному алгоритму, всё было в порядке, каретка ходила по квадрату.
но как только в коде появилось условие выбора между блоками движения, всё пошло боком.
я с ардуинами не очень хорошо разобрался. это проба пера была.

ALEXHEX
Offline
Зарегистрирован: 12.12.2013

Добавил в блок задержку

void VPERED ()
 {
 digitalWrite(MLa,HIGH);
 digitalWrite(MRa,HIGH);
delay(1000); 
 digitalWrite(MLa,LOW);
 digitalWrite(MRa,LOW);
}
....
Работает, и работает ка требовалось. Но теперь появилась ещё одна проблема. Плавности работы не наблюдаю, Меньшая задержка (25)
не даёт возможноссти крутить валы двигателей.
так как же нужно правильно? не криволапо?

 

ALEXHEX
Offline
Зарегистрирован: 12.12.2013

Код отладил, работает на ура.

Решил добавить проверку состояния порта, но не понял как это делается.

Допустим, порт ML, находится в состоянии HIGH. Нужно что бы в этот момент А=70.

Есл же ML в состоянии LOW, то А=35.