I2CN16
Motor controller based on the TB6612 Dual H-Bridge capable of 1.2A with 3.2A peek with a maximum of 15V.
This is an I2C device to control two DC motors or any high power requirement. In addition it has and interface and commands for 2 IR slot switches to count pulses or to provide end stops.
Resources
Physical Layout
I2C
This has duplicate connections for easy daisy chaining of other I2C devices. Power for the logic is supplied through this connector and can be from 3.3V to 5V
Motor
Power is supplied to drive the motors via the bottom two pins of the motor connector. VM is the positive supply and can be from 4.5V to 15V
Sensors
There are 2 input sensors marked S1 and S2, by default these are held high by a pull up resistor, this value can be read directly by an I2C command. The pin layout is designed for a standard 3D type printer end stop, for example:
However a standard micro-switch can be used if connected from S1 or S2 to Ground.
Pulse Counting: It is possible to use the slotted IR switch for pulse counting and there is a command that will stop the motor after a specified count. However, there are some restrictions to this and that is the IR switch must swing below 500mV in order to register a count. In practice some IR detectors of the type above did not get to below 900mV (0.9V). This coud be due to the detector itself or that the optical disk was not black enough.
RPi
The example is a written in python, put the four files:
i2c_p_v2.py
i2c_p_V3.py
i2cn16.py
i2ctest.py
Into a directory and run from the terminal "python testi2c.py"
This will run motor B for 50 pulses, of course this assumes that the endslot is set up to detect pulses, if not simply edit the i2ctest.py and select function t1() instead of t2()
MicroPython
This uses exactly the same library as Python, as there is no python version 2 only three files need to be on the device.
Arduino
*** Pull up resistors will be required if used with the UNO or Nano ***
Please not that this is intended as a staring point, it is not intended as a full blown library. I has also only been tested on the UNO
(see example for constructor, default i2c address is 0x29)
Applies to all Motors
void en(uint8_t on); // global enable 1=enable 0 = disable
uint8_t status(void); // returns status
void mreset(void); // resets motor
Applies to specific motor = 10 = A, 20 = B
void power(uint8_t motor, uint8_t value); // sets power to motor 0-255
void direction(uint8_t motor, uint8_t value); // set direction 0,3 = off 1=fwd, 2=bwk
void pow_dir(uint8_t motor, uint8_t power, uint8_t dir); // set both power and direction
uint8_t get_power(uint8_t motor); // gets current set power
uint8_t slot(uint8_t motor); // gets end stop value
void clr_count(uint8_t motor); // clears end stop (slot) counter
uint16_t get_count(uint8_t motor); // gets end stop counter
void endstop(uint8_t motor, uint8_t dir, uint8_t hl); // run until end stop
void steps(uint8_t motor, uint16_t value, uint8_t dir); // run until end stop count reached
System
void EEreset(); // reset default eeprom values
void change_i2c(uint8_t new_address); // changes i2c address
void EEwrite(uint8_t adr, uint8_t value); // write to eeprom
uint8_t EEread(uint8_t adr); // read from eeprom
uint16_t ID(); // return device id
void Version(uint8_t *b); // return firmware version 3 bytes
void reset(void); // global reset