формирование PPM

vasia
Offline
Зарегистрирован: 07.11.2013

Есть желание управлять при помощи одного канала (например 8-го) на 8-канальной аппаратуре несколькими нагрузками.

Для этого:

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

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

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

toc
Offline
Зарегистрирован: 09.02.2013

конспект лекций опубликуйте. 

или описание изделия на человеческом языке. 

vasia
Offline
Зарегистрирован: 07.11.2013
Вот нарыл скетч.http://hobby.msdatabase.ru/project-updates/theresultsofoursurvey/modesw С помощью которого я смогу реализовать часть своего проекта. Суть устройства такова: имеется 5 кнопок, в зависимости от того какая кнопка была нажата на "выходном пине"формируется ШИМ определенной длительности от (0 до 255)Проблема - не могу понять как работает програмка. Запутался в циклах, когда какой заканчивается а другой начинается... 
Ну и переменная "i" то ли внутри 2 циклов обьявлена, то ли она глобальная для всех сразу....
/*
s1 - s5 & LEDS connected to analog pins 1-5
its numbers from 14 to 18
 

*/ 
 
#define AnalogOut 10 // PWM out
 
int SelBtn = 14; // default 
int BtnLevels[19];
  

void setup()
{
  
Serial.begin(9600);

//5 of 6 modes

BtnLevels[14] = 0; // 1 кнопка
BtnLevels[15] = 84;
BtnLevels[16] = 127;
BtnLevels[17] = 169;
BtnLevels[18] = 255; // 5 кнопка
  
  
//force pwm
TCCR1B = 0x01;
delay(100);  
  
pinMode(SelBtn, OUTPUT);
digitalWrite(SelBtn,0);
analogWrite (AnalogOut, BtnLevels[SelBtn]);
 
}
void loop()
{
ScanBtns();
delay(10);
}
 

void ScanBtns()
{
for  (int i=14; i <= 18; i++)
     ScanBtn(i);
}
 

void ScanBtn(int ScanPin)
{
if (SelBtn != ScanPin)  
{
pinMode(ScanPin, INPUT);
 
if (digitalRead(ScanPin)==0)
  {
      SelBtn = ScanPin;
      unsetOther(ScanPin);
      while (digitalRead(ScanPin)==0); // hold scaning until relise button
      pinMode(ScanPin, OUTPUT);
      digitalWrite(ScanPin,LOW); 
 

  }
}
}
 
 
 
void unsetOther(int excludePin)
{
for  (int i=14; i <= 18; i++)
    {
    if (i != excludePin) 
        pinMode(i, INPUT); 
        digitalWrite(i,HIGH);  
    }  
 
analogWrite (AnalogOut, BtnLevels[excludePin]);
Serial.println(BtnLevels[excludePin]);   
}

 

ПростоСерега
Offline
Зарегистрирован: 05.12.2013

toc пишет:

конспект лекций опубликуйте.

или описание изделия на человеческом языке. 

vasia, в самом деле, перепишите подробней и яснее первый пост, тогда есть вероятность что вам помогут. Просто люди которые далеки авиамоделизма, уверен, не понимают что вы хотите сделать, как именно, и зачем это вообще нужно. Я то вас сразу понял, так как бьюсь сейчас над похожей проблемой (пытаюсь заставить ардуину передавать сигнал через в\ч модуль Turnigy 9x в обход пульта управления), но помочь к сожалению не могу ничем.

vasia
Offline
Зарегистрирован: 07.11.2013

Попробую яснее сформулировать задачу, параллельно упростив ее.

Делаю усттройство дистанционного управления. Устройство должно дискретно (вкл/выкл) включать несколько нагрузок.

Передатчик: высокочастотный передатчик возьмем готовый, поэтому интересует только устройство формирующее ШИМ сигнал фиксированной длительности (0-255мкс). Допустим имеем 5 кнопок, принажатии на которые устройство выдает ШИМ фиксированной длительности 1я-0; 2ая-84; 3я-127; 4ая-169; 5ая-255. Причем при нажатии кнопки включается соответствующий светодиод, который горит и после отпускания кнопки ( длительность ШИМ не изменяется пока не будет нажата следующая кнопка)

