Подскажите с кодом

Подскажите с кодом

Сообщение kirill92 » 26 янв 2014, 12:10

Добрый день!
Я достаточно недавно начал заниматься программированием Arduino, и попробовав все простые примеры решил сделать что то свое. Мой взгляд остановился на манипулятора. Под рукой оказалась всего 4 сервы SG90. Поэтому движения у нас следующие: поднимаем, опускаем, поворот лево/право и соответственно захват и отпустить.
Написал вот такой скетч (захват клешни пока не написан):
Код: Выделить всё
#include <Servo.h>

Servo ser1; // серва 1
Servo ser2; // серва 2
Servo ser3; // серва 3
Servo ser4; // серва 4

byte pos = 0; // позиция сервы 1
byte pos2 = 0; // позиция сервы 2
byte pos3 = 0; // позиция сервы 3
byte pos4 = 0; // позиция сервы 4

const byte buttonPin1 = 8; // порт для кнопки вверх серва 1
const byte buttonPin = 12; // порт для кнопки вниз серва 1
const byte buttonPin2 = 7; // порт кнопки вправо серва 2
const byte buttonPin3 = 4; // порт кнопки влево серва 2
const byte buttonPin4 = 3; // порт кнопки захват сервы 3,4
const byte buttonPin5 = 2; // порт кнопки отпустить сервы 3,4

byte buttonState; // кнопка 1 серва 1 (вниз)
byte buttonState1; // кнопка 2 серва 1 (вверх)
byte buttonState2; // кнопка 3 серва 2 (вправо)
byte buttonState3; // кнопка 4 серва 2 (влево)
byte buttonState4; // кнопка 5 серва 3,4 захват
byte buttonState5; // кнопка 6 серва 3,4 отпустить

void setup ()
{
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
}

void loop ()
{
  buttonState = digitalRead (buttonPin);
  buttonState1 = digitalRead (buttonPin1);
  buttonState2 = digitalRead (buttonPin2);
  buttonState3 = digitalRead (buttonPin3);
  buttonState4 = digitalRead (buttonPin4);
  buttonState5 = digitalRead (buttonPin5);
 
  if (buttonState == HIGH) // опускаем
  for(pos = 1; pos < 80; pos += 1) 
  { 
    ser1.attach(9);   
    ser1.write(pos);         
    delay(20);
    ser1.detach();
    break;
  }
 
 if (buttonState1 == HIGH) // поднимаем
 for(pos = 80; pos > 1; pos-=1) 
 { 
    ser1.attach(9);
    ser1.write(pos);               
    delay(20);
    ser1.detach();
    break;               
 }
 
   if (buttonState2 == HIGH) // поворот влево
   for(pos2 = 1; pos2 < 180; pos2 += 1) 
  { 
    ser2.attach(11);   
    ser2.write(pos2);           
    delay(20);
    ser2.detach();
    break;
  }
   if (buttonState3 == HIGH) // поворот вправо
   for(pos2 = 180; pos2 > 1; pos2 += 1) 
  { 
    ser2.attach(11);   
    ser2.write(pos2);           
    delay(20);
    ser2.detach();
    break;
  }
}

Правильно ли так писать? Можно ли сократить объем? И как одновременно сделать захват с помощью 2-х серв.
P.S. все управление выведено на кнопки.
Заранее спасибо!
kirill92
 
Сообщения: 8
Зарегистрирован: 25 сен 2013, 13:14
programming: c++

Re: Подскажите с кодом

Сообщение admin » 27 янв 2014, 06:42

Как минимум - методы servo.attach(); лучше вынести в setup(),
а реакцию-обработчик нажатия кнопок можно оформить в виде отдельных функций.
Для понимания процесса, так же, рекомендую ознакомиться с программированием на C/C++.
Например, break; внутри цикла for() приведёт к выходу из цикла.
Аватара пользователя
admin
Администратор
 
Сообщения: 317
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: Подскажите с кодом

Сообщение kirill92 » 27 янв 2014, 10:29

Если я убтраю оператор break после цикла for то когда я отпускаю кнопку серва продолжает движение , а надо чтобы она сразу останавливалась. И можно ли так написать чтобы захват двумя сервами одновременнно проводить с нажатия 1 кнопки:
If(...........)
{
for(........) - серва 1
{
....
}
for(..............) - серва 2
{
....
}
}
kirill92
 
