Делаю робота на 2х колесах. При движении его траектория отходит в сторону. Хочу это решить снижением скорости одного из моторов, но не получается эту скорость отрегулировать. Моторы либо крутятся одинаково, ели на один подаешь аналог-сигнал, например 128, а на другой 254; либо один мотор не крутится совсем, если подавать аналог-сигнал ниже 128. Использую вот этот драйвер моторов, занимающий 6 пинов (L298N) Тестирую вот этим кодом: Код (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 L298N я питаю от RX TX порта (там 5 вольт), от него же и управляю скоростью моторов через пины 0 и 1 (видно на схеме распиновку портов шилды). Смена пинов и входов питания не помогает. Минимальный сигнал при котором мотор перестает вращаться - 128. От 128 до 254 скорость вращения одинакова. Никакой реакции на изменение скорости через сигналы от ардуины - она меняется только если сбавлять напряжение от питания моторов. Питаю все от 2х аккумуляторов 8.4V NiMH 3800mAh. Один кормит ардуину, к которой подключены 2 дальномера и l298n. Второй - моторы и сервы. Помогите, для проекта надо, чтобы робот более менее прямо ездил, а он все время сворачивает в одну сторону.
Поменяйте это Код (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 должны быть на этих пинах
Нашел в недрах 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); }
Большое спасибо! Поменял пины из списка указанных и теперь скорость регулируется. С wiring_analog.c не совсем разобрался, я новичок, но как понял это откуда-то настройки по умолчанию команды analogWrite, которые интерпретируют сигнал ниже 128 как LOW. Еще раз спасибо :3
Да в общем-то это библиотеки самой ардуино, в которой определяются всякие вещи типа analogRead и т.д. Этот код я привел только потому, что раньше я только догадывался, что оно работает как-то так, а теперь в этом сам убедился)