Page 62 - MATINF Nr. 9-10
P. 62
62 R.D. Albu
distant , a parcurs˘a de roata mai rapid˘a s , i distant , a pe care o parcurge roata mai lent˘a. Dac˘a se
a
a
apeleaz˘ funct , ia cu aceast˘ diferent , ˘a, se va oferi unghiul ˆın care robotul s-a ˆıntors.
ˆ
def getUnghiIntoarcere(distant , a): pasare.resetEncoders()
d = 10 # l˘at , imea robotului pasare.setMotors(0,20)
ˆ
unghi=180*distant , a/(3.14159*d) while getUnghiIntoarcere(getDistant , aRoata (’R’)) <= 360:
return unghi pass
pasare.stop()
def trasareCerc(leftSpeed, rightSpeed):
pasare.resetEncoders()
pasare.setMotors(leftSpeed, rightSpeed)
ˆ
while getUnghiIntoarcere(abs(getDistant , aRoata(’R’)-getDistant , aRoata(’L’))) <= 360:
pass
bird.stop()
for i in range(5):
trasareCerc(random.randint(0,50),50+random.randint(0,50))
sleep(1)
ˆ
Utilizarea busolei Finch spune direct , ia micro:bitului ˆın raport cu nordul magnetic. Inainte
de a utiliza busola, trebuie calibrat˘a ˆın conectorul BlueBird. Dup˘a calibrare, se poate utiliza
a
metoda getCompass() pentru a citi valoarea busolei. Aceast˘a metod˘ nu necesit˘a parametri s , i
◦
◦
◦
returneaz˘ valoarea busolei de la 0 s , i 359 . 0 corespunde direct , iei nordului magnetic. Unghiul
a
◦
cres , te pe m˘asur˘ ce robotul se ˆıntoarce ˆın sensul acelor de ceasornic, deci 90 este spre est, 180 ◦
a
◦
este spre sud, iar 270 este vest. Pentru a utiliza busola, Finch trebuie s˘a fie la nivelul solului,
ˆın caz contrar, busola nu va oferi m˘asur˘atori utile.
#Funct , a returneaz˘a un string ce reprezint˘a direct , ia ˆın care este while not(pasare.getButton(’A’)):
ˆındreptat Finch if pasare.getDistance()>30: #Niciun obstacol
def direct , ia(): if pasare.getCompass()>180: #us , or spre vest
if pasare.getCompass()>30 and pasare.getCompass()<60: pasare setMotors(20,0)
return ’NE’ else: # us , or spre est
elif pasare.getCompass()>75 and pasare.getCompass()<105: pasare.setMotors(0,20)
return ’E’ else:
elif pasare.getCompass()>120 and pasare.getCompass()<150: pasare.setMove(’B’,10,50)
return ’SE’ pasare setTurn(’L’,90, 50)
elif pasare.getCompass()>165 and pasare.getCompass()<195: pasare.stopAll()
return ’S’
elif pasare.getCompass()>210 and pasare.getCompass()<240:
return ’SW’
elif pasare.getCompass()>255 and pasare.getCompass()<285:
return ’W’
elif pasare.getCompass()>300 and pasare.getCompass()<330:
return ’NW’
elif pasare.getCompass()>345 or pasare.getCompass()<15:
return ’N’
else:
return ”
# Testare funct , ie
while not(pasare.getButton(’A’)):
pasare.print(direct , a())
print(pasare.getCompass())
sleep(1)
Dac˘a se dores , te ca Finch s˘a redea o not˘a diferit˘a pentru fiecare direct , ie, o modalitate ar
fi de a utiliza o declarat , ie if-elif-else care s˘a includ˘a un caz pentru fiecare direct , ie. Se poate
a
face codul mai eficient folosind un dict , ionar, care este similar cu o list˘a, cu except , ia faptului c˘