Skip to content

Commit

Permalink
Merge pull request #7764 from dsborets/add-wemos-motor-shield-v1
Browse files Browse the repository at this point in the history
Add Wemos DC mottor shild (v1.0.0) support
  • Loading branch information
arendst authored Feb 22, 2020
2 parents 1875365 + 5f1dac2 commit 820046c
Show file tree
Hide file tree
Showing 5 changed files with 199 additions and 1 deletion.
1 change: 1 addition & 0 deletions I2CDEVICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,4 @@ Index | Define | Driver | Device | Address(es) | Description
42 | USE_DS1624 | xsns_59 | DS1621 | 0x48 - 0x4F | Temperature sensor
42 | USE_DS1624 | xsns_59 | DS1624 | 0x48 - 0x4F | Temperature sensor
43 | USE_AHT1x | xsns_63 | AHT10/15 | 0x38 | Temperature and humidity sensor
44 | USE_WEMOS_MOTOR_V1 | xdrv_34 | | 0x2D - 0x30 | WEMOS motor shield v1.0.0 (6612FNG)
3 changes: 3 additions & 0 deletions tasmota/my_user_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,9 @@
#define MTX_ADDRESS7 0x00 // [DisplayAddress7] I2C address of seventh 8x8 matrix module
#define MTX_ADDRESS8 0x00 // [DisplayAddress8] I2C address of eigth 8x8 matrix module
// #define USE_DISPLAY_SH1106 // [DisplayModel 7] [I2cDriver6] Enable SH1106 Oled 128x64 display (I2C addresses 0x3C and 0x3D)
// #define USE_WEMOS_MOTOR_V1
#define USE_WEMOS_MOTOR_V1_ADDR 0x30
#define USE_WEMOS_MOTOR_V1_FREQ 1000
#endif // USE_I2C

// -- SPI sensors ---------------------------------
Expand Down
5 changes: 4 additions & 1 deletion tasmota/support_features.ino
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,10 @@ void GetFeatures(void)
#ifdef USE_AHT1x
feature5 |= 0x10000000; // xsns_63_aht1x.ino
#endif
// feature5 |= 0x20000000;
#ifdef USE_WEMOS_MOTOR_V1
feature5 |= 0x20000000; // xdrv_34_wemos_motor_v1.ino
#endif

// feature5 |= 0x40000000;
// feature5 |= 0x80000000;

Expand Down
3 changes: 3 additions & 0 deletions tasmota/tasmota_post.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,9 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
//#define USE_ARDUINO_SLAVE // Add support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem)
#undef DEBUG_THEO // Disable debug code
#undef USE_DEBUG_DRIVER // Disable debug code
#define USE_WEMOS_MOTOR_V1
#define USE_WEMOS_MOTOR_V1_ADDR 0x30
#define USE_WEMOS_MOTOR_V1_FREQ 1000
#endif // FIRMWARE_SENSORS

/*********************************************************************************************\
Expand Down
188 changes: 188 additions & 0 deletions tasmota/xdrv_34_wemos_motor_v1.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
/*
xdrv_34_wemos_motor_v1.ino - Support for I2C WEMOS motor shield (6612FNG)
Copyright (C) 2020 Andre Thomas and Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#ifdef USE_I2C
#ifdef USE_WEMOS_MOTOR_V1
/*********************************************************************************************\
* WEMOS_MOTOR_V1 - DC motor driver shield (6612FNG) v 1.0.0
*
* I2C Address: 0x30
* Command format:
* driver44 <command>,<motor>,<direction>{,<duty>}
* command:
* RESET - reset a motor shield
* SETMOTOR - seter motor state
* motor:
* 0 - motor A
* 1 - motor B
* direction:
* 0 - short break
* 1 - CCW
* 2 - CW
* 3 - stop
* 4 - standby
* duty (optional):
* 0 - 100% (100% by default)
\*********************************************************************************************/

#define XDRV_34 34
#define XI2C_44 44 // See I2CDEVICES.md

#define MOTOR_A 0
#define MOTOR_B 1

#define SHORT_BRAKE 0
#define CCW 1
#define CW 2
#define STOP 3
#define STANDBY 4

bool wemos_driver_detected = false;

uint8_t _motor;

void Wemos_Driver_Detect(void)
{
if (!I2cActive(USE_WEMOS_MOTOR_V1_ADDR))
{
I2cSetActiveFound(USE_WEMOS_MOTOR_V1_ADDR, "WEMOS_MOTOR_V1");
wemos_driver_detected = true;
Motor_Reset();
return;
}
}

void Motor_Reset(void)
{
Wire.begin();
Motor_SetFreq(USE_WEMOS_MOTOR_V1_FREQ);
Response_P(PSTR("{\"WEMOS_MOTOR_V1\":{\"RESET\":\"OK\"}}"));
}

void Motor_SetFreq(uint32_t freq)
{
Wire.beginTransmission(USE_WEMOS_MOTOR_V1_ADDR);
Wire.write(((byte)(freq >> 16)) & (byte)0x0f);
Wire.write((byte)(freq >> 16));
Wire.write((byte)(freq >> 8));
Wire.write((byte)freq);
Wire.endTransmission(); // stop transmitting
delay(100);
}

void Motor_SetMotor(uint8_t motor, uint8_t dir, float pwm_val)
{
uint16_t _pwm_val;
Wire.beginTransmission(USE_WEMOS_MOTOR_V1_ADDR);
Wire.write(motor | (byte)0x10);
Wire.write(dir);

_pwm_val = uint16_t(pwm_val * 100);

if (_pwm_val > 10000)
_pwm_val = 10000;

Wire.write((byte)(_pwm_val >> 8));
Wire.write((byte)_pwm_val);
Wire.endTransmission();

delay(100);

Response_P(PSTR("{\"WEMOS_MOTOR_V1\":{\"SETMOTOR\":\"OK\"}}"));
}

bool Motor_Command(void)
{
uint8_t args_count = 0;
if (XdrvMailbox.data_len > 0)
{
args_count = 1;
}
else
{
return false;
}

for (uint32_t idx = 0; idx < XdrvMailbox.data_len; idx++)
{
if (' ' == XdrvMailbox.data[idx])
{
XdrvMailbox.data[idx] = ',';
}
if (',' == XdrvMailbox.data[idx])
{
args_count++;
}
}
UpperCase(XdrvMailbox.data, XdrvMailbox.data);

char *command = strtok(XdrvMailbox.data, ",");

if (strcmp(command, "RESET") == 0)
{
Motor_Reset();
return true;
}

if (strcmp(command, "SETMOTOR") == 0)
{
if (args_count >= 3)
{

int motor = atoi(strtok(NULL, ","));
int dir = atoi(strtok(NULL, ","));
int duty = 100;

if (args_count == 4)
{
duty = atoi(strtok(NULL, ","));
}

Motor_SetMotor(motor, dir, duty);

return true;
}
}
return false;
}

bool Xdrv34(uint8_t function)
{
if (!I2cEnabled(XI2C_44))
{
return false;
}
bool result = false;
if (FUNC_INIT == function)
{
Wemos_Driver_Detect();
result = wemos_driver_detected;
}
else if (wemos_driver_detected)
{
if (FUNC_COMMAND_DRIVER == function && XI2C_44 == XdrvMailbox.index)
{
result = Motor_Command();
}
}
return result;
}

#endif // USE_WEMOS_MOTOR_V1
#endif // USE_IC2

0 comments on commit 820046c

Please sign in to comment.