Помогите с кодом для робота.

chelovek

✩✩✩✩✩✩✩
12 Авг 2020
13
3
17
Помогите скодом для робота! Хотел сделать ему клещню из серво, но работает либо одно или другое
C++:
#include <Servo.h>

Servo servo1;
byte Blu;        
byte GAZ = 127;//при включении газ на 127
void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);  // Левые моторы
  pinMode(3, OUTPUT);  // Левые моторы
  pinMode(4, OUTPUT);  // Правые моторы
  pinMode(5, OUTPUT);  // Правые моторы
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  servo1.attach(13); // привязываем сервопривод к аналоговому выходу 13
}
void loop() {
  if (Serial.available() > 0) {
    Blu = Serial.read();


    if (Blu >= 0 && Blu <= 100) {
      GAZ = map(Blu, 0, 100, 0, 255); // Указываем значение газа
    }


    if (Blu == 106) { // тормозим
      analogWrite(9, GAZ);
      analogWrite(10, GAZ);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
    }

    if (Blu == 102) { // вперёд
      analogWrite(9, GAZ);
      analogWrite(10, GAZ);
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
    }
    if (Blu == 103) { // назад
      analogWrite(9, GAZ);
      analogWrite(10, GAZ);
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(4, LOW);
    }
    if (Blu == 104) { // влево
      analogWrite(9, GAZ);
      analogWrite(10, GAZ);
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(4, LOW);
    }
    if (Blu == 105) { // вправо
      analogWrite(9, GAZ);
      analogWrite(10, GAZ);
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
    }
    if (Blu == 101) {
      servo1.write(36);
    }
    if (Blu == 107) {
      servo1.write(72);
    }
    if (Blu == 108) {
      servo1.write(108);
    }
    if (Blu == 109) {
      servo1.write(144);
    }
    if (Blu == 110) {
      servo1.write(180);
    }


  }
}
Либо робот едет, но клешня не шевелится. Либо клешня шевелится, а робот стоит. Я уже совсем отчаялся перепробовав почти всё.
 
Изменено:

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Тебе нужна библиотека для асинхронной работы с сервами. Иначе у тебя программа будет останавливаться на строчках servo1.write(xxx) пока серва не закончит движение
 
  • Лойс +1
Реакции: chelovek и PiratFox

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
На 16-и разрядных таймерах вполне можно работать функцией analogWrite(), если таймер ставить на 50-60гц.

C++:
// from arhat.h: установка 16-битного таймера в режим Servo
// type - какие выходы таймера включить в работу и как: прямо или инверсно.
// @see datasheet
#define timer2servo(num, type) \
{ \
  TCCR##num##A = (1<<WGM11)|(type); \
  TCCR##num##B = (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); \
  ICR##num = 4999; \
}
Этот код ставит таймер на 50гц, через регистр захвата таймера. То есть, на нем отключается аппаратная реализация функции pulseIn().

Только диапазон значений ШИМ подобрать вручную для крайних положений вашей сервы.
 
Изменено:

Boroda

✩✩✩✩✩✩✩
20 Янв 2020
17
2
" На контроллерах отличных от Mega использование библиотеки <Servo.h> отключает возможность использовать выходы 9 и 10 в режиме ШИМ. "
Попробуйте переназначить и переподключить на другие пины.
 

chelovek

✩✩✩✩✩✩✩
12 Авг 2020
13
3
17
" На контроллерах отличных от Mega использование библиотеки <Servo.h> отключает возможность использовать выходы 9 и 10 в режиме ШИМ. "
Попробуйте переназначить и переподключить на другие пины.
спасибо огромное

На 16-и разрядных таймерах вполне можно работать функцией analogWrite(), если таймер ставить на 50-60гц.

C++:
// from arhat.h: установка 16-битного таймера в режим Servo
// type - какие выходы таймера включить в работу и как: прямо или инверсно.
// @see datasheet
#define timer2servo(num, type) \
{ \
  TCCR##num##A = (1<<WGM11)|(type); \
  TCCR##num##B = (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); \
  ICR##num = 4999; \
}
Этот код ставит таймер на 50гц, через регистр захвата таймера. То есть, на нем отключается аппаратная реализация функции pulseIn().

Только диапазон значений ШИМ подобрать вручную для крайних положений вашей сервы.
спасибо