ThymioTv
Der Thymio ist Aufmerksam
Koppieren Sie den Folgenden Text in Aseba ein und lesen sie es sorgfälltig durch:
# mit # kann man Kommentare schreiben
#* so kann man Kommentare über mehrere
Zeilen schreiben *#
#* <constant value="0" name="NOCLAP"/> Diese Konstanten müssen Sie aus dem Code löschen und in dem Fenster
<constant value="1" name="ONECLAP"/> oben rechts " Konstante" auf + klicken, dann den Namen (name=) und dann
<constant value="2" name="TWOCLAP"/> bei Wert die Zahl von Value eingeben.
<constant value="3" name="THREECLAP"/> Hier wird für jedes constant ein je eine Konstante eingetragen.
<constant value="0" name="STOP"/>
<constant value="1" name="RUN"/>
<constant value="2" name="TURNLEFT"/>
<constant value="3" name="TURNRIGHT"/>
<constant value="80" name="TURN_SPEED"/>
<constant value="80" name="FRONT_SPEED"/>
*#
var direction #Hier wird eine Variable direction deklaiert
var time #Hier wird eine Variable time deklaiert
var clap #Hier wird eine Variable clap deklaiert
var claptime #Hier wird eine Variable claptime deklaiert
var lastdirection #Hier wird eine Variable lastdirection deklaiert
var micled =0 #Hier wird eine Variable micled mit dem Wert 0 deklaiert
var tempmic #Hier wird eine Variable tempmic deklaiert
var led_pulse #Hier wird eine Variable led_pulse deklaiert
var temp #Hier wird eine Variable temp deklaiert
var disco #Hier wird eine Variable disco deklaiert
var leds_rainbow[160] #Hier wird eine Variable leds_rainbow mit einem Array deklaiert in diese 160 Elemente mit Werten reinpassen
var i #Hier wird eine Variable i deklaiert
var j #Hier wird eine Variable j deklaiert
var led_i #Hier wird eine Variable led_i deklaiert
var r #Hier wird eine Variable r deklaiert
var g #Hier wird eine Variable g deklaiert
var b #Hier wird eine Variable b deklaiert
# um eine Variable zu deklaieren (= einen Namen etwas zuteilen) muss man vor den freiwählbaren Namen
# "var" davor setzen. Man kann den Namen auch direkt ein Wert zuteilen ( var micled = 0 , da wird den Namen den
# Wert 0 zugeteilt. Man kann auch sogenannte Arrys hizufügen (d.h. dass man dem Namen x viele Elemente hizufügen kann) mit
# var "name" [x]. Array = ein Platzhalter für x viele Elemente. Elemente = ein Element ist sozusagen ein Wert.
# Man kann ein einzelnes Element (Wert) von einem Array füllenmit: name[Element]= Wert. Z.B wenn ich das 5 Element von 100 Elementen
# des Arrays var leds[100] (das ist die Deklartion von leds das heißt das Array leds kann 100 Elemente füllen) füllen will mit dem # Wert 6 : leds[4]=6.Das erste Element ist 0 (d.h. leds_rainbow[0] = das erste Element)!!!! Und wenn man ein einzelnes Element # aufrufen will: name[Element] .
call math.fill(leds_rainbow,0) #call (aufrufen) math.fill(a,c) ist eine mathematiche Funktion,die die Konstante c (ein Wert,
# hier: c = 0) in jedes Element (vom Array) a füll. D.h. das hier jedes Element mit 0 gefüllt wird.
for j in 0:52 do #hier ist eine for-Schleife gegeben, wo die Werte 0-52 die noch auf die
leds_rainbow[j] = j*2 #deklaierte Variable j gespeichert wird.
end #in dem Array leds_rainbow sind ja x viele Elemente. Aber anstatt x habe ich j
#gewählt. Bei leds_rainbow[j] sieht man das jedes Element aus leds_rainbow = j*2 ist.
#d.h. das wenn das erste Element (leds_rainbow[0]) ist, ist j auch 1, d.h. das erste Element
#mit 1*2 (2) gefüllt wird usw. Hier gehen die Zahlen pro Element um j*2 bis zum 52 Element, das mit
#104 gefüllt wird
for j in 53:105 do #hier ist es das gleiche bloß das die Elemente 53-105 mit einer bisschen komplexeren Rechnung
leds_rainbow[j] = 53*2 - (j - 53) * 2 #gefüllt werden. Hier gehen die Werte der Elemente ab Element 53 (=106)nach unten
end # bis Element 105 (=2).
mic.threshold =250 #Mit mic.threshold legt man fest ab welcher Value (bei mic = Lautstärke) das Microfon ein Ergebnis senden soll
#Ereignisse sind sozusagen Infosendungen das zb das Mikro ein
#Ergebnis gesendet hat dass ein Ton mit Value 250 entdeckt hat.
timer.period[0]=10 #timer.period[0oder1]=x legt fest wann der Timer (so was wie ein "Wecker") ein Ereignis senden soll.
timer.period[1]=15 #Es gibt 2 timer ( 1oder2 ) die nach x Millisekunden ein Ereinis senden (also bei Timern den "Kingelton"
#abspielt um dann etwas zu machen zb "aufstehen" oder halt das sich der Thymio bewegt).
motor.left.target =0 #motor links wird auf Geschwindigkeit 0 gesetzt.
motor.right.target =0 #motor rechts wird auf Geschwindigkeit 0 gesetzt.
sub rainbow #mit sub <freiwählbarer name> können sie ein Unterprogramm definieren.
#jedes mal wenn sie im Hauptprogramm callsub name aufrufen läuft das Unterprogramm ab
led_i = (led_i + 2) % 160 #Jedes Mal, wenn rainbow genannt wird,wird led_i erhöht, bis 160 % das bedeutet: Modulo , es ist
#was Sie als Rest erhalte, wenn sie durch 160 dividiert wird.
r = (led_i) % 160 #r,g.b sind Variablen die mit led_i berechnet werden. Dies ist eigentlich nur da das
r = leds_rainbow[r] / 4 # die led Farben sehr gemixt werden.
g = (led_i+ 53) % 160
g = leds_rainbow[g] / 4
b = (led_i + 106) % 160
b = leds_rainbow[b] / 4
call leds.top(r,g,b) #hier werden die Werte aus r,g,b in die Klammer von led.top/bottom eingesetzt.
call leds.bottom.left(b,r,g) #Aus 3 Werten die man dort eigibt werden die leds (top= leds oben auf dem Thymio
call leds.bottom.right(g,b,r) #bottom.right/left= leds unten rechts/links) eine entsprechende Farbe geleuchtet.
onevent timer0 #timer 0 wird jede 1/100 sekunde aufgerufen, weil timer.period[0]=10 ist
if time<200 then #wenn die oben difinierte Variable time kleiner als 200 ist dann
time=time+1 # rechnet man time +1
end
if time>100 then #wenn time > 100 dann
clap = NOCLAP #ist die Variable die Konstante NOCLAP
call leds.circle(0,0,0, 0, 0, 0,0, 0) #und macht den Led Kreis aus
end
if time == 5 then #nach 0,05 Sekunden sehen wir , wenn es oneclap ist und nehmen die
# entsprechenden Entscheidungen
if direction == RUN and clap==ONECLAP then #wenn Variable direction == Konstante Run und calp == ONEClAP ist dann
direction = TURNRIGHT # Variable direction = TURNRIGHT
motor.left.target = TURN_SPEED #motor links fährt Wert von TURN_SPEED
motor.right.target = -TURN_SPEED #motor rechts fährt -Wert von TURN_SPEED
elseif direction == TURNRIGHT and clap==ONECLAP then #ansonsten wenn direction == TURNRIGHT und calp == ONEClAP ist dann
direction = RUN #direction= RUN
motor.left.target = FRONT_SPEED #motor links fährt Wert von FRONT_SPEED
motor.right.target = FRONT_SPEED #motor rechts fährt Wert von FRONT_SPEED
end
end
if time == 60 then #nach 0,6 Sekunden sollten wir TWOCLAP oder nichts haben haben, und wenn ja,
#nehmen wir die entsprechenden Entscheidungen
if direction == STOP and clap==TWOCLAP then
direction = RUN
motor.left.target = FRONT_SPEED
motor.right.target = FRONT_SPEED
elseif clap==TWOCLAP then
direction = STOP
motor.left.target = 0
motor.right.target = 0
end
end
if time == 80 then #nach 0,8 Sekunden sollten wir drei Klatschen oder nichts haben, und wenn ja nehmen wir die
# entsprechenden Entscheidungen
if clap==THREECLAP then
disco=RUN
direction = RUN
motor.left.target = TURN_SPEED
motor.right.target =0
end
end
onevent mic #Dies ist jedes Mal der Fall, wenn es ein Geräusch höher als die mic.threshold = 250 gibt
if clap==NOCLAP then #Das bedeutet, dass wenn das Mikrofon einen Ton registriert und die Variable " clap " auf NOCLAP gesetzt
time = 0 # ist, fangen wir an zu zählen time = 0
clap = ONECLAP
call leds.circle(32,0,0, 0, 0, 0,0, 0)
elseif clap==ONECLAP and 5 < time and time < 60 then
clap = TWOCLAP
call leds.circle(32,32,0, 0, 0, 0,0, 32)
claptime = time + 2
elseif clap==TWOCLAP and claptime < time and time < 80 then
clap = THREECLAP
call leds.circle(32,32,32, 0, 0, 0,32, 32)
led_pulse=0
call sound.system(7)
end
onevent prox
#Hier wird programmiert wenn der Thymio kein Boden erkennt soll er Motoren und Leds ausschalten
if prox.ground.delta[0]<130 or prox.ground.delta[1]<130 then
motor.left.target=0
motor.right.target=0
call leds.bottom.left(32,0,0)
call leds.bottom.right(32,0,0)
elseif disco==STOP then
call leds.bottom.left(0,0,0)
call leds.bottom.right(0,0,0)
end
onevent timer1
#Hier wird programmiert das das unterprogramm bei threeclap angehen soll usw.
if disco==RUN then
callsub rainbow
led_pulse = led_pulse + 1
if led_pulse == 128 then
disco=STOP
led_pulse=0
call leds.bottom.left(0,0,0)
call leds.bottom.right(0,0,0)
end
else
led_pulse = led_pulse + 1
if led_pulse > 0 then
call leds.top(0, 0, led_pulse)
if led_pulse > 40 then
led_pulse = -128
end
else
temp=-led_pulse/4
call leds.top(0, 0, temp)
end
end