L298N проблема регулировки скорости

Тема в разделе "Arduino & Shields", создана пользователем Aref, 2 апр 2014.

  1. Aref

    Aref Нуб

    Делаю робота на 2х колесах. При движении его траектория отходит в сторону. Хочу это решить снижением скорости одного из моторов, но не получается эту скорость отрегулировать. Моторы либо крутятся одинаково, ели на один подаешь аналог-сигнал, например 128, а на другой 254; либо один мотор не крутится совсем, если подавать аналог-сигнал ниже 128.

    Использую вот этот драйвер моторов, занимающий 6 пинов (L298N)
    [​IMG]
    Тестирую вот этим кодом:

    Код (Text):
        // 2 мотора через L298N - шилду
        #define D1 8      
        #define M1 7      
        #define D2 9      
        #define M2 10      
        #define ENA 0
        #define ENB 1
     
        // уз-дальномер
        #define Trig1 6
        #define Echo1 5
     
        // зона остановки
        #define dead_zone 40
     
        void setup()
        {pinMode(Trig1, OUTPUT);
        pinMode(Echo1, INPUT);
        pinMode(D1, OUTPUT);
        pinMode(M1, OUTPUT);
        pinMode(D2, OUTPUT);
        pinMode(M2, OUTPUT);
        delay(1000);
        }
        unsigned int impulseTime=0;
        unsigned int distanceUP_sm=0;
     
        void loop()
        // замер расстояния
        { digitalWrite(Trig1, HIGH);
        delayMicroseconds(10);
        digitalWrite(Trig1, LOW);
        impulseTime = pulseIn(Echo1, HIGH);
        distanceUP_sm = impulseTime/58;
        delay(60);
        // если дистанция больше 40см - движение
            if (distanceUP_sm >= dead_zone)
            {digitalWrite(D1, 1);
            digitalWrite(M1, 0);
            analogWrite(ENA, 254);
                digitalWrite(D2, 1);
            digitalWrite(M2, 0);
            analogWrite(ENB, 254);
       
              }
        // иначе - стоп
        else
        {
            analogWrite(ENA, 0);
            analogWrite(ENB, 0);}
        }
    Так же, все подключено через v5.0 Sensor Shield
    [​IMG]
    L298N я питаю от RX TX порта (там 5 вольт), от него же и управляю скоростью моторов через пины 0 и 1 (видно на схеме распиновку портов шилды). Смена пинов и входов питания не помогает. Минимальный сигнал при котором мотор перестает вращаться - 128. От 128 до 254 скорость вращения одинакова. Никакой реакции на изменение скорости через сигналы от ардуины - она меняется только если сбавлять напряжение от питания моторов. Питаю все от 2х аккумуляторов 8.4V NiMH 3800mAh. Один кормит ардуину, к которой подключены 2 дальномера и l298n. Второй - моторы и сервы. Помогите, для проекта надо, чтобы робот более менее прямо ездил, а он все время сворачивает в одну сторону.
     
  2. acos

    acos Официальный гик Администратор

    Поменяйте это
    Код (Text):
       
    #define D1 8    
        #define M1 7    
        #define D2 9    
        #define M2 10    
        #define ENA 0
        #define ENB 1
    на это
    Код (Text):
       
    #define D1 8    
        #define M1 7    
        #define D2 12    
        #define M2 13    
        #define ENA 9
        #define ENB 10
    Ну и пины соответственно переставьте.
    analogWrite работает на PWM пинах. Для Arduino Uno это 3, 5, 6, 9, 10, 11. Поэтому ENA и ENB должны быть на этих пинах
     
    Aref и Megakoteyka нравится это.
  3. acos

    acos Официальный гик Администратор

    Нашел в недрах wiring_analog.c
    Код (Text):
               
    void analogWrite(uint8_t pin, int val)
    {
        // We need to make sure the PWM output is enabled for those pins
        // that support it, as we turn it off when digitally reading or
        // writing with them.  Also, make sure the pin is in output mode
        // for consistenty with Wiring, which doesn't require a pinMode
        // call for the analog output pins.
        pinMode(pin, OUTPUT);
        if (val == 0)
        {
            digitalWrite(pin, LOW);
        }
        else if (val == 255)
        {
            digitalWrite(pin, HIGH);
        }
        else
        {
            switch(digitalPinToTimer(pin))
            {
                // XXX fix needed for atmega8
                #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__)
                case TIMER0A:
    //...

    //...тут было бла бла бла. И в конце вот он ваш случай:

                case NOT_ON_TIMER:
                    default:
                        if (val < 128) {
                            digitalWrite(pin, LOW);
                        } else {
                            digitalWrite(pin, HIGH);
                        }
     
     
    Megakoteyka и Aref нравится это.
  4. Aref

    Aref Нуб

    Большое спасибо! Поменял пины из списка указанных и теперь скорость регулируется. С wiring_analog.c не совсем разобрался, я новичок, но как понял это откуда-то настройки по умолчанию команды analogWrite, которые интерпретируют сигнал ниже 128 как LOW. Еще раз спасибо :3
     
  5. acos

    acos Официальный гик Администратор

    Да в общем-то это библиотеки самой ардуино, в которой определяются всякие вещи типа analogRead и т.д. Этот код я привел только потому, что раньше я только догадывался, что оно работает как-то так, а теперь в этом сам убедился)