Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.18 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. slopeY = 1/(maxY-minY) # TODO: fullfør kommentering
  17. bY = -slopeY*minY
  18. slopeX = 0.5/(maxX-minX)
  19. bX = -slopeX*minX
  20. mode = "none"
  21. timeout = 0 # Bilen skal stoppe etter for lang tid uten mottatt signal.
  22. imageUndefined = Image("90009:" #Lager et bilde av et kryss
  23. "09090:"
  24. "00900:"
  25. "09090:"
  26. "90009")
  27. imageLinefollower = Image("90000:" #Lager et bilde av en L
  28. "90000:"
  29. "90000:"
  30. "90000:"
  31. "99999")
  32.  
  33.  
  34. def funcLSpeed(var): # Lager enklere funksjonsnavn for å lettere kunne lese koden.
  35. pin0.write_analog(var) # Parameteren heter "var" fordi "dir" og "speed" brukes senere
  36. def funcLDir(var):
  37. pin8.write_digital(var)
  38. def funcRSpeed(var):
  39. pin1.write_analog(var)
  40. def funcRDir(var):
  41. pin12.write_digital(var)
  42. def drive(lDir, lSpeed, rDir, rSpeed):
  43. funcLDir(lDir)
  44. funcRDir(rDir)
  45. if lDir == 0: # Venstre kjører framover
  46. funcLSpeed(math.floor(lSpeed*1023))
  47. else:
  48. funcLSpeed(math.floor((1-lSpeed)*1023))
  49. if rDir == 0:
  50. funcRSpeed(math.floor(rSpeed*1023))
  51. else:
  52. funcRSpeed(math.floor((1-rSpeed)*1023))
  53.  
  54.  
  55. radio.on() #Skrur på radio
  56. radio.config(channel=23) #Setter radiokanal
  57. while True:
  58. time.sleep(0.01)
  59. inData = radio.receive_bytes()
  60. if inData is not None:
  61. timeout = 0
  62. inData = str(inData, 'utf-8').split()
  63. mode = inData[0]
  64. if mode == "none":
  65. display.show(Image.CONFUSED)
  66. elif mode == "linefollower":
  67. display.show(imageLinefollower)
  68. leftSensor = leftLineSensor.read_digital()
  69. rightSensor = rightLineSensor.read_digital() # 1 eller 0
  70. if leftSensor is not None and rightSensor is not None:
  71. if leftSensor == 1:
  72. if rightSensor == 1:
  73. #Midt på linje
  74. display.show(Image.ARROW_N)
  75. drive(0, 0.4, 0, 0.4)
  76. else:
  77. #Høyre for linje
  78. display.show(Image.ARROW_W)
  79. drive(1, 0.2, 0, 0.2)
  80. else:
  81. if rightSensor == 1:
  82. #Venstre for linje
  83. display.show(Image.ARROW_E)
  84. drive(0, 0.2, 1, 0.2)
  85. else:
  86. #Linje ikke funnet
  87. display.show(Image.SAD)
  88. drive(1, 0.3, 1, 0.3)
  89. else:
  90. #Ugyldig inndata
  91. display.show(Image.ANGRY)
  92. elif mode == "control":
  93. x = int(inData[1])
  94. y = int(inData[2])
  95. speedMultiplier = slopeY*abs(y)+bY
  96. if speedMultiplier > 1:
  97. speedMultiplier = 1
  98. elif speedMultiplier < 0:
  99. speedMultiplier = 0
  100. leftRatio = slopeX*x+bX
  101. rightRatio = -slopeX*x+bX
  102. if leftRatio > 1:
  103. leftRatio = 1
  104. elif leftRatio < 0.5:
  105. leftRatio = 0.5
  106. if rightRatio > 1:
  107. rightRatio = 1
  108. elif rightRatio < 0.5:
  109. rightRatio = 0.5
  110. if leftRatio > rightRatio:
  111. rightWheelMultiplier = 2-(leftRatio*2)
  112. leftWheelMultiplier = 1
  113. elif rightRatio > leftRatio:
  114. leftWheelMultiplier = 2-(rightRatio*2)
  115. rightWheelMultiplier = 1
  116. else:
  117. leftWheelMultiplier = 1
  118. rightWheelMultiplier = 1
  119. leftSpeed = leftWheelMultiplier*speedMultiplier
  120. rightSpeed = rightWheelMultiplier*speedMultiplier
  121. if y <= 0:
  122. direction = 0
  123. else:
  124. direction = 1
  125. drive(direction, leftSpeed, direction, rightSpeed)
  126. #Følgende kode bestemmer når ulike piler vises på displayet.
  127. if y > requiredY: #Hvis styrer bakover
  128. if x > requiredX: #Hvis styrer bakover mot høyre:
  129. display.show(Image.ARROW_SE)
  130. elif x < -requiredX: #Hvis styrer bakover mot venstre:
  131. display.show(Image.ARROW_SW)
  132. else: #Hvis styrer bakover med lite venstre/høyre:
  133. display.show(Image.ARROW_S)
  134. elif y < -requiredY: #Hvis styrer framover:
  135. if x > requiredX: #Hvis styrer framover mot høyre:
  136. display.show(Image.ARROW_NE)
  137. elif x < -requiredX: #Hvis styrer framover mot venstre:
  138. display.show(Image.ARROW_NW)
  139. else: #Hvis styrer framover med lite venstre/høyre:
  140. display.show(Image.ARROW_N)
  141. else: #Hvis lite framover/bakover:
  142. if x > requiredX: #Hvis styrer nesten kun mot høyre:
  143. display.show(Image.ARROW_E)
  144. elif x < -requiredX: #Hvis styrer nesten kun mot venstre:
  145. display.show(Image.ARROW_W)
  146. else: #Hvis lite framover/bakover og lite venstre/høyre:
  147. display.show(Image.HEART_SMALL)
  148. else:
  149. timeout += 1
  150. if timeout >= 10:
  151. display.show(imageUndefined)
  152. drive(0, 0, 0, 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement