Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. #pragma config(Sensor, S1, lightRight, sensorLightActive)
  2. #pragma config(Sensor, S4, lightLeft, sensorLightActive)
  3. #pragma config(Motor, motorA, motorRight, tmotorNormal, PIDControl, encoder)
  4. #pragma config(Motor, motorC, motorLeft, tmotorNormal, PIDControl, encoder)
  5. //*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
  6.  
  7. /*--------------------------------------------------------------------------------------------------------*\
  8. |* *|
  9. |* - P-Pegler - *|
  10. |* ROBOTC on NXT *|
  11. |* *|
  12. |* Mit Hilfe eines P-Regler folgt das Fahrzeug einer Kante (schwarz/weiss) *|
  13. |* *|
  14. |* ROBOT CONFIGURATION *|
  15. |* NOTES: *|
  16. |* 1) Die Lichtsensoren sind frontseitig nebeneinader montiert *|
  17. |* 2) Stellen Sie sicher, dass vor dem Start des Programms Ihr Roboter mittig auf der Kante *|
  18. |* platziert ist, damit der korrekte Teachwert (Sollwert) initialisiert werden kann *|
  19. |* comparison in your program. *|
  20. |* *|
  21. |* MOTORS & SENSORS: *|
  22. |* [I/O Port] [Name] [Type] [Description] *|
  23. |* Port A motorRight NXT Right motor *|
  24. |* Port C motorLeft NXT Left motor *|
  25. |* Port 1 lightRight LightActiv Right mounted *|
  26. |* Port 4 lightLeft LightActiv Left mounted *|
  27. \*--------------------------------------------------------------------------------------------------------*/
  28.  
  29. //globale Variablen und Konstanten
  30. int lightTeach; // Bestimmung des Sollwert (Teach In)
  31. int valueLightBlack; // aktueller Sensorwert (Lichtsensor Rechts)
  32. int valueLightWhite; // aktueller Sensorwert (Lichtsensor Lichts)
  33. int targetSpeed = 5; // Zielgeschwindigkeit Fahrzeug (%)
  34. bool flag_initBlackColorLeft;
  35. bool flag_BlackSide = false;
  36. int invert_Stellgroesse;
  37.  
  38. //Regler
  39. int fuehrungsgroesse_w = 0;
  40. float regelgroesse_x; // Istwert auf den ein allfaelliger Regler reagiert
  41. float regelverstaerkung_Kp = 0.5;
  42. float regelabweichung_e;
  43. int stellgroesse_y;
  44.  
  45. task main()
  46. {
  47. wait1Msec(2000); // warte 2000 Millisekunden zum initialisieren der Lichtsensoren
  48. // Sensoren einlesen
  49. valueLightBlack = SensorValue(lightRight);
  50. valueLightWhite = SensorValue(lightLeft);
  51.  
  52. if (valueLightBlack > valueLightWhite) {
  53. flag_initBlackColorLeft = true;
  54. invert_Stellgroesse = 1;
  55. } else {
  56. flag_initBlackColorLeft = false;
  57. invert_Stellgroesse = -1;
  58. }
  59.  
  60. // TeachValue fuer Kante schwarz/weiss bestimmen
  61. lightTeach = valueLightBlack + valueLightWhite;
  62.  
  63. while(true) // Endlosschleife
  64. {
  65. // Sesoren einlesen
  66. if (flag_initBlackColorLeft) {
  67. valueLightBlack = SensorValue(lightLeft);
  68. valueLightWhite = SensorValue(lightRight);
  69. } else {
  70. valueLightBlack = SensorValue(lightLeft);
  71. valueLightWhite = SensorValue(lightRight);
  72. }
  73.  
  74. // Position berechnen
  75. // mit Hilfe dieser berechnung ergibt sich der Wert null, wenn Fahrzeug direkt
  76. // auf Kante schwarz / weiss steht. Somit kann die Führungsgrösse mit null de-
  77. // finiert werden
  78. regelgroesse_x = lightTeach - (valueLightBlack + valueLightWhite);
  79.  
  80. // P Regler
  81. regelabweichung_e = fuehrungsgroesse_w - regelgroesse_x;
  82.  
  83. if (regelabweichung_e < 0 && flag_BlackSide == false) {
  84. flag_BlackSide = true;
  85. } else if (regelabweichung_e > 0 && flag_BlackSide == true && valueLightBlack < valueLightWhite) {
  86. flag_BlackSide = false;
  87. }
  88.  
  89. stellgroesse_y = regelverstaerkung_Kp * regelabweichung_e;
  90.  
  91. // Stellglied ansteuern
  92. motor[motorLeft] = targetSpeed - (invert_Stellgroesse * stellgroesse_y);
  93. motor[motorRight] = targetSpeed + (invert_Stellgroesse * stellgroesse_y);
  94.  
  95. // Position ausgeben
  96. nxtDisplayTextLine(2, "akt. Position:");
  97. nxtDisplayTextLine(3, "%d", regelgroesse_x);
  98. }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement