roboforum.ru

Технический форум по робототехнике.

Экзоскелет "Крок"

Ответить

Re: Экзоскелет "кРок"

Kulverstukas » 29 июл 2015, 15:42

Из тех схем что я сам пробовал эта самая простая http://www.tehnari.ru/attachments/f156/54603d1320489273-h-bridge.jpg У нее нет защиты от совместного включения входов (я делал программно) и нужно 2 входа вместо 1-го. Но для пробы она самая удобная и токи хорошие можно обеспечить.. (только диоды при большой мощности моторов обязательно ставить!)
Разные моторы через нее подключал (конечно не очень большой мощности до 30 Ват) проблем небыло с ней.

Re: Экзоскелет "кРок"

Angel71 » 29 июл 2015, 16:14

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

Re: Экзоскелет "кРок"

robovan » 29 июл 2015, 16:43

:)

Добавлено спустя 33 секунды:
вот самая простая на мосфетах
Вложения
hb_mosfet (1).gif
hb_mosfet (1).gif (5.38 КиБ) Просмотров: 2145

Re: Экзоскелет "кРок"

holomrn » 30 июл 2015, 01:10

ага. именно что самая простая. защиты от сквозного тока в упор не видно.
вообще странно что неудобные вопросы вы считаете флудом.. ;)

Re: Экзоскелет "кРок"

Angel71 » 30 июл 2015, 02:29

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

Re: Экзоскелет "кРок"

dccharacter » 30 июл 2015, 03:39

Ну вот хочет человек набить шишки, пусть набивает. Я тоже всегда хотел и сейчас хочу.
Вот ему ж, как и мне, лень посмотреть в даташит
Например вот на это:
RDS(on) () VGS = 10 V 0.54
И на график напряжения и тока при Vgs = 5V - ведь рулить хочется таким мостом с помощью дуни какой-нить, да? (Там какое напряжение не подавай, 1А макс тока будет, т.е. при напряжении питания движков 12В и токе 1А, сопротивление перехода будет 12Ом, а мощность рассеиваемая на транзисторе всего 12Вт). Короче абсолютно мой случай - абсолютное пренебрежение к аппноутам типа "Управление мощными мосфетами", элементарной арифметикой, советами на форуме. Кивание на ребят, которые делают экзоскелет на модельных аутраннерах, похоже, без малейшего понимания того, что они трехфазные и нужен спец драйвер, и что управлять в движках надо током, а не напряжением. В общем, удачи, чувак. Я часы на движке от винта два года делал. Ты свой экзоскелет будешь делать пять лет, если не бросишь. А потом придет Дима и расскажет тебе про емкость затвора мосфетов и чудесную магию маленьких магнитиков и китайских планетарных передач, и ты все будешь переделывать заново.

Re: Экзоскелет "кРок"

Angel71 » 30 июл 2015, 04:16

поправки на ветер это после определения параметров мотора. для слабеньких моторчиков, как в микросервах мелкие полевички. для моторчиков помощнее, как в стандартных сервах, допустим irl7309. для более мощных другие мосфеты, может 4-мя и не обойдётся.

Re: Экзоскелет "кРок"

robovan » 30 июл 2015, 09:41

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

вы меня похоже за идиота считаете. Робототехника только одно из моих хобби. Со школы занимаюсь моделизмом. Прекрасно осведомлен о работе драйверов для BLDC движков. :x
Потому собственно и делаю как умею.
А схему я привел как самую простую для примера.
По поводу управления планируется пока так: Ардуина подключается к плате от мелкой сервы как у меня на модельке. Резистор на сустав, вместо мотора подключается Н мост собраный или на мосфетах или на микрухе(так даже проще). Получается как бы серво но мощное. Вы видео что я постил смотрите? :o
У меня и так головняка хватает и с механикой и с электроникой, а еще программирование...
С механикой трабл в том что нет возможности купить те моторредукторы что мне подходят, приходится что то думать, как то из говна и палок лепить редукторы. Пока остановился или на использовании редукторов от дворников с тросовым понижающим редуктором(нет возможности шестерни делать или купить) или тогда движки от шурика со шпилькой и гайкой.

Добавлено спустя 7 минут 22 секунды:
вчера баловался с переключателями :D
Вложения
7uc0ri0okp.jpg
2015713205437.jpg

Re: Экзоскелет "кРок"

Angel71 » 30 июл 2015, 13:34

зачем сейчас большой макет? на этом мелком макете уже нормально получается мотором управлять?

Re: Экзоскелет "кРок"

robovan » 30 июл 2015, 14:50

зачем сейчас большой макет? на этом мелком макете уже нормально получается мотором управлять?

Ну так большой же все равно придется делать и желательно в ЭТОМ году.

Добавлено спустя 10 минут 2 секунды:
Код: Выделить всёРазвернуть
//Wiper motor software v 1.3:
//Servo sensor to Analog 0
//Setpoint potentiometer to Analog 1
//H bridge direction pin to Digital 2
//H bridge PWM signal to Digital 3
//LEDs at digital pins 4 - 13 are optional (indicating setpoint as LED bar)
//
//For the first test run, set MAX_DUTYCYCLE to 75 in order to lower the maximum torque in case something goes wrong.
//When connecting the servo to the microcontroller for the first time, you have to consider the rotational direction of your wiper motor!
//Adjust the potentiometer defining the setpoint to the center position.
//If the servo moves to neutral position, too after connecting the circuit to the supply voltage, the polarity of the servo sensor is correct.
//If the wiper motor starts spinning away from the center position, the polarity of the servo sensor (+ and - connector) has to be swapped.
//
//
//Source & info: www.HomoFaciens.de/technics-computer-arduino-uno_en_navion.htm


//#include <avr/io.h>
//#include <util/delay.h>


int ADC_SetPoint = 0;
int ADC_SetPointOld = 0;
int ADC_ServoPoti = 0;
int ADC_ServoPotiOld = 0;
int dutyCycle = 50; // 10 - 255
int ADCdiff = 0;
int timeDiff = 0;

//Change values below to adapt your motor
//Set MAX_DUTYCYCLE to 75 for the first test run!

#define P_FRACTION 0.3         //0.0 - 10.0 (0.3)
#define I_FRACTION 0.3         //0.0 - 10.0 (0.3)
#define D_FRACTION 4.0         //0.0 - 10.0 (4.0)
#define V_WINDOW 25            //10 - 1000 (25)
#define MIN_DUTYCYCLE 25       //0 - 255 (25)
#define MAX_DUTYCYCLE 200      //0 - 255 (255)
#define SOFT_START 0.3        //0.00 - 1.00 (0.30) 1.00 = OFF
#define D_FRACTION_DEMO 0      //1 - consider only D_FRACTION for servo movement (0 - OFF)
#define EMERGENCY_SHUTDOWN 4   //0 - 100 (4), 0 - OFF, Stops motor if blocked
#define SHOOT_THROUGH_PAUSE 10 //Prevent H bridge from shoot through whenever the direction pin is changed

#define SERVO_DIRECTION_PIN 2 //Direction pin servo motor
#define SERVO_PWM_PIN 3       //PWM pin servo motor
#define SERVO_SENSOR A0       //Analog input servo sensor
#define POTI A1               //Analog input potentiometer
#define LED_01 4
#define LED_02 5
#define LED_03 6
#define LED_04 7
#define LED_05 8
#define LED_06 9
#define LED_07 10
#define LED_08 11
#define LED_09 12
#define LED_10 13


void setup(){
  pinMode(SERVO_DIRECTION_PIN, OUTPUT);     
  pinMode(SERVO_PWM_PIN, OUTPUT);     

  pinMode(SERVO_SENSOR, INPUT);     
  pinMode(POTI, INPUT);     

  //LED bar (optional)
  pinMode(LED_01, OUTPUT);     
  pinMode(LED_02, OUTPUT);     
  pinMode(LED_03, OUTPUT);     
  pinMode(LED_04, OUTPUT);     
  pinMode(LED_05, OUTPUT);     
  pinMode(LED_06, OUTPUT);     
  pinMode(LED_07, OUTPUT);     
  pinMode(LED_08, OUTPUT);     
  pinMode(LED_09, OUTPUT);     
  pinMode(LED_10, OUTPUT);     
 
}


void loop(){
  ADC_ServoPoti = analogRead(0);     // reads the servo sensor (between 0 and 1023)
  ADC_SetPoint = analogRead(1);             
   
  ADCdiff = ADC_SetPoint - ADC_ServoPoti;
 
  dutyCycle = abs(ADCdiff) * P_FRACTION;
  dutyCycle += timeDiff * I_FRACTION;
  dutyCycle += abs(ADC_SetPointOld - ADC_SetPoint) * D_FRACTION;
 
  if(D_FRACTION_DEMO == 1){
    dutyCycle = abs(ADC_SetPointOld - ADC_SetPoint) * D_FRACTION;
  }
 
  if(SOFT_START * timeDiff < 1){
    dutyCycle = dutyCycle * (SOFT_START * timeDiff);
  }
 
  timeDiff++;
 
  if(dutyCycle < MIN_DUTYCYCLE && dutyCycle > 0){
    dutyCycle = MIN_DUTYCYCLE;
  }
 
  if(dutyCycle > MAX_DUTYCYCLE){
    dutyCycle = MAX_DUTYCYCLE;
  }
 
  if(dutyCycle < 0){
    dutyCycle = 0;
  }
 
 
 
  if(D_FRACTION_DEMO == 1){
    if(abs(ADC_SetPointOld - ADC_SetPoint) < 2){
      analogWrite(SERVO_PWM_PIN, 0);
      delayMicroseconds(SHOOT_THROUGH_PAUSE);
      digitalWrite(SERVO_DIRECTION_PIN, 0);
      delayMicroseconds(SHOOT_THROUGH_PAUSE);
    }
    else{
      if(ADC_SetPointOld - ADC_SetPoint < 0){
        analogWrite(SERVO_PWM_PIN, 0);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        digitalWrite(SERVO_DIRECTION_PIN, 0);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        analogWrite(SERVO_PWM_PIN, dutyCycle);
      }
      if(ADC_SetPointOld - ADC_SetPoint > 0){
        analogWrite(SERVO_PWM_PIN, 0);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        digitalWrite(SERVO_DIRECTION_PIN, 1);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        analogWrite(SERVO_PWM_PIN, dutyCycle);
      }
    }
  }
  else{
    if(abs(ADCdiff) < V_WINDOW){
      dutyCycle = 0;
      timeDiff = 0;
    }

    if(abs(ADC_ServoPotiOld - ADC_ServoPoti) < EMERGENCY_SHUTDOWN && dutyCycle == MAX_DUTYCYCLE && timeDiff > 50){
      analogWrite(SERVO_PWM_PIN, 0);
      delayMicroseconds(SHOOT_THROUGH_PAUSE);
      digitalWrite(SERVO_DIRECTION_PIN, 0);
      delay(1000);
      timeDiff = 0;
    }
    else{ 
      if(ADCdiff > 0){
        analogWrite(SERVO_PWM_PIN, 0);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        digitalWrite(SERVO_DIRECTION_PIN, 0);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        analogWrite(SERVO_PWM_PIN, dutyCycle);
      }
      if(ADCdiff < 0){
        analogWrite(SERVO_PWM_PIN, 0);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        digitalWrite(SERVO_DIRECTION_PIN, 1);
        delayMicroseconds(SHOOT_THROUGH_PAUSE);
        analogWrite(SERVO_PWM_PIN, dutyCycle);
      }
    }
  }
 

  ADC_SetPointOld = ADC_SetPoint;
  ADC_ServoPotiOld = ADC_ServoPoti;


  //LED bar at digital pins 4 - 13 (optional)
 
  if(ADC_SetPoint >= 93 * 10){
    digitalWrite(LED_10, 1);
  }
  else{
    digitalWrite(LED_10, 0);
  }

  if(ADC_SetPoint >= 93 * 9){
    digitalWrite(LED_09, 1);
  }
  else{
    digitalWrite(LED_09, 0);
  }

  if(ADC_SetPoint >= 93 * 8){
    digitalWrite(LED_08, 1);
  }
  else{
    digitalWrite(LED_08, 0);
  }

  if(ADC_SetPoint >= 93 * 7){
    digitalWrite(LED_07, 1);
  }
  else{
    digitalWrite(LED_07, 0);
  }

  if(ADC_SetPoint >= 93 * 6){
    digitalWrite(LED_06, 1);
  }
  else{
    digitalWrite(LED_06, 0);
  }

  if(ADC_SetPoint >= 93 * 5){
    digitalWrite(LED_05, 1);
  }
  else{
    digitalWrite(LED_05, 0);
  }

  if(ADC_SetPoint >= 93 * 4){
    digitalWrite(LED_04, 1);
  }
  else{
    digitalWrite(LED_04, 0);
  }

  if(ADC_SetPoint >= 93 * 3){
    digitalWrite(LED_03, 1);
  }
  else{
    digitalWrite(LED_03, 0);
  }

  if(ADC_SetPoint >= 93 * 2){
    digitalWrite(LED_02, 1);
  }
  else{
    digitalWrite(LED_02, 0);
  }

  if(ADC_SetPoint >= 93 * 1){
    digitalWrite(LED_01, 1);
  }
  else{
    digitalWrite(LED_01, 0);
  }


  delay(15);                             // waits for the servo to get there

}
нашел сайт http://www.homofaciens.de/technics-computer-arduino-uno_en_navion.htmгде подробно описано как функцию сервомашинки возложить на плечи ардуино. но код меня пугает :O:
Вложения
wiper-servo_001g.jpg
Последний раз редактировалось robovan 31 июл 2015, 11:47, всего редактировалось 1 раз.

