Как управлять контроллером двигателя DRV8266 с помощью ESP8266?

https://github.com/sparkfun/SparkFun_MiniMoto_Arduino_Library/tree/V_1.1.0

Будет ли эта библиотека работать на esp8266? Если нет, то есть ли способ заставить этот драйвер работать на ESP?

, 👍0


1 ответ


Лучший ответ:

1

Как любезно указал Игнасио (+1), ответ на мой первоначальный вопрос — нет.


Следующий код работает для управления платой Sparkfun Minimoto или, в более общем смысле, DRV8830. Просто подключите GPIO5 к SCL, а GPIO4 к SDA. В некоторых вариантах выводы SDA/SCL по умолчанию отличаются — вы всегда можете использовать любые выводы (кроме GPIO0, GPIO2 и GPIO15 — см. мой недавний пост об использовании этих выводов) для вашей шины I2C и просто вызовите wire.begin(sda,scl), где sda и scl — нужные вам номера выводов.

#include <Wire.h>

#define MOTORA_WRITE 0x64
#define MOTORA_READ 0x65
#define CONTROL_addr 0x00
#define FAULT_addr 0x01

void setup() {
  Wire.begin();

  drive(20);//введите значения от -63 до 63, где отрицательные значения обратны
  delay(100);
  coast();//отпускает мотор
  delay(100);
  brake();//тормозит двигатель

}

void loop() {
  // поместите сюда свой основной код для многократного выполнения:

}

byte tsState = -99;//используется, чтобы избыточные вызовы любого из этих методов ничего не делали — только новые вызовы будут инициировать связь с контроллером двигателя
void drive(int speed) {
  if (speed != tsState) {
    tsState = speed;
    // Запись в регистр неисправностей для его сброса
    Wire.beginTransmission(MOTORA_WRITE);
    Wire.write(FAULT_addr);
    Wire.write(0x80);
    Wire.endTransmission(true);

    // Запись в регистр управления
    Wire.beginTransmission(MOTORA_WRITE);
    Wire.write(CONTROL_addr);
    byte regValue;
    regValue = (byte)abs(speed); // Находим байтовое значение abs для входных данных
    if (regValue > 63) regValue = 63;
    regValue = regValue << 2; // Сдвиг влево, чтобы освободить место для битов 1:0
    if (speed < 0) regValue |= 0x01; // Установить биты 1:0 на основе знака ввода.
    else regValue |= 0x02;
    Wire.write(regValue);
    Wire.endTransmission(true);
  }
}
void brake() {
  if (tsState != -98) {
    tsState = -98;
    Wire.beginTransmission(MOTORA_WRITE);
    Wire.write(FAULT_addr);
    Wire.write(0x80);
    Wire.endTransmission(true);
    Wire.beginTransmission(MOTORA_WRITE);
    Wire.write(CONTROL_addr);
    byte regValue = (byte)63;
    regValue = regValue << 2;
    regValue |= 0x03;
    Wire.write(regValue);
    Wire.endTransmission(true);
  }
}
void coast() {
  if (tsState != -97) {
    tsState = -97;
    Wire.beginTransmission(MOTORA_WRITE);
    Wire.write(FAULT_addr);
    Wire.write(0x80);
    Wire.endTransmission(true);
    Wire.beginTransmission(MOTORA_WRITE);
    Wire.write(CONTROL_addr);
    byte regValue = (byte)0;
    Wire.write(regValue);
    Wire.endTransmission(true);
  }
}
,