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.

134 lines
3.2 KiB

  1. # Control de LED de usuario por medio de script en C
  2. El objetivo de este script en lenguaje C es controlar uno de los LED's de usuario
  3. integrados en la BeagleBone Black por medio de los registros del sistema.
  4. ![BeagleBone Black y sus LED's de usuario](bbled.png)
  5. ## Header
  6. ### Librerías
  7. En el encabezado de nuestro script se importan las librerías necesarias para
  8. realizar las operaciones de entrada y salida en la terminal de la Beaglebone, manejo de archivos,
  9. así como otras operaciones estandar y el manejo de strings.
  10. ```C
  11. #include<stdio.h>
  12. #include<stdlib.h>
  13. #include<string.h>
  14. ```
  15. ### Registros del LED 3 de usuario
  16. Se define la dirección dónde se encuentran los registros del LED 3
  17. que modificaremos para controlar su estado.
  18. ```C
  19. #define LED3_PATH "/sys/class/leds/beaglebone:green:usr3"
  20. #define bled "/brightness"
  21. #define tled "/trigger"
  22. ```
  23. ### Prototipos de funciones
  24. Se establecen los prototipos de las funciones que usaremos:
  25. la función que modificará los registros del LED y la que deshabilitará
  26. el trigger.
  27. ```C
  28. void writeLED(char fileName[], char value[]);
  29. void removeTrigger();
  30. ```
  31. ## Main
  32. En nuestro ciclo principal las argumentos serán *argc* y *argv*, dónde argc cuenta el número de argumentos en la terminal,
  33. mientras argv almacena el valor de los argumentos.
  34. argc nos ayudará a determinar si el usario ingresó el número correcto de argumentos
  35. a nuestra función siendo este 1.
  36. ```C
  37. int main(int argc, char* argv[]){
  38. printf("Starting app \n");
  39. if(argc!=2){
  40. printf("Incorrect number of arguments");
  41. return 2;
  42. }
  43. ```
  44. Se utiliza un ciclo if para seleccionar la acción del LED, comparando el valor
  45. de argumento en la terminal con unos comandos definidos: ***on***, ***off*** y ***blink***
  46. Para prender o apagar el LED, se deshabilita el trigger y se modifica el registro de *brightness*.
  47. ```C
  48. if(strcmp(argv[1], "on")==0){
  49. printf("LED on \n");
  50. removeTrigger();
  51. writeLED(bled, "1");
  52. printf("Done");
  53. }
  54. else if (strcmp(argv[1], "off")==0){
  55. printf("LED off \n");
  56. removeTrigger();
  57. writeLED(bled, "0");
  58. printf("Done");
  59. }
  60. ```
  61. En el caso del parpadeo del LED, el trigger se modifica para activar el timer
  62. y se utilizan los registro de *delay_on* y *delay_off* para establecer
  63. el tiempo de encendido y apagado.
  64. ```C
  65. else if (strcmp(argv[1], "blink")==0){
  66. printf("LED blinking \n");
  67. writeLED(tled, "timer");
  68. writeLED("/delay_on", "500");
  69. writeLED("/delay_off", "500");
  70. }
  71. else
  72. printf("Invalid command!\n");
  73. return 0;
  74. }
  75. ```
  76. ## Funciones
  77. Se desarrollan las funciones anterior mente mencionadas, para esto se
  78. necesita un puntero de archivo fp y la función fopen de las librerías
  79. que importamos, el argumento de la función será el directorio y los
  80. registros que definimos en el encabezado.
  81. ```C
  82. void writeLED(char fileName[], char value[]){
  83. FILE* fp;
  84. char fullName[150];
  85. sprintf(fullName, LED3_PATH "%s", fileName);
  86. fp = fopen(fullName, "w+");
  87. fprintf(fp, "%s", value);
  88. fclose(fp);
  89. }
  90. void removeTrigger(){
  91. writeLED(tled, "none");
  92. }
  93. ```
  94. ## Ejecución
  95. Se compila el archivo main.c
  96. ```
  97. gcc main.c -o led
  98. ```
  99. Se cambian los permisos de nuestro ejecutable.
  100. ```
  101. sudo chmod u+x led
  102. ```
  103. Y se ejecuta con cualquiera de los argumentos mencionados anteriormente.
  104. ```
  105. sudo ./led blink
  106. ```