The module support SPI communications with following features (mode 3):
- module is slave
- SS signal is not used
- clock signal at 1 MHz maximum
- clock polarity is HIGH
- clock phase is HIGH
- byte codification is 8 bits MSB
It exchanges bytes with two shifted registers: from master via MOSI and to master via MISO (circular buffer).
Lua example:
-- configure SPI bus
spi.setup(1, spi.MASTER, spi.CPOL_HIGH, spi.CPHA_HIGH, 8, 22, spi.FULLDUPLEX)
-- send byte by byte
function spiSend(data)
-- send one byte and receive another (to/from module)
r = { spi.send(1, data) }
return r[2]
end
-- useful conversion of values longer than 1 byte
function int32Net(val)
local b = {}
b[4] = val % 256
val = val / 256
b[3] = val % 256
val = val / 256
b[2] = val % 256
b[1] = val / 256
return b
end
Master sends commands and, optionally, some parameter. Commands are 1 byte constant (specified below). Parameters are 0-N bytes sequence and length depends on each command.
When the command is processed, the module sends the response starting with a SM (Start of Message) constant followed by a 0-N bytes sequence and the OK constant. While command response is not available, requesting answer is NC (No Command) in result.
Lua example:
NC = 0x00
OK = 0x01
KO = 0x02
SM = 0xFF
function sendCommand(cmd, params, retCount)
spiSend(cmd)
for p=1,#params do spiSend(params[p]) end
result = {}
n = 0
while spiSend(NC) ~= SM do
tmr.delay(10000)
n = n + 1
if n > 100 then return false end
end
for r=1,retCount do table.insert(result, spiSend(NC)) end
return (spiSend(NC) == OK and result or false)
end
- command (1 byte, unsigned): 0x10
Returns:
- SM (1 byte, unsigned): 0xFF
- firmVersion (1 byte, unsigned): 0 .. 255
- serialNumber (2 bytes, unsigned): 0 .. 65535
- OK (1 byte, unsigned): 0x01
Lua example:
function hello()
r = sendCommand(0x10, {}, 3)
if not r then return false end
version = r[1]
serial = (r[2]*0x100)+r[3]
return { version, serial }
end
h = hello()
print("version " .. h[1] .. ", serial " .. h[2])
- command (1 byte unsigned): 0x22
- left (1 byte signed): -128 .. 127
- right (1 byte signed): -128 .. 127
Returns:
- SM (1 byte, unsigned): 0xFF
- OK (1 byte, unsigned): 0x01
Lua example:
function setPower(left, right)
r = sendCommand(0x22, {left, right}, 0)
return (r and true or false)
end
=setPower(127, -20)
- command (1 byte, unsigned): 0x40
Returns:
- SM (1 byte, unsigned): 0xFF
- leftSteps (4 bytes, signed): −2147483648 .. 2147483647
- rightSteps (4 bytes, signed): −2147483648 .. 2147483647
- OK (1 byte, unsigned): 0x01
Lua example:
function getSteps()
r = sendCommand(0x30, {}, 8)
if r then
left = (r[1]*0x1000000)+(r[2]*0x10000)+(r[3]*0x100)+r[4]
right = (r[5]*0x1000000)+(r[6]*0x10000)+(r[7]*0x100)+r[8]
return { left, right }
else
return false
end
end
- command (1 byte, unsigned): 0x50
Returns:
- SM (1 byte, unsigned): 0xFF
- OK (1 byte, unsigned): 0x01
Lua example:
function resetSteps()
r = sendCommand(0x40, {}, 0)
return (r and true or false)
end
=resetSteps()
- command (1 byte, unsigned): 0x54
- steps (4 bytes, signed): −2147483648 .. 2147483647
Returns:
- SM (1 byte, unsigned): 0xFF
- OK (1 byte, unsigned): 0x01
Note: see "Alarm steps" below.
Lua example:
function alarmStepsLeft(steps)
r = sendCommand(0x54, int32Net(steps), 0)
return (r and true or false)
end
=alarmStepsLeft(400)
- command (1 byte, unsigned): 0x64
- steps (4 bytes, signed): −2147483648 .. 2147483647
Returns:
- SM (1 byte, unsigned): 0xFF
- OK (1 byte, unsigned): 0x01
Note: see "Alarm steps" below.
Lua example:
function alarmStepsRight(steps)
r = sendCommand(0x64, int32Net(steps), 0)
return (r and true or false)
end
=alarmStepsRight(-300)
Commands alarmStepsLeft and alarmStepsRight set an absolute value of steps to alarm when the left or right encoder reachs the steps. When it ocurrs, the MMI pin is set HIGH and the main controller should read the steps with getSteps command. MMI pin is set LOW again by the motor module when getSteps command is executed.
Even though the steps value is absolute (32 bits integer), motor module can only set the alarm to a value not greater or lower than 32767 steps (16 bits integer) from current steps value. This is an internal memory optimization and it should be enough to manage almost use cases. If you want to be alarmed in longer steps, set intermediate alarm values within the working range.
-ToDo-