ARduino MEga 2560 + servo + IK

frankyjohn2014
Offline
Зарегистрирован: 23.05.2016

Передаю данные с последовательного порта с авиасимулятора, хочу сделать иммитацию прибора с помощью сервомашинки. Данные поступают нормально и стрелка отклоняется, но теряется начальное положение при старте и возникает вопрос как это сделать. Порылся на сайтах и нашёл это

Тут шаговый двигатель , но суть та же. Вот что написано в опасании.(Извените за транслит - гугл переводчик)

Оптическая пара находится позади лицевой панели на расстоянии около 3..5 мм, а передняя панель имеет небольшой вертикальный зазор перед ней (шириной около 2 мм) - это исключает вмешательство внешнего света. Для инструмента, который не имеет иглы, но имеет вращающиеся карты просто использовать черную матовую поверхность на задней стороне этой карты с тонкой белой линии или полоски фольги в соответствие с "нуля" на лицевой стороне.

Запуск программы последовательности ArdSimX перемещает все степперы в сторону положения "ноль", и все степперы (с датчиками или с ограничителем) займет свою позицию. После этой последовательности все степперы будут перемещены в их рабочее положение, соответственно, с входящими данными плагина.

Вот мой код, сервомашинки, может кто сможет уделить немного времени и помочь с кодом? как вернуть стрелку при старте программы в нулевое положение.

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
// a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
String msgline="";
String bankanglestr="";
void setup() 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  Serial.begin(9600);
  pos=45;
  myservo.write(pos); //just do this here, once, to check the servo's connected
 
 
void loop() 
 
 
  char c;
  if( Serial.available() ) {  // buffer up a line
    c = Serial.read();
    if (c!= '\n')    msgline+=c;
  }
 
  if (c =='\n'){
    if (msgline.length() > 0){
      int firstcomma = msgline.indexOf(",");
      if (firstcomma > 0 ) {
        bankanglestr=msgline.substring(0,firstcomma );
        pos=bankanglestr.toInt() +90 ;
        pos=90-(pos-90);
        myservo.write(pos);
        delay(15);
      }
      msgline="";
      
    }
  }
}

 

frankyjohn2014
Offline
Зарегистрирован: 23.05.2016
#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
// a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
String msgline="";
String bankanglestr="";
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  Serial.begin(9600);
  pos=45;
  myservo.write(pos); //just do this here, once, to check the servo's connected
} 
 
 
void loop() 
{ 
 
 
  char c;
  if( Serial.available() ) {  // buffer up a line
    c = Serial.read();
    if (c!= '\n')    msgline+=c;
  }
 
  if (c =='\n'){
    if (msgline.length() > 0){
      int firstcomma = msgline.indexOf(",");
      if (firstcomma > 0 ) {
        bankanglestr=msgline.substring(0,firstcomma );
        pos=bankanglestr.toInt() +90 ;
        pos=90-(pos-90);
        myservo.write(pos);
        delay(15);
      }
      msgline="";
      
    }
  }
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

У шагового двигателя нет такого понятия как "положение", тогда как у сервопривода - есть. Поэтому, чтобы выставить серву в ноль достаточно всего лишь команды myservo.write(0);, ну, или с любым другим значением параметра для "нулевого" положения.

KADAVR
Offline
Зарегистрирован: 21.10.2016

frankyjohn2014

подскажите, вам удалось разобраться "как повернуть стрелку в нулевое положение"?

у меня аналогичная задача.

 

 

 

 

 

 

 

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Araris пишет:

У шагового двигателя нет такого понятия как "положение", тогда как у сервопривода - есть. Поэтому, чтобы выставить серву в ноль достаточно всего лишь команды myservo.write(0);, ну, или с любым другим значением параметра для "нулевого" положения.

Я правильно понимаю, что это есть серво? https://ru.aliexpress.com/item/100-NEW-Wholesale-SG90-9G-Micro-Servo-Mot...

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Угу. Она самая.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ua6em пишет:

Araris пишет:

У шагового двигателя нет такого понятия как "положение", тогда как у сервопривода - есть. Поэтому, чтобы выставить серву в ноль достаточно всего лишь команды myservo.write(0);, ну, или с любым другим значением параметра для "нулевого" положения.

Я правильно понимаю, что это есть серво? https://ru.aliexpress.com/item/100-NEW-Wholesale-SG90-9G-Micro-Servo-Mot...

 

И как её к ардуине подключать? Через серво-контроллер? Нашёл только на 32 канала, мне то нужен один канал )))

Araris
Offline
Зарегистрирован: 09.11.2012

ua6em пишет:

И как её к ардуине подключать?

Не ищите, этого нет в Интернете ))).

Если серьёзно, маломощную серву можно подключать так :

Мощную - питание (+5) подавать не с Ардуино, а с отдельного источника соответствующей мощности.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Подключается примитивно: питание - на +5в платы, землю - на землю, а сигнальный провод подключаете к любому PWM сигналу платы. Это если хотите использовать аппаратное управление через analogWrite(millisecs); А можете подключать через библиотеку Servo.h кажется .. там программная эмуляция, насколько помню, соответственно можно подлкючаться к любому выходу.

А ещё рекомендую скачать ArduBlock и поставить его как плагин в Ардуино ИДЕ. Там просто море разных библиотек и визуальное программирование. Тупо соединяете блоки промеж себя и всё. У меня 10-и летний ребенок разобрался практически самостоятельно. Паука вон сделал на 8-и таких сервоприводах .. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Araris пишет:

ua6em пишет:

И как её к ардуине подключать?

Не ищите, этого нет в Интернете ))).

Мощную - питание (+5) подавать не с Ардуино, а с отдельного источника соответствующей мощности.

По подключению получается совсем просто (как бы)
Задача:
Есть контроллер K3NG управляющий поворотным устройством, всё работает, цифирьки на дисплее рисует, но хочется же и стрелку как в аналоговых поворотках, выходит серво-мотор эту задачу решает.
Угол поворота хранится в переменной, эту переменну через библиотеку и выводим (с определённой периодичностью)
Ход рассуждения правильный?

И еще один вопрос, значит, что сам сервомотор должен иметь метку по ориентации его на 360 градусов к примеру?

Araris
Offline
Зарегистрирован: 09.11.2012

Мне кажется, Вам пока не хватает знаний, советую хоть чуток изучить тему сервоприводов, ну, например, вот здесь http://robotday.ru/2015/03/28/сервопривод-tower-pro-9g-sg90/

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Araris пишет:

Мне кажется, Вам пока не хватает знаний

Мне кажется, что их нет ))) От слова совсем )))
Благодарствую!!!
Учу материальную часть и, даже немного получается, уже ARDUINO IDE устанавливаю влёт, а вот

ArduBlock

не подключается (в русской версии)
как всё запутано однако )))

PS тем не менее контроллер поворотки (на макетке) c LCD по шине IIC запустить удалось, так что надежда есть )))

PPS неожиданно оказалось, что заказанный девайс до углов только 180 градусов, для 360 совсем другие цены, хочешь-не-хочешь придётся делать индикацию и по элевации, не пропадать же добру )))
 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Устанавливается отсюда: https://sourceforge.net/projects/ardublock/, русификация там типовая с текущей локали (Вам из такой скриншот и делал).

Сайт разработчика http://blog.ardublock.com/

Там же инструкции "как поставить", "как допиливать".. :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Arhat109-2 пишет:

Устанавливается отсюда: https://sourceforge.net/projects/ardublock/, русификация там типовая с текущей локали (Вам из такой скриншот и делал).

Сайт разработчика http://blog.ardublock.com/

Там же инструкции "как поставить", "как допиливать".. :)

делаю как написано: НО

"Этот гвоздь не в ту стену"

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Там фишка в том, что в рабочей папке, где у вас лежит Ардуино ИДЕ, в папке tools надо создать точную структуру папок и ПОЛОЖИТЬ в неё скачанный архив, и потом ПЕРЕИМЕНОВАТЬ его ровно так, как оно сказано. Это не архив, это "оно и есть". :) Да, буковки в верхних и нижних регистрах воспроизведите дотошно в названиях попаок и самого файлика. И не забудьте перезагрузить ИДЕ.

У меня с первого раза тоже "ни палучилося". :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Так и делал! Под русской XP не заработала, а вот под вистой - работает!
Под вистой и как jar и как распакованный архив (а там много папок получается) работает...