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˘
   57   58   59   60   61   62   63   64   65   66   67