Доработка детского электрокара

tygra
Offline
Зарегистрирован: 03.05.2014

Доброго дня. Приобрел китайскую машинку, ребенка катать и самому чтоб не скучать на прогулках. Машинка на 12в. Имеет два движка с редукторами по 12в* 9000об. Вроде как каждый ватт на 30-35. Скорость около 7-8км\ч . Повороты от одного движка на 12в. Собственно со всем этим хозяйством 2 основные проблемы:

1) Блок управления не имеет каких либо плавных переключений , все просто "вперед\назад" "влево\вправо" тупо кнопки. При до упора заряженном акке на два движка подается впрямую с релюшки все 12в. итого стартует с буксами ребенка сильно дергает, так что чадо отказывается на машинке ездить : ) . Тормозит так же ( путем замыкания движков, встают колом) , что также дергает , но уже "фейсом" об руль... Еслиб дело было об подростковом авто, то возможно было бы и прикольно, в случае с моим ребенком ( 2года) это не премлимо. Помимо этого редуктор пластиковый, шестерням быстро настанет "кирдык".

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

Что думаю по данным проблемам, ну раз в форуме про ардуину, понятно что "колхозить" будем на ней. Не потому что это хорошо просто и здорово, а потому что ардуина уже есть, лежит себе в коробочке и ждет своего часа, который похоже что настал. По проблеме 1) возможно установить "плавный пуск" на таймере 555, но засада в том что их нет у меня, заказал с инета, ждать 1-2 месяца, не решает проблемы с управлением. В наличии есть пульт от RC модели на 2.4 Ггц , двухканальный, с приемником, цифровой. Само собой появилась идея связать все это вместе и сделать нормальное управление, паралельно и разгон соизмеримый со степенью нажатия на "гашетку". Основная проблема в рулевом. Или колхозить потенциометр на руль, чтобы положение отследить. Или оставить как есть и на ардуине отрабатывать триггером на сигналы с пульта ( на нем нет кнопок, только плавное "руление"). Т.к. с ардуиной "баловался" на уровне "поморгай лампочкой", то помощь знающих и опытных мастеров мне бы не помешала. Управлять ходовыми двигателями планирую с помошью шим выхода, путем усиления последнего 4хIRF3205 на радиаторе. Реверс отрабатывать при помощи штатных релюшек. Логика работы тормоза пока не ясна, сразу тормоз "в пол" тоже как то не то. Как это обработать программно пока не знаю. Любая критика и предложения приветствуются.

P\S Прошу прощения за грамматику, в школе рус.яз был не самым любимым предметом : )

P\P\S Колхозить буду на ардуине мега2560 r3 . Других нет : ).. Взять на данный момент не где, заказывать долго : )

 

tygra
Offline
Зарегистрирован: 03.05.2014

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

тут 2 варианта. 1 простой ставите реле и мощный полевик. 2 собираете мост. и в том и другом случае к полевикам драйверы

мы заложили мощные полевики. тут и массовых irfz44 за глаза. но если уже есть то пожалуйста

плавный газ и тормоз сделаете программно не проблема

только не пойму. управление у вас с пульта. а ребенок управлять не будет получается?

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

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

тут 2 варианта. 1 простой ставите реле и мощный полевик. 2 собираете мост. и в том и другом случае к полевикам драйверы

мы заложили мощные полевики. тут и массовых irfz44 за глаза. но если уже есть то пожалуйста

плавный газ и тормоз сделаете программно не проблема

только не пойму. управление у вас с пульта. а ребенок управлять не будет получается?

Реле планируются штатные , по 30ампер каждая. Массовых irfz44 нету, живу в опе, что либо достать здесь проблема, только через инет, но ждать капецки долго, потому на 4шт irf3205 , на мощный драйвер полноценный нужны детали, которых у меня нет, а ждать шибко долго и не факт что прийдут, одна из посылок пол года шла. Ребенок пока что еще маленький, как подрастет, вколхозит потенциометр вместо педальки и не много перепилить прошу, с синхронным управлением с пульта "на всякий"...  В принципе что возможно будет еще нужно заказать, готов рассмотреть, заказывать нужно заранее, так что лучше об этом думать сейчас. Заказал полевики 200n10 . Думаю нужен ли драйвер к 4х irf3205 ? Я тестово запаралелил все 4, входы через 4 резюка на 47 ом и на выход шима ардуины. На выход зацепил две галогенки от авто по 60вт, яркость регулируется нормально, ничего кроме проводов не греется : ))... Нужен ли драйвер ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если реле зачем полноценный драйвер? если полноценный драйвер зачем реле?

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

