# pybricks blocks file:{"blocks":{"languageVersion":0,"blocks":[{"type":"blockGlobalSetup","id":"zx$EljAkPt375ra3Fr[q","x":400,"y":-200,"deletable":false,"next":{"block":{"type":"variables_set_prime_hub","id":"rP[{/ZBT({HRi0!4!*$z","extraState":{"optionLevel":0},"fields":{"VAR":{"id":"~hwO=)x.uhr3S`p+SNv_"}},"next":{"block":{"type":"variables_set_color_sensor","id":"#?Q!2FqdcA+Xaf*zm0VS","extraState":{"optionLevel":0},"fields":{"VAR":{"id":"m7%jG`dYdG1~(tyX+t!E"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"H*7,=:_X6/NVWo]zjbt]","fields":{"NAME":"C"}}}},"next":{"block":{"type":"variables_set_motor","id":"=]J}2I+TX`+X%1zgs?gS","fields":{"VAR":{"id":"4-OSkmsDV+KSF64q5qEQ"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"Lni{Hm_t!{irS=jRsZ6T","fields":{"NAME":"E"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"?r(YU8*e0sWrBFaz=8HS","fields":{"SELECTION":"Direction.COUNTERCLOCKWISE"}}}},"next":{"block":{"type":"variables_set_motor","id":"De{{BDy.){=:Ocg9sKCv","fields":{"VAR":{"id":"b,Nr#2,#?~3zp6X2G=YP"}},"inputs":{"PORT":{"shadow":{"type":"blockParametersPort","id":"1VK$g6LwKHK$JGn4uMcc","fields":{"NAME":"F"}}},"POSITIVE_DIRECTION":{"shadow":{"type":"blockParametersDirection","id":"O7ZOn0tog0_G2f{F!Tpc","fields":{"SELECTION":"Direction.CLOCKWISE"}}}},"next":{"block":{"type":"variables_setup_any","id":"nB;H@ZMCQXxZ^*oQ~$P~","fields":{"VAR":{"id":"^J`}l7~af0Gl.D[D$VRw"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":";hriuy:a,+4q)fU%O`5a","fields":{"NUM":50}}}},"next":{"block":{"type":"variables_setup_any","id":"w?9W~#*LH~]B`}WixDjM","fields":{"VAR":{"id":"{aXlTANm/R[ciin`eTjz"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"#fTa{+b.QQIIA9*h#{79","fields":{"NUM":0.4}}}},"next":{"block":{"type":"variables_setup_any","id":"D)XiW*u{;lO1(d,$57Pe","fields":{"VAR":{"id":"|5Z:Q_CAA|%G_)vrkW+n"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"zS%dqleBN,1PtPclyKf-","fields":{"NUM":1.5}}}},"next":{"block":{"type":"variables_setup_any","id":"YJHYL0n4;U~%Y!zBpQ-~","fields":{"VAR":{"id":"8Z2eHh6IejIo6/3aj69N"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"o#|qnEoPU(q#{1nY3hn2","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":",iy[kvfs3h$:{Y``g64]","fields":{"VAR":{"id":"+!c|*Y1*Z#nTkI3$KNR2"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"DS{Ta1^(m[*%+SW|[UQa","fields":{"NUM":0}}}},"next":{"block":{"type":"variables_setup_any","id":"byRm`OXZ~!7P;(CV=`Wv","fields":{"VAR":{"id":",NM6phJv=f)8sO$t!cU4"}},"inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"^m5mLW3M6`~EQ[^UDt!0","fields":{"NUM":0}}}}}}}}}}}}}}}}}}}}}}}}},{"type":"blockGlobalStart","id":"U}MbiT)W6jPX~$WCjnz/","x":400,"y":260,"deletable":false,"next":{"block":{"type":"blockFlowWhile","id":"Kn1cIVr6ej%z7;dCC{w^","fields":{"MODE":"WHILE"},"inputs":{"BOOL":{"shadow":{"type":"blockLogicTrue","id":"O8zXBx.VTxY]w){14Z[("}},"DO":{"block":{"type":"blockIfElse","id":"I6.mH6Ran1!6pPwoWDKw","extraState":{"optionLevel":1},"inputs":{"IF0":{"shadow":{"type":"blockLogicTrue","id":"n},@]n2#0I)sL?Aed/93"},"block":{"type":"blockLogicCompare","id":"wN^p|N%Pav~3X?tQo}y]","fields":{"OP1":"GT"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"sQ!HqY+9piW6ilV!i#[S","fields":{"NUM":1}},"block":{"type":"blockFunctionCallerValue","id":"W)/4!:h2!t*Qn;-W}-LS","extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":";IaXG2cT)7N9T3!-?mI$"}}}},"B":{"shadow":{"type":"blockMathNumber","id":"M7Ot$Jv4=/TW5bu8t)K,","fields":{"NUM":5}}}}}},"DO0":{"block":{"type":"blockMotorDuty","id":"0T;O(B#;dK!=4e2Ufm.*","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"+VA5w;0$TC;~-z_%.@)@","fields":{"VAR":{"id":"4-OSkmsDV+KSF64q5qEQ","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"DV//wnHaG7kp%=J}J!yX","fields":{"VALUE0":0}}}},"next":{"block":{"type":"blockMotorDuty","id":"xau?SK=,0cvn3o$qMOQq","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"^B=KegO|^8b@fn,s;HP{","fields":{"VAR":{"id":"b,Nr#2,#?~3zp6X2G=YP","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"=tNA3`@]=v?1fN3[vJ61","fields":{"VALUE0":0}}}}}}}},"ELSE":{"block":{"type":"blockVariableSetValue","id":"zFG`,62H8xmuZd4a2iWE","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"~|_iw5S(sBD!Ro=.Gi5}","fields":{"VAR":{"id":"8Z2eHh6IejIo6/3aj69N","name":"error","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"~daGj#yQ=hn2(D:09b!j","fields":{"NUM":1}},"block":{"type":"blockFunctionCallerValue","id":"lgAX^/*v%c2`sE=ZFU0|","extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":"wk*0xm#+FlzOHka)NG[c"}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"/CJkypr=[eiyD}(iGksy","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"4n2$ssP5|64F]x.CDe9o","fields":{"VAR":{"id":",NM6phJv=f)8sO$t!cU4","name":"PD","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"A+FSp*85/MDSxB^X3?IT","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"7TyWGQ.7GLztP|`?(;gK","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"_0CO3xR2Y4%}V-aA)F^J","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"15[z*Pj`6UN}dQ.HeZNc","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"?]ry+kUF=NyRdreF68~/","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"z9B0hA_gchr)Hhr=$~6`","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"PefJT0]rB+g,G%S+;+Z]","fields":{"VAR":{"id":"8Z2eHh6IejIo6/3aj69N","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"2^$W?uX/h66RZ?s@rat$","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"spn3eX$I5(}Xr!0cdB~8","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"wrD51I5gl$5nxW:_d#R5","fields":{"VAR":{"id":"{aXlTANm/R[ciin`eTjz","name":"KP","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"bL.?mUr+MyMr4K#2ZO*2","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"KW_{L;#EHg[+ytt({Z$T","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"ges]pSvYA{;gM~wf7^5n","fields":{"NUM":1}},"block":{"type":"blockMathArithmetic","id":"V?Yh]X)D#MSx6T$JaR!n","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"r_3{f2BB^o(_pWk6KgN3","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"=NOJvJ(dajmPnX*^A8wB","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"0SC!MQi#Q#R3R4lh[qO*","fields":{"VAR":{"id":"8Z2eHh6IejIo6/3aj69N","name":"error","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"a3Dx-K4MVh1Ly@YcpI1V","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"=wr,qsrE/51Z*`1WDv#g","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"6UW_VSez#OfiBKF0WMpB","fields":{"VAR":{"id":"+!c|*Y1*Z#nTkI3$KNR2","name":"lastError","type":"Any"}}}}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"N5O-{G#tjr.su@.d[aUC","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"da-l4Qt@OieQqeCalQ+V","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"g0l9RrmowL{VB+mA,$%,","fields":{"VAR":{"id":"|5Z:Q_CAA|%G_)vrkW+n","name":"KD","type":"Any"}}}}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"}EJo*,bOs3I[^,tQ(7!`","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"57SY*!|oq74^rH9Y},_{","fields":{"VAR":{"id":"4-OSkmsDV+KSF64q5qEQ","name":"motorL","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"f3mg}VY(RiXIC1k^t0j-","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":"lI_ny6JWU,W*|J8+D$@C","fields":{"OP":"ADD"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"]eFU*XUrP7ZVNp2^ITqz","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"mOo.r[3z8cNm{;g^6O~n","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":":h[)O}WBbl;Cw7MtPLc1","fields":{"VAR":{"id":"^J`}l7~af0Gl.D[D$VRw","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"2{T:TYT)}%O=J#@-YQ)N","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"2az!#uCdzKv}Y7MdjGuL","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"MO.wr{5+LcnpB*!qv7nc","fields":{"VAR":{"id":",NM6phJv=f)8sO$t!cU4","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockMotorDuty","id":"f%j=f]JfS3qSp:+rb}_0","inputs":{"VAR":{"shadow":{"type":"variables_get_simple_motor_device","id":"oKohC++?Nr}+^aWhNs/J","fields":{"VAR":{"id":"b,Nr#2,#?~3zp6X2G=YP","name":"motorR","type":"Motor"}}}},"VALUE0":{"shadow":{"type":"unit_percent","id":"OuD)=kvsqo~GhgiGPh1o","fields":{"VALUE0":50}},"block":{"type":"blockMathArithmetic","id":",u9n7Yp2O?Pb:dO1g][@","fields":{"OP":"MINUS"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"OqIEt@{+jj[6L-6ZA`9H","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":")n3+cukgv)G2P}`2OX];","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"7:vjwH.UPNrMS9FQ6Y-?","fields":{"VAR":{"id":"^J`}l7~af0Gl.D[D$VRw","name":"SPEED","type":"Any"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"Zx}2l/`H=?YK#.K)/[Xm","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"I9v-]#2v*z0s*PC`O~}_","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"U+u7|$[7FsZ9=YF:`p^/","fields":{"VAR":{"id":",NM6phJv=f)8sO$t!cU4","name":"PD","type":"Any"}}}}}}}}}}},"next":{"block":{"type":"blockVariableSetValue","id":"N`schaz$}g]Qul-[4Bu(","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"ppa^Cu([ArQ9?dcPXwV=","fields":{"VAR":{"id":"+!c|*Y1*Z#nTkI3$KNR2","name":"lastError","type":"Any"}}}},"VALUE0":{"shadow":{"type":"blockMathNumber","id":"FUC1`8@q=lSdv^GO_2ps","fields":{"NUM":1}},"block":{"type":"blockVariableGetValue","id":"w-0pjZ4cY0_dq=la=5{v","inputs":{"VAR":{"shadow":{"type":"variables_get_any","id":"tiu-PMFyGmQPY{lqqA9C","fields":{"VAR":{"id":"8Z2eHh6IejIo6/3aj69N","name":"error","type":"Any"}}}}}}}}}}}}}}}}}}},"next":{"block":{"type":"blockWaitTime","id":"wl+@zMG*2RDoA}Ai%sAr","inputs":{"VALUE0":{"shadow":{"type":"unit_time","id":"[rRwI|miC?gOAcQim0O~","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":"m7%jG`dYdG1~(tyX+t!E","name":"Line8","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":")J=C=e:}[1(kp1=)Z$)/","x":40,"y":30,"extraState":{"optionLevel":0},"fields":{"ICON":"SUITCASE","VAR":{"id":";IaXG2cT)7N9T3!-?mI$"}},"inputs":{"STACK":{"block":{"type":"blockTaskReturn","id":"@z~tjGTbTz~g^GNX.2-X","inputs":{"VALUE0":{"shadow":{"type":"blockMathNumber","id":"Rf1R6s9X[4iIxx9.ke*r","fields":{"NUM":0}},"block":{"type":"blockMathOp","id":"//W@w1YRvC,{qk@UR,+X","extraState":{"optionLevel":1},"fields":{"OP":"MODULO"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"-eaD0h?zn+aVZKYh!uQ/","fields":{"NUM":0}},"block":{"type":"blockMathOp","id":"2FBEQV}NCWVDKyHUnLr(","extraState":{"optionLevel":0},"fields":{"OP":"ROUND"},"inputs":{"NUM":{"shadow":{"type":"blockMathNumber","id":"7YhS/G_{w^jZ^Ay^y[XD","fields":{"NUM":0}},"block":{"type":"blockMathArithmetic","id":"y7fk1IdS/U1Qrph*9?UZ","fields":{"OP":"MULTIPLY"},"inputs":{"A":{"shadow":{"type":"blockMathNumber","id":"Me5L0n:rurjG%#m.7x57","fields":{"NUM":1}},"block":{"type":"blockLightAmbient","id":"!H%hA_|]R.LC[c1cj-!X","inputs":{"VAR":{"shadow":{"type":"variables_get_light_ambient_intensity_device","id":"bN0I2[y0+}l,]o+l_ax)","fields":{"VAR":{"id":"m7%jG`dYdG1~(tyX+t!E","name":"Line8","type":"ColorSensor"}}}}}}},"B":{"shadow":{"type":"blockMathNumber","id":"KWSMrHPi)E?ce!ADGzB6","fields":{"NUM":10}}}}}}}}},"NUM2":{"shadow":{"type":"blockMathNumber","id":"3M;(zNZ`Wz}.@7Gh$@f}","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":"~hwO=)x.uhr3S`p+SNv_","type":"PrimeHub"},{"name":"motorL","id":"4-OSkmsDV+KSF64q5qEQ","type":"Motor"},{"name":"motorR","id":"b,Nr#2,#?~3zp6X2G=YP","type":"Motor"},{"name":"SPEED","id":"^J`}l7~af0Gl.D[D$VRw","type":"Any"},{"name":"KP","id":"{aXlTANm/R[ciin`eTjz","type":"Any"},{"name":"KD","id":"|5Z:Q_CAA|%G_)vrkW+n","type":"Any"},{"name":"error","id":"8Z2eHh6IejIo6/3aj69N","type":"Any"},{"name":"lastError","id":"+!c|*Y1*Z#nTkI3$KNR2","type":"Any"},{"name":"PD","id":",NM6phJv=f)8sO$t!cU4","type":"Any"},{"name":"Line8","id":"m7%jG`dYdG1~(tyX+t!E","type":"ColorSensor"},{"name":"getLinePos100","id":"wk*0xm#+FlzOHka)NG[c","type":"Function"},{"name":"getLineWidth100","id":";IaXG2cT)7N9T3!-?mI$","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()
Line8 = 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(Line8.ambient() // 1 - 100)

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


# The main program starts here.
while True:
    if getLineWidth100() > 5:
        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)
