Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.17 KB | None | 0 0
  1. # Write your code here :-) ok
  2. from microbit import *
  3. import radio
  4. import time
  5. import math
  6.  
  7.  
  8. leftLineSensor = pin11 # Enklere navn for linjesensoren på venstre side
  9. rightLineSensor = pin5 # Enklere navn for linjesensoren på høyre side
  10. requiredX = 400 # Hvor mye må man tilte venstre/høyre før display skal vise venstre/høyre? (Verdier 0-1000)
  11. requiredY = 100 # Hvor mye må man tilte framover/bakover før display skal vise fram/bakover? (Verdier 0-1000)
  12. minX = 0 # Hvor mye må man tilte venstre/høyre før vila begynner å svinge? (Verdier 0-1000)
  13. maxX = 400 # Hvor mye må man tilte venstre/høyre for å svinge maksimalt? (Verdier 0-1000)
  14. minY = 100 # Hvor mye må man tilte framover/bakover før bila begynner å gasse? (Verdier 0-1000)
  15. maxY = 500 # Hvor mye må man tilte framover/bakover for å gasse maksimalt? (Verdier 0-1000)
  16.  
  17. # Hver verdi av y skal tilsvare en verdi av fart.
  18. # Senere i programmet regnes det ut en speedMultiplier er mellom 0 og 1.
  19. # Når y er mellom minY og maxY er farta et sted mellom 0 og 1.
  20. # Her legges det en basis for en lineær funksjon med punkter (minY, 0) og (maxY, 1)
  21. # Følgende kode beregner stigningstall og konstantledd for denne funksjonen.
  22. slopeY = 1/(maxY-minY) # Finner stigningstall
  23. bY = -slopeY*minY # Finner konstantledd
  24.  
  25. # Når x er i området [-maxX, -minX] eller [minX, maxX]:
  26. # Forholdet mellom farta til det tregeste hjulet og det kjappeste hjulet er mellom 0 og 1.
  27. # Her legges det en basis for en lineær funksjon med punkter (minX, 0.5) og (maxX, 1)
  28. # Følgende kode beregner stigningstall og konstantledd for denne funksjonen.
  29. slopeX = 0.5/(maxX-minX)
  30. bX = -slopeX*minX
  31.  
  32. mode = "none" # mode kan være none, control eller linefollower. Starter med none.
  33. timeout = 0 # Bilen skal stoppe etter for lang tid uten mottatt signal.
  34. imageUndefined = Image("90009:" # Lager et bilde av et kryss
  35. "09090:"
  36. "00900:"
  37. "09090:"
  38. "90009")
  39. imageLinefollower = Image("90000:" # Lager et bilde av en L
  40. "90000:"
  41. "90000:"
  42. "90000:"
  43. "99999")
  44.  
  45.  
  46. def funcLSpeed(var): # Lager enklere funksjonsnavn for fart til venste hjul for å lettere kunne lese koden.
  47. pin0.write_analog(var)
  48. def funcLDir(var): # Samme for retning til venstre hjul
  49. pin8.write_digital(var)
  50. def funcRSpeed(var): # Samme for fart til høyre hjul
  51. pin1.write_analog(var)
  52. def funcRDir(var): # Samme for retning til høyre hjul
  53. pin12.write_digital(var)
  54. def drive(lDir, lSpeed, rDir, rSpeed): # Definerer en enkel funksjon for å få bilen til å kjøre en viss retning
  55. funcLDir(lDir) # Setter venstre hjul retning til lDir
  56. funcRDir(rDir) # Setter høyre hjul retning til rDir
  57. if lDir == 0: # Hvis venstre hjul kjører framover:
  58. funcLSpeed(math.floor(lSpeed*1023)) # funcLSpeed tar en verdi mellom 0 og 1023
  59. else: # Hvis venstre hjul kjører bakover:
  60. funcLSpeed(math.floor((1-lSpeed)*1023)) # verdi mellom 0 og 1023, men her er 0 mest og 1023 minst
  61. if rDir == 0: # Hvis høyre hjul kjører framover:
  62. funcRSpeed(math.floor(rSpeed*1023)) # funcRSpeed tar en verdi mellom 0 og 1023
  63. else: # Hvis høyre hjul kjører bakover:
  64. funcRSpeed(math.floor((1-rSpeed)*1023)) # verdi mellom 0 og 1023, men her er 0 mest og 1023 minst
  65.  
  66.  
  67. radio.on() # Skrur på radio
  68. radio.config(channel=23) # Setter radiokanal
  69. while True: # Hovedløkke
  70. time.sleep(0.01) # Klokkefrekvens
  71. inData = radio.receive_bytes() # Sjekker siste radiomelding i bufferen
  72. if inData is not None: # Hvis en melding er mottatt:
  73. timeout = 0 # Tid siden siste melding resettes
  74. inData = str(inData, 'utf-8').split() # Radiomeldingen inneholder en string med mellomrom. Splitter opp i en array.
  75. mode = inData[0] # Første ord i meldinga spesifiserer modus (none, control, linefollower)
  76. if mode == "none": # Hvis fjernkontrolleren ikke har valgt modus enda:
  77. display.show(Image.CONFUSED) # Displayer spørsmålstegn
  78. elif mode == "linefollower": # Hvis modus er linefollower
  79. display.show(imageLinefollower) # Henter bilde av L for linefollower
  80. leftSensor = leftLineSensor.read_digital() # Får en verdi 0 eller 1 om venstre sensor oppfatter en konstrast
  81. rightSensor = rightLineSensor.read_digital() # Får en verdi 0 eller 1 om høyre sensor oppfatter en kontrast
  82. if leftSensor is not None and rightSensor is not None: # Hvis det ikke er noe feil med komponentene:
  83. if leftSensor == 1: # Hvis ser linje til venstre:
  84. if rightSensor == 1: # Hvis ser linje til venstre og høyre:
  85. # Midt på linje
  86. display.show(Image.ARROW_N) # Pil framover
  87. drive(0, 0.4, 0, 0.4) # Kjør framover
  88. else: # Hvis kun ser linje til venstre:
  89. # Høyre for linje
  90. display.show(Image.ARROW_W) # Pil venstre
  91. drive(1, 0.2, 0, 0.2) # Kjør til venstre
  92. else: # Hvis ikke ser linje til venstre:
  93. if rightSensor == 1: # Hvis kun ser linje til høyre:
  94. # Venstre for linje
  95. display.show(Image.ARROW_E) # Pil høyre
  96. drive(0, 0.2, 1, 0.2) # Kjør til høyre
  97. else: # Hvis hverken ser linje til venstre eller høyre:
  98. # Linje ikke funnet
  99. display.show(Image.SAD) # Surfjes
  100. drive(1, 0.3, 1, 0.3) # Kjør bakover
  101. else: # Ikke mottatt data fra sensorene
  102. # Noe er feil med bila, eller microbiten er ikke koblet til bila
  103. display.show(Image.ANGRY) # Surfjes
  104. elif mode == "control": # Ganske selvsagt
  105. x = int(inData[1]) # Andre ord i radiomeldinga er x-rotasjon til fjernkontrolleren
  106. y = int(inData[2]) # Tredje ord i radiomeldinga er y-rotasjon til fjernkontrolleren
  107. speedMultiplier = slopeY*abs(y)+bY # Beregner basefart fra rotasjon (mellom 0 og 1)
  108. if speedMultiplier > 1: # Hvis y > maxY:
  109. speedMultiplier = 1 # Sett fart til 1
  110. elif speedMultiplier < 0: # Hvis y < minY:
  111. speedMultiplier = 0 # Sett fart til 0
  112. leftRatio = slopeX*x+bX # Bruker funksjonsuttrykk til å finne hvor stor ratio venstre hjul skal ha
  113. rightRatio = -slopeX*x+bX # Bruker funksjonsuttrykk til å finne hvor stor ratio høyre hjul skal ha
  114. if leftRatio > 1: # Hvis x > maxX:
  115. leftRatio = 1 # Sett venstre hjuls ratio til 1
  116. elif leftRatio < 0.5: # Hvis x < minX:
  117. leftRatio = 0.5 # Sett venstre hjuls ratio til 0.5
  118. if rightRatio > 1: # Hvis x < -maxX:
  119. rightRatio = 1 # Sett høyre hjuls ratio til 1
  120. elif rightRatio < 0.5: # Hvis x > -minX:
  121. rightRatio = 0.5 # Sett høyre hjuls ratio til 0.5
  122. if leftRatio > rightRatio: # Hvis det skal svinges til høyre:
  123. rightWheelMultiplier = 2-(leftRatio*2) # Setter en multiplier for hastighet til høyre hjul
  124. leftWheelMultiplier = 1 # Venstre hjuls hastighet = speedMultiplier
  125. elif rightRatio > leftRatio: # Hvis det skal svinges til venstre:
  126. leftWheelMultiplier = 2-(rightRatio*2) # Setter en multiplier for hastighet til venstre hjul
  127. rightWheelMultiplier = 1 # Høyre hjuls hastighet = speedMultiplier
  128. else: # Hvis x er i [-minX, minX]:
  129. # Begge hjulene har samme fart
  130. leftWheelMultiplier = 1
  131. rightWheelMultiplier = 1
  132. leftSpeed = leftWheelMultiplier*speedMultiplier # Kombinerer venstre hjuls fart med generell fart (blir mellom 0 og 1)
  133. rightSpeed = rightWheelMultiplier*speedMultiplier # Kombinerer høyre hjuls fart med generell fart (blir mellom 0 og 1)
  134. if y <= 0: # Hvis fjernkontrolleren vendes framover:
  135. direction = 0 # Retning framover
  136. else: # Hvis fjernkontrolleren vendes bakover:
  137. direction = 1 # Retning bakover
  138. drive(direction, leftSpeed, direction, rightSpeed) # Kjør bila med verdiene som er funnet.
  139. # Følgende kode bestemmer når ulike piler vises på displayet.
  140. if y > requiredY: # Hvis styrer bakover
  141. if x > requiredX: # Hvis styrer bakover mot høyre:
  142. display.show(Image.ARROW_SE) # Pil sørøst
  143. elif x < -requiredX: # Hvis styrer bakover mot venstre:
  144. display.show(Image.ARROW_SW) # Pil sørvest
  145. else: # Hvis styrer bakover med lite venstre/høyre:
  146. display.show(Image.ARROW_S) # Pil sør
  147. elif y < -requiredY: # Hvis styrer framover:
  148. if x > requiredX: # Hvis styrer framover mot høyre:
  149. display.show(Image.ARROW_NE) # Pil nordøst
  150. elif x < -requiredX: # Hvis styrer framover mot venstre:
  151. display.show(Image.ARROW_NW) # Pil nordvest
  152. else: # Hvis styrer framover med lite venstre/høyre:
  153. display.show(Image.ARROW_N) # Pil nord
  154. else: # Hvis lite framover/bakover:
  155. if x > requiredX: # Hvis styrer nesten kun mot høyre:
  156. display.show(Image.ARROW_E) # Pil øst
  157. elif x < -requiredX: # Hvis styrer nesten kun mot venstre:
  158. display.show(Image.ARROW_W) # Pil vest
  159. else: # Hvis lite framover/bakover og lite venstre/høyre:
  160. display.show(Image.HEART_SMALL) # Hjerte som metafor for korleis kjærleiken ikkje går nokon veg
  161. else: # Hvis radiomelding ikke ble mottatt:
  162. timeout += 1 # Øk tid siden forrige melding ble mottatt
  163. if timeout >= 10: # Hvis det har gått for lang tid uten noen radiomelding mottatt:
  164. display.show(imageUndefined) # Display kryss
  165. drive(0, 0, 0, 0) # Stopp bila
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement