Thymio II Learning Commands

In this example, the Thymio II learns a sequence of commands and then executes those commands.

Press the central button to enter the learning mode (green). Then, enter a sequence using the directional buttons (forward, left, right, backward) and press the central button again. The sequence is first replayed and then executed.

The complete source code can be found here.

# Deklarationen
var s = 0             # Schrittzähler
var schrittzahl = 0    # Anzahl der Schritte im Programm
var max = 100         # Maximale Anzahl Schritte im Programm
var schritt[100]
var zustand = 0

call leds.top(0,0,0)
call leds.circle(0,0,0,0,0,0,0,0)

sub vorwaerts
    motor.left.target = MOTOR
    motor.right.target = MOTOR

sub zurueck
    motor.left.target = -MOTOR
    motor.right.target = -MOTOR

sub rechts
    motor.left.target = MOTORDREHEN
    motor.right.target = -MOTORDREHEN

sub links
    motor.left.target = -MOTORDREHEN
    motor.right.target = MOTORDREHEN

sub stopp
    motor.left.target = 0
    motor.right.target = 0

sub zustand0
            zustand = 0
            call sound.system(3)
            call leds.top(0,0,0)
            call leds.circle(0,0,0,0,0,0,0,0)
            callsub stopp

sub zustand1
            zustand = 1
            call sound.system(3)
            call leds.top(0,32,0)
            schrittzahl = 0
            s = 0

sub zustand2
            zustand = 2
            call sound.system(3)
            call leds.top(32,32,0)
            schrittzahl = s        # Schrittzahl merken für Zeige-Zustand
            s = 0                # Zähler für nächsten Zustand zurücksetzen
            timer.period[0] = MILLIS    # Nach MILLIS ms kommt der erste timer0 event

sub zustand3
            zustand = 3
            call sound.system(3)
            call leds.top(0,0,32)
            s = 0                # Zähler für nächsten Zustand zurücksetzen
            timer.period[0] = MILLISMOTOR    

onevent button.center
    if  button.center == 1 then
        if         zustand == 0 then    # Initialzustand
            callsub zustand1
        elseif     zustand == 1 then    # Lernzustand
            callsub zustand2
        elseif     zustand == 2 then
            callsub zustand3
        elseif     zustand == 3 then
            callsub zustand0
        end        
    end

onevent button.right
    if  button.right == 1 then    # Button ist gedrückt und nicht losgelassen
        if  zustand == 1 then    # Nur im Zustand1 das Folgende auführen
            schritt[s] = RECHTS    # Schritt speichern
            s++                    # Schrittzähler eins vor
            call sound.system(5)    # Rückmeldung
        end
    end

onevent button.left
    if  button.left == 1 then
        if  zustand == 1 then
            schritt[s] = LINKS
            s++
            call sound.system(5)
        end
    end

onevent button.forward
    if  button.forward == 1 then
        if  zustand == 1 then
            schritt[s] = VOR
            s++
            call sound.system(5)
        end
    end

onevent button.backward
    if  button.backward == 1 then
        if  zustand == 1 then
            schritt[s] = ZURUECK
            s++
            call sound.system(5)
        end
    end

onevent timer0
    if  zustand == 2 then    # Nur im Zustand 2 das Folgende ausführen
        if s == schrittzahl then
            timer.period[0] = 0
            call leds.circle(0,0,0,0,0,0,0,0)
            call sound.system(3)
            callsub zustand3
        else
            if schritt[s] == RECHTS then
                call leds.circle(0,0,32,0,0,0,0,0)
            elseif schritt[s] == LINKS then
                call leds.circle(0,0,0,0,0,0,32,0)
            elseif schritt[s] == VOR then
                call leds.circle(32,0,0,0,0,0,0,0)
            elseif schritt[s] == ZURUECK then
                call leds.circle(0,0,0,0,32,0,0,0)
            end
            call sound.system(5)
            s++
        end
    elseif zustand == 3 then
        if s == schrittzahl then
            timer.period[0] = 0
            call leds.circle(0,0,0,0,0,0,0,0)
            call sound.system(3)
            callsub stopp
            callsub zustand0
        else
            if schritt[s] == RECHTS then
                call leds.circle(0,0,32,0,0,0,0,0)
                callsub rechts
            elseif schritt[s] == LINKS then
                call leds.circle(0,0,0,0,0,0,32,0)
                callsub links
            elseif schritt[s] == VOR then
                call leds.circle(32,0,0,0,0,0,0,0)
                callsub vorwaerts
            elseif schritt[s] == ZURUECK then
                call leds.circle(0,0,0,0,32,0,0,0)
                callsub zurueck
            end
            call sound.system(5)
            s++
        end
    end
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License