Написать код управления сервоприводом на Nano

Ufamak
Offline
Зарегистрирован: 03.12.2017

Здравствуйте. Нет времени вникать, за сим готов оплатить услугу. Нужен механизм на основе мощного сервопривода, угол работы 170. Нужно чтобы он крутился туда сюда непрерывно, скорость от 0 до максимальной регулируется крутилкой. Давно валяется плата андурында нано. Предложения?

Сергей Звягинцев
Offline
Зарегистрирован: 02.03.2017

Всегда всё есть, arduino.maingroup@mail.ru ждём.

Green
Offline
Зарегистрирован: 01.10.2015

- ваше жизненное кредо?
- всегда!
 

Сергей Звягинцев
Offline
Зарегистрирован: 02.03.2017

Ufamak пишет:
Здравствуйте. Нет времени вникать, за сим готов оплатить услугу. Нужен механизм на основе мощного сервопривода, угол работы 170. Нужно чтобы он крутился туда сюда непрерывно, скорость от 0 до максимальной регулируется крутилкой. Давно валяется плата андурында нано. Предложения?

Иди в кружок, любитель детей

Ufamak
Offline
Зарегистрирован: 03.12.2017

я бы тебе сказал куда идти, да воспитание не позволяет.

 

поясню что мне нужно: кусок кода описывающий зависимость скорости вращения сервопривода (по циклу от крайней до крайней точки) от положения ручного потенциометра

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Я так понял нужно бесплатно ?

Ufamak
Offline
Зарегистрирован: 03.12.2017

нет конечно)) готов заплатить. в разумных пределах (мне тут один выставил ценег в 3т.р. - я долго смеялся). мне нужно буквально несколько строк вписать сюда - чтобы скорость вращения зависила от внешней крутилки (переменного резистора). сейчас уже не поленился сам залезть и почитать, благо из за 3D принтеров есть опыт работы с мегой, так что помошь нужна даже больше консультативного характера

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Да пожалуйста - разбирайтесь.

#include <Servo.h> 

Servo myservo;

void setup() { 
  myservo.attach(5);
  myservo.write(0);
} 

void loop() {
   for(uint8_t i=0; i<180; i++){
      delayMicroseconds(analogRead(A0));
      myservo.write(i); 
   }
   for(uint8_t i=180; i<180; i--){
      delayMicroseconds(analogRead(A0));
      myservo.write(i); 
   }
} 

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

brokly пишет:

Да пожалуйста - разбирайтесь.

#include <Servo.h> 

Servo myservo;

void setup() { 
  myservo.attach(5);
  myservo.write(0);
} 

void loop() {
   for(uint8_t i=0; i<180; i++){
      delayMicroseconds(analogRead(A0));
      myservo.write(i); 
   }
   for(uint8_t i=180; i<180; i--){
      delayMicroseconds(analogRead(A0));
      myservo.write(i); 
   }
} 

 

Ошибка в коде, не случайно ? :)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Случайно :) , в строке 15 нужно так

for(uint8_t i=180; i<181; i--){

Попросил сына проверить, а исправить не успел :)

Да и 10 , нужно так :)

for(uint8_t i=0; i<181; i++)

 

man9913
Offline
Зарегистрирован: 19.03.2016

Ошибка спецом чтобы потом развести. Хитро. Или пока брокля тут месяцами цены заламывал прогать соусем разучился?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Че я не все исправил ? :( 

Что бы разучиться нужно уметь !  Я умею, а значит могу разучиться ! Да и заламывай тут или не заламывай все пустое.

man9913
Offline
Зарегистрирован: 19.03.2016

может я что-то не понимаю, но во втором цикле я написал бы условие i > 0 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Тогда при 0 не выполнится. Нужно бyдет писать >=, а это на одну проверку больше.... Да и не остановится оно на нуле...

Диапазон сервы от 0 до 180, включая 0 и 180.

Ufamak
Offline
Зарегистрирован: 03.12.2017

ммм... сервопривод аналоговый или цифровой - принципиально? у меня цифровой

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Наверное можно и так

#include <Servo.h> 

Servo myservo;

int8_t k=1;
uint8_t i=0;

void setup() 
{ 
  myservo.attach(5);
  myservo.write(0);
} 

void loop() {
   while (i<171) {
      delayMicroseconds(analogRead(A0));
      myservo.write(i); 
      i+=k;
   }
   k *= -1;
   i += k;
} 

Вдруг заработает....

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ufamak пишет:

ммм... сервопривод аналоговый или цифровой - принципиально? у меня цифровой

Эта такая спасиба ?

inspiritus
Offline
Зарегистрирован: 17.12.2012

Как то незамеченным проскочило радушное приглашение известного персонажа и , через один пост, грубое оскорбление от него же по отношению к заказчику.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Видимо, сумма, предложенная известному персонажу, вызвала у него нешуточную попаболь. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ага, и похоже это Три рубля :) 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Мдяяя...