Сообщения: 8
Зарегистрирован: 25 сен 2013, 13:14
programming: c++

Re: Подскажите с кодом

Сообщение kirill92 » 27 янв 2014, 15:39

И стоит ли использовать detach () для отключения серв, чтобы не вибрировали когда стоят?
kirill92
 
Сообщения: 8
Зарегистрирован: 25 сен 2013, 13:14
programming: c++

Re: Подскажите с кодом

Сообщение admin » 28 янв 2014, 07:03

Например, можно для каждой сервы завести глобальную переменную в которой хранить текущее положение и просто инкрементить/декрементить её при нажатии определённой кнопки.

kirill92 писал(а):И стоит ли использовать detach () для отключения серв, чтобы не вибрировали когда стоят?

Скорее всего это джиттер, либо проблема в отработке сервой возмущающего момента.
Аватара пользователя
admin
Администратор
 
Сообщения: 317
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: Подскажите с кодом

Сообщение kirill92 » 28 янв 2014, 15:27

и просто инкрементить/декрементить её при нажатии определённой кнопки.

Прошу прощение за тупость мою, я немного не понимаю, можно на примере?

Исправил код? И все же detach-ем можно выключать их, с дерганьем ничего не получается, да и я запитываю их все от ардуины, поэтому отключение необходимо чтобы не перегружать её.

Код: Выделить всё
 /* Рука манипулятор, с движениями вверх, вниз, поворотом манипулятора и захватом предметов. Работает на 4 сервоприводах с кнопочным управлением. */

#include <Servo.h>

Servo ser1; // серва 1
Servo ser2; // серва 2
Servo ser3; // серва 3
Servo ser4; // серва 4

byte pos = 0; // позиция сервы 1
byte pos2 = 0; // позиция сервы 2
byte pos3 = 0; // позиция сервы 3
byte pos4 = 0; // позиция сервы 4

const byte buttonPin1 = 8; // порт для кнопки вверх серва 1
const byte buttonPin = 12; // порт для кнопки вниз серва 1
const byte buttonPin2 = 7; // порт кнопки вправо серва 2
const byte buttonPin3 = 4; // порт кнопки влево серва 2
const byte buttonPin4 = 3; // порт кнопки захват сервы 3,4
const byte buttonPin5 = 2; // порт кнопки отпустить сервы 3,4

byte buttonState; // кнопка 1 серва 1 (вниз)
byte buttonState1; // кнопка 2 серва 1 (вверх)
byte buttonState2; // кнопка 3 серва 2 (вправо)
byte buttonState3; // кнопка 4 серва 2 (влево)
byte buttonState4; // кнопка 5 серва 3,4 захват
byte buttonState5; // кнопка 6 серва 3,4 отпустить



void setup ()
{
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
 
  ser1.attach(9);
  ser2.attach(11);
}



void loop ()
{
  buttonState = digitalRead (buttonPin);
  buttonState1 = digitalRead (buttonPin1);
  buttonState2 = digitalRead (buttonPin2);
  buttonState3 = digitalRead (buttonPin3);
  buttonState4 = digitalRead (buttonPin4);
  buttonState5 = digitalRead (buttonPin5);
 
 if (buttonState == HIGH) // опускаем
 int up = up_down1 ();
 
 if (buttonState1 == HIGH) // поднимаем
 int down = up_down2 ();
 
 if (buttonState2 == HIGH) // поворот влево
 int left = go_left ();
 
 if (buttonState3 == HIGH) // поворот вправо
 int right = go_right ();
}

 int up_down1 ()
{
  for(pos = 1; pos < 80; pos += 1) 
  {   
    ser1.write(pos);         
    delay(20);
    return 0;
  }
}

 int up_down2 ()
{
  for(pos = 80; pos > 1; pos-=1) 
 { 
    ser1.write(pos);               
    delay(20);
    return 0;   
 }
}
 
 int go_left ()
{
   for(pos2 = 1; pos2 < 180; pos2 += 1) 
  {     
    ser2.write(pos2);           
    delay(20);
    return 0;
  }
}

 int go_right ()
{
   for(pos2 = 180; pos2 > 1; pos2 -= 1) 
  {     
    ser2.write(pos2);           
    delay(20);
    return 0;
  }
}
kirill92
 
Сообщения: 8
Зарегистрирован: 25 сен 2013, 13:14
programming: c++

Re: Подскажите с кодом

Сообщение admin » 29 янв 2014, 07:15