Re: Экзоскелет "кРок"

holomrn » 30 июл 2015, 16:31

Продолжайте пугаться. Т.к. собрать железки в кучу это хорошо если треть дела. Все остальное - код, код, код..

Re: Экзоскелет "кРок"

dccharacter » 30 июл 2015, 18:57

Функцию сервомашинки нельзя возложить на плечи ардуино , у ардуино нет движущихся частей. А если ты говоришь про управление сервомашинкой, то, конечно, такой успех в использовании поисковика похвален. Просто уточнить - ты обнаружил откровение о том, как генерить ШИМ с периодом 20мс и длиной импульса 1-2мс? Неужели ардуино способна осилить эту задачу, в ней же 8-ми битный МК стоит. Я думал как минимум ДСП нужен.

Re: Экзоскелет "кРок"

Angel71 » 30 июл 2015, 19:37

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

Re: Экзоскелет "кРок"

robovan » 31 июл 2015, 00:46

ох набежали))) завтра отвечу

Re: Экзоскелет "кРок"

robovan » 31 июл 2015, 11:12

dccharacter писал(а):Функцию сервомашинки нельзя возложить на плечи ардуино , у ардуино нет движущихся частей. А если ты говоришь про управление сервомашинкой, то, конечно, такой успех в использовании поисковика похвален. Просто уточнить - ты обнаружил откровение о том, как генерить ШИМ с периодом 20мс и длиной импульса 1-2мс? Неужели ардуино способна осилить эту задачу, в ней же 8-ми битный МК стоит. Я думал как минимум ДСП нужен.


Ну что вы опять за ересь несете?? :ROFL:
внимательно прочитав статью вы поймете что меня заинтерисовал принцип реализации PID регулятор на ардуине.
В моем коде я использую сервомашинки. Записываю повернутся на угол такой то и она отрабатывает. В ней уже есть схема с отрицательной обратной связью.
Код: Выделить всёРазвернуть
void loop()

{


  servo1.write(50);  // правая нога вперед
  servo3.write(150); // левая нога назад
  servo2.write(50);  // правое колено согнуть
  delay(100);

Но можно и так: ардуино получает данные на аналоговый вход с потенциометра и с помощью ШИМ управляет двигателем.
алгоритм такой: включается двигатель, когда данные с потенциометра совпадают с теми что нужны, он выключается.
Но такой код я сам написать пока не знаю как.
Если вы знаете то зачем глумится над тем кто не знает?
Я вот на форуме по моделизму такого не замечал. Если у человека есть проблема ее стараются решить все, и с радостью помогают в реализации проекта.
Тут же напротив сидят знатоки но помогать не спешат. Или может я в чем то оплошал, может нужно внятное ТЗ ? А то форумчане не понимают что я строю.
Последний раз редактировалось robovan 31 июл 2015, 11:44, всего редактировалось 1 раз.


Rambler\'s Top100 Mail.ru counter