Инструменты пользователя

Инструменты сайта


Электронное приложение к набору «IO.KIT Робот Ампи: Захват»

На этой странице ты найдёшь все нужные материалы для проектов набора Робот Ампи: Захват из серии IO.KIT:

  • Схему подключения модулей.
  • Исходный код программ (копируй его в редактор Arduino IDE).
  • Дополнительные материалы: программные библиотеки, даташиты и т. п.

Обрати внимание

Для сборки и функционирования руки робота Ампи тебе понадобится IO.KIT Базовый!

Схема

Проекты

Прежде чем приступать к экспериментам, нужно подготовить свой компьютер:

Драйвер чипа CH340

Установи драйвер CH340 для Windows или Linux, чтобы твой компьютер мог корректно распознать и прошить плату Iskra Nano.

№1. Инициализация захвата

GripperBegin.ino
  1. // Подключаем библиотеку для работы с сервоприводом
  2. #include <Servo.h>
  3.  
  4. // Создаём объект сервопривода с клешнёй захвата
  5. Servo servoGripper;
  6.  
  7. // Даём понятное имя светодиоду на пине 10
  8. constexpr uint8_t LED_PIN = 10;
  9.  
  10. // Даём понятное имя пину A1 с сервоприводом клешни
  11. constexpr uint8_t SERVO_GRIPPER_PIN = A1;
  12.  
  13. // Задаём максимально доступные углы поворота сервопривода клешни
  14. constexpr int ANGLE_GRIPPER_OPEN = 30;
  15. constexpr int ANGLE_GRIPPER_CLOSED = 90;
  16.  
  17. // Вычисляем средний угол поворота сервопривода клешни
  18. constexpr int ANGLE_GRIPPER_MID = (ANGLE_GRIPPER_OPEN + ANGLE_GRIPPER_CLOSED) / 2;
  19.  
  20. // Создаём константу для хранения паузы сервопривода при каждом градусе поворота
  21. constexpr int DELAY_SWEEP = 20;
  22. // Создаём константу для хранения паузы сервопривода между поворотами
  23. constexpr int DELAY_STOP = 1000;
  24.  
  25. // Прототип функции плавной установки угла сервопривода
  26. void servoWriteSmooth(int angleNew, int delaySweep = 20);
  27.  
  28. void setup() {
  29. // Настраиваем пин со светодиодом в режим выхода
  30. pinMode(LED_PIN, OUTPUT);
  31. // Включаем световую индикацию старта работы
  32. ledStart();
  33. // Подключаем сервопривод с клешнёй захвата
  34. servoGripper.attach(SERVO_GRIPPER_PIN);
  35. // Устанавливаем начальное состояние клешни в среднее положение
  36. servoGripper.write(ANGLE_GRIPPER_MID);
  37. // Выжидаем паузу после инициализации клешни
  38. delay(1000);
  39. // Устанавливаем плавно состояние клешни в закрытое положение
  40. servoWriteSmooth(ANGLE_GRIPPER_CLOSED);
  41. }
  42.  
  43. void loop() {
  44. }
  45.  
  46. // Функция светодиодной индикации старта работы
  47. void ledStart() {
  48. // Перебираем значения от 0 до 2
  49. for (int i = 0; i < 3; i++) {
  50. // Зажигаем светодиод
  51. digitalWrite(LED_PIN, HIGH);
  52. // Ждём 300 мс
  53. delay(300);
  54. // Гасим светодиод
  55. digitalWrite(LED_PIN, LOW);
  56. // Ждём 300 мс
  57. delay(300);
  58. }
  59. }
  60.  
  61. // Функция плавной установки угла сервопривода
  62. void servoWriteSmooth(int angleNew, int delaySweep) {
  63. // Считываем текущий угол сервопривода
  64. int angleNow = servoGripper.read();
  65. // Если текущий угол меньше нового
  66. if (angleNow < angleNew) {
  67. // Увеличиваем значения угла от текущего до нового
  68. for (int angle = angleNow; angle <= angleNew; angle++) {
  69. // Отправляем текущий угол на сервопривод
  70. servoGripper.write(angle);
  71. // Выжидаем паузу на каждом градусе поворота
  72. delay(delaySweep);
  73. }
  74. } else if (angleNow > angleNew) {
  75. // Если текущий угол меньше нового
  76. // Уменьшаем значения угла от текущего до нового
  77. for (int angle = angleNow; angle >= angleNew; angle--) {
  78. // Отправляем текущий угол на сервопривод
  79. servoGripper.write(angle);
  80. // Выжидаем паузу на каждом градусе поворота
  81. delay(delaySweep);
  82. }
  83. } else if (angleNow == angleNew) {
  84. // Если текущий угол совпадает с новым
  85. // Ничего не делаем и выходим из функции
  86. return true;
  87. }
  88. }

