|
@ -1,7 +1,134 @@ |
|
|
# Control de LED de usuario por medio de script en Control de LED de usuario por medio de script en |
|
|
|
|
|
|
|
|
# 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 |
|
|
El objetivo de este script en lenguaje C es controlar uno de los LED's de usuario |
|
|
integrados en la BeagleBone Black por medio delos registros del sistema. |
|
|
|
|
|
|
|
|
integrados en la BeagleBone Black por medio de los registros del sistema. |
|
|
|
|
|
|
|
|
![BeagleBone Black y sus LED's de usuario](/bbled.png) |
|
|
|
|
|
|
|
|
![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 arguemntos mencionados anteriormente. |
|
|
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
|
sudo ./led blink |
|
|
|
|
|
``` |