|
|
- # 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](bbled.png)
-
- ## 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.
-
- ```C
- #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.
-
- ```C
- #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.
-
- ```C
- 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.
-
- ```C
- 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*.
-
- ```C
- 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.
-
- ```C
- 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.
-
- ```C
- 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
- ```
|