№2. Захват с размахом

GripperSweep.ino
  1. // Подключаем библиотеку для работы с сервоприводом
  2. #include <Servo.h>
  3.  
  4. // Создаём объект сервопривода с клешнёй захвата
  5. Servo servoGripper;
  6.  
  7. // Даём понятное имя светодиоду на пине 10
  8. constexpr uint8_t LED_PIN = 10;
  9.  
  10. // Даём понятное имя пину A1 с сервоприводом клешни
  11. constexpr uint8_t SERVO_GRIPPER_PIN = A1;
  12.  
  13. // Задаём максимально доступные углы поворота сервопривода клешни
  14. constexpr int ANGLE_GRIPPER_OPEN = 30;
  15. constexpr int ANGLE_GRIPPER_CLOSED = 90;
  16.  
  17. // Вычисляем средний угол поворота сервопривода клешни
  18. constexpr int ANGLE_GRIPPER_MID = (ANGLE_GRIPPER_OPEN + ANGLE_GRIPPER_CLOSED) / 2;
  19.  
  20. // Создаём константу для хранения паузы сервопривода при каждом градусе поворота
  21. constexpr int DELAY_SWEEP = 20;
  22. // Создаём константу для хранения паузы сервопривода между поворотами
  23. constexpr int DELAY_STOP = 1000;
  24.  
  25. // Прототип функции плавной установки угла сервопривода
  26. void servoWriteSmooth(int angleNew, int delaySweep = 20);
  27.  
  28. void setup() {
  29. // Настраиваем пин со светодиодом в режим выхода
  30. pinMode(LED_PIN, OUTPUT);
  31. // Включаем световую индикацию старта работы
  32. ledStart();
  33. // Подключаем сервопривод с клешнёй захвата
  34. servoGripper.attach(SERVO_GRIPPER_PIN);
  35. // Устанавливаем начальное состояние клешни в среднее положение
  36. servoGripper.write(ANGLE_GRIPPER_MID);
  37. // Выжидаем паузу после инициализации клешни
  38. delay(1000);
  39. }
  40.  
  41. void loop() {
  42. // Устанавливаем плавно состояние клешни в открытое положение
  43. servoWriteSmooth(ANGLE_GRIPPER_OPEN, DELAY_SWEEP);
  44. // Выжидаем паузу
  45. delay(DELAY_STOP);
  46. // Устанавливаем плавно состояние клешни в закрытое положение
  47. servoWriteSmooth(ANGLE_GRIPPER_CLOSED, DELAY_SWEEP);
  48. // Выжидаем паузу
  49. delay(DELAY_STOP);
  50. }
  51.  
  52. // Функция светодиодной индикации старта работы
  53. void ledStart() {
  54. // Перебираем значения от 0 до 2
  55. for (int i = 0; i < 3; i++) {
  56. // Зажигаем светодиод
  57. digitalWrite(LED_PIN, HIGH);
  58. // Ждём 300 мс
  59. delay(300);
  60. // Гасим светодиод
  61. digitalWrite(LED_PIN, LOW);
  62. // Ждём 300 мс
  63. delay(300);
  64. }
  65. }
  66.  
  67. // Функция плавной установки угла сервопривода
  68. void servoWriteSmooth(int angleNew, int delaySweep) {
  69. // Считываем текущий угол сервопривода
  70. int angleNow = servoGripper.read();
  71. // Если текущий угол меньше нового
  72. if (angleNow < angleNew) {
  73. // Увеличиваем значения угла от текущего до нового
  74. for (int angle = angleNow; angle <= angleNew; angle++) {
  75. // Отправляем текущий угол на сервопривод
  76. servoGripper.write(angle);
  77. // Выжидаем паузу на каждом градусе поворота
  78. delay(delaySweep);
  79. }
  80. } else if (angleNow > angleNew) {
  81. // Если текущий угол меньше нового
  82. // Уменьшаем значения угла от текущего до нового
  83. for (int angle = angleNow; angle >= angleNew; angle--) {
  84. // Отправляем текущий угол на сервопривод
  85. servoGripper.write(angle);
  86. // Выжидаем паузу на каждом градусе поворота
  87. delay(delaySweep);
  88. }
  89. } else if (angleNow == angleNew) {
  90. // Если текущий угол совпадает с новым
  91. // Ничего не делаем и выходим из функции
  92. return true;
  93. }
  94. }

