Stellaris LaunchPad & Energia: Puerto serie - Envió de datos para recepción en Python (Parte 1)


Siguiendo con los ejemplos sobre la Stellaris LaunchPad, veremos en esta ocasión una forma sencilla de enviar datos a través del puerto serie y para aprovechar que andamos aprendiendo Python pues lo usaremos para recibir los datos.

Código Stellaris:
Para la Stellaris no vamos a trabajar mucho sera algo sencillo, tendremos el botón (SW1) que dará inicio a la secuencia, con un pulso iniciara un contador el cual sera incrementado aproximadamente cada segundo, también se enviara su valor a través del puerto serial, ademas que el LED azul (D1) cambiara su estado con cada incremento, si el botón se vuelve a pulsar todo esto se detiene. Sin mas el código es el siguiente:
/*******************************************************************************
*
* Envio de datos al puerto serie para monitoreo en Python
*
*******************************************************************************
* FileName: LM4F_E008.ino
* Processor: EX-LM4F120XL
* Complier: Energia 0101e0017
* Author: Pedro Sánchez (MrChunckuee)
* Blog: http://mrchunckuee.blogspot.com/
* Email: mrchunckuee.psr@gmail.com
* Description: Este ejemplo envia un valor tipo Int atraves del puerto serie,
* para ser procesado en Python, ademas de cambiar el estado del
* LED azul
*******************************************************************************
* Rev. Date Comment
* v0.0.0 22/02/2019 Creación del firmware
* v0.0.1 02/03/2019 Se implemento retardos usando millis()
******************************************************************************/
const int pinButton = PUSH1;
const int pinLed = BLUE_LED;
// Variables will change:
int ledState = LOW; // ledState used to set the LED
long previousMillis = 0; // will store last time LED was updated
long interval = 1000; // interval at which to blink (milliseconds)
int buttonState = 0;
int buttonTicks = 0;
int currentButtonState = 0;
int lastButtonState= 0;
int buttonFlag = LOW;
unsigned int send_data = 0;
void setup() {
pinMode(pinButton, INPUT_PULLUP);
pinMode(pinLed, OUTPUT);
Serial.begin(9600);
}
void loop(){
GetInput();
if(buttonFlag == HIGH){
// check to see if it's time to blink the LED; that is, if the
// difference between the current time and last time you blinked
// the LED is bigger than the interval at which you want to
// blink the LED.
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW){
ledState = HIGH;
Serial.print(send_data); //When use .read() in python
send_data ++;
if(send_data == 400) //Limitamos a mandar 400 valores
send_data= 0;
}
else
ledState = LOW;
// set the LED with the ledState of the variable:
digitalWrite(pinLed, ledState);
}
}
}
void GetInput(void){
// Push Button debounce
if (buttonState != digitalRead(pinButton)){
if (buttonTicks > 20){
buttonState = digitalRead(pinButton);
buttonTicks = 0;
}
else buttonTicks++;
}
else buttonTicks = 0;
// Process the push button
currentButtonState = buttonState;
if (currentButtonState == 0 && lastButtonState == 1){
if (buttonFlag == LOW){
send_data= 0;
buttonFlag = HIGH;
}
else{
buttonFlag = LOW;
digitalWrite(pinLed, LOW);
send_data= 0;
}
}
lastButtonState = currentButtonState;
}
view raw LM4F_E008.ino hosted with ❤ by GitHub

Código Python:
Como andamos aprendiendo Python vamos a realizar un pequeño un pequeño ejemplo para la recepción de datos a través del puerto serie, para ello usaremos la librería pySerial (esta por demás decir que ya debes de tener instalado python así como la librería PySerrial). Bueno lo primero que haremos sera importar la librería, seguido de inicializar el puerto para este ejemplo usaremos el COM4 que es ahí donde esta nuestra Stellaris, la velocidad sera de 9600, vamos a usar la introducción .read() y luego imprimiremos este dato en pantalla. Sin mas el script es el siguiente:
"""
*******************************************************************************
*
* Puerto serie - Recepción de datos
*
*******************************************************************************
* FileName: PY_001.py
* Complier: EPython 3.7.1
* Author: Pedro Sánchez (MrChunckuee)
* Blog: http://mrchunckuee.blogspot.com/
* Email: mrchunckuee.psr@gmail.com
* Description: Ejemplo de recepcion de datos atravez de un puerto COM
* usando la libreria pySerial.
*******************************************************************************
* Rev. Date Comment
* v0.0.0 22/02/2019 Creación del firmware
*******************************************************************************
"""
import serial
#Usamos puerto COM4 a 9600 baudios
serial_object = serial.Serial("COM4", 9600)
print("Connected to: " + serial_object.portstr)
value = 0
while True:
value = serial_object.read();
print (value)
view raw PY_001.py hosted with ❤ by GitHub

Resultados:
Bueno aquí esta el resultado, la función .read() devuelve un tipo byte con tamaño 1 y al imprimirlo obtenemos lo siguiente:

Lo curioso de esto es que si nuestra variable tiene dos dígitos mostrara un por uno, como vemos en la siguiente imagen, en donde muestra el 10 en dos partes (en otra publicación veremos como solucionar esto, incluso como leer un string):


También puedes definir un tamaño para la función read(), por ejemplo podemos usar read(5) el cual leerá los 5 datos y luego imprimirá en pantalla, aunque esto sigue teniendo el mismo problema al leer valores con dos dígitos, como se ve a continuación:


Video:
Aquí un pequeño video donde muestra la launchpad en acción.
 

Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.



Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.


Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.

Referencias:

Publicar un comentario

0 Comentarios