Now that communication with the Chromecast is working let’s make a small game with the few parts that I have in my “holiday bag”:
I’m using the LEGO Dimensions Toy Pad to read the NFC tags. I already scanned the ID’s of a blue and an orange tag and saved two JPEG images of the Frenchman LEGO minifigure and also the Invisible Woman (sorry, only had one minifig with me these holydays) on the web server folder so each time one of these NFC tags is recognized it’s JPEG image is presented on the TV.
The code is based on my tutorial for the using the LEGO Dimensions Toy Pad with ev3dev, I just updated it to work with Python 3:
#!/usr/bin/python3
import usb.core
import usb.util
from time import sleep
import pychromecast
TOYPAD_INIT = [0x55, 0x0f, 0xb0, 0x01, 0x28, 0x63, 0x29, 0x20, 0x4c, 0x45, 0x47, 0x4f, 0x20, 0x32, 0x30, 0x31, 0x34, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
OFF = [0,0,0]
RED = [255,0,0]
GREEN = [0,255,0]
BLUE = [0,0,255]
ORANGE= [255,30,0]
ALL_PADS = 0
CENTER_PAD = 1
LEFT_PAD = 2
RIGHT_PAD = 3
# Actions
TAG_INSERTED = 0
TAG_REMOVED = 1
# UIDs can be retrieved with Android App (most probably in hexadecimal)
bluetag = (4, 77, 198, 218, 162, 64, 129) # a Blue Tag from LEGO Dimensions
orangetag = (4, 91, 182, 122, 177, 73, 129) # an Orange Tag from LEGO Dimensions
DELAY_PLAY = 1.75 # 1.5 NOT OK
def init_usb():
global dev
dev = usb.core.find(idVendor=0x0e6f, idProduct=0x0241)
if dev is None:
print('Device not found')
else:
print('Device found:')
if dev.is_kernel_driver_active(0):
dev.detach_kernel_driver(0)
print(usb.util.get_string(dev, dev.iProduct))
dev.set_configuration()
dev.write(1,TOYPAD_INIT)
return dev
def send_command(dev,command):
# calculate checksum
checksum = 0
for word in command:
checksum = checksum + word
if checksum >= 256:
checksum -= 256
message = command+[checksum]
# pad message
while(len(message) < 32):
message.append(0x00)
# send message
dev.write(1, message)
return
def switch_pad(pad, colour):
send_command(dev,[0x55, 0x06, 0xc0, 0x02, pad, colour[0], colour[1], colour[2],])
return
def uid_compare(uid1, uid2):
match = True
for i in range(0,7):
if (uid1[i] != uid2[i]) :
match = False
return match
def main():
# init chromecast
chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == "NOMAD")
cast.wait()
mc = cast.media_controller
print("Blacking chromecast...")
mc.play_media('http://192.168.43.104:3000/black.png', 'image/png')
result=init_usb()
# print(result)
if dev != None :
print('Running...')
mc.stop()
mc.play_media('http://192.168.43.104:3000/presentminifig.png', 'image/png')
print('Present a minifg')
while True:
try:
in_packet = dev.read(0x81, 32, timeout = 10)
bytelist = list(in_packet)
if not bytelist:
pass
elif bytelist[0] != 0x56: # NFC packets start with 0x56
pass
else:
pad_num = bytelist[2]
uid_bytes = bytelist[6:13]
# print(uid_bytes)
match_orange = uid_compare(uid_bytes, orangetag)
match_blue = uid_compare(uid_bytes, bluetag)
action = bytelist[5]
if action == TAG_INSERTED :
if match_orange:
switch_pad(pad_num, ORANGE)
mc.play_media('http://192.168.43.104:3000/french-man-2.png', 'image/png')
elif match_blue:
mc.play_media('http://192.168.43.104:3000/invisible-woman-2b.png', 'image/png')
switch_pad(pad_num, BLUE)
else:
# some other tag
switch_pad(pad_num, GREEN)
else:
# some tag removed
switch_pad(pad_num, OFF)
mc.stop()
# sleep(1)
mc.play_media('http://192.168.43.104:3000/presentminifig.png', 'image/png')
sleep(DELAY_PLAY)
except usb.USBError:
pass
switch_pad(ALL_PADS,OFF)
return
if __name__ == '__main__':
main()
You probably need to install pyusb for python3. With Ubuntu I just needed
sudo apt install python3-usb
but it is not available for Debian Jessie so
sudo pip3 install pyusb --pre
(ev3dev is changing to Debian Stretch that also has python3-usb)