## Comunicación Serial Raspberry y Microcontrolador (PIC, AVR, ESP)
### Comunicación Serial
> La comunicación serial es un método de transmisión de datos que permite la transferencia de información entre dos dispositivos electrónicos mediante la transmisión de bits de forma secuencial a través de un canal de comunicación compartido. En el contexto de un Raspberry Pi y un microcontrolador, la comunicación serial puede establecerse para permitir la transferencia de datos entre ambos dispositivos.
>
> El Raspberry Pi y el microcontrolador pueden comunicarse mediante diferentes protocolos de comunicación serial, como UART, SPI o I2C. En general, la comunicación UART es la más comúnmente utilizada, ya que es simple de implementar y no requiere una configuración compleja.
>
> Para establecer una comunicación serial entre el Raspberry Pi y el microcontrolador, ambos dispositivos deben estar configurados para utilizar el mismo protocolo de comunicación y la misma velocidad de transmisión de datos (baud rate). En el caso de la comunicación UART, se utiliza un par de pines del Raspberry Pi (GPIO14 y GPIO15) para transmitir y recibir datos a través de un cable serial.
>
> Una vez establecida la comunicación serial, el microcontrolador puede enviar comandos o datos al Raspberry Pi para controlar sus operaciones o recibir datos de sensores o actuadores conectados al microcontrolador.
>
> En resumen, la comunicación serial entre un Raspberry Pi y un microcontrolador permite una conexión simple y efectiva entre dos dispositivos electrónicos para transferir datos y controlar operaciones.
### Hardware:
- `Raspberry Pi 3`

- `PIC`

> Para establecer la comunicación serial entre el microcontrolador y la Raspberry Pi 3, es necesario adaptar los niveles de tensión debido a que los niveles en el microcontrolador son de 5V (TTL) y en la Raspberry Pi son de 3.3V (LV-TTL). Para lograr esto, se utilizará un adaptador de nivel (level shifter), que es un componente que permite convertir señales lógicas de distintos niveles de tensión. En este caso, se utilizarán dos transistores para adaptar los niveles de tensión entre ambos dispositivos.
>
> Una vez realizada la conexión de los pines TX y RX respectivamente, se procede con la codificación.
- `Conexión`

> Note que el PIN TX del Raspberry en la conexión del transistor en el colector van los 5V del PIC y para el PIN TX del microcontrolador el colector va al PIN GPIO 1 que es el PIN de 3.3V.
>
> Recuerde que los GND deben ir unificados, es decir, que tanto el GND del Raspberry debe ir conectado al GND del microcontrolador que se este usando. Lo mismo aplica si en vez de un microcontrolador PIC se usa un Arduino, un AVR o un ESP.
### Software:
> A modo de ejemplo se presenta el siguiente código:

*Puedes descargar el codigo desde aquí* [comunicacionSerial.py](https://drive.google.com/file/d/1O4-voHeyMIj0RhCN0gp88vaxTgG3nTvW/view?usp=sharing)
> Este código establece una comunicación serial entre un dispositivo externo y una computadora (en este caso, el Raspberry Pi) utilizando la biblioteca PySerial en Python.
>
> La primera línea importa la biblioteca "serial", que se utiliza para configurar y leer datos de la comunicación serial. La segunda línea importa la biblioteca "pyautogui", que se utiliza para simular la pulsación de teclas en el teclado de la computadora.
>
> La tercera línea configura la conexión serial con el puerto "/dev/ttyS0" del Raspberry Pi a una velocidad de transmisión de 9600 baudios.
>
> Luego, se inicia un bucle while que se ejecuta continuamente para leer los datos que se reciben a través del puerto serial.
>
> Dentro del bucle while, la función "ser.readline()" lee los datos recibidos del dispositivo externo, "decode()" los convierte de bytes a una cadena de caracteres, y "strip()" elimina los caracteres de espacio en blanco alrededor del borde. Esto permite leer los datos en formato de cadena.
>
> A continuación, se utiliza una serie de declaraciones "if-elif" para comprobar si los datos recibidos son iguales a "up", "down", "left" o "right". Si se recibe alguno de estos valores, la biblioteca "pyautogui" simula la pulsación de la tecla de flecha correspondiente mediante la función "press()".
>
> Finalmente, el bucle while se ejecuta continuamente hasta que se detiene manualmente mediante una instrucción de interrupción o un comando externo. En resumen, este código lee los datos recibidos a través de un puerto serial, y emula las teclas de flecha del teclado de la computadora en función de los datos recibidos.
*Si te ha gustado el contenido en general puedes contactarme por:*
* [Behance](https://www.behance.net/jssmarinl)
* [LinkedIn](https://www.linkedin.com/in/jssmarinl/)
* [Instagram](https://www.instagram.com/jss.marinl/)
* [WhatsApp](https://api.whatsapp.com/send?phone=+584120835034)