You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Gustavo Martinez 1c36e0990c Minor changes in Readme 2 years ago
.gitignore First commit 2 years ago
Readme.md Minor changes in Readme 2 years ago
bbled.png Readme.md edied and assets added 2 years ago
main.c Minor changes 2 years ago

Readme.md

Control de LED de usuario por medio de script en C

El objetivo de este script en lenguaje C es controlar uno de los LED's de usuario integrados en la BeagleBone Black por medio de los registros del sistema.

BeagleBone Black y sus LED's de usuario

Header

Librerías

En el encabezado de nuestro script se importan las librerías necesarias para realizar las operaciones de entrada y salida en la terminal de la Beaglebone, manejo de archivos, así como otras operaciones estandar y el manejo de strings.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

Registros del LED 3 de usuario

Se define la dirección dónde se encuentran los registros del LED 3 que modificaremos para controlar su estado.

#define LED3_PATH "/sys/class/leds/beaglebone:green:usr3"
#define bled "/brightness"
#define tled "/trigger"

Prototipos de funciones

Se establecen los prototipos de las funciones que usaremos: la función que modificará los registros del LED y la que deshabilitará el trigger.

void writeLED(char fileName[], char value[]);
void removeTrigger();

Main

En nuestro ciclo principal las argumentos serán argc y argv, dónde argc cuenta el número de argumentos en la terminal, mientras argv almacena el valor de los argumentos.

argc nos ayudará a determinar si el usario ingresó el número correcto de argumentos a nuestra función siendo este 1.

int main(int argc, char* argv[]){
	printf("Starting app \n");

	if(argc!=2){
		printf("Incorrect number of arguments");
		return 2;
	}

Se utiliza un ciclo if para seleccionar la acción del LED, comparando el valor de argumento en la terminal con unos comandos definidos: on, off y blink

Para prender o apagar el LED, se deshabilita el trigger y se modifica el registro de brightness.

	if(strcmp(argv[1], "on")==0){
		printf("LED on \n");
		removeTrigger();
		writeLED(bled, "1");
		printf("Done");
	}
	
	else if (strcmp(argv[1], "off")==0){
		printf("LED off \n");
		removeTrigger();
		writeLED(bled, "0");
		printf("Done");	
	}

En el caso del parpadeo del LED, el trigger se modifica para activar el timer y se utilizan los registro de delay_on y delay_off para establecer el tiempo de encendido y apagado.

	else if (strcmp(argv[1], "blink")==0){
		printf("LED blinking \n");
		writeLED(tled, "timer");
		writeLED("/delay_on", "500");
		writeLED("/delay_off", "500");
	}
	
	else
		printf("Invalid command!\n");
	
	return 0;
}	

Funciones

Se desarrollan las funciones anterior mente mencionadas, para esto se necesita un puntero de archivo fp y la función fopen de las librerías que importamos, el argumento de la función será el directorio y los registros que definimos en el encabezado.

void writeLED(char fileName[], char value[]){
	FILE* fp;
	char fullName[150];
	sprintf(fullName, LED3_PATH "%s", fileName);
	fp = fopen(fullName, "w+");
	fprintf(fp, "%s", value);
	fclose(fp);
}

void removeTrigger(){
	writeLED(tled, "none");
}	

Ejecución

Se compila el archivo main.c

gcc main.c -o led

Se cambian los permisos de nuestro ejecutable.

sudo chmod u+x led

Y se ejecuta con cualquiera de los argumentos mencionados anteriormente.

sudo ./led blink