- Tilta Nucleus Nano 2 motor (WLC-T05-MK))
- "The Knob" - Tilta Nucleus Nano II Hand Wheel Controller (WLC-T05) (needed to configure the motor, once)
- nRF52840-Dongle dev board from Nordic Semiconductor
Most importantly, we must set the motor to operate on IEEE 804.15.4 channel 12. If you want it on a different channel, you'll need to change it in both motor and dongle firmware (in src/main.c
).
- turn on the Knob.
- navigate to Menu -> Connect -> 2.4G -> Channels, activate CH1
- apply power to the motor
- with short presses, make the LED pink (that sets it to be a focus motor)
- double-click motor's button (it enters pairing mode)
- click Search on the Knob. The motor should appear in the list, tap it.
That's it, the motor should now be controlled by the Knob. (you may have to calibrate the motor range first)
- Turn off the Knob.
- install nRF Connect SDK for VSCode (follow nRF Connect SDK introduction Excercise 1)
- open this project in VSCode
- in VSCode, open nRF Connect on the activity bar, click "Create new build configuration". Select board
nrf52840dongle_nrf52840
, andprj.conf
in Configuration field. - build it.
The executable is usually placed into
<project>/build/zephyr/zephyr.hex
- flash it:
- open Nrf Connect Programmer tool (needs to be installed separately)
- insert the dongle and press the Reset button
- select the board in Programmer
- click Add File, browse to
zephyr.hex
we've just built - click "write".
After the write is finished, the motor should start going back and forth by about a quarter of its range, in sync with the red led turning on and off on the dongle.
We have only reverse-engineered the position commands so far.
The communication is on IEEE 802.15.4 channel 12 ("CH1" in Knob's terms).
vv vv vv vv vv vv vv vv vv ieee802.15.4 packet header
vv vv vv vv packet payload
61 88 c4 e7 01 ff ff 96 f0 44 05 00 b7
^^ ^^ packet type and flags (type=Data, Ack=1, PAN_compression=1, src and dst addr: short(16 bit))
^^ sequence number, ++ on each packet
^^ ^^ destination PAN addr.
^^ ^^ destination
^^ ^^ source
^ motor command type
^ ^^ knob position (12-bit)
^^ internal checksum
^^ ^^ ^^ (bytes covered by internal checksum)
command type:
4 = position, seeing lots of these when turning the Knob
Also seeing 8, C and 0 while idling, no idea what they mean.
internal checksum: =(0u8 - byte0 - byte1 - byte2)
We don't know yet if source and destination addresses matter, we've just copied what we've seen in the air.
02 00 c4
^^ sequence number
Use the Knob to configure the motion speed (called "sensitivity" in Knob's menu) and torque.
We have noticed that the motor only engages the full speed if it senses that a human is turning the Knob, and would otherwise be very slow and gentle. When holding static position, adding some noise is enough to convince the motor to engage the full speed. That is being done in this example project.
If yours doesn't work, or if you want to implement some other features, you can use ieee802.15.4 sniffer from Nordic, which runs on the same dongle. This is what we have used for our reverse-engineering.