Запитывать лучше от отдельного блока питания; 4 серв стабилизатор на Arduino может не выдержать и сгореть.
kirill92 писал(а):можно на примере?

можно:
Код: Выделить всё
// ...
int pos1=0;
int pos2=0;
void loop()
{
 buttonState = digitalRead (buttonPin);
 buttonState1 = digitalRead (buttonPin1);
//...
if (buttonState == HIGH) { // опускаем
  pos1++;
}
if (buttonState1 == HIGH) { // поднимаем
  pos1--;
}
//...
// проверка на выход за диапазон
if(pos1 < 0) {
   pos1 = 0;
}
if(pos1 > 180) {
  pos1 = 180;
}
// ...
ser1.write(pos1);
ser2.write(pos2);
delay(20);
}

кстати, на будущее рекомендую делать более человеко-понятное именование переменных, чтобы код был более читаем.
Например: btn_servo_up, btn_servo_down или btnServoUp и т.п.
Аватара пользователя
admin
Администратор
 
Сообщения: 317
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: Подскажите с кодом

Сообщение kirill92 » 29 янв 2014, 10:39

Спасибо большое за внятное объяснение , а то ребята с roboforum.ru. видио не знают что такое человек который только начал этим заниматься и вникать при этом не имея технического образования. Да, как бы это дико не звучало, по образованию я юрист, видимо когда то давно ступивший не на ту тропу (так как всегда нравилась техника), но сейчас питаюсь сам во всем разобраться, мб даже когда нибудь сделать стартап по робототехнике. Я НЕ СУМАСШЕДШИЙ :) хотя многие наверно так подумали.
kirill92
 
Сообщения: 8
Зарегистрирован: 25 сен 2013, 13:14
programming: c++

Re: Подскажите с кодом

Сообщение admin » 30 янв 2014, 06:56

kirill92 писал(а):мб даже когда нибудь сделать стартап по робототехнике.

Замечательный настрой :co_ol:
Аватара пользователя
admin
Администратор
 
Сообщения: 317
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: Подскажите с кодом

Сообщение kirill92 » 30 янв 2014, 19:21

Есть идеи, но нет людей.
kirill92
 
Сообщения: 8
Зарегистрирован: 25 сен 2013, 13:14
programming: c++

Re: Подскажите с кодом

Сообщение admin » 31 янв 2014, 07:12

kirill92 писал(а):Есть идеи, но нет людей.

Это уж как всегда. Однако, есть мысль, что идея - это только потенциал и сама по себе - без реализации, она ничего не стоит. Поэтому пробуйте делиться идеями со своими друзьями/знакомыми и возможно получится привлечь единомышленников.
Однако эта мысль, похоже, пока не слишком находит отклик и раздел Коллективное творчество, который и задумывался для таких проектов пока не слишком пользуется популярностью :)
Поэтому как вариант - делать минимальный прототип (MVP - minimum valuable product - по терминологии The Lean Startup) своими силами (+ возможно фриланс) и выкатывать его на краудфандинг.
Успехов!

PS прямо в тему - Дело техники: Как гуманитарию создать IT-бизнес:
Вы не можете программировать. Что ещё вы не можете? А что можете? Составьте список вещей, которые вы можете сделать, и займитесь этим. Остальное доверьте профессионалам.

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

Основатель должен не только разбираться в битах и в байтах, но и по-настоящему понимать проблемы клиентов.

Если вы не обладаете техническими навыками, просто получите их. Научитесь программировать. Первичных навыков должно хватить, чтобы хотя бы сделать прототип вашей идеи.
Аватара пользователя
admin
Администратор
 
Сообщения: 317
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: Подскажите с кодом

Сообщение kirill92 » 31 янв 2014, 13:14

Поэтому пробуйте делиться идеями со своими друзьями/знакомыми и возможно получится привлечь единомышленников.

К сожалению им всем до лампочки эти идеи, так как они все гуманитарии (юристы, депутаты, госслужащие) :)
Мб стоит на форуме описать проект (свои идеи), хотя не хотелось бы чтобы его украли (и запатентовали :) ) ? Или вам в личку (может интересно будет).
Единственное я нахожусь в Москве.
kirill92
 
Сообщения: 8
Зарегистрирован: 25 сен 2013, 13:14
programming: c++


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron
© 2009-2019 |  О проекте  |  Политика Конфиденциальности  |