1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Решено SOS Помогите написать скетч для ардуино

Тема в разделе "Arduino", создана пользователем Vasyl, 10 дек 2017.

  1. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
    Всем привет. Нужна помощь в написании скетча для Ардуино, кто может помочь? Необходимо чтобы сервамашинка равномерно вращалась на 90 градусов при приближении препятствия, блокируя колеса, и в то же время двигатель машины равномерно останавливался при наличии препятствия.
     
  2. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
    Скетч для управления сервомашинкой

    PHP:
    #include <Servo.h>
    #define coef 2
    #define dead_zone 5
    #define max_value 45
    #define servoPin 22

    #define Trig 52
    #define Echo 50
    #define ledPin 13

    Servo myservo;

    void setup()
    {
      
    pinMode(TrigOUTPUT);
      
    pinMode(Echo, INPUT);
      
    pinMode(ledPinOUTPUT);
      
    myservo.attach(servoPin);
      
    myservo.write(0);
    }

    unsigned int impulseTime=0;
    unsigned int distance_sm=0;

    void loop()
    {
      
    digitalWrite(TrigHIGH);
      
    delayMicroseconds(10);
      
    digitalWrite(TrigLOW);
      
    impulseTime pulseIn(Echo, HIGH);
      
    distance_sm impulseTime/58;
      if (
    distance_sm >= dead_zone && distance_sm <= max_value)
      {
        
    myservo.write(coef * (distance_sm dead_zone));
      }
      else if (
    distance_sm dead_zone)
      {
        
    myservo.write(0);
      }
      else
      {
        
    myservo.write(90);
      }
      
    delay(100);
         }
    --- Сообщения объединены, 10 дек 2017 ---
    Скетч для управления двигателем
    PHP:
    int IN3 40;
    int IN4 42;
    int ENB 44;
    void setup()
    {
    pinMode (ENBOUTPUT);
    pinMode (IN3OUTPUT);
    pinMode (IN4OUTPUT);
    }
    void loop()
    {
      
    digitalWrite (IN3HIGH);
      
    digitalWrite (IN4LOW);
      
    analogWrite(ENB,255);
      
    delay(2000);
      
    analogWrite(ENB,0);
      
    delay(5000);
    }
    Но нужно, чтобы двигатель при включении набирал обороты, а при наличии препятствия останавливался. Кто может, помогите объединить скетчи
  3. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.550
    Симпатии:
    352
    Адрес:
    Алматы
    По двигателям строка analogWrite(ENB,255); отвечает за включение двигателя как я понял?
    Можно в цикле наращивать скорость двигателя:
    PHP:
    for (int speed 0speed 256speed 10) {
        
    analogWrite (ENBspeed);
    }
    И таким же способом торможение. Аналогично с сервой, если нужно плавное изменение положения.
    Vasyl нравится это.
  4. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
    Спасибо за помощь, вчера написал рабочий скетч, но появились новые проблемы. Если подключить Ардуино к компьютеру, то все работает как нужно. Когда подавать питание от крон, то сервопривод становится в положение 0 градусов , блокирует колесо, и начинает дергаться, подскажите в чем проблема?

    #include <Servo.h>
    #define coef 2
    #define IN3 2
    #define IN4 3
    #define ENB 4
    #define Trig 52
    #define Echo 50
    #define ledPin 13
    #define servoPin 22
    #define max_value 45
    #define dead_zone 5
    #define dead_zone_dvig 45

    Servo myservo;


    void setup()
    {
    pinMode(ledPin, HIGH);
    pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
    pinMode (ENB, OUTPUT);
    pinMode (IN3, OUTPUT);
    pinMode (IN4, OUTPUT);
    myservo.attach(servoPin);
    myservo.write(0);
    }


    unsigned int impulseTime=0;
    unsigned int distance_sm=0;

    void loop()
    {
    digitalWrite(Trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(Trig, LOW);
    impulseTime = pulseIn(Echo, HIGH);
    distance_sm = impulseTime/58;

    if (distance_sm >= dead_zone_dvig)
    {
    digitalWrite (IN3, HIGH);
    digitalWrite (IN4, LOW);
    analogWrite(ENB,210);
    }
    else
    {
    analogWrite(ENB, 0);
    }

    if (distance_sm >= dead_zone && distance_sm <= max_value)
    {
    myservo.write(coef * (distance_sm - dead_zone));
    }
    else if (distance_sm < dead_zone)
    {
    myservo.write(0);
    }
    else
    {
    myservo.write(90);
    }
    // delay(200);
    }
    --- Сообщения объединены, 11 дек 2017 ---
    и при этом светодиод на ардуино синхронно тушится, такое впечатление что проседает напряжение, замена крон результат не изменил. Может в коде ошибка? Пробовал менять время задержки в функции if для сервы, никакого результата, просто дергается через заданное время. Зато если задержки нет то плавно работает (при подключении от компа)
    Последнее редактирование: 11 дек 2017
  5. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
    Питания идет одновременно на логику двигателя/двигатель и на + 5v / gnd Ардуино, датчик расстояния и серва подключены к Ардуино. Подача ровно 5V вместо 9 проблему не решила
    Последнее редактирование: 11 дек 2017
  6. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
  7. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.313
    Симпатии:
    350
    Адрес:
    Талгар
    думаю с питанием косяк какой то, например силы тока не хватает, отсюда просадки и светодиод тухнет, светодиод по питанию стоит ?
  8. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
    светодиод обычный что на Ардуино, вместе с ним тушится и светодиод на драйвере
  9. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.313
    Симпатии:
    350
    Адрес:
    Талгар
    ну явно косяки по питанию
  10. Дмитрий BASIC

    Дмитрий BASIC В доску свой

    Сообщения:
    185
    Симпатии:
    100
    Попробуй раздельное питание !
  11. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
    Наверное косяк в питании датчика расстояния. Если задавать положение сервы / обороты двигателя, то все от батареи работает. Но если использовать датчик то все начинает жить своей жизнью. Попробую подавать питание напрямую в датчик или его заменю. Такой вопрос, если я подаю + 9В от кроны в порты + 5В и GND Ардуино, то серва и датчик расстояния будут адекватно работать? Или нужно обязательно подавать в разъем 2,1 мм? Знаю что вопрос глупый, но все же...
    Последнее редактирование: 13 дек 2017
  12. Дмитрий BASIC

    Дмитрий BASIC В доску свой

    Сообщения:
    185
    Симпатии:
    100
    вот сейчас наверное все уже по полу катаются и заживоты держатся чтобы от смеха не разарвало , дабы прояснить ситуацию лучше всего скинь схему как у тебя все подключено !
  13. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.313
    Симпатии:
    350
    Адрес:
    Талгар
    я вот понять не могу как можно вместо пяти вольт дать девять :eek:
  14. Vasyl

    Vasyl Гость

    Сообщения:
    8
    Симпатии:
    1
    Отдельное питание датчика решило проблему, всем спасибо за помощь ;)
    Buba_Chkhadze нравится это.
  15. .ctor

    .ctor В доску свой

    Сообщения:
    715
    Симпатии:
    202
    Род занятий:
    парогенератор
    Адрес:
    Алматы
    Вова, легко. берешь два провода... :D
  16. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.313
    Симпатии:
    350
    Адрес:
    Талгар
    и чо, ардуина выживает ?

Поделиться этой страницей