если вы будете мостовой драйвер делать на ваших полевиках, кстати все n-канальные, вам полюбому придется делать как минимум к верхним полевикам драйвер. в мост обычно ставят n и p канальные, так как проще управлять, не надо согласовывать напряжение на затворе. ардуина выдаст максимум 5В относительно земли, а верхний полевик к земле не подключен, а только к +12В питания. соответтвенно нужно подавать эти 12В. если с ардуины подать 5В, а срнеднюю точку полумоста представить делителем напряжения, но на затвор верхнего полевика придется -1В.

короче))) проще реле и 1 полевик

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

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

Типа такого ? Посоветуйте какой лучше взять драйвер для транзюков 200n10 на подобие данного.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

можно и так, но я предлагал вариант проще

tygra
Offline
Зарегистрирован: 03.05.2014

Ну примерно понял, завтра бум осваивать pulsin , попробую подружить приемник RC и ардуину, а дальше уже видно будет. Надо бы блок схему еще накидать, дабы проще потом было.

tygra
Offline
Зарегистрирован: 03.05.2014

В общем прикрутил приемник к ардуине, повесил через 4 полевика (паралельно) 2 галогенки от авто по 60вт каждая. Залил тестовый скетч. : 

int pin = 2;
int pin1 = 3;
int throut;
int thrin;
int ledPin = 9;
int ledPin2 = 8;
void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
  pinMode(pin1, INPUT);
  //digitalWrite(pin, 1);
}

void loop()
{
  Serial.print("   thr= ");
  thrin = pulseIn(pin, HIGH, 50000);
  Serial.print(thrin);
  //Serial.print("thr= ");
  //Serial.println(pulseIn(pin1, HIGH, 50000));
  throut = map(thrin, 1100, 2100, 0, 255);
  analogWrite(ledPin, throut);
  analogWrite(ledPin2, throut);
  Serial.print("   thrut= ");
  Serial.print(throut);
  //delay(1000);
}

Работает , пока что вылез косяк о котором я не думал, пределы регулирования достаточно размытые. Т.е. макс газ может быть как 2020 так и 2030 , соответсвенно map выходит за пределы 255 и при отправке на шим значения выше 255 , шим отрубает сигнал на выходе. .... Думаем дальше.. 

Как можно в map зафиксировать предельные значения, что бы они не выходили за рамки заданных ? 

Нашел throut = constrain(throut, 0, 255);

P\S Сильно "пищит" зараза, все таки 590гц маловато. Кто знает схемку преобразовать частоту к 20кгц прошу ткнуть носом, с ходу что то не нашел, изменением таймингов на радуине не предлогать, ищу аппаратное решение.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

шим можно настроить и на другую частоту. но это уже на си писать, а не ардуиновская функция

tygra
Offline
Зарегистрирован: 03.05.2014

Весч.. Попытался накидать блок схему, понял что будет нифига не просто ( ну для меня по крайней мере) : )))

Много мусора, но на данный момент работает "газ" т.е. с нейтрального положения газульки и до макс регулирует шим на лампочку, пределы в норме, работает адекватно : )  пилим дальше.

int pin = 2;
int pin1 = 3;
int throut;
int thrin;
int ledPin = 9;
int ledPin2 = 8;
void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
  pinMode(pin1, INPUT);
  //digitalWrite(pin, 1);
}

void loop()
{
  Serial.print("   thr= ");
  thrin = pulseIn(pin, HIGH, 50000);
  Serial.print(thrin);
  //Serial.print("thr= ");
  //Serial.println(pulseIn(pin1, HIGH, 50000));
  throut = map(thrin, 1540, 2000, 0, 255);
  throut = constrain(throut, 0, 255);
  analogWrite(ledPin, throut);
  analogWrite(ledPin2, throut);
  Serial.print("   thrut= ");
  Serial.print(throut);
  //delay(500);
}

 

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

шим можно настроить и на другую частоту. но это уже на си писать, а не ардуиновская функция

С этим у меня туго,  потом я не смогу все остальное припилить. Возможно ли будет накидать все на ардуино, а потом переведя на СИ подправить тайминги ? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да там не все так сложно. хотя я сам писать не умею. лень разбираться с этими даташитами. для меня непонятно написано. я просто генерю в codevision и не парюсь

просто вместо analogwrite будете писать какойто там регистр. не помню на память типа

ACCR=250; тоже самое будет работать, только можно уже частоту поменять шима

 

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

да там не все так сложно. хотя я сам писать не умею. лень разбираться с этими даташитами. для меня непонятно написано. я просто генерю в codevision и не парюсь

просто вместо analogwrite будете писать какойто там регистр. не помню на память типа

ACCR=250; тоже самое будет работать, только можно уже частоту поменять шима

 

Вроде писали что это отразится на всех таймингах атмеги , соответсвенно и измерения длины импульса и таймы по задержкам нужно будет сильно пересчитать. Для меня это уже сильно сложно, тут с ардуиной бы разобраться : )

P\S Попытался накидать блок схему по отработке газ\тормоз\нейтраль\задний ход  ... запутался.. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

tygra
Offline
Зарегистрирован: 03.05.2014

По поводу таймеров: 

Tаймер 0 (Системное время, ШИМ 5 and 6)
Используется для хранения счетчика времени работы программы. Функция millis() возвращает число миллисекунд с момента запуска программы, используя ISR глобального приращения таймера 0. Таймер 0 также используется для реализации ШИМ на выводах 5 и 6.
Tаймер 1 (ШИМ 9 и 10)
Используется для реализации ШИМ для цифровых выводах 9 и 10.
Tаймер 2 (ШИМ 3 и 11)
Используется для управления выходами ШИМ для цифровых выводов 3 и 11.

т.е. 3 таймера, без особых изменений можно менять значит таймер 1 и 2. Соответственно отразится на парных выводах 3и11 , 9и10.

Хмм если больше ни на чем не отразится, кроме изменения частоты шим на данных выводах, то я как бы за. На что еще повлияет и как использовать ? То биш как менять ? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а вы попробуйте и узнаете)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

tygra, http://arduino.ru/forum/proekty/arduinoide-i-atmega16-korrektiruem-yadro?page=1#comment-47102

я там описывал как можно изменить частоту PWM для таймера 1, такое же можно сделать и с другими таймерами, но таймер 0 трогать не нужно, иначе будет плохо. Метод только меняет предделитель для таймера и ничего больше не делает. Читайте внимательно.

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

 

tygra
Offline
Зарегистрирован: 03.05.2014

Хмм откровенно говоря, мало что понял, понял что нужно на низком уровне сменить значения таймеров, понял на что сменить, но как ? Физически как ? Какой именно кусок куда и куда вставить ? Я конечно понимаю что для вас это элементарно и мол "иди читай доки" , но на данный момент я мягко выражаясь не силен в программировании и для меня это пока что сложно, если вас не затруднит поясните чуть подробнее или готовый ксочек кода и куда его воткнуть. С ардуиной буквально второй день занимаюсь, заранее спасибо : ) 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну зачем вам кучу шимов?

вот что codevision сгенерил. кучу лишнего конечно. используется 2 таймер. неинвертированный шим на ардуиновских 3 и 11 пине

шим задается задавая значения регистрам OCR2A и OCR2B

например 

OCR2A=0x56;
OCR2B=0x4D;
#include <mega328p.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x08;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x08;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Fast PWM top=OCR2A
// OC2A output: Non-Inverted PWM
// OC2B output: Non-Inverted PWM
ASSR=0x00;
TCCR2A=0xA3;
TCCR2B=0x0F;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// USART initialization
// USART disabled
UCSR0B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
      {
      // Place your code here

      }
}

самое нужное для вас это настроить стандартной ардуиновской функцией пины на выход и вставить этот код в setup

вроде так насколько помню. частота шим будет 15,625 кгц

ASSR=0x00;
TCCR2A=0xA3;
TCCR2B=0x0F;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

 

tygra
Offline
Зарегистрирован: 03.05.2014

Чувствую себя полнейшим нубом, ничерта не понял, потратил несколько часов на изучения вопроса правки таймера, понял что ничего не понял : ) т.к. тупо не хватает элементарных знаний по Си и программирования контроллеров. На изучение которых уйдет слишком много времени. Пока пробую все написать как есть на ардуине, потом буду думать о частоте шима. М\б кто нибудь более понятно разжует : ) буду премного благодарен. На данный момент мне настолько не понятно что проще будет аппаратный конвертор собрать.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуйте

void setup(){
  ASSR=0x00;
  TCCR2A=0xA3;
  TCCR2B=0x0F;
  TCNT2=0x00;
  OCR2A=0x00;
  OCR2B=0x00;
}

void loop(){
  for(int i=20; i<220;i++){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
  for(int i=220; i>20;i--){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
}

посмотрите шим светодиод например подключив

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

попробуйте

Большое спасибо, попробую уже завтра, весь "колхоз" на работе, дома доча не дает ни чего делать : ). 

tygra
Offline
Зарегистрирован: 03.05.2014

Хмм а как определить до какой частоты будет нормально работать полевик ? В частности Irf3205 ? Глянул датащит, исходя из того что емкости приведены для частоты в 1мгц, думаю что шим до 100кгц будет работать адекватно, м\б разве что действительно прийдется делать развязку на порт шима.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

tygra пишет:

Хмм откровенно говоря, мало что понял, понял что нужно на низком уровне сменить значения таймеров, понял на что сменить, но как ? Физически как ? Какой именно кусок куда и куда вставить ? Я конечно понимаю что для вас это элементарно и мол "иди читай доки" , но на данный момент я мягко выражаясь не силен в программировании и для меня это пока что сложно, если вас не затруднит поясните чуть подробнее или готовый ксочек кода и куда его воткнуть. С ардуиной буквально второй день занимаюсь, заранее спасибо : ) 

Для первого таймера, частота ~30КГц, нужно добавить в setup() следующую строку:

// 31,373 KHz
TCCR1B = _BV(CS10);

Для первого таймера, частота ~4КГц, нужно добавить в setup() следующую строку:

// 3,922 KHz
TCCR1B = _BV(CS11);

и т.п. Я понятия не имею, для какого таймера Вы хотите изменить частоту ШИМ и какую частоты хотите использовать, потому ответить по другому не могу.

 

 

tygra
Offline
Зарегистрирован: 03.05.2014

kisoft пишет:
Для первого таймера, частота ~30КГц, нужно добавить в setup() следующую строку:

Хмм вроде так и делал .. сегодня попробую еще раз.

просто вставил ваш код в сетап : 

int pin = 10;
int pin2 = 2;
int pin1 = 3;
int throut;
int thrin;
int ledPin = 9;
int ledPin2 = 10;
int divisor = 8;


void setup()
{
// 31,373 KHz
TCCR1B = _BV(CS10);

  Serial.begin(9600);
  pinMode(pin2, INPUT);
  pinMode(pin1, INPUT);
}
void loop()
{
  Serial.print("   thr= ");
  thrin = pulseIn(pin2, HIGH, 50000);
  Serial.print(thrin);
  //Serial.print("thr= ");
  //Serial.println(pulseIn(pin1, HIGH, 50000));
  throut = map(thrin, 1540, 2000, 0, 255);
  throut = constrain(throut, 0, 255);
  analogWrite(ledPin, throut);
  analogWrite(ledPin2, throut);
  Serial.print("   thrut= ");
  Serial.print(throut);
  //delay(500);
}

Разницы никакой, что то не так делаю, а что не пойму.

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

попробуйте

void setup(){
  ASSR=0x00;
  TCCR2A=0xA3;
  TCCR2B=0x0F;
  TCNT2=0x00;
  OCR2A=0x00;
  OCR2B=0x00;
}

void loop(){
  for(int i=20; i<220;i++){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
  for(int i=220; i>20;i--){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
}

посмотрите шим светодиод например подключив

На выходе  диод не горит и не моргает, полная тишина.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

)))))) порты на выход же не настроены. настройте через pinMode

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

)))))) порты на выход же не настроены. настройте через pinMode

дописал в сетап 

pinMode(OCR2A, OUTPUT); 
pinMode(OCR2B, OUTPUT); 

Так же пробовал вместо OCR2A  указать явно порты 3 и 11, не получается. 

Diemon
Offline
Зарегистрирован: 18.11.2011

Вот вам ссылочка:

http://playground.arduino.cc/Main/TimerPWMCheatsheet

Всё расписано по полочкам

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так пробовали или как то по другому?

void setup(){
  ASSR=0x00;
  TCCR2A=0xA3;
  TCCR2B=0x0F;
  TCNT2=0x00;
  OCR2A=0x00;
  OCR2B=0x00;
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop(){
  for(int i=20; i<220;i++){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
  for(int i=220; i>20;i--){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
}

 

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

так пробовали или как то по другому?

void setup(){
  ASSR=0x00;
  TCCR2A=0xA3;
  TCCR2B=0x0F;
  TCNT2=0x00;
  OCR2A=0x00;
  OCR2B=0x00;
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop(){
  for(int i=20; i<220;i++){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
  for(int i=220; i>20;i--){
    OCR2A=i; //задали шим на 3 и 11 выводе
    OCR2B=i;
    delay(50);
  }
}

 

Пробовал не работает. 

Сделал так в секции сетап добавил 

TCCR2B = TCCR2B & 0b11111000 | 0x01;  //sets Arduino Mega's pin 10 and 9 to frequency 31250.

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

Сделал газ\тормоз\нейтралку и задний ход, нужно воткнуть еще запуск релюшек и повороты отработать.

tygra
Offline
Зарегистрирован: 03.05.2014

Diemon пишет:

Вот вам ссылочка:

http://playground.arduino.cc/Main/TimerPWMCheatsheet

Всё расписано по полочкам

Большое спасибо, заработало : )

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну и отлично

tygra
Offline
Зарегистрирован: 03.05.2014

Проект не закончен. Вот что вышло на данный момент http://youtu.be/SjiLKiTLZnE . В планах еще много чего, пока потестим, посмотрим. На очереди пропорциональное управление на рулевое и доработка подвески. С инета жду мелких ардуин и мощных полевиков, как прийдут проект будет переделан на постоянку. 4*irf3205 вообще не греются, работают на частоте 31кгц. Спасибо все кто помог победить частоту шима : ))

Diemon
Offline
Зарегистрирован: 18.11.2011

В видео был один момент когда вы с полного газа резко отпустили гашетку. Колеса продолжили вращатсья по инерции. Получается тормоза нет никакого вообще?

tygra
Offline
Зарегистрирован: 03.05.2014

Diemon пишет:

В видео был один момент когда вы с полного газа резко отпустили гашетку. Колеса продолжили вращатсья по инерции. Получается тормоза нет никакого вообще?

Тормоз есть, но не в том понятии как он был. Под нагрузкой все выглядит иначе. На данный момент тормоз реализован практически задним ходом. т.е. сначала скидывается напряжение с хода вперед до нуля, машина практически останавливается т.к. замедление у редукторов хорошее и при снятии напряжения она очень быстро тормозит на одних редукторах, ну а дальше да идет реверс и обратный ход. Пока что иной логики я не придумал. "родной тормоз" это замыкание обоих движков, их клинит намертво и машина колом останавливается. На данный момент реализовано для аварийной остановки при потери связи с пультом и на парковке. Есть идеи как сделать, предлагайте, у меня что то пока идей нет. В целом очень редко есть надобность резко тормозить, если такая надобность есть то не проблема тормозить задним ходом все равно будет резко дергать. Уже пробовал без груза на поверхности, полевикам плохо не стало, движкам тоже, на стандартном пульту тоже можно было так давить.

P\S В реалии инерции практически нет, инерция реализована програмно. Если снять питание с движков , то в воздухе движки почти мгновенно остановятся и на ходу также, но чуть медленнее, потому реализована нейтралка. м\б не лучшее решение, но пока вроде юзабельно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а возврат в среднее положение рулевых колес планируется?

tygra
Offline
Зарегистрирован: 03.05.2014

jeka_tm пишет:

а возврат в среднее положение рулевых колес планируется?

В смысле автоматический возврат ? Они и так назад вернутся если делать рулевую по принципу сервы, без датчика положения это не возможно. Пока не знаю куда там можно вколхозить потенциометр, еще не смотрел. А так  автоматически вернется обратно в среднее т.к. на пульту рулевое колесо тоже автоматом центруется посередине. На пульту есть подстроечные триммеры, которыми можно выставить середину.

tygra
Offline
Зарегистрирован: 03.05.2014

Пока сырой тестовый код: 


int pin2 = 2; //вход с приемника газ\тормоз
int pin1 = 3; //вход c приемника влево\право
int thrin;   // длина импульса с приемника газ\тормоз
int strin;   //длина импульса с приемника влево\вправо
int ledPin = 9; // контрольный пин шим (светодиод)
int throut;  // значение выхода на шим для вперед
int throutb; //значение выхода на шим для назад
int ledPin2 = 10; // выход шим на драйвер
int c=2; // степень замедления на нейтралке (чем больше тем быстрее остановится)
int c1=15; // Делитель для регулировки жесткости тормоза (чем меньше тем жестче)
int x=0;   // для системы переключения реверса
int y=0;    // для системы переключения реверса
int out=0;  // Значение для выхода на шим , для управления ходовыми двигателями.
int rtf=4; //реле вперед
int rtr=5; //реле назад
int rsl=6; //реле влево
int rsr=7; //реле вправо
int rout=2; // команда вперед 0 \назад 1 \ 2 тормоз парковка 
int routx=2; // для системы переключения реверса
int shrout; // длина импульса с приемника l\r
int shroutb; // длина импульса с приемника l\r
int l=0; //на всякий
int r=0; // На всякий

void setup()
{
  TCCR2B = TCCR2B & 0b11111000 | 0x01;  //переводим шим таймеры Mega's пинов 10 и 9 на частоту 31250гц ( чтобы не слышать писка от двигателей)
  Serial.begin(9600); //конфигурация последовательного порта для мониторинга 
  pinMode(pin2, INPUT); // установка порта на вход
  pinMode(pin1, INPUT); // установка порта на вход
  pinMode(ledPin, OUTPUT); // установка порта на выход
  pinMode(ledPin2, OUTPUT); // установка порта на выход
  pinMode(rtf, OUTPUT); // установка порта на выход
  pinMode(rtr, OUTPUT); // установка порта на выход
  pinMode(rsl, OUTPUT); // установка порта на выход
  pinMode(rsr, OUTPUT); // установка порта на выход
}
 void loop()
{
  thrin = pulseIn(pin2, HIGH, 50000); //считываем с приемника длину импульса газ\тормоз
  strin = pulseIn(pin1, HIGH, 50000); //считываем с приемника длину импульса влево\вправо
  if (thrin < 1135)   // Защита от потери связи, при значении газ\тормоз с приемника ниже 1135 вырубаем обе релюшки, что приводит к "тормоз в пол" 
  {
    digitalWrite(rtf, LOW); //Отключаем реле вперед
    digitalWrite(rtr, LOW); //отключаем реле назад
    out = 0; // выводим шим на 0
goto outsh;  // сразу переходим к выходу на шим 
}
  shrout = map(strin, 1510, 1930, 0, 255); //преобразование длины импульса в значение для шим left 
  shrout = constrain(shrout, 0, 255); // ограничение значения для шим в рабочем диапазоне 
  shroutb = map(strin, 1180, 1450, 255, 0); //преобразование длины импульса в значение для шим right 
  shroutb = constrain(shroutb, 0, 255); // ограничение значения для шим в рабочем диапазоне 
  
  throut = map(thrin, 1570, 1985, 0, 255); //преобразование длины импульса в значение для шим вперед  
  throut = constrain(throut, 0, 255); // ограничение значения для шим в рабочем диапазоне вперед
  throutb = map(thrin, 1180, 1510, 255, 0); //преобразование длины импульса в значение для шим назад   
  throutb = constrain(throutb, 0, 255); // ограничение значения для шим в рабочем диапазоне назад
  
  if (shrout > 100) //триггер на поворот влево
  {
    digitalWrite(rsl, HIGH); //вкл реле поворота влево
  }
  else 
  {
    digitalWrite(rsl, LOW); //откл реле поворота влево
  }
  if (shroutb > 100) //триггер для поворота вправо
  {
    digitalWrite(rsr, HIGH); // вкл реле поворота вправо
  }
  else 
  { 
    digitalWrite(rsr, LOW);// откл реле поворота вправо
  }
  
  if (x > throut) // эмуляция нейтралки и плавного тормоза
    { x = x - c - (throutb/c1); //расчет значения для выхода на шим 
    out = x; 
    routx = 0; // команда блоку реле реверса "вперед"
    }
   else
    { x = throut; //набираем ход
   out = x;
   routx = 0; //команда блоку реле реверса "вперед"
    }
  if ( x <= 0 )  //задний ход
     { if ( throutb > 0 )
     {
       routx = 1;
     out = throutb;    
     }
     }

if (routx == 0 && rout != routx) //Блок управления релюшками вперед\назад (блок реверса)
  {
    rout=routx;
    digitalWrite(rtr, LOW);
    delay(100);
    digitalWrite(rtf, HIGH);
  }
else 
if (routx == 1 && rout != routx)
  {
    rout=routx;
    digitalWrite(rtf, LOW);
    delay(100);
    digitalWrite(rtr, HIGH);
  }
else 
if (routx == 2 && rout != routx)
  { 
    rout=routx;
    digitalWrite(rtf, LOW);
    digitalWrite(rtr, LOW);
  }
outsh:
  analogWrite(ledPin, (constrain(out, 0, 255))); //выход шим
  analogWrite(ledPin2, (constrain(out, 0, 255))); //выход шим
  //Serial.print("   thrut="); // контролька 
  //Serial.print(shrout);       //контролька
  //Serial.print("   thrutb="); // контролька 
  //Serial.print(thrin);       //контролька
  //Serial.print("   rout = "); // контролька 
  //Serial.print(strin);       //контролька
  //delay(500);
}

 

BIOlinq
BIOlinq аватар
Offline
Зарегистрирован: 28.01.2014

В итоге проекта должно получится некое подобие BRUSHED ESC , только с более гибкой настройкой на Arduino :-)

 

tygra
Offline
Зарегистрирован: 03.05.2014

Если использовать такой готовый блок и сделать из рулевой серву, путем спаривания родного движка и сервопривода, то ардуина нафиг не нужна, можно управлять напрямую с пульта как RC моделью. На ардуину будет возложен еще ряд функций, например курсовой стабилизатор движения путем раздельного управления ходовыми движками, эмулятор диффиринциала, управление илюминацией, авто вкл\откл , стопиков, задний ход, поворотки. Систему ручного управления, то биш с педальки в самом авто, с системой аварийного управления с пульта ( паралельно, с более высоким приоритетом чем на самом авто,.. на всякий , все таки ребенок в машине). Ограничители скоростей, думается сделать экран и какое то подобие диагностики, поставить температурные дачтики на движки, токоограничители, некое подобие маршрутного компьютера, что то вроде сколько заряду осталось, нормальную зарядку и т.д. Что то скорее всего не сделаю, что то посчитаю лишним, а что то будет лень делать, поживем увидим. На данный момент работаю над подвеской и жду деталей с китая. После подвески, по плану, установка потенциометра в рулевое, подключение его к ардуине и "замутить" мощную серву, а далее видно будет, скорее всего доработка света, жду мощные светодиоды в головной и кучка мелких сверхярких вокруг... Если к тому моменту у дочери желание не пропадет на ней ездить, то будем дальше думать ...

P\S  К моделям контроллеры есть программируемые, их можно отстроить так как нужно.

P\P\S Кстати приемник работает от 5в. с платы ардуины. К тому что где то тут на форуме про вертолет говорилось что приемник от 5в. работает не стабильно, вернее ардуина не стабильно читает длину импульса, у моем случае приемник по паспорту от 4в. и до 8 что ли, в общем стабильно работает без дополнительного питания.

P\P\P\S Возможно на следующий год приобрету нормальные движки, 3х фазные с контроллерами по 40000 об. каждый. Пока что два таких комплекта дороговаты для меня, да и собственно пока и не нужно, скорости хватает пока что. Вот если чаду захочется ездить побыстрее и увижу что ей "можно" побыстрее, то сильно подумаю : )))