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.

182 lines
4.1 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 **led.h** 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. ```cpp
  11. #ifndef LED_H
  12. #define LED_H
  13. #include<iostream>
  14. #include<fstream>
  15. #include<string>
  16. #include<sstream>
  17. ```
  18. ### Clases
  19. Se define la clase CLED que se usará en el main para nuestro objeto LED, junto
  20. con su destructor de clase y todos sus métodos.
  21. ```cpp
  22. class CLED{
  23. private:
  24. std::string path;
  25. int ledNumber;
  26. virtual void WriteLED(std::string filename, std::string value);
  27. virtual void RemoveTrigger();
  28. public:
  29. CLED(int ledNumber); //class creator
  30. virtual ~CLED(); //class deconstructor
  31. virtual void TurnOn();
  32. virtual void TurnOff();
  33. virtual void BlinkLED();
  34. };
  35. #endif
  36. ```
  37. ## Métodos
  38. En **led.cpp** se desarrollan los métodos definidos en el encabezado, primero
  39. se establece la dirección de los registros de los LED de usuario.
  40. ```cpp
  41. #define LED_PATH "/sys/class/leds/beaglebone:green:usr"
  42. ```
  43. **CLED:** Es el creador de la clase y de nuestro objeto, nos entrega la dirección
  44. del LED de usuario que escojamos.
  45. ```cpp
  46. CLED::CLED(int ledNumber){
  47. this->ledNumber = ledNumber; //Solo para argumentos que sean numeros
  48. std::ostringstream s;
  49. s << LED_PATH << ledNumber;
  50. path =std::string(s.str()); //convert to string
  51. }
  52. ```
  53. **WriteLED:** Es el método que modifica los registros de nuestro LED.
  54. ```cpp
  55. void CLED::WriteLED(std::string filename, std::string value){
  56. std::ofstream fs;
  57. fs.open((path+filename).c_str());
  58. fs << value;
  59. fs.close();
  60. }
  61. ```
  62. **RemoveTrigger:** Método que desactiva el trigger.
  63. ```cpp
  64. void CLED::RemoveTrigger(){
  65. WriteLED("/trigger", "none");
  66. }
  67. ```
  68. Los métodos **TurnOn** y **TurnOff** desactivan el trigger con RemoveTrigger, y
  69. con WriteLED cambian el registro *brightness* para encender o apagar el LED.
  70. **BlinkLED** solo utiliza WriteLED para cambiar el trigger a *timer* y
  71. así modificar los registros *delay_on* y *delay_off* para cambiar los tiempos de
  72. encendido y apagado.
  73. ```cpp
  74. void CLED::TurnOn(){
  75. std::cout << "LED Turn On: " << ledNumber << " on" << std::endl;
  76. RemoveTrigger();
  77. WriteLED("/brightness", "1");
  78. }
  79. void CLED::TurnOff(){
  80. std::cout << "LED Turn Off: " << ledNumber << " off" << std::endl;
  81. RemoveTrigger();
  82. WriteLED("/brightness", "0");
  83. }
  84. void CLED::BlinkLED(){
  85. std::cout << "LED blinking: " << ledNumber << " blinking" << std::endl;
  86. WriteLED("/trigger", "timer");
  87. WriteLED("/delay_on", "50");
  88. WriteLED("/delay_off", "50");
  89. }
  90. ```
  91. Por último, el destructor de clase.
  92. ```cpp
  93. CLED::~CLED(){
  94. std::cout << "destroying LED " << path << std::endl;
  95. }
  96. ```
  97. ## Main
  98. En **main.cpp** se incluye nuestro encabezado, y se utilizan los argumentos
  99. *argc* y *argv* para conocer lo que se ingresa en la terminal. Argc nos indicará
  100. si el número de argumentos es correcto.
  101. Se utiliza un ciclo if para seleccionar la acción del LED, comparando el valor
  102. de argumento en la terminal con unos comandos definidos: ***on***, ***off***
  103. y ***blink***.
  104. ```cpp
  105. #include"led.h"
  106. #include<string>
  107. using namespace std;
  108. int main(int argc, char* argv[]){
  109. CLED led1 = CLED(3);
  110. string cmd(argv[1]);
  111. if(argc!=2)
  112. std::cout << "Incorrect number of arguments" << std::endl;
  113. if(cmd=="on")
  114. led1.TurnOn();
  115. else if(cmd=="off")
  116. led1.TurnOff();
  117. else if(cmd=="blink")
  118. led1.BlinkLED();
  119. else
  120. cout << "Invalid command" << endl;
  121. return 0;
  122. }
  123. ```
  124. ## Ejecución
  125. Se creó un archivo makefile para compilar, eliminar archivos
  126. antiguos de salida y para hacer un debug.
  127. ```console
  128. all:
  129. g++ main.cpp -o led led.cpp
  130. clean:
  131. rm led
  132. debug:
  133. g++ -g main.cpp -o led led.cpp
  134. ```
  135. Se cambian los permisos de nuestro ejecutable.
  136. ```
  137. sudo chmod u+x led
  138. ```
  139. Y se ejecuta con cualquiera de los argumentos mencionados anteriormente.
  140. ```
  141. ./led blink
  142. ```