Ufamak
Offline
Зарегистрирован: 03.12.2017

brokly как с вами связаться?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Если хотите что то заплатить, за то что опубликовано тут, то не стоит:) Не было никаких затрат времени.

В другом случае brokly(собака)mail.ru

Ufamak
Offline
Зарегистрирован: 03.12.2017

пока brokly молчит, спрошу сообщество:

можно ли потенциометром (переменным резистором) менять значение delay , например от 500 до 2500

во время выполнения вот этого элементарного кода?

#include <Servo.h>
 
Servo myservo;
 
void setup()
{
  myservo.attach(9);
  myservo.write(90);  // устанавливает сервопривод в среднее положение
}
 
void loop() {
 
  myservo.write(0);
  delay(1000);
  myservo.write(180);
  delay(1000);
  }
 
а то код, который мне написали выше работает не корректно - серва то дергается, то очень медленно движется, вообще не по линейной какой то зависимости
p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Ufamak пишет:

пока brokly молчит, спрошу сообщество:

можно ли потенциометром (переменным резистором) менять значение delay , например от 500 до 2500

во время выполнения вот этого элементарного кода?

#include <Servo.h>
 
Servo myservo;
 
void setup()
{
  myservo.attach(9);
  myservo.write(90);  // устанавливает сервопривод в среднее положение
}
 
void loop() {
 
  myservo.write(0);
  delay(1000);
  myservo.write(180);
  delay(1000);
  }
 
а то код, который мне написали выше работает не корректно - серва то дергается, то очень медленно движется, вообще не по линейной какой то зависимости

 

https://www.arduino.cc/reference/en/language/functions/math/map/

 

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ufamak пишет:

а то код, который мне написали выше работает не корректно - серва то дергается, то очень медленно движется, вообще не по линейной какой то зависимости

Да не код это. Код как раз работает отлично. А вот характеристику резистора вы наверняка не знаете. Ток потребления сервы, опять же, может у вас серва мощная и просаживает питание ардуино. Вы же, уверен, пытаетесь от USB ее запитать. Давате сюда фото сервы , потенциометра и всего этого дела, как оно у вас на столе соеденено.

Кстати, на глазах общественности разворачивается типичный случай работы без ТЗ, в котором заказчик обвиняет исполнителя:) Очень хорошо, что я никаких денег не брал :) Просто волшебно !

Что то ТС молчит, будем подождать фоток.

Ufamak
Offline
Зарегистрирован: 03.12.2017

респект пользователю brokly ! с его коректировкой код заработал как надо. скорость мин/макс теперь можно регулировать переменным резистором, серва поворачивается на свой полный оборот (170гр), значение же мин и макс скорости можно задавать вручную в коде, сейчас это 3000 и 6000

inspiritus
Offline
Зарегистрирован: 17.12.2012

Респекты оно канешно респектабельно, но в карман не положишь, не помещаица. 

Ufamak
Offline
Зарегистрирован: 03.12.2017

абсолютно согласен. финансовый вопрос мы уже решили

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ufamak пишет:

абсолютно согласен. финансовый вопрос мы уже решили

Да, подтверждаю. Человек предлагал деньги. Я отказался поскольку считаю, что в данном случае стоимость работы дешевле стоимости транзакции :) И вобще с сервой это прям какой то болезненный вопрос. Очень много обращений с примерно одинаковыми ТЗ. На всякий случай этот простенький код вот :

// здесь серва бесконечно "кивает" от 0 до 170 градусов
// скорость зависит от потенциомметра на ноге A0

#include <Servo.h> 

Servo myservo;

int8_t k=1;
uint8_t i=0;

void setup() 
{ 
  myservo.attach(5);
  myservo.write(0);
} 

void loop() {
   while (i<171) {
      delayMicroseconds(map(analogRead(A0),0,1023,3000,6000)); // 3000 - минимально возможная задержка между поворотами на 1 гр., 6000 - максимальная в uS
      myservo.write(i); 
      i+=k;
   }
   k *= -1;
   i += k;
}

В данном, конкретном случае, косяк был в том, что испольуемая серва имела дедбанд 2uS.

Ufamak
Offline
Зарегистрирован: 03.12.2017

я немного поясню почему так много обращений. на своем примере. в сети туева хуча видеороликов как запрограмировать ардуину на работу с сервой, какие лучше/какие хуже. и везде эта серва - китайский 9грамовый клон towerpro. а вот как работать с иными сервами - тут уже, как я например незная языка программирования, начинаешь читать тучу страниц информации и в конце концов еще больше запутываешься))) еще раз спасибо! моя серва кстати - PDI-6221MG на 15/20кг, цифровая с углом поворота ~170 градусов