На самом деле устройство передатчика выглядит иначе, и arduino подключается к типовому модельному передатчику, вместо делителя напряжения, и при помощи длительности ШИМ имитирует  аналоговый сигнал (напряжение снимаемое с переменного резистора) но не суть...... 

На принимающей стороне имеем: приемник ВЧ(берем типовой поэтому не суть) "декодер" длительности ШИМ который, в зависимости от длительности  ШИМ импульса будет подавать "0" на соответствующий выход Arduino ,  например  0- 13Pin; 84- 12 Pin; 127- 11Pin;

255- 9Pin. Ну и соответственно выходы подключаются к базам  силовых ключей управляющих соответсвующей нагрузкой.

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

Клапауций
Offline
Зарегистрирован: 10.02.2013

попробуй пилить библиотеку IRremote на эту тему

a5021
Offline
Зарегистрирован: 07.07.2013

vasia пишет:

устройство формирующее ШИМ сигнал фиксированной длительности (0-255мкс). Допустим имеем 5 кнопок, принажатии на которые устройство выдает ШИМ фиксированной длительности 1я-0; 2ая-84; 3я-127; 4ая-169; 5ая-255.

Длительность 0мкс это отсутствие колебаний вообще. Вам точно такое на первой кнопке надо? То, как вы описали сигналы, характеристикой шима является весьма своеобразной. Импульсы длительностью 127мкс можно формировать с любой частотой ниже 7874 Гц. Например, единственный импульс длительностью 127мкс раз в четыреста тысяч лет тоже подходит под ваши требования. Сформулируйте условия более четко.

pyro
Offline
Зарегистрирован: 24.11.2012
ПростоСерега
Offline
Зарегистрирован: 05.12.2013

Попробую за топикстартера сформулировать, только давайте сначала и попорядку. У нас есть аппаратура радиоуправления, которая состоит из пульта управления, передающего высокочастотного модуля в него встроенного, и собственно приемника. Механика следующая: когда приемник и передатчик включены, пульт управления, в зависимости от состояния стиков, тумблеров и кнопок, генерирует ppm сигнал, и передает его на высокочастотный передатчик (фопросы радиосвязи тут опустим), далее приемник принимает, расшифровывает сигнал, и выдает нужные ppm на сервомашинки, двигатели, регуляторы и т.д.

Что мы хотим (в идеале):

1) Чтобы ардуина могла генерировать полноценный "родной" ppm сигнал пульта управления програмно. Другими словами, нужно подключить микроконтроллер напрямую к в/ч модулю, так, чтобы на "том конце" разницы не было.

2) Чтобы ардуина могла читать полноценно родной сигнал передатчика будучи подключенной к приемнику, и уже програмно, в зависимости от настроек, рулить сервами и управлять двигателями и т.д.

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

Без него, я не смогу программно генерировать сигналы, так как тупо не знаю что генерировать, а топикстартер не сможет управлять нагрузками через 8й канал, так как не знает конкретных параметров 8го канала.

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

vasia
Offline
Зарегистрирован: 07.11.2013

Ну задачу я вообщето сформулировал немного по другому. Значительно упростив ее по сравнению с той которую ставите вы. Плюс у вас в постановку вкралось несколько неточностей.

- приемник принимает PPM  сигнал, но на сервы и т.д. выдает уже не PPM , а прогнав ППМ через декодер разлагает его на отдельные так сказать импульсы-  ШИМ сигнал так сказать.  Ну и соответсвенно у нас не стоит задача декодировать ППМ пачку. Нам нужно только измерять длину импулса одиночного ШИМ сигнала. котрый мы будема получать уже выделенный приемником из ППМ пачки.

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

"  analogWrite   не просто выдаёт логический ноль или единицу на заданный пин, а выдаёт на него ШИМ-сигнал (PWM signal). То есть, пин начинает очень быстро (32 000 раз в секунду) переключаться между 0 и 5 вольтами и если подключить к такому пину светодиод, создастся иллюзия, что он горит в пол силы.Функция analogWriteпринимает 2 аргумента: пин, о котором идёт речь и значение скважности. Значение скважности — это целое число от 0 до 255, которое определяет отношение длительности ступеньки в 0 В к длительности ступеньки в 5 В. "

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