# Sigue líneas

Vamos a crear un programa SIGUE LÍNEAS. El objetivo es que el robot ALVIK sea capaz de seguir cualquier trazado de líneas utilizando sus sensores IR

[![image.png](https://libros.catedu.es/uploads/images/gallery/2024-06/scaled-1680-/5hzimage.png)](https://libros.catedu.es/uploads/images/gallery/2024-06/5hzimage.png)Fuente [https://docs.arduino.cc/tutorials/alvik/getting-started/](https://docs.arduino.cc/tutorials/alvik/getting-started/) Author<svg fill="none" height="4" viewbox="0 0 3 4" width="3" xmlns="http://www.w3.org/2000/svg"><circle cx="1.5" cy="2" fill="#95A5A6" r="1.5"></circle></svg>Jose Gracia CC-BY-SA

Para poder conseguirlo simplemente tendremos que establecer distintas condiciones de que hacer dependiendo de que sensor del robot detecta el trazado negro.

En este programa también hemos hecho que el robot nos trasmita los valores de los distintos sensores y que el usuario pueda interrumpir el proceso (todo suponiendo que el robot está conectado al equipo).

```python
from arduino_alvik import ArduinoAlvik
from time import sleep
import sys

alvik = ArduinoAlvik()
alvik.begin()
sleep(5)

#VELOCIDAD DEL ROBOT
base_speed = 30

#IMPRIMIR VALORES DE LOS SENSORES
while True:
    try:
        ir_left, ir_center, ir_right = alvik.get_line_sensors()
        print(ir_left, ir_center, ir_right)
        sleep(0.01)
        
        #Condiciones de giro, avance y parar
        if ir_center > 300:
            alvik.set_wheels_speed(base_speed, base_speed)
        elif ir_left > 300:
            alvik.set_wheels_speed(0, base_speed)
        elif ir_right > 300:
            alvik.set_wheels_speed(base_speed, 0)
        else:
            alvik.set_wheels_speed(0, 0)
          
  #INTERRUPCION DEL USUARIO
    except KeyboardInterrupt as e:
        print('over')
        alvik.stop()
        sys.exit()
```

No va muy preciso, el código es mejorable:

- Si la raya es fina, no avanza
- Si la raya no es negra no avanza
- La velocidad 30 es baja
- El margen límite 300 es demasiado generoso que hace que pueda quedarse quieto por detectar todo blanco (ver el final del vídeo)

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="849" src="https://www.youtube.com/embed/6Nz4B13j3Vg" title="July 12, 2024" width="478"></iframe>

Más preciso (agradecimientos a Mario Monteagudo Alda CP Ejea)

```python
from arduino import *
from arduino_alvik import ArduinoAlvik

alvik = ArduinoAlvik()

def setup():
  alvik.begin()
  delay(1000)
 
def loop():
 
  global base, iteracion
 
  iz, ce, de = alvik.get_line_sensors()
  error = ((1*iz+2*ce+3*de)/(iz+ce+de))-2

  if ((ce > 400) and (de > 400)):
    alvik.left_led.set_color(1, 1, 0)
    alvik.right_led.set_color(1, 1, 0)
    base = 0
    ajuste = 30
    iteracion = 25
    
  elif ((ce > 400) and (iz > 400)):
    alvik.left_led.set_color(1, 1, 0)
    alvik.right_led.set_color(1, 1, 0)
    base = 0
    ajuste = -30
    iteracion = 25  
    
  elif (abs(error) < 0.75) and (iteracion == 0):  
    alvik.left_led.set_color(0, 0, 1)
    alvik.right_led.set_color(0, 0, 1)
    base = 60
    ajuste = 25 * error + 40 * error * abs(error) + 80 * error * error * error
    
  elif (abs(error) < 0.75):  
    alvik.left_led.set_color(0, 1, 0)
    alvik.right_led.set_color(0, 1, 0)
    base = 40
    ajuste = 20 * error + 40 * error * abs(error) + 80 * error * error * error
    iteracion = iteracion -1
    
  elif error > 0:
    alvik.left_led.set_color(1, 0, 0)
    alvik.right_led.set_color(1, 0, 0)
    base = 0
    ajuste = 60
    iteracion = 25
    
  else:
    alvik.left_led.set_color(1, 0, 0)
    alvik.right_led.set_color(1, 0, 0)
    base = 0
    ajuste = -60
    iteracion = 25
 
  veIz = base + ajuste
  veDe = base - ajuste

  alvik.set_wheels_speed(veIz,veDe)

  delay(50)

def cleanup():
  alvik.stop()

base = 40
iteracion = 0

start(setup, loop, cleanup)
```

Autor Mario Monteagudo Alda CP Ejea

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/jJ_ulJH5SLM" width="560"></iframe>