№3. Захват с кнопкой

ControlButton.ino
  1. // Подключаем библиотеку для работы с сервоприводом
  2. #include <Servo.h>
  3. // Подключаем библиотеку для работы с кнопкой
  4. #include <TroykaButton.h>
  5.  
  6. // Создаём объект сервопривода с клешнёй захвата
  7. Servo servoGripper;
  8.  
  9. // Создаём объект кнопки на пине 2
  10. TroykaButton button(2);
  11.  
  12. // Даём понятное имя светодиоду на пине 10
  13. constexpr uint8_t LED_PIN = 10;
  14.  
  15. // Даём понятное имя пину A1 с сервоприводом клешни
  16. constexpr uint8_t SERVO_GRIPPER_PIN = A1;
  17.  
  18. // Задаём максимально доступные углы поворота сервопривода клешни
  19. constexpr int ANGLE_GRIPPER_OPEN = 30;
  20. constexpr int ANGLE_GRIPPER_CLOSED = 90;
  21.  
  22. // Вычисляем средний угол поворота сервопривода клешни
  23. constexpr int ANGLE_GRIPPER_MID = (ANGLE_GRIPPER_OPEN + ANGLE_GRIPPER_CLOSED) / 2;
  24.  
  25. // Создаём константу для хранения паузы сервопривода при каждом градусе поворота
  26. constexpr int DELAY_SWEEP = 20;
  27. // Создаём константу для хранения паузы сервопривода между поворотами
  28. constexpr int DELAY_STOP = 1000;
  29.  
  30. // Создаём перечисление состояний захвата с соответствующей переменной
  31. enum {
  32. GRIPPER_OPEN, // Захват открыт
  33. GRIPPER_CLOSED, // Захват закрыт
  34. } gripperState;
  35.  
  36. // Прототип функции плавной установки угла сервопривода
  37. void servoWriteSmooth(int angleNew, int delaySweep = 20);
  38.  
  39. void setup() {
  40. // Инициализируем кнопку
  41. button.begin();
  42. // Настраиваем пин со светодиодом в режим выхода
  43. pinMode(LED_PIN, OUTPUT);
  44. // Включаем световую индикацию старта работы
  45. ledStart();
  46. // Подключаем сервопривод с клешнёй захвата
  47. servoGripper.attach(SERVO_GRIPPER_PIN);
  48. // Устанавливаем начальное состояние клешни в среднее положение
  49. servoGripper.write(ANGLE_GRIPPER_MID);
  50. // Выжидаем паузу после инициализации клешни
  51. delay(1000);
  52. // Устанавливаем режим «Захват открыт»
  53. gripperState = GRIPPER_OPEN;
  54. }
  55.  
  56. void loop() {
  57. // Считываем данные с кнопки
  58. button.read();
  59. // Определяем нажатие кнопки
  60. if (button.justPressed()) {
  61. // Если установлен режим «Захват открыт»
  62. if (gripperState == GRIPPER_OPEN) {
  63. // Зажигаем светодиод
  64. digitalWrite(LED_PIN, HIGH);
  65. // Устанавливаем плавно состояние клешни в закрытое положение
  66. servoWriteSmooth(ANGLE_GRIPPER_CLOSED, DELAY_SWEEP);
  67. // Гасим светодиод
  68. digitalWrite(LED_PIN, LOW);
  69. // Устанавливаем режим «Захват закрыт»
  70. gripperState = GRIPPER_CLOSED;
  71. } else if (gripperState == GRIPPER_CLOSED) {
  72. // Если установлен режим «Захват закрыт»
  73. // Зажигаем светодиод
  74. digitalWrite(LED_PIN, HIGH);
  75. // Устанавливаем плавно состояние клешни в открытое положение
  76. servoWriteSmooth(ANGLE_GRIPPER_OPEN, DELAY_SWEEP);
  77. // Гасим светодиод
  78. digitalWrite(LED_PIN, LOW);
  79. // Устанавливаем режим «Захват открыт»
  80. gripperState = GRIPPER_OPEN;
  81. }
  82. }
  83. }
  84.  
  85. // Функция светодиодной индикации старта работы
  86. void ledStart() {
  87. // Перебираем значения от 0 до 2
  88. for (int i = 0; i < 3; i++) {
  89. // Зажигаем светодиод
  90. digitalWrite(LED_PIN, HIGH);
  91. // Ждём 300 мс
  92. delay(300);
  93. // Гасим светодиод
  94. digitalWrite(LED_PIN, LOW);
  95. // Ждём 300 мс
  96. delay(300);
  97. }
  98. }
  99.  
  100. // Функция плавной установки угла сервопривода
  101. void servoWriteSmooth(int angleNew, int delaySweep) {
  102. // Считываем текущий угол сервопривода
  103. int angleNow = servoGripper.read();
  104. // Если текущий угол меньше нового
  105. if (angleNow < angleNew) {
  106. // Увеличиваем значения угла от текущего до нового
  107. for (int angle = angleNow; angle <= angleNew; angle++) {
  108. // Отправляем текущий угол на сервопривод
  109. servoGripper.write(angle);
  110. // Выжидаем паузу на каждом градусе поворота
  111. delay(delaySweep);
  112. }
  113. } else if (angleNow > angleNew) {
  114. // Если текущий угол меньше нового
  115. // Уменьшаем значения угла от текущего до нового
  116. for (int angle = angleNow; angle >= angleNew; angle--) {
  117. // Отправляем текущий угол на сервопривод
  118. servoGripper.write(angle);
  119. // Выжидаем паузу на каждом градусе поворота
  120. delay(delaySweep);
  121. }
  122. } else if (angleNow == angleNew) {
  123. // Если текущий угол совпадает с новым
  124. // Ничего не делаем и выходим из функции
  125. return true;
  126. }
  127. }

№4. Ловкий захват

ControlPot.ino
  1. // Подключаем библиотеку для работы с сервоприводом
  2. #include <Servo.h>
  3.  
  4. // Создаём объект сервопривода с клешнёй захвата
  5. Servo servoGripper;
  6.  
  7. // Даём понятное имя светодиоду на пине 10
  8. constexpr uint8_t LED_PIN = 10;
  9.  
  10. // Даём понятное имя потенциометру на пине A0
  11. constexpr uint8_t POT_PIN = A0;
  12.  
  13. // Даём понятное имя пину A1 с сервоприводом клешни
  14. constexpr uint8_t SERVO_GRIPPER_PIN = A1;
  15.  
  16. // Задаём максимально доступные углы поворота сервопривода клешни
  17. constexpr int ANGLE_GRIPPER_OPEN = 30;
  18. constexpr int ANGLE_GRIPPER_CLOSED = 90;
  19.  
  20. // Вычисляем средний угол поворота сервопривода клешни
  21. constexpr int ANGLE_GRIPPER_MID = (ANGLE_GRIPPER_OPEN + ANGLE_GRIPPER_CLOSED) / 2;
  22.  
  23. // Создаём константу для хранения паузы сервопривода при каждом градусе поворота
  24. constexpr int DELAY_SWEEP = 20;
  25. // Создаём константу для хранения паузы сервопривода между поворотами
  26. constexpr int DELAY_STOP = 1000;
  27.  
  28. // Прототип функции плавной установки угла сервопривода
  29. void servoWriteSmooth(int angleNew, int delaySweep = 20);
  30.  
  31. void setup() {
  32. // Настраиваем пин со светодиодом в режим выхода
  33. pinMode(LED_PIN, OUTPUT);
  34. // Настраиваем пин с потенциометром в режим входа
  35. pinMode(POT_PIN, INPUT);
  36. // Включаем световую индикацию старта работы
  37. ledStart();
  38. // Подключаем сервопривод с клешнёй захвата
  39. servoGripper.attach(SERVO_GRIPPER_PIN);
  40. // Устанавливаем начальное состояние клешни в среднее положение
  41. servoGripper.write(ANGLE_GRIPPER_MID);
  42. // Выжидаем паузу после инициализации клешни
  43. delay(1000);
  44. }
  45.  
  46. void loop() {
  47. // Контролируем клешню с помощью потенциометра
  48. remoteHandlerGripperPot();
  49. }
  50.  
  51. // Функция контроля клешнёй с помощью потенциометра
  52. void remoteHandlerGripperPot() {
  53. // Считываем аналоговый сигнал с потенциометра
  54. int rotation = analogRead(POT_PIN);
  55. // Преобразуем диапазон значений с потенциометра [0; 1023]
  56. // в диапазон значений угла сервопривода клешни [ANGLE_GRIPPER_OPEN; ANGLE_GRIPPER_CLOSED]
  57. int angle = map(rotation, 0, 1023, ANGLE_GRIPPER_OPEN, ANGLE_GRIPPER_CLOSED);
  58. // Выдаём результат на клешню
  59. servoGripper.write(angle);
  60. }
  61.  
  62. // Функция светодиодной индикации старта работы
  63. void ledStart() {
  64. // Перебираем значения от 0 до 2
  65. for (int i = 0; i < 3; i++) {
  66. // Зажигаем светодиод
  67. digitalWrite(LED_PIN, HIGH);
  68. // Ждём 300 мс
  69. delay(300);
  70. // Гасим светодиод
  71. digitalWrite(LED_PIN, LOW);
  72. // Ждём 300 мс
  73. delay(300);
  74. }
  75. }
  76.  
  77. // Функция плавной установки угла сервопривода
  78. void servoWriteSmooth(int angleNew, int delaySweep) {
  79. // Считываем текущий угол сервопривода
  80. int angleNow = servoGripper.read();
  81. // Если текущий угол меньше нового
  82. if (angleNow < angleNew) {
  83. // Увеличиваем значения угла от текущего до нового
  84. for (int angle = angleNow; angle <= angleNew; angle++) {
  85. // Отправляем текущий угол на сервопривод
  86. servoGripper.write(angle);
  87. // Выжидаем паузу на каждом градусе поворота
  88. delay(delaySweep);
  89. }
  90. } else if (angleNow > angleNew) {
  91. // Если текущий угол меньше нового
  92. // Уменьшаем значения угла от текущего до нового
  93. for (int angle = angleNow; angle >= angleNew; angle--) {
  94. // Отправляем текущий угол на сервопривод
  95. servoGripper.write(angle);
  96. // Выжидаем паузу на каждом градусе поворота
  97. delay(delaySweep);
  98. }
  99. } else if (angleNow == angleNew) {
  100. // Если текущий угол совпадает с новым
  101. // Ничего не делаем и выходим из функции
  102. return true;
  103. }
  104. }

