EP-0108: Difference between revisions

From 52Pi Wiki
Jump to navigation Jump to search
Line 56: Line 56:
==Package Includes==
==Package Includes==
* 1 x Motor Board
* 1 x Motor Board
* 2 x Motors
* 2 x Motor
* 2 x PH Connector
* 1 x Instruction
* 1 x Instruction
* 4 x M2.5*12 + 6 Copper stick
* 4 x M2.5*12 + 6 Copper stick

Revision as of 14:10, 13 August 2019

DockerPi Motor Board(A) SKU:EP-0108

Description

DockerPi Motor Board(A) is a DockerPi series expansion board.It can control two 12V DC motors.

DockerPi Motor Board(A) can be used in Raspberry Pi.You could communicate with it by opening I2C.

DockerPi Motor Board(A) can be used only one,but it still can be stacked with other DockerPi expansion board.

You could choose single,of course,you could control both of them at the same time.

If you need to run for a long time ,we recommend that you use our DockerPi Power expansion board to provide more power.

Note: DockerPi Motor Board does not support hot plug.

Features

  • DockerPi Series
  • Programmable
  • Control directly(without programming)
  • Extend GPIO Pins
  • Two DC 12V motors
  • Selective control
  • Can stack with other stack board
  • Independent of the mainboard hardware (require I2C support)

Specification

  • The speed of Motor ranges from 100 to 1300.
 If you set the value less than 100 and greater than 0,
 the speed is 100.If you set the value greater than 1300, the speed is 1300.
  • The parameters of Motor
 Power supply voltage:VM = 15 V(MAX)
 Output current:Iout = 1.2 A(ave)/3.2 A(peak)
 Standby(power save)system
 CW/CCW/short break/stop function modes
  • We recommand you to buy our power board.So,you don't have to worry about the power.
  Moreover,you need be careful to connect the Power Board.The Power Board is under the Motor Board.
  

Official Compatibility Test

Not only support the following development boards, other development boards can be compatible if they have I2C peripherals. (Note: some software changes may be required)

Platform DockerPi Motor Board Notes
Raspberry Pi All Platform Not Include CM Series & EOL Platform

Gallery

waiting for supplement...

Package Includes

  • 1 x Motor Board
  • 2 x Motor
  • 2 x PH Connector
  • 1 x Instruction
  • 4 x M2.5*12 + 6 Copper stick
  • 4 x M2.5*6 Nut
  • 4 x M2.5*6 Half-round head screw

Register Map

Register Address Function Value
0x01 Set Motor 1 speed Set Motor 1 speed Low 8 bit
0x02 Set Motor 1 speed Set Motor 1 speed High 8 bit
0x03 Set Motor 2 speed Set Motor 2 speed Low 8 bit
0x04 Set Motor 2 speed Set Motor 2 speed High 8 bit
0x05 Set Motor 1 count Set Motor 1 count Low 8 bit
0x06 Set Motor 1 count Set Motor 1 count High 8 bit
0x07 Set Motor 2 count Set Motor 2 count Low 8 bit
0x08 Set Motor 2 count Set Motor 2 count High 8 bit
0x09 Set status of Direction Set Motor 1 and Motor 2 Direction
0x0A Now Motor 1 speed Now Motor 1 speed Low 8 bit
0x0B Now Motor 1 speed Now Motor 1 speed High 8 bit
0x0C Now Motor 2 speed Now Motor 2 speed Low 8 bit
0x0D Now Motor 2 speed Now Motor 2 speed High 8 bit
0x0E Now Motor 1 count Now Motor 1 count Low 8 bit
0x0F Now Motor 1 count Now Motor 1 count High 8 bit
0x10 Now Motor 2 count Now Motor 2 count Low 8 bit
0x11 Now Motor 2 count Now Motor 2 count High 8 bit
0x12 Now status of Direction Now status of Direction
0x13 Enable Enable data write
STATUS_REG 0x09
Default Value 0 0 0 0 0 0 0/1 0/1
Description Reserved Reserved Reserved Reserved Reserved Reserved CCW/CW CCW/CW
STATUS_REG 0x12
Default Value 0 0 0 0 0 0 0/1 0/1
Description Reserved Reserved Reserved Reserved Reserved Reserved CCW/CW CCW/CW

Motor Board Details

waiting for supplement...

Mechanical Drawing

waiting for supplement...

Configuring I2C(Raspberry Pi)

Run sudo raspi-config and follow the prompts to install i2c support for the ARM core and linux kernel
Go to Interfacing Options

Raspi-config-1.png

then I2C

Raspi-config-2.png

Enable!

Raspi-config-3.png

Done!

Raspi-config-4.png

Direct control wtihout programming(Raspberry Pi)

  • Please do not set the value of register 0x13 more than 254,otherwise,it dosen't work.
  • Set Motor1's speed of low 8 bits
i2cset -y 1 0x18 0x01 100
i2cset -y 1 0x18 0x13 100
  • Set Motor1's speed of high 8 bits
i2cset -y 1 0x18 0x02 100
i2cset -y 1 0x18 0x13 100
  • Set Motor1's count of low 8 bits
i2cset -y 1 0x18 0x05 100
i2cset -y 1 0x18 0x13 100
  • Set Motor1's count of high 8 bits
i2cset -y 1 0x18 0x06 100
i2cset -y 1 0x18 0x13 100
  • Set Motor1 and Motor2's direction
i2cset -y 1 0x18 0x09 1
i2cset -y 1 0x18 0x13 100
  • Set Motor1 and Motor2's directions
i2cset -y 1 0x18 0x0

Program in language C(Raspberrry Pi)

  • Create a new file named:Motor.c and paste following codes:
#include <stdio.h>
#include <stdint.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

//MOTOR_DRIVER Address
#define DEVICE_ARRD 0x18

//Set the speed value of MOTOR_DRIVER
#define MOTOR_DRIVER_SPEED_SET_1 500
#define MOTOR_DRIVER_SPEED_SET_2 1000

//Set the status of MOTOR_DRIVER
#define MOTOR_DRIVER_DIRECTION_STATUS 0x01

//The functions of MOTOR_DRIVER
#define MOTOR_DRIVER_SPEED_1_L 0x01
#define MOTOR_DRIVER_SPEED_1_H 0x02
#define MOTOR_DRIVER_SPEED_2_L 0x03
#define MOTOR_DRIVER_SPEED_2_H 0x04
#define MOTOR_DRIVER_COUNT_1_L 0x05
#define MOTOR_DRIVER_COUNT_1_H 0x06
#define MOTOR_DRIVER_COUNT_2_L 0x07
#define MOTOR_DRIVER_COUNT_2_H 0x08
#define MOTOR_DRIVER_DIRECTION 0x09
#define MOTOR_DRIVER_SPEED_NOW_1_L 0x0a
#define MOTOR_DRIVER_SPEED_NOW_1_H 0x0b
#define MOTOR_DRIVER_SPEED_NOW_2_L 0x0c
#define MOTOR_DRIVER_SPEED_NOW_2_H 0x0d
#define MOTOR_DRIVER_COUNT_NOW_1_L 0x0e	
#define MOTOR_DRIVER_COUNT_NOW_1_H 0x0f
#define MOTOR_DRIVER_COUNT_NOW_2_L 0x10
#define MOTOR_DRIVER_COUNT_NOW_2_H 0x11
#define MOTOR_DRIVER_DIRECTION_NOW 0x12
#define MOTOR_DRIVER_ENABLE 0x13

int main(void)
{
	int device_addr;
	int i = 0;
	device_addr = wiringPiI2CSetup(DEVICE_ARRD);
	
	if (device_addr < 0)
		printf("Extend board Can not be initialized, please enable I2C and try again!\n", device_addr);
	
	if (MOTOR_DRIVER_SPEED_SET_1 <= 255)
		printf("Now the speed of MOTOR_DRIVER_1 is: %d\n" ,(int)(wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_SPEED_1_L)));
	else
		printf("Now the speed of MOTOR_DRIVER_1 is: %d\n" ,(int)((wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_SPEED_NOW_1_H) << 8 | wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_SPEED_1_L))));
	if (MOTOR_DRIVER_SPEED_SET_2 <= 255)
		printf("Now the speed of MOTOR_DRIVER_2 is: %d\n" ,(int)(wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_SPEED_2_L)));
	else
		printf("Now the speed of MOTOR_DRIVER_2 is: %d\n" ,(int)((wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_SPEED_NOW_2_H) << 8 | wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_SPEED_2_L))));
	
	if (((wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_DIRECTION_NOW) & 0x01) == 0x01))
		printf("Now the direction of MOTOR_DRIVER_1 is:CW\n");
	else
		printf("Now the direction of MOTOR_DRIVER_1 is:CCW\n");
	
	if (((wiringPiI2CReadReg8(device_addr,MOTOR_DRIVER_DIRECTION_NOW) & 0x02) == 0x02))
		printf("Now the direction of MOTOR_DRIVER_2 is:CW\n");
	else
		printf("Now the direction of MOTOR_DRIVER_2 is:CCW\n");

	wiringPiI2CWriteReg8(device_addr,MOTOR_DRIVER_SPEED_1_L,(MOTOR_DRIVER_SPEED_SET_1 & 0xff));
	wiringPiI2CWriteReg8(device_addr,MOTOR_DRIVER_SPEED_1_H,(MOTOR_DRIVER_SPEED_SET_1 >> 8));
	wiringPiI2CWriteReg8(device_addr,MOTOR_DRIVER_SPEED_2_L,(MOTOR_DRIVER_SPEED_SET_2 & 0xff));
	wiringPiI2CWriteReg8(device_addr,MOTOR_DRIVER_SPEED_2_H,(MOTOR_DRIVER_SPEED_SET_2 >> 8));
	wiringPiI2CWriteReg8(device_addr,MOTOR_DRIVER_ENABLE,DEVICE_ARRD);	
}

Compile!

gcc Motor.c -lwiringPi -o Motor

Exec It!

./Motor

Progarm in language Python(Raspberry Pi)

  • Create a new file named:Motor.py and paste following codes:
import time as t
import smbus
import sys

#MOTOR_DRIVER Address

MOTOR_DRIVER_ADDRESS = 0x18
MOTOR_DRIVER_BUS = 1

#Set the speed value of MOTOR_DRIVER
MOTOR_DRIVER_SPEED_SET_1 = (int)(input("Set the speed of MOTOR_DRIVER_1:"))
MOTOR_DRIVER_SPEED_SET_2 = (int)(input("Set the speed of MOTOR_DRIVER_2:"))

MOTOR_DRIVER_SPEED_1_L = 0x01
MOTOR_DRIVER_SPEED_1_H = 0x02
MOTOR_DRIVER_SPEED_2_L = 0x03
MOTOR_DRIVER_SPEED_2_H = 0x04
MOTOR_DRIVER_COUNT_1_L = 0x05
MOTOR_DRIVER_COUNT_1_H = 0x06
MOTOR_DRIVER_COUNT_2_L = 0x07
MOTOR_DRIVER_COUNT_2_H = 0x08
MOTOR_DRIVER_DIRECTION = 0x09
MOTOR_DRIVER_SPEED_NOW_1_L = 0x0a
MOTOR_DRIVER_SPEED_NOW_1_H = 0x0b
MOTOR_DRIVER_SPEED_NOW_2_L = 0x0c
MOTOR_DRIVER_SPEED_NOW_2_H = 0x0d
MOTOR_DRIVER_COUNT_NOW_1_L = 0x0e
MOTOR_DRIVER_COUNT_NOW_1_H = 0x0f
MOTOR_DRIVER_COUNT_NOW_2_L = 0x10
MOTOR_DRIVER_COUNT_NOW_2_H = 0x11
MOTOR_DRIVER_DIRECTION_NOW = 0x12
MOTOR_DRIVER_ENABLE = 0x13

bus = smbus.SMBus(MOTOR_DRIVER_BUS)

if MOTOR_DRIVER_SPEED_SET_1 <= 255 :
    print("Now the speed of MOTOR_DRIVER_1 is:" ,bus.read_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_NOW_1_L))
else :
    print("Now the speed of MOTOR_DRIVER_1 is:" ,((bus.read_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_NOW_1_H)) << 8) | bus.read_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_NOW_1_L))
    
if MOTOR_DRIVER_SPEED_SET_2 <= 255 :
    print("Now the speed of MOTOR_DRIVER_2 is:" ,bus.read_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_NOW_2_L))
else :
    print("Now the speed of MOTOR_DRIVER_2 is:" ,((bus.read_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_NOW_2_H)) << 8) | bus.read_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_NOW_2_L))

bus.write_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_1_H,(MOTOR_DRIVER_SPEED_SET_1 >> 8))  
bus.write_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_1_L,(MOTOR_DRIVER_SPEED_SET_1 & 0xff))
bus.write_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_2_L,(MOTOR_DRIVER_SPEED_SET_2 & 0xff))
bus.write_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_SPEED_2_H,(MOTOR_DRIVER_SPEED_SET_2 >> 8))
bus.write_byte_data(MOTOR_DRIVER_ADDRESS,MOTOR_DRIVER_ENABLE,0x10)

Execute it !

python3 Motor.py

Progarm in language java(Raspberry Pi)

  • Create a new file named:Motor.java and paste following codes:
import java.io.IOException;
import java.util.Arrays;

import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CDevice;
import com.pi4j.io.i2c.I2CFactory;
import com.pi4j.io.i2c.I2CFactory.UnsupportedBusNumberException;
import com.pi4j.platform.PlatformAlreadyAssignedException;
import com.pi4j.util.Console;

public class Motordriver {
	
	//MOTOR_DRIVER Address
	public static final int DOCKERPI_MOTORDRIVER_BOARD = 0x18;
	
	public static final byte MOTOR_DRIVER_DIRECTION_STATUS_1 = (byte) 0x00;
	public static final byte MOTOR_DRIVER_DIRECTION_STATUS_2 = (byte) 0x01;
	public static final byte MOTOR_DRIVER_DIRECTION_STATUS_3 = (byte) 0x02;
	public static final byte MOTOR_DRIVER_DIRECTION_STATUS_4 = (byte) 0x04;
	
	//Set the speed value of MOTOR_DRIVER
	public static final int MOTOR_DRIVER_SPEED_SET_1 = 500;
	public static final int MOTOR_DRIVER_SPEED_SET_2 = 1000;
	//Set the status of MOTOR_DRIVER_DIRECTION
	public static final byte MOTOR_DRIVER_DIRECTION_STATUS = (byte) 0x01;
	
	//Set the count value of MOTOR_DRIVER
	public static final int MOTOR_DRIVER_COUNT_SET_1 = 500;
	public static final int MOTOR_DRIVER_COUNT_SET_2 = 1000;
	
	//Motordriver functions
	public static final byte MOTOR_DRIVER_SPEED_1_L = (byte) 0x01;
	public static final byte MOTOR_DRIVER_SPEED_1_H = (byte) 0x02;
	public static final byte MOTOR_DRIVER_SPEED_2_L = (byte) 0x03;
	public static final byte MOTOR_DRIVER_SPEED_2_H = (byte) 0x04;
	public static final byte MOTOR_DRIVER_COUNT_1_L = (byte) 0x05;
	public static final byte MOTOR_DRIVER_COUNT_1_H = (byte) 0x06;
	public static final byte MOTOR_DRIVER_COUNT_2_L = (byte) 0x07;
	public static final byte MOTOR_DRIVER_COUNT_2_H = (byte) 0x08;
	
	public static final byte MOTOR_DRIVER_DIRECTION = (byte) 0x09;
	
	public static final byte MOTOR_DRIVER_SPEED_NOW_1_L = (byte) 0x0a;
	public static final byte MOTOR_DRIVER_SPEED_NOW_1_H = (byte) 0x0b;
	public static final byte MOTOR_DRIVER_SPEED_NOW_2_L = (byte) 0x0c;
	public static final byte MOTOR_DRIVER_SPEED_NOW_2_H = (byte) 0x0d;
	
	public static final byte MOTOR_DRIVER_COUNT_NOW_1_L = (byte) 0x0e;
	
	public static final byte MOTOR_DRIVER_COUNT_NOW_1_H = (byte) 0x0f;
	public static final byte MOTOR_DRIVER_COUNT_NOW_2_L = (byte) 0x10;
	public static final byte MOTOR_DRIVER_COUNT_NOW_2_H = (byte) 0x11;
	public static final byte MOTOR_DRIVER_DIRECTION_NOW = (byte) 0x12;
	public static final byte MOTOR_DRIVER_ENABLE = (byte) 0x13;
	
	
	public static void main(String[] args)
			throws InterruptedException, PlatformAlreadyAssignedException, IOException, UnsupportedBusNumberException {
			

				final Console console = new Console();
				
				I2CBus i2c = I2CFactory.getInstance(I2CBus.BUS_1);
				I2CDevice device = i2c.getDevice(DOCKERPI_MOTORDRIVER_BOARD);	
				
				if (MOTOR_DRIVER_SPEED_SET_1 <= 255)
					console.println("Now the speed of MOTOR_DRIVER_1 is:" + (device.read(MOTOR_DRIVER_SPEED_NOW_1_L)));
				else
					console.println("Now the speed of MOTOR_DRIVER_1 is:" + (device.read(MOTOR_DRIVER_SPEED_NOW_1_L) | (device.read(MOTOR_DRIVER_SPEED_NOW_1_H) << 8)));
				
				//device.write(MOTOR_DRIVER_DIRECTION,(byte)0x01);
				
				//device.write(MOTOR_DRIVER_COUNT_1_L,(byte)((MOTOR_DRIVER_COUNT_SET_1_L) & 0xff));
				//device.write(MOTOR_DRIVER_COUNT_1_H,(byte)(MOTOR_DRIVER_COUNT_SET_1_H >> 8));
				
				if (MOTOR_DRIVER_SPEED_SET_2 <= 255)
					console.println("Now the speed of MOTOR_DRIVER_2 is:" + device.read(MOTOR_DRIVER_SPEED_NOW_2_L));
				else
					console.println("Now the speed of MOTOR_DRIVER_2 is:" + (device.read(MOTOR_DRIVER_SPEED_NOW_2_L) | (device.read(MOTOR_DRIVER_SPEED_NOW_2_H) << 8)));
				
				if ((device.read(MOTOR_DRIVER_DIRECTION_NOW) & 0x01) == 0x01)
					console.println("Now the direction of MOTOR_DRIVER_1 is:CW");
				else
					console.println("Now the direction of MOTOR_DRIVER_1 is:CCW");
				
				if ((device.read(MOTOR_DRIVER_DIRECTION_NOW) & 0x02) == 0x02)
					console.println("Now the direction of MOTOR_DRIVER_2 is:CW");
				else
					console.println("Now the direction of MOTOR_DRIVER_2 is:CCW");                                                                                                                                                                                                                                                                                                                             
				
				device.write(MOTOR_DRIVER_DIRECTION,MOTOR_DRIVER_DIRECTION_STATUS);
				device.write(MOTOR_DRIVER_SPEED_2_L,(byte)((MOTOR_DRIVER_SPEED_SET_2) & 0xff));
				device.write(MOTOR_DRIVER_SPEED_2_H,(byte)(MOTOR_DRIVER_SPEED_SET_2 >> 8));
				
				device.write(MOTOR_DRIVER_SPEED_1_L,(byte)((MOTOR_DRIVER_SPEED_SET_1) & 0xff));
				device.write(MOTOR_DRIVER_SPEED_1_H,(byte)(MOTOR_DRIVER_SPEED_SET_1 >> 8));

				device.write(MOTOR_DRIVER_ENABLE,(byte)0x02);
			}
}
  • Compile it and running:
javac Motor.java -classpath .:classes:/opt/pi4j/lib/'*' 
sudo java -classpath .:classes:/opt/pi4j/lib/'*' Motor

FAQ

  • Q: If i set some value of register address,but the Motor has no response,what can i do for it?
 A: Firstly,please check the power supply port.
    Secondly,you need to check whether you open I2C.Secondly.
    Thirdly,you may not set the value of register address :"0x13".
  • Q: If i directly control it without programming,when i finish setting the value,but the motor doesn't work.
 A: Please try to set the value of register 0x13 again.

Keywords

Motor,DockerPi

Git Repository

waiting for supplement...

Video Tutorial

waiting for supplement...