# pybricks blocks file:{"blocks":{"languageVersion":0,"blocks":[{"type":"blockGlobalSetup","id":"/@es6QzN{qSwC~HMX+9u","x":400,"y":-200,"deletable":false,"next":{"block":{"type":"variables_set_prime_hub","id":"E=#cw:D%$QMcKx3ZwpFp","extraState":{"optionLevel":0},"fields":{"VAR":{"id":"[P)[NrZRT;Eq7S7UX-sd"}},"next":{"block":{"type":"variables_set_color_sensor","id":"=:!C.7;rw`A9je}RpVxD","extraState":{"optionLevel":0},"fields":{"VAR":{"id":"1gtl=w`S4:OahZl~[ol9"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"aeKr?s|,OEr!tZh--dhj","fields":{"NAME":"C"}}}},"next":{"block":{"type":"variables_set_motor","id":"Uxy1_H@^xcQhO,`I);v$","fields":{"VAR":{"id":"Tv4M4=z+NJ,1lIT1hlBQ"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"k/yXOz7x5:l6zamox[?E","fields":{"NAME":"E"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"M%|@%K;)#wUUEnp`FVJW","fields":{"SELECTION":"Direction.COUNTERCLOCKWISE"}}}},"next":{"block":{"type":"variables_set_motor","id":"Sw~!cjKi^7yd7lWy:Lr[","fields":{"VAR":{"id":"26_IIwyP=gSKAh*:ks0m"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"98=cvh0d[KsTpd)al,Ej","fields":{"NAME":"F"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"u5Jo]svRA5;}/!+,PS?r","fields":{"SELECTION":"Direction.CLOCKWISE"}}}},"next":{"block":{"type":"variables_setup_any","id":"s05,_6.=`81HT;123dt+","fields":{"VAR":{"id":"%-@_Xvhny7#4O9Lk5~ZL"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"vo?UkO(e^A#*Be2hFq49","fields":{"NUM":50}}}},"next":{"block":{"type":"variables_setup_any","id":"]@:fn/ZGWHll3@[$7t7[","fields":{"VAR":{"id":"^KN92vnOZf:O{5kW`zNv"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"7NU;mMf?O|V6fZgh!xn3","fields":{"NUM":0.4}}}},"next":{"block":{"type":"variables_setup_any","id":"_t)=x02kk_kRGh}XmVN}","fields":{"VAR":{"id":")yd%Y=4$19n_-yFBA5PZ"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":".YTA{kRyhc;Y4.W4lb06","fields":{"NUM":1.5}}}},"next":{"block":{"type":"variables_setup_any","id":"WJnxuv{OX^S/v=n/GLeF","fields":{"VAR":{"id":"bS5SE^V|S_t1=4sHVFQG"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"q|wRXZS`fuKCAz.eRnF8","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":".=#@B6Ee[=!`_gkmO8]U","fields":{"VAR":{"id":"TNa-#].~a^_|f*sq.hmu"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"Q@+g)5-`;~ynKxnaT@oA","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":"72K2J+pjP6oRhr.i89-o","fields":{"VAR":{"id":"!SHecqwn4-*VrR-3L4IJ"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"(}BrsCbC$gy@XWgk353p","fields":{"NUM":0}}}}}}}}}}}}}}}}}}}}}}}}},{"type":"blockGlobalStart","id":"+CMEps|bMZ/cLk8vaFx^","x":400,"y":260,"deletable":false,"next":{"block":{"type":"blockFlowWhile","id":";~7cKCQ(iG4Y9,VgR(WF","fields":{"MODE":"WHILE"},"inputs":{"BOOL":{"shadow":{"type":"blockLogicTrue","id":"FaFVjLF_+Kvib14ZVO[C"}},"DO":{"block":{"type":"blockIfElse","id":"~x_xThv_#`NYN/9m~J2-","extraState":{"optionLevel":1},"inputs":{"IF0":{"shadow":{"type":"blockLogicTrue","id":"n5Yt^kTg)Dvq|Et!Zsw?"},"block":{"type":"blockLogicCompare","id":"eI@[LtG*cgsdrH?NTcK#","fields":{"OP1":"GT"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"{?3HS6|wL-pj~W3w7]It","fields":{"NUM":1}},"block":{"type":"blockFunctionCallerValue","id":"6EK[$i$hBQv6H1tw:hq!","extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":".RS,|0(dA+i4W43=Ix,`"}}}},"B":{"shadow":{"type":"blockMathNumber","id":"q,Ly~#gqY|SP{Lx2p:dG","fields":{"NUM":8}}}}}},"DO0":{"block":{"type":"blockMotorDuty","id":"UXG!LiD%xy7fBzEo:a]1","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"t1`l_81-A+3u#C6dp-x-","fields":{"VAR":{"id":"Tv4M4=z+NJ,1lIT1hlBQ","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"Qa8_d$(#~82=Kohlh.B7","fields":{"VALUE0":0}}}},"next":{"block":{"type":"blockMotorDuty","id":"T40SgA3{nXQU7n{NH^PG","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"_1%aO]Sk})k;@N3tm#ww","fields":{"VAR":{"id":"26_IIwyP=gSKAh*:ks0m","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"*K/9kcnCrMK_WT$QrcUp","fields":{"VALUE0":0}}}}}}}},"ELSE":{"block":{"type":"blockVariableSetValue","id":"Y:]|X-pL4MeVeOmdB+*=","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"aW!n4j4M)BXS,9g?^iZL","fields":{"VAR":{"id":"bS5SE^V|S_t1=4sHVFQG","name":"error","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"`gNGddJLfBy{P.$DOW!n","fields":{"NUM":1}},"block":{"type":"blockFunctionCallerValue","id":"b,2_S5Waiq412aRTVcr*","extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":"wk*0xm#+FlzOHka)NG[c"}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"5y1{eSQanK02*}a#)daC","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"*^*cnGPlc@_o3f^2]Coo","fields":{"VAR":{"id":"!SHecqwn4-*VrR-3L4IJ","name":"PD","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"zm+;ick|0|KLTZt0#X{e","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"hVNZQbKlM[U|a*#{+VRt","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"Go$u$NPC6oH(PJcpTfi#","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"Xmm!0T|qT}VpHvUQPW%)","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"[ZPrV4RM9Y6/KU.5FfJ_","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"Rij/Q{XfM|euuR@{r@iQ","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"Zmo:9hE_SIM5_3xTcJtR","fields":{"VAR":{"id":"bS5SE^V|S_t1=4sHVFQG","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"!6LfQ.23KsxcNF2~G|_S","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"WUTWjcO`OX7ZUS99{45=","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"L(~V+YpLymT83nbG3_D6","fields":{"VAR":{"id":"^KN92vnOZf:O{5kW`zNv","name":"KP","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"{1$ILnE=:8.!h/-7/X)`","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"_-J6)oIxsux5]`zU;!=7","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"=ZF,SO9^3EawCDZYdpPC","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"(?!w%_fGXJXJKq;Lj,AD","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"R]F7cGX8tKCLC,_9Mx7-","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"yex3=`RI/VM%[k:ds%kz","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"*90}hS=}D1A#tXvwO?f3","fields":{"VAR":{"id":"bS5SE^V|S_t1=4sHVFQG","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"fS*5Km(vG|;[)hdFVvu.","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":";rqYq6m{7fP/gw7CX^0}","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":";+eL%@8Up5d_k7%zXHIe","fields":{"VAR":{"id":"TNa-#].~a^_|f*sq.hmu","name":"lastError","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":":5*[TV?RP9Gb^n0..g!Z","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"cr1eg]:/-Js1d0t$Ki}+","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"P3r@`znUJRM=7HE0qvvP","fields":{"VAR":{"id":")yd%Y=4$19n_-yFBA5PZ","name":"KD","type":"Any"}}}}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"$.7?2=(y31VKk3)1J2y?","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"d!GSf[-[-]i~;@|zpB;;","fields":{"VAR":{"id":"Tv4M4=z+NJ,1lIT1hlBQ","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"kx:)}NBK:%[%WS`8neg,","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"5xvBrIO*SkF$#4JlTyf_","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"#8ib0djN;%mIEc4Eh2gO","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"pL9.mZVv1y4Obtc;0!8X","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"p6z[T%OKY-TjqhfO)Tp-","fields":{"VAR":{"id":"%-@_Xvhny7#4O9Lk5~ZL","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"CBxA_6$v=6m;$:i!OPp|","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"0y#|;42q0b7Q7i]MaJJD","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"={[wiSkMppQGdQ/??eqz","fields":{"VAR":{"id":"!SHecqwn4-*VrR-3L4IJ","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"=xNe.V^%J}[Dhp0al~h[","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"QQYTM#Tb9:o@PCI93;`5","fields":{"VAR":{"id":"26_IIwyP=gSKAh*:ks0m","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"6-f^L1cawA}?Ig#^#P]$","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"++GFRPVYT.i^rp)C:*IE","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"HUgD1}m;G^?i}-iG[E1S","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"X~-pGzl-V%oYr,7VLd5j","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"AUP~APp}+35a?BqERb4v","fields":{"VAR":{"id":"%-@_Xvhny7#4O9Lk5~ZL","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"Bs$!RoWlzPta02/,Fg2r","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"(-b0.X)!*b]}*uBNu8Sy","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"xn)Mpp+:J2=^kZg;ntcR","fields":{"VAR":{"id":"!SHecqwn4-*VrR-3L4IJ","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"L5A02aw*M17I;oV4lRau","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":")l0eGqM6ZOnH45^,!z?i","fields":{"VAR":{"id":"TNa-#].~a^_|f*sq.hmu","name":"lastError","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"eI]29bha:*C%Y=v85w]P","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":".@z8X7E]=]sO1-aI:SD1","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"0hUel0ek6-LTeeI6HyHo","fields":{"VAR":{"id":"bS5SE^V|S_t1=4sHVFQG","name":"error","type":"Any"}}}}}}}}}}}}}}}}}}},"next":{"block":{"type":"blockWaitTime","id":";wuMy/)ouD[h[cZhrl9o","inputs":{"VALUE0":{"shadow":{"type":"unit_time","id":"F@Vucke.!^[F:Y,Yt@`z","fields":{"VALUE0":10}}}}}}}}}}}},{"type":"variables_setup_function","id":"qG+HoV65%qsGUWXmCtFF","x":40,"y":-200,"extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":"wk*0xm#+FlzOHka)NG[c"}},"inputs":{"STACK":{"block":{"type":"blockTaskReturn","id":"/efPbA:T]PpRT#ZQry3F","inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"dgy#2A(^x#)!v-#Jocnb","fields":{"NUM":0}},"block":{"type":"blockMathOp","id":";K=)i,BvASO!aw4|.U|4","extraState":{"optionLevel":0},"fields":{"OP":"ROUND"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"Y!^X;7}Iv-{meXz9PENe","fields":{"NUM":0}},"block":{"type":"blockMathArithmetic","id":"+c_RJDm^bSwa8I`n=r,S","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"$FrY5_SV+$+qFkU!*S(6","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"*{kFsJEoxm8Y2`m3ema9","fields":{"OP":"MATH_DIVIDE_INT"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":":Asq%h;N^J-$C,}rI[T!","fields":{"NUM":1}},"block":{"type":"blockLightAmbient","id":"UCa{3Xb*wVRxa@q~])Yo","inputs":{"VAR":{"shadow":{"type":"variables_get_light_ambient_intensity_device","id":"qh/ZO(d!#W/dL|_gTzk4","fields":{"VAR":{"id":"1gtl=w`S4:OahZl~[ol9","name":"Line16","type":"ColorSensor"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"y)1[SV[~EXS%mFBd|[8x","fields":{"NUM":1}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"%3m^8m)%H9.I@-QX:8E4","fields":{"NUM":100}}}}}}}}}}}}}},{"type":"variables_setup_function","id":"rN-P[jicu50jqxVRmD7,","x":40,"y":30,"extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":".RS,|0(dA+i4W43=Ix,`"}},"inputs":{"STACK":{"block":{"type":"blockTaskReturn","id":"+AH[G}A{d#b+{}$|=~Zf","inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"TQoK]OEG(N2VRFiT?^]z","fields":{"NUM":0}},"block":{"type":"blockMathOp","id":"d[[AIX)(1V@3cBYVw+xs","extraState":{"optionLevel":1},"fields":{"OP":"MODULO"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"QaXzjyEt*veO,$m~Zu*#","fields":{"NUM":0}},"block":{"type":"blockMathOp","id":"L(,:*SC^V-}by|,_i@4w","extraState":{"optionLevel":0},"fields":{"OP":"ROUND"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"#`,/a~N/[+R6jCQ:Z(gI","fields":{"NUM":0}},"block":{"type":"blockMathArithmetic","id":"nFl!6l6DIklTDRda2YL6","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"BA`3m?21r4f/w%6[=*9W","fields":{"NUM":1}},"block":{"type":"blockLightAmbient","id":"r;4E1biNu/j:MF02P,gS","inputs":{"VAR":{"shadow":{"type":"variables_get_light_ambient_intensity_device","id":"_Z$c*]z1R!`7C0dV=`Y.","fields":{"VAR":{"id":"1gtl=w`S4:OahZl~[ol9","name":"Line16","type":"ColorSensor"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"K7%0F@-{]okY,CHC@6G*","fields":{"NUM":10}}}}}}}}},"NUM2":{"shadow":{"type":"blockMathNumber","id":"e]3czDVOZQVTF?S/,m6L","fields":{"NUM":10}}}}}}}}}}}]},"variables":[{"name":"red","id":"m;P|xbP~Owy]3YESw6#P","type":"ColorDef"},{"name":"orange","id":"[j@=rq!IEasH0?lU7,e5","type":"ColorDef"},{"name":"yellow","id":"b4f9U`p*sT%y*~_]?+[r","type":"ColorDef"},{"name":"green","id":"s/!L{}z^IN[y4G!H9)Qz","type":"ColorDef"},{"name":"cyan","id":"5Aq2T5#/tgGYW%.gZR@)","type":"ColorDef"},{"name":"blue","id":"hOl;G*0YIc=O^({,{W4#","type":"ColorDef"},{"name":"violet","id":"`+z@2NxMW_%~G0J`o[+8","type":"ColorDef"},{"name":"magenta","id":"A{bYb=,*wMLoP(D{SHU|","type":"ColorDef"},{"name":"white","id":"~;yfi~/`5$+yYey:TssW","type":"ColorDef"},{"name":"none","id":"n[kr@A~O|Lvu1Z(Ys5p/","type":"ColorDef"},{"name":"prime hub","id":"[P)[NrZRT;Eq7S7UX-sd","type":"PrimeHub"},{"name":"motorL","id":"Tv4M4=z+NJ,1lIT1hlBQ","type":"Motor"},{"name":"motorR","id":"26_IIwyP=gSKAh*:ks0m","type":"Motor"},{"name":"SPEED","id":"%-@_Xvhny7#4O9Lk5~ZL","type":"Any"},{"name":"KP","id":"^KN92vnOZf:O{5kW`zNv","type":"Any"},{"name":"KD","id":")yd%Y=4$19n_-yFBA5PZ","type":"Any"},{"name":"error","id":"bS5SE^V|S_t1=4sHVFQG","type":"Any"},{"name":"lastError","id":"TNa-#].~a^_|f*sq.hmu","type":"Any"},{"name":"PD","id":"!SHecqwn4-*VrR-3L4IJ","type":"Any"},{"name":"Line16","id":"1gtl=w`S4:OahZl~[ol9","type":"ColorSensor"},{"name":"getLinePos100","id":"wk*0xm#+FlzOHka)NG[c","type":"Function"},{"name":"getLineWidth100","id":".RS,|0(dA+i4W43=Ix,`","type":"Function"}],"info":{"type":"pybricks","version":"2.1.1"},"workspaceOptions":{"scrollX":0,"scrollY":0,"scale":0.7}}
from pybricks.hubs import PrimeHub
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import ColorSensor, Motor
from pybricks.tools import wait

# Set up.
prime_hub = PrimeHub()
Line16 = ColorSensor(Port.C)
motorL = Motor(Port.E, Direction.COUNTERCLOCKWISE)
motorR = Motor(Port.F, Direction.CLOCKWISE)
SPEED = 50
KP = 0.4
KD = 1.5
error = 0
lastError = 0
PD = 0

def getLinePos100():
    return round(Line16.ambient() // 1 - 100)

def getLineWidth100():
    return round(Line16.ambient() * 10) % 10


# The main program starts here.
while True:
    if getLineWidth100() > 8:
        motorL.dc(0)
        motorR.dc(0)
    else:
        error = getLinePos100()
        PD = error * KP + (error - lastError) * KD
        motorL.dc(SPEED + PD)
        motorR.dc(SPEED - PD)
        lastError = error
    wait(10)
