After David Lechner announced ev3dev support for it I’ve been planning to offer myself a couple of BrickPi 3 from Dexter Industries (just one is not enough since the BrickPi 3 suports daisy chaining).
While I wait for european distributors to sell it (and my budget to stabilize) and since I’m also playing with magnets, I ordered a mindsensors.com Grove adapter so I can start testing Grove devices with my Ev3. Also got two Grove devices from Seeed Studio at my local robotics store, will start with the easiest one: Grove – Electromagnet.
ev3dev doesn’t have a Grove driver yet but since the adapter is an I2C device it recognizes it and configures it as an I2C host:
[ 563.590748] lego-port port0: Added new device 'in1:nxt-i2c-host' [ 563.795525] i2c-legoev3 i2c-legoev3.3: registered on input port 1
Addressing the Grove adpter is easy, just need to follow the ev3dev documentation (Appendix C : I2C devices):
robot@ev3dev:~$ ls /dev/i2c-in* /dev/i2c-in1 robot@ev3dev:~$ udevadm info -q path -n /dev/i2c-in1 /devices/platform/legoev3-ports/lego-port/port0/i2c-legoev3.3/i2c-3/i2c-dev/i2c-3
So the Grove adapter is at I2C bus #3. According to mindsensors.com User Guide, it’s address is 0x42. That’t the unshifted address but fot i2c-tools we need to use the shifted address (0x21 – at the end of the ev3dev Appendix C doc there is a table with both addresses).
robot@ev3dev:~$ sudo i2cdump 3 0x21 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 56 31 2e 30 32 00 00 00 6d 6e 64 73 6e 73 72 73 V1.02...mndsnsrs 10: 47 61 64 70 74 6f 72 00 00 00 00 00 00 00 00 00 Gadptor......... 20: 4a 61 6e 20 30 34 20 32 30 31 35 00 31 32 46 31 Jan 04 2015.12F1 30: 38 34 30 00 00 00 00 00 00 00 00 00 00 00 00 00 840............. 40: 00 97 03 32 00 00 00 00 00 00 00 00 00 00 00 00 .??2............ 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Acording to the User Guide, this is the expected content of the first 24 registers:
0x00-0x07: Software version – Vx.nn
0x08-0x0f: Vendor Id – mndsnsrs
0x10-0x17: Device ID – Gadptor
So I have a v1.02 Grove adapter.
To use the Grove – Electromagnet I just need to send a “T” (0x54) to the Command Register (0x41) to set the Grove Adapter into “Transmit” mode and next set the Operation Mode, which can be “Digital_0” (sending 0x02 to the Operation Mode register at 0x42) or “Digital_1” (sending 0x03 to the Operation Mode register).
So to turn the electromagnet ON:
sudo i2cset -y 3 0x21 0x41 0x54 sudo i2cset -y 3 0x21 0x42 0x03
And to turn it OFF:
sudo i2cset -y 3 0x21 0x41 0x54 sudo i2cset -y 3 0x21 0x42 0x02
Just a warning: with an operating current of 400 mA when ON the electromagnet gets hot very quickly – not enough to hurt but don’t forget to switch it OFF after use to prevent draing the EV3 batteries.
The same method (“T” + “Digital_0” / “Digital_1”) can be used with several other Grove devices, like the Grove – Water Atomization:
(a great way to add fog effects to our creations – just be careful with short circuits; if you add some kind of parfum you can also have scent effects)
Final note: you can use the mindsensors.com Grove Adapter with native EV3 firmware (just import the available EV3-G block) but if you are using ev3dev like me be sure to use a recent kernel (as of today, “4.4.61-20-ev3dev-ev3”) because older versions had a bug that caused some communication problems with I2C devices (the Grove Adapter is an I2C device).