БИБЛИОТЕКА GYVERMOTOR

Библиотека для удобного управления моторчиками через драйвер полного моста для Arduino

  • Контроль скорости и направления вращения
  • Встроенный инструмент для настройки частоты ШИМ
  • Работа с 10 битным ШИМом

Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции). Смена частоты работает только на ATmega328/168

Библиотека подходит для большинства драйверов, построенных по схеме H-мост, на два мотора они обычно имеют 4 входа (по 2 на каждый)

ДОКУМЕНТАЦИЯ


void PWM10bit();
// установка пинов 9 и 10 в режим 10 бит (управляется сигнало 0-1023)
 
void PWMfrequency(uint8_t pin, uint16_t mode);
// установка частоты ШИМ на пине
// пины 5 и 6 	8 bit	mode: 1 (62 500 Гц), 2 (7 812 Гц), 3 (976 Гц), 4 (244 Гц), 5 (61 Гц). ВЛИЯЕТ НА РАБОТУ millis() и delay()
// пины 9 и 10 	8 bit 	mode: 1 (62 500 Гц), 2 (7 812 Гц), 3 (976 Гц), 4 (244 Гц), 5 (61 Гц). ВЛИЯЕТ НА РАБОТУ servo
// пины 9 и 10 	10 bit 	mode: 1 (15 625 Гц), 2 (1 953 Гц), 3 (244 Гц), 4 (61 Гц),  5 (15 Гц). ВЛИЯЕТ НА РАБОТУ servo
// пины 3 и 11 	8 bit	mode: 1 (31 250 Гц), 2 (3 906 Гц), 3 (976 Гц), 4 (488 Гц), 5 (244 Гц), 6 (122 Гц), 7 (30 Гц). ВЛИЯЕТ НА РАБОТУ tone()


GMotor(uint8_t dig_pin, uint8_t pwm_pin);	
// создаём объект. 
// dig_pin - пин направления, любой пин
// pwm_pin - ШИМ пин (у NANO/UNO/MINI это 3, 5, 6, 9, 10, 11)
 
void setSpeed(uint8_t duty);           // установка скорости (0-255)
 
void setSpeed10bit(uint16_t duty);     // установка скорости в режиме 10 бит (0-1023) для пинов 9 и 10
 
void setMode(uint8_t mode);
// режим работы мотора:
// FORWARD - вперёд
// BACKWARD - назад
// STOP - остановить												
            
void setDirection(boolean direction);
// направление вращения (один раз настроить в setup вместо переподключения мотора)
// NORM - обычное
// REVERSE - обратное

ПРИМЕРЫ


/*
 Пример управления мотором при помощи драйвера полного моста
 и потенциометра. На всём диапазоне потенциометра:
 от 0 до мёртвой зоны (512 - deadzone) крутим в одну сторону
 в мёртвой зоне не крутим вообще
 от мёртвой зоны (512 + deadzone) до 1023 крутим в другую сторону
 Управление производится хардварным ШИМ пином на стандартной частоте
*/

#define DEADZONE 60 // "мёртвая зона" потенциометра
#define IN1 2		// пин мотора
#define IN2 3		// IN2 обязательно должен быть ШИМ пином!!!
#define POT 0      	// сюда подключен потенциометр

#include "GyverMotor.h"
GMotor motor1(IN1, IN2);			// IN2 обязательно должен быть ШИМ пином!!!

int left_min = 512 - DEADZONE;   	// расчёт границ мёртвой зоны
int right_min = 512 + DEADZONE;  	// расчёт границ мёртвой зоны

void setup() {
  
}

void loop() {
  int potent = analogRead(POT);                    // читаем с потенциометра

  if (potent > left_min && potent < right_min) { // если мы в "мёртвой" зоне motor1.setMode(STOP); } else if (potent > right_min) {   // если мы вышли из мёртвой зоны справа
    motor1.setMode(FORWARD);
    byte duty = map(potent, right_min, 1023, 0, 255);
    motor1.setSpeed(duty);
  } else if (potent < left_min) {   // если мы вышли из мёртвой зоны слева
    motor1.setMode(BACKWARD);
    byte duty = map(potent, left_min, 0, 0, 255);
    motor1.setSpeed(duty);
  }

}
/*
 Пример управления мотором при помощи драйвера полного моста
 и потенциометра. На всём диапазоне потенциометра:
 от 0 до мёртвой зоны (512 - deadzone) крутим в одну сторону
 в мёртвой зоне не крутим вообще
 от мёртвой зоны (512 + deadzone) до 1023 крутим в другую сторону
 Управление 10 битным ШИМом!!! 0-1023 на 9 и 10 пинах. В такой системе
 не работает управление сервоприводами из библиотеки Servo!
*/

#define DEADZONE 60 // "мёртвая зона" потенциометра
#define IN1 2
#define IN2 10		// IN2 обязательно должен быть 9 или 10 (уно, нано)
#define POT 0      	// сюда подключен потенциометр

#include "GyverMotor.h"
GMotor motor1(IN1, IN2);

int left_min = 512 - DEADZONE;   // расчёт границ мёртвой зоны
int right_min = 512 + DEADZONE;  // расчёт границ мёртвой зоны

void setup() {
  PWM10bit();	// ставим пин 9 и 10 в режим 10 бит
  motor1.setDirection(NORM);
}

void loop() {
  int potent = analogRead(POT);                    // читаем с потенциометра

  if (potent > left_min && potent < right_min) { // если мы в "мёртвой" зоне motor1.setMode(STOP); } else if (potent > right_min) {   // если мы вышли из мёртвой зоны справа
    motor1.setMode(FORWARD);
    int duty = map(potent, right_min, 1023, 0, 1023);
    motor1.setSpeed10bit(duty);
  } else if (potent < left_min) {   // если мы вышли из мёртвой зоны слева
    motor1.setMode(BACKWARD);
    int duty = map(potent, left_min, 0, 0, 1023);
    motor1.setSpeed10bit(duty);
  }

}
/*
 Пример управления мотором при помощи драйвера полного моста
 и потенциометра. На всём диапазоне потенциометра:
 от 0 до мёртвой зоны (512 - deadzone) крутим в одну сторону
 в мёртвой зоне не крутим вообще
 от мёртвой зоны (512 + deadzone) до 1023 крутим в другую сторону
 Управление производится хардварным ШИМ пином на настраиваемой частоте
*/

#define DEADZONE 60 	// "мёртвая зона" потенциометра
#define IN1 2
#define IN2 3			// IN2 обязательно должен быть ШИМ пином!!!
#define POT 0     	 	// сюда подключен потенциометр

#include "GyverMotor.h"
GMotor motor1(IN1, IN2);

int left_min = 512 - DEADZONE;   // расчёт границ мёртвой зоны
int right_min = 512 + DEADZONE;  // расчёт границ мёртвой зоны

void setup() {
  motor1.setDirection(REVERSE);
  
  // изменение частоты ШИМа на 3 пине. Таблицу частот смотрите в библиотеке GyverHacks.h"
  // пины 5 и 6   8 bit mode: 1 (62 500 Гц), 2 (7 812 Гц), 3 (976 Гц), 4 (244 Гц), 5 (61 Гц). ВЛИЯЕТ НА РАБОТУ millis() и delay()
  // пины 9 и 10  8 bit   mode: 1 (62 500 Гц), 2 (7 812 Гц), 3 (976 Гц), 4 (244 Гц), 5 (61 Гц). ВЛИЯЕТ НА РАБОТУ servo
  // пины 3 и 11  8 bit mode: 1 (31 250 Гц), 2 (3 906 Гц), 3 (976 Гц), 4 (488 Гц), 5 (244 Гц), 6 (122 Гц), 7 (30 Гц). ВЛИЯЕТ НА РАБОТУ tone()
  PWMfrequency(IN2, 1);
}

void loop() {
  int potent = analogRead(POT);                    // читаем с потенциометра

  if (potent > left_min && potent < right_min) { // если мы в "мёртвой" зоне motor1.setMode(STOP); } else if (potent > right_min) {   // если мы вышли из мёртвой зоны справа
    motor1.setMode(FORWARD);
    byte duty = map(potent, right_min, 1023, 0, 255);
    motor1.setSpeed(duty);
  } else if (potent < left_min) {   // если мы вышли из мёртвой зоны слева
    motor1.setMode(BACKWARD);
    byte duty = map(potent, left_min, 0, 0, 255);
    motor1.setSpeed(duty);
  }

}

ОСТАЛЬНЫЕ БИБЛИОТЕКИ

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.