Wgrywanie programu python na Lego EV3
Tematyka dla użytkowników zaawansowanych w programowaniu EV3. Wymaga podstawowej znajomości języka python 3.
2. ev3-micropython
3. liknij to google site>
4. Instrukcja wgrywania
Beyond Basics Ex 7-11
Ćwiczenie 7: 'czujnik Blocks'
Ja
zachowałem oryginalny tytuł tego ćwiczenia, „czujnik Blocks”, choć EV3
Python nie korzysta z bloków programowych jak oprogramowanie Lego robi.
Cel:
Gdy
czujnik dotykowy nie jest wciśnięty robot okaże na miejscu w prawo z
prędkością, która jest proporcjonalna do natężenia światła otoczenia. Gdy
czujnik dotyku jest wciśnięty następnie robot zatrzyma się dopóki
przełącznik jest wciśnięty, a kontrolka stanu będzie świecić na
czerwono. Ten program nie
zatrzyma sama więc trzeba zmusić program aby zatrzymać naciskając
przycisk Wstecz na EV3 lub przycisk stop w Kodeksie VS jeśli uruchomił
skrypt stamtąd.
Rozwiązanie:
#!/usr/bin/env python3
from ev3dev2.motor import MoveSteering, OUTPUT_B, OUTPUT_C
from ev3dev2.sensor.lego import TouchSensor, ColorSensor
from ev3dev2.led import Leds
from time import sleep
steer_pair = MoveSteering(OUTPUT_B, OUTPUT_C)
cl = ColorSensor()
ts = TouchSensor()
leds = Leds()
while True: # forever
if ts.is_pressed==0: # touch sensor NOT pressed
leds.all_off() # turn off LEDs
# turn motors at opposite speeds to turn on the spot
steer_pair.on(steering=100, speed=cl.ambient_light_intensity)
else: # touch sensor is pressed
steer_pair.off()
leds.set_color('LEFT', 'RED')
leds.set_color('RIGHT', 'RED')
Uwagi:
1. Proponowane rozwiązanie jest bardzo różny oficjalnej roztworu EV3-G, przedstawionym poniżej:
Oficjalne rozwiązanie wykorzystuje dwa wątki , które poruszają się równocześnie, ponieważ są one przyłączone do bloku Start. Kiedy
dolna pętla wykryje, że czujnik dotykowy został naciśnięty to wydaje
polecenie zatrzymania silnika, ale to wydaje się być w konflikcie z
dowództwem Samochodowego w górnej pętli, która opowiada silniki
przenieść. Przypuszczalnie
polecenie zatrzymania silnika ma pierwszeństwo, ale jak może, ponieważ
polecenie zatrzymania silnika i komenda startu silnika są w różnych
pętli i będą realizowane w różnym czasie? Więc
to rozwiązanie może działać, ale jest trudne do zrozumienia i
niepotrzebnie skomplikowane - dlaczego używać dwóch wątków dla tego
rozwiązania?
To ćwiczenie jest jak ćwiczenia 5, ale prostsze.
Cel:
Czujnik ultradźwiękowy mierzy odległość. Wartość odległość będzie wyświetlany w centymetrach na ekranie LCD, po którym następuje ciąg „CM”. Tekst zostanie wyświetlony w courB24 czcionki. Na wyświetlaczu będzie stale aktualizowana o aktualnym czytaniu odległość czujnika.
Rozwiązanie:
#! / Usr / bin / env python3
od ev3dev2.sensor.lego importu UltrasonicSensor
Wyświetlanie od ev3dev2.display importowej
od czasu snu importowej
LCD = Wyświetlacz ()
Us = UltrasonicSensor ()
podczas gdy prawdziwe: # wiecznie
distance = us.distance_centimeters # pływak
lcd.text_pixels (łańcuch (w) cm '+', X = 40, Y = 50, czcionki = 'courB24')
lcd.update ()
sleep (0,1) # więc wyświetlacz nie zbyt często zmieniać
- Zatrzymać program, naciskając przycisk Wstecz na EV3 lub przycisk stop w Kodeksie VS jeśli uruchomił skrypt stamtąd.
- Ten skrypt czasami wyświetla odczyty takich jak 63.40000000000 cm zamiast oczekiwanych 63,4 cm.
- Jest to możliwe, aby przepisać powyższy skrypt do pracy z czujnikiem podczerwieni, chociaż odczyty odległość będzie znacznie mniej dokładne. Tylko raz, nie da ci rozwiązanie - można popracować na zmiany!
Cel:
Dokonaj
robot śledzić obiekt, który oddala się od niego - powinien poruszać się
do przodu w kierunku obiektu, o ile obiekt jest między 10 a 20 cm z
przodu robota, ale zatrzyma się, jeśli robi się bliżej niż 10 cm, co
pozwala na uniknięcie kolizja. Będzie również zatrzymywać się (zrezygnować) jeśli prowadzi przedmiot jest większa niż 20 cm przed robota.
Rozwiązanie:
#!/usr/bin/env python3
from ev3dev2.motor import MoveTank, OUTPUT_B, OUTPUT_C
from ev3dev2.sensor.lego import UltrasonicSensor
from time import sleep
tank_pair = MoveTank(OUTPUT_B, OUTPUT_C)
us = UltrasonicSensor()
while True: # forever
distance = us.distance_centimeters
if distance > 10 and distance < 20:
tank_pair.on(left_speed=50, right_speed=50)
else:
tank_pair.off()
sleep(0.1)
Uwagi:
- Jak w poprzednim ćwiczeniu, powinno być bardzo możliwe (i to dobre wyzwanie) przekonwertować ten program do pracy z czujnikiem podczerwieni, a następnie czujnik USA.
Cel:
Ten
program obliczy, jak wiele obrotów kół konieczne, aby robot przodu 50
cm, a następnie uczyni to ruch robota, a następnie będzie obliczyć
prędkość robota podczas ruchu.
Rozwiązanie:
Za każdym razem gdy koło obraca się o jeden robota obrót całego obwodu rolki koła wzdłuż ziemi.
- Średnica EV3 Education opon wersja gumy wynosi około 5,6 cm, a więc obwód wynosi 5,6 cm x π = 5,6 cm x 3,14 = 17,6 cm ok.
- Średnica EV3 domowe opon gumowych wersja 4.32 cm, a więc obwód wynosi 4,32 cm * π = 4,32 cm x 3,14 = 13,6 cm, odległość .
Znaleźć
ilości obrotów koniecznych do przemieszczania robota do przodu 50 musi
podzielić 50 cm od odległości przesunięcia każdego obrotu koła (równy
obwodowi koła).
Użyjemy functi on time () , która jest częścią czasu bibliotece - nie mylić z funkcji z biblioteki o tej samej nazwie. time () zwraca (jako pływaka) liczba sekund, które upłynęły od „epoki”. Nie
musimy wiedzieć, kiedy „epoka” było (może to być bardzo początkiem
1970?), Ponieważ wszyscy jesteśmy zainteresowani jest wydłużenie czasu
między początkiem a końcem ruchu ruchu. W tym skrypcie używam od czasu czasu importu więc w scenariuszu I wystarczy użyć time () , aby wywołać funkcję. Gdybym użył czasu import następnie w skrypcie musiałbym użyć time.time () , aby wywołać t on funkcję.
#!/usr/bin/env python3
from ev3dev2.motor import MoveSteering, OUTPUT_B, OUTPUT_C
from ev3dev2.display import Display
from time import sleep, time
steer_pair = MoveSteering(OUTPUT_B, OUTPUT_C)
lcd = Display()
# num_rots is number of wheel rotations needed for robot to advance 50 cm
num_rots = 50/17.6 # wheel circumference = 17.6 cm for education version
# num_rots = 50/13.6 # wheel circumference = 13.6 cm for home version
start_time = time() # time() returns seconds since the 'epoch'
steer_pair.on_for_rotations(steering=0, speed=40, rotations=num_rots)
travel_time = time() - start_time # calculate how long the movement took
speed = 50/travel_time # speed = distance in cm / time in s
lcd.text_pixels(str(round(speed)) + ' cm/s', x=40, y=50, font='helvB24')
lcd.update()
sleep(5) # Give enough time for the screen to be read
Uwagi:
- Jeśli używasz wersji Home następnie wypowiedzieć się wiersz, który wspomina o wersji edukacyjnej i usuń wiersz, który wspomina o wersji domowej.
- Oto oficjalne rozwiązanie EV3-G do tego samego problemu:
Cel:
Program powinien stale (co 0,5 sekundy) pokazują szybkość obrotu czujnika żyroskopowego w stopniach na sekundę. W EV3 Python v2 stopa kolei jest przez stopy własności czujnik żyroskopowy .
Rozwiązanie:
Przypomnijmy, że przy każdym użyciu czujnik żyroskopowy to jest niezwykle ważne, aby utrzymać czujnik absolutnie nieruchomy gdy cegła EV3 jest zasilony lub czujnik żyroskopowy jest podłączony , w przeciwnym razie odczyt żyroskop będzie nieustannie wędrują od prawidłowej wartości.
#! / Usr / bin / env python3
od ev3dev2.sensor.lego importu GyroSensor
Wyświetlanie od ev3dev2.display importowej
ev3dev2.fonts import jak czcionki
od czasu snu importowej
żyroskop = GyroSensor ()
LCD = Wyświetlacz ()
podczas gdy prawda:
lcd.text_pixels (STR ( gyro.rate ) +”deg / s', X = 40, Y = 50, czcionki = 'helvB24')
lcd.update ()
sleep (0,4) # więc wyświetlacz nie zbyt często zmieniać
Uwagi:
- Zauważ, kiedy robot obraca się w prawo wskaźnik jest pozytywny i odwrotnie, niezależnie od kierunku, w którym robot jest faktycznie wskazującego.
- gyro.rate szereg więc musi być przekształcony w ciąg ze str () zanim może być wykorzystany do LCD jako tekst.
Solution:
Recall that whenever you use the gyro sensor it is vitally important to keep the sensor absolutely stationary when the EV3 brick is powered up or the gyro sensor is plugged in, otherwise the gyro reading will continually wander away from the correct value.
#!/usr/bin/env python3
from ev3dev2.sensor.lego import GyroSensor
from ev3dev2.display import Display
import ev3dev2.fonts as fonts
from time import sleep
gyro = GyroSensor()
lcd = Display()
while True:
lcd.text_pixels(str(gyro.rate)+' deg/s', x=40, y=50, font='helvB24')
lcd.update()
sleep(0.4) # so the display doesn't change too frequently
Notes:
- Note how when the robot is turning clockwise the rate is positive and vice versa, irrespective of the direction in which the robot is actually pointing.
- gyro.rate is a number so it has to be converted to a string with str() before it can be drawn to the LCD as text.
Komentarze
Prześlij komentarz