EV3 Python. Lego

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? 

Ćwiczenie 8: Tekst

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ć

Uwagi:
  1. Zatrzymać program, naciskając przycisk Wstecz na EV3 lub przycisk stop w Kodeksie VS jeśli uruchomił skrypt stamtąd.
  2. Ten skrypt czasami wyświetla odczyty takich jak 63.40000000000 cm zamiast oczekiwanych 63,4 cm.
  3. 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!

Ćwiczenie 9: Zakres

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:
  1. 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.

Ćwiczenie 10: Matematyka - Basic

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:
  1. 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.
  2. Oto oficjalne rozwiązanie EV3-G do tego samego problemu:

Ćwiczenie 11: Gyro - stawka

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:
  1. 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.
  2. gyro.rate szereg więc musi być przekształcony w ciąg ze str ()  zanim może być wykorzystany do LCD jako tekst.
Teraz jesteśmy gotowi do walki  Beyond Basics sprawuje 12-18 .

Wersja po angielsku
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:
  1. 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.
  2. 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.
You are now ready to tackle Beyond Basics exercises 12-18.

Komentarze