Как управлять контроллером двигателя DRV8266 с помощью ESP8266?
https://github.com/sparkfun/SparkFun_MiniMoto_Arduino_Library/tree/V_1.1.0
Будет ли эта библиотека работать на esp8266? Если нет, то есть ли способ заставить этот драйвер работать на ESP?
@Murey Tasroc, 👍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);
}
}
,
@Murey Tasroc
Смотрите также:
- Обратное напряжение двигателя постоянного тока, как правильно разместить диод?
- ESP8266 NODEMCU V3, КАК ИСПОЛЬЗОВАТЬ И УПРАВЛЯТЬ ВЫХОДНОЙ МОЩНОСТЬЮ V3
- Контроль скорости бесщеточного двигателя постоянного тока
- ESP8266-01 Сброс при работе двигателя постоянного тока
- Проблема с аналоговой перезаписью ESP12E motorshield при питании двигателя постоянного тока
- Почему модуль Wi-Fi ESP01 сбрасывается при подключении к двигателю постоянного тока/водяному насосу?
- Управление двигателем постоянного тока ARDUINO через ИК-датчик INPUT
- ESP01 к двигателю постоянного тока питается от батареи с регулятором мощности