top of page
Buscar

Formas de se fazer um seguidor de linha no lego mindstorms 51515

1 de dez. de 2024
3 min de leitura

Neste post, iremos nos aprofundar em duas maneiras as quais podemos utilizar para fazer um seguidor de linha no lego mindstorms robot inventor(51515).


A primeira delas trata-se da mais convencional, utilizar as leituras do sensor de cor que vem no kit para fazer seu robô seguir a linha. Embora seja um meio bastante simples e rápido de fazer um seguidor de linha, ele apresenta algumas desvantagens, como o fato de não ser tão rápido ou eficiente, por exemplo.


Código utilizado para esse modelo:




Demonstração do modelo:





A outra forma de construir um seguidor de linha nesta plataforma é utilizando a câmera huskylens, da Dfrobot. Trata-se de uma câmera bastante fácil de se programar, mas ainda requer alguns conhecimentos a mais, em relação ao modelo anterior. Ela é bem mais precisa e funciona de forma mais suave, mas requer uma fonte externa para utilizá-la.


Para utilizá-la, instale a biblioteca pyhuskylens.py no python do app lego:


import ubinascii, uos, machine,uhashlib

from ubinascii import hexlify

b64="""TQUCHyCLCOgQTgAHLExpYnJhcnkvcHlodXNreWxlbnMucHk5KDA5UGUlRYAdHx8fK2YkJCQkJCQkJEQkJGQgixSLEoupAIAQEHNsZWVwX21zEBB0aWNrc19tcyoCGwh0aW1lHAUWARwFFgFZgFEbDHN0cnVjdBYBgBAASCoBGwBzHABIFgBIWYAQCmF0YW4yEA5kZWdyZWVzKgIbCG1hdGgcBRYBHAUWAVmAEAhwb3J0KgEbBmh1YhwDFgFZMgIWCGJ5dGUjABYMSEVBREVSIwEWDEZBSUxFRDIDEQB8oCI+NAI0ATAeFg5SRVFVRVNUFhxSRVFVRVNUX0JMT0NLUxYcUkVRVUVTVF9BUlJPV1MWHlJFUVVFU1RfTEVBUk5FRBYsUkVRVUVTVF9CTE9DS1NfTEVBUk5FRBYsUkVRVUVTVF9BUlJPV1NfTEVBUk5FRBYaUkVRVUVTVF9CWV9JRBYoUkVRVUVTVF9CTE9DS1NfQllfSUQWKFJFUVVFU1RfQVJST1dTX0JZX0lEFhZSRVRVUk5fSU5GTxYYUkVUVVJOX0JMT0NLFhhSRVRVUk5fQVJST1cWGlJFUVVFU1RfS05PQ0sWIlJFUVVFU1RfQUxHT1JJVEhNFhJSRVRVUk5fT0sWJlJFUVVFU1RfQ1VTVE9NTkFNRVMWGlJFUVVFU1RfUEhPVE8WJFJFUVVFU1RfU0VORF9QSE9UTxYuUkVRVUVTVF9TRU5EX0tOT1dMRURHRVMWNFJFUVVFU1RfUkVDRUlWRV9LTk9XTEVER0VTFiZSRVFVRVNUX0NVU1RPTV9URVhUFiRSRVFVRVNUX0NMRUFSX1RFWFQWGlJFUVVFU1RfTEVBUk4WHFJFUVVFU1RfRk9SR0VUFi5SRVFVRVNUX1NFTkRfU0NSRUVOU0hPVBYuUkVRVUVTVF9TQVZFX1NDUkVFTlNIT1QWPFJFUVVFU1RfTE9BRF9BSV9GUkFNRV9GUk9NX1VTQhYcUkVRVUVTVF9JU19QUk8WMFJFUVVFU1RfRklSTVdBUkVfVkVSU0lPThYWUkVUVVJOX0JVU1kRBRYaUkVUVVJOX0lTX1BST4AWNEFMR09SSVRITV9GQUNFX1JFQ09HTklUSU9OgRYyQUxHT1JJVEhNX09CSkVDVF9UUkFDS0lOR4IWOEFMR09SSVRITV9PQkpFQ1RfUkVDT0dO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

"""


def calc_hash(b):

    return hexlify(uhashlib.sha256(b).digest()).decode()


# this is the hash of the compiled mpy

hash_gen='3af861ba999a2843b8873036adb9cbca23d288a637a3cec237b68da3cddd34b0'


pyhuskylens=ubinascii.a2b_base64(b64)

hash_initial=calc_hash(pyhuskylens)


try: # remove any old versions of pyhuskylens library

    uos.remove('/projects/pyhuskylens.py')

    uos.remove('/projects/pyhuskylens.mpy')

except OSError:

    pass


print('writing pyhuskylens.mpy to folder /projects')

with open('/projects/pyhuskylens.mpy','wb') as f:

    f.write(pyhuskylens)

print('Finished writing pyhuskylens.mpy.')

print('Checking hash.')

pyhuskylens_check=open('/projects/pyhuskylens.mpy','rb').read()

hash_check=calc_hash(pyhuskylens_check)


print('Hash generated: ',hash_gen)

error=False

if hash_initial != hash_gen:

    print('Failed hash of base64 input : '+hash_initial)

    error=True

if hash_check != hash_gen:

    print('Failed hash of .mpy on SPIKE: '+hash_check)

    error=True


if not error:

    print('pyhuskylens library written succesfully. Resetting....')

    machine.reset()

else:

    print('Failure in pyhuskylens library!')




feito isso, apague este programa e rode o código do seguidor de linha:


from mindstorms import MSHub, Motor, MotorPair, ColorSensor, DistanceSensor, App

from mindstorms.control import wait_for_seconds, wait_until, Timer

from mindstorms.operator import greater_than, greater_than_or_equal_to, less_than, less_than_or_equal_to, equal_to, not_equal_to

import math


from projects.pyhuskylens import (HuskyLens,

ALGORITHM_FACE_RECOGNITION,

ALGORITHM_FACE_RECOGNITION,

ALGORITHM_OBJECT_TRACKING,

ALGORITHM_OBJECT_RECOGNITION,

ALGORITHM_LINE_TRACKING,

ALGORITHM_COLOR_RECOGNITION,

ALGORITHM_TAG_RECOGNITION,

ALGORITHM_OBJECT_CLASSIFICATION,

ALGORITHM_QR_CODE_RECOGNITION,

ALGORITHM_BARCODE_RECOGNITION,

ARROWS, # key for get() dict

BLOCKS, # key for get() dict

FRAME, # key for get() dict

clamp_int)


### huskylens usage ###

# get_blocks(ID=None, learned=False) returns a list of block objects

# blocks have x, y , width , height, ID properties.

# get_arrows(ID=None, learned=False) returns a list of arrow objects

# arrows have x_tail, y_tail , x_head , y_head, ID and direction properties


# get(ID=None, learned=False) returns a dict with blocks, arrows & frame


# on firmware 0.5+ you also have these class methods available:

# show_text("text", position=(10,10))

# clear_text()


# Create your objects here.

ms_hub = MSHub()

hl = HuskyLens('B', baud=9600)

ma = Motor('D')

mb = Motor('A')


# Write your program here.

ms_hub.speaker.beep()


# Get direction of a learned arrow

print("Starting line tracking")

hl.set_alg(ALGORITHM_LINE_TRACKING)

while not ms_hub.left_button.is_pressed():

    arrows = hl.get_arrows(learned=False)

    if len(arrows) > 0:

        direction = ((arrows[0].x_head+arrows[0].x_tail)/2 - 160)/-6

        ma.start_at_power(clamp_int(30+direction))

        mb.start_at_power(clamp_int(-30+direction))

    else:

        ma.start_at_power(0)

        mb.start_at_power(0)

ma.start_at_power(0)

mb.start_at_power(0)


Vídeo demonstrando o modelo:



Agora que mostramos as diferentes formas de se fazer um seguidor de linha com o lego mindstorms, cabe a você escolher qual utilizar em seus projetos!

 
 
 

Comentários


Seja o primeiro a saber das novidades

2024 Mundo do Arduino

bottom of page