The idea of building my own I2C (read as I square C) smart DC motor controller is came to me when I was learning and playing together with my son on his LEGO® MINDSTORM® NXT 2.0 about a year ago. The NXT sophisticated controller also called NXT Intelligent Brick is powered by Atmel 32-bit ARM7 AT91SAM7S256 microcontroller and communicating with Atmel 8-bit AVR ATmega48 acting as a co-microcontroller using I2C protocol. This NXT co-microcontroller main function is to help handle some of the NXT I/O special task i.e. power management, reading buttons, analog’s input sensors and control to the motors. The following picture shows my version of the I2C smart DC motor controller which is power by Atmel 8-bit AVR ATmega168 microcontroller:
The advantage of separating this special I/O task to the co-microcontroller is to release the main microcontroller from the hungry resources task such as generating the required Pulse Width Modulation (PWM) to the motor and reading the analog input, therefore the main microcontroller could be used to do other important task. This I2C smart motor controller which has these following features:

Communicate with a standard I2C protocol to the any smart controller (e.g. microcontroller based board or microprocessor based board) that supports I2C protocol.

Driving two DC geared Motors simultaneously which maximum current up to 1 A, maximum voltage of 20 volts

I will split this project into 3 articles (part 1 to 3) and as we move to implement more complex features, the firmware will be slightly modified to support the additional features, and finally we will use a different type of master controller board to experiment with this I2C smart DC motor controller as shown in this following picture:
This I2C smart DC motor controller project also serve as a basic knowledge required to any microcontroller enthusiast or hobbyists to start their own embedded system application design. Ok let’s take a look at all the electronic components and software required to develop this project: