Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. #include <Servo.h>
  2.  
  3. Servo servoLeft;
  4. Servo servoRight;
  5.  
  6.  
  7. int globalSpeed = 5000;
  8. int minSpeed = 500;
  9. int maxSpeed = 5000;
  10. int minAngle = 10; // минимальный угол для серв
  11. int maxAngle = 170; // максимальный угол для серв
  12. int startLeftPos = 10; // стартовая позиция в градусах для левой сервы (должна быть в интервале (minAngle, maxAngle))
  13. int startRightPos = 10; // стартовая позиция в градусах для правой сервы (должна быть в интервале (minAngle, maxAngle))
  14. int currentLeftPos;
  15. int currentRightPos;
  16. int nextLeftPos;
  17. int nextRightPos;
  18. int leftDelay;
  19. int rightDelay;
  20. int signLeftPosDelta;
  21. int signRightPosDelta;
  22. unsigned long currentLeftTime;
  23. unsigned long currentRightTime;
  24.  
  25. void setup() {
  26. servoLeft.attach(10); // левая рука на 10 пине
  27. servoRight.attach(11); // правая рука на 11 пине
  28. randomSeed(analogRead(0)); // активируем генератор рандомных значений
  29. servoLeft.write(startLeftPos); // ставим левый серв в стартовую позицию
  30. servoRight.write(startRightPos); // ставим правый серв в стартовую позицию
  31. currentLeftPos = startLeftPos;
  32. currentRightPos = startRightPos;
  33. initLeft();
  34. initRight();
  35. }
  36.  
  37. void loop() {
  38. unsigned long time = millis();
  39. if (time - currentLeftTime > leftDelay) {
  40. currentLeftPos = max(minAngle, min(maxAngle, currentLeftPos + signLeftPosDelta));
  41. servoLeft.write(currentLeftPos);
  42. currentLeftTime = time;
  43. if (currentLeftPos == nextLeftPos) initLeft();
  44. }
  45. if (time - currentRightTime > rightDelay) {
  46. currentRightPos = max(minAngle, min(maxAngle, currentRightPos + signRightPosDelta));
  47. servoRight.write(currentRightPos);
  48. currentRightTime = time;
  49. if (currentRightPos == nextRightPos) initRight();
  50. }
  51. }
  52.  
  53. int generateNextPos(int currentPos) {
  54. int newPos = random(minAngle, maxAngle + 1);
  55. while (newPos == currentPos) newPos = random(minAngle, maxAngle + 1);
  56. return newPos;
  57. }
  58.  
  59. void initLeft() {
  60. nextLeftPos = generateNextPos(currentLeftPos);
  61. int nextLeftSpeed = random(minSpeed, maxSpeed + 1);
  62. int leftPosDelta = currentLeftPos - nextLeftPos;
  63. leftDelay = nextLeftSpeed / abs(leftPosDelta);
  64. signLeftPosDelta = sign(leftPosDelta);
  65. currentLeftTime = millis();
  66. }
  67.  
  68. void initRight() {
  69. nextRightPos = generateNextPos(currentRightPos);
  70. int nextRightSpeed = random(minSpeed, maxSpeed + 1);
  71. int rightPosDelta = currentRightPos - nextRightPos;
  72. rightDelay = nextRightSpeed / abs(rightPosDelta);
  73. signRightPosDelta = sign(rightPosDelta);
  74. currentRightTime = millis();
  75. }
  76.  
  77. int sign(int x) {
  78. return x < 0 ? -1 : (x > 0 ? 1 : 0);
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement