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.

164 lines
4.0 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. ```
  72. Si el usuario no conoce los comandos, puede usar ***help*** para desplegar la lista de
  73. los comandos anteriormente mencionados, o bien al ingresar un comando erróneo
  74. saldrá una alerta que indicará que el comando es incorrecto y mostrará todos los
  75. comandos a usar.
  76. ```C
  77. else if (strcmp(argv[1], "help")==0){
  78. printf("This is an application to control User LED 3");
  79. printf("List of commands: ");
  80. printf("on - Powers on the LED");
  81. printf("off - Powers off the LED");
  82. printf("blink - Makes the LED blink");
  83. }
  84. else
  85. printf("Error: This is not a command for this application");
  86. printf("These are the commands you can use: ");
  87. printf("on - Powers on the LED");
  88. printf("off - Powers off the LED");
  89. printf("blink - Makes the LED blink");
  90. return 0;
  91. }
  92. ```
  93. ## Funciones
  94. Se desarrollan las funciones anterior mente mencionadas, para esto se
  95. necesita un puntero de archivo fp y la función fopen de las librerías
  96. que importamos, el argumento de la función será el directorio y los
  97. registros que definimos en el encabezado.
  98. ```C
  99. void writeLED(char fileName[], char value[]){
  100. FILE* fp;
  101. char fullName[150];
  102. sprintf(fullName, LED3_PATH "%s", fileName);
  103. fp = fopen(fullName, "w+");
  104. fprintf(fp, "%s", value);
  105. fclose(fp);
  106. }
  107. void removeTrigger(){
  108. writeLED(tled, "none");
  109. }
  110. ```
  111. ## Ejecución y compilación
  112. Se compila el archivo main.c
  113. ```
  114. gcc main.c -o led
  115. ```
  116. Se asignan los permisos necesarios a nuestro ejecutable.
  117. ```
  118. sudo chmod u+x led
  119. ```
  120. Y se ejecuta con cualquiera de los argumentos disponibles.
  121. Encender el LED
  122. ```
  123. sudo ./led on
  124. ```
  125. Apagar el LED
  126. ```
  127. sudo ./led off
  128. ```
  129. Parpadear el LED
  130. ```
  131. sudo ./led blink
  132. ```