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 python3from ev3dev2.motor import MoveSteering, OUTPUT_B, OUTPUT_Cfrom ev3dev2.sensor.lego import TouchSensor, ColorSensorfrom ev3dev2.led import Ledsfrom time import sleepsteer_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 python3from ev3dev2.motor import MoveTank, OUTPUT_B, OUTPUT_Cfrom ev3dev2.sensor.lego import UltrasonicSensorfrom time import sleeptank_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 python3from ev3dev2.motor import MoveSteering, OUTPUT_B, OUTPUT_Cfrom ev3dev2.display import Displayfrom time import sleep, timesteer_pair = MoveSteering(OUTPUT_B, OUTPUT_C)lcd = Display()# num_rots is number of wheel rotations needed for robot to advance 50 cmnum_rots = 50/17.6 # wheel circumference = 17.6 cm for education version# num_rots = 50/13.6 # wheel circumference = 13.6 cm for home versionstart_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 tookspeed = 50/travel_time # speed = distance in cm / time in slcd.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 readUwagi:
- 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.