№5. Захват с пультом

ControlPanel.ino
  1. // Подключаем библиотеку для работы с сервоприводом
  2. #include <Servo.h>
  3. // Подключаем библиотеку для работы с кнопкой
  4. #include <TroykaButton.h>
  5.  
  6. // Создаём объект сервопривода с клешнёй захвата
  7. Servo servoGripper;
  8.  
  9. // Создаём объект кнопки на пине 2
  10. TroykaButton button(2);
  11.  
  12. // Даём понятное имя светодиоду на пине 10
  13. constexpr uint8_t LED_PIN = 10;
  14.  
  15. // Даём понятное имя потенциометру на пине A0
  16. constexpr uint8_t POT_PIN = A0;
  17.  
  18. // Даём понятное имя пину A1 с сервоприводом клешни
  19. constexpr uint8_t SERVO_GRIPPER_PIN = A1;
  20.  
  21. // Задаём максимально доступные углы поворота сервопривода клешни
  22. constexpr int ANGLE_GRIPPER_OPEN = 30;
  23. constexpr int ANGLE_GRIPPER_CLOSED = 90;
  24.  
  25. // Вычисляем средний угол поворота сервопривода клешни
  26. constexpr int ANGLE_GRIPPER_MID = (ANGLE_GRIPPER_OPEN + ANGLE_GRIPPER_CLOSED) / 2;
  27.  
  28. // Создаём константу для хранения паузы сервопривода при каждом градусе поворота
  29. constexpr int DELAY_SWEEP = 20;
  30. // Создаём константу для хранения паузы сервопривода между поворотами
  31. constexpr int DELAY_STOP = 1000;
  32.  
  33. // Создаём перечисление состояний захвата с соответствующей переменной
  34. enum {
  35. GRIPPER_ON, // Захват включен
  36. GRIPPER_OFF, // Захват выключен
  37. } gripperState;
  38.  
  39. // Прототип функции плавной установки угла сервопривода
  40. void servoWriteSmooth(int angleNew, int delaySweep = 20);
  41.  
  42. void setup() {
  43. // Инициализируем кнопку
  44. button.begin();
  45. // Настраиваем пин со светодиодом в режим выхода
  46. pinMode(LED_PIN, OUTPUT);
  47. // Настраиваем пин с потенциометром в режим входа
  48. pinMode(POT_PIN, INPUT);
  49. // Включаем световую индикацию старта работы
  50. ledStart();
  51. // Подключаем сервопривод с клешнёй захвата
  52. servoGripper.attach(SERVO_GRIPPER_PIN);
  53. // Устанавливаем начальное состояние клешни в среднее положение
  54. servoGripper.write(ANGLE_GRIPPER_MID);
  55. // Выжидаем паузу после инициализации клешни
  56. delay(1000);
  57. // Устанавливаем режим «Захват выключен»
  58. gripperState = GRIPPER_OFF;
  59. }
  60.  
  61. void loop() {
  62. // Если захват включен
  63. if (gripperState == GRIPPER_ON) {
  64. // Переходим в функцию обработки режима «Захват включен»
  65. handleGripperOn();
  66. }
  67. // Если захват выключен
  68. if (gripperState == GRIPPER_OFF) {
  69. // Переходим в функцию обработки режима «Захват выключен»
  70. handleGripperOff();
  71. }
  72. }
  73.  
  74. // Функция обработки режима «Захват выключен»
  75. void handleGripperOff() {
  76. // Гасим светодиод
  77. digitalWrite(LED_PIN, LOW);
  78. // Ожидаем нажатие на кнопку
  79. do {
  80. // Считываем состояние с кнопки
  81. button.read();
  82. } while (!button.isClick());
  83. // Устанавливаем режим «Захват включен»
  84. gripperState = GRIPPER_ON;
  85. }
  86.  
  87. // Функция обработки режима «Захват включен»
  88. void handleGripperOn() {
  89. // Зажигаем светодиод
  90. digitalWrite(LED_PIN, HIGH);
  91. // Плавно устанавливаем состояние клешни из положения потенциометра
  92. remoteHandlerGripperPotSmooth();
  93. // Ожидаем нажатие на кнопку
  94. do {
  95. // Устанавливаем состояние клешни из положения потенциометра
  96. remoteHandlerGripperPot();
  97. // Считываем состояние с кнопки
  98. button.read();
  99. } while (!button.isClick());
  100. // Устанавливаем плавно состояние клешни в закрытое положение
  101. servoWriteSmooth(ANGLE_GRIPPER_CLOSED);
  102. // Устанавливаем режим «Захват выключен»
  103. gripperState = GRIPPER_OFF;
  104. }
  105.  
  106. // Функция установки состояние клешни из положения потенциометра
  107. void remoteHandlerGripperPot() {
  108. // Считываем аналоговый сигнал с потенциометра
  109. int rotation = analogRead(POT_PIN);
  110. // Преобразуем диапазон значений с потенциометра [0; 1023]
  111. // в диапазон значений угла сервопривода клешни [ANGLE_GRIPPER_OPEN; ANGLE_GRIPPER_CLOSED]
  112. int angle = map(rotation, 0, 1023, ANGLE_GRIPPER_OPEN, ANGLE_GRIPPER_CLOSED);
  113. // Выдаём результат на клешню
  114. servoGripper.write(angle);
  115. }
  116.  
  117. // Функция плавной установки состояние клешни из положения потенциометра
  118. void remoteHandlerGripperPotSmooth() {
  119. // Считываем аналоговый сигнал с потенциометра
  120. int rotation = analogRead(POT_PIN);
  121. // Преобразуем диапазон значений с потенциометра [0; 1023]
  122. // в диапазон значений угла сервопривода клешни [ANGLE_GRIPPER_OPEN; ANGLE_GRIPPER_CLOSED]
  123. int angle = map(rotation, 0, 1023, ANGLE_GRIPPER_OPEN, ANGLE_GRIPPER_CLOSED);
  124. // Выдаём результат на клешню
  125. servoWriteSmooth(angle);
  126. }
  127.  
  128. // Функция светодиодной индикации старта работы
  129. void ledStart() {
  130. // Перебираем значения от 0 до 2
  131. for (int i = 0; i < 3; i++) {
  132. // Зажигаем светодиод
  133. digitalWrite(LED_PIN, HIGH);
  134. // Ждём 300 мс
  135. delay(300);
  136. // Гасим светодиод
  137. digitalWrite(LED_PIN, LOW);
  138. // Ждём 300 мс
  139. delay(300);
  140. }
  141. }
  142.  
  143. // Функция плавной установки угла сервопривода
  144. void servoWriteSmooth(int angleNew, int delaySweep) {
  145. // Считываем текущий угол сервопривода
  146. int angleNow = servoGripper.read();
  147. // Если текущий угол меньше нового
  148. if (angleNow < angleNew) {
  149. // Увеличиваем значения угла от текущего до нового
  150. for (int angle = angleNow; angle <= angleNew; angle++) {
  151. // Отправляем текущий угол на сервопривод
  152. servoGripper.write(angle);
  153. // Выжидаем паузу на каждом градусе поворота
  154. delay(delaySweep);
  155. }
  156. } else if (angleNow > angleNew) {
  157. // Если текущий угол меньше нового
  158. // Уменьшаем значения угла от текущего до нового
  159. for (int angle = angleNow; angle >= angleNew; angle--) {
  160. // Отправляем текущий угол на сервопривод
  161. servoGripper.write(angle);
  162. // Выжидаем паузу на каждом градусе поворота
  163. delay(delaySweep);
  164. }
  165. } else if (angleNow == angleNew) {
  166. // Если текущий угол совпадает с новым
  167. // Ничего не делаем и выходим из функции
  168. return true;
  169. }
  170. }

Оглавление

Ресурсы

Софт

Библиотеки