FrSky 2.4GHz FHSS, новый игрок на рынке 2.4ГГц

HATUUL
Musgravehill:

Данные потекли!

Если не секрет,можно поодробней,про схему и прогу?

Musgravehill
HATUUL:

Данные потекли! Если не секрет,можно поодробней,про схему и прогу?

rcopen.com/forum/f4/topic186091/1702 - вот код для приема данных из ВЧ-блока.

Экран WH-1602(a,b,c,d)-“буква” (Winstar). Если буква N - без подсветки! www.winstar.com.tw/products_detail_ov.php?ProID=98… - маркировка ЖКИ. Если хотите таблицу русских\английских символов, берите с кодом “CT”. В ардуинку загружается библиотека LiquidCrystal, экран подключается по 4х-битной схеме. Если будете включать светодиодную подсветку, то не забудьте про балластные резисторы!

Вывод символов на экран - по примеру из библиотеки LiquidCrystal. Шкала - отрисовка собственных символов, как описано robocraft.ru/blog/arduino/503.html Я вычисляю количество “полных блоков 5*8 пикселей”, остаток дает единственный “1*8”, “2*8”, “3*8”, “4*8” блок.
Например, на картинке для RSSI 5 полных блоков и один “4*8” блок. Для напряжения - 2 полных блока и один “1*8”.

Код для приема данных и код для вывода на экран конфликтует по пину D2, нужно изменить. Также я подключил ногу Vo контраста на ШИМ вместо делителя 10кОм: int ledPin = 9; analogWrite(ledPin, 100);//V0 contrast.

/*
  LiquidCrystal Library - Serial Input

 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.

 This sketch displays text sent over the serial port
 (e.g. from the Serial Monitor) on an attached LCD.

 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)


 
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ledPin = 9; //я подключил ногу Vo контраста на ШИМ вместо делителя 10кОм.
int rssi = 102;
int rssilevel =0;
int rssilevelblock=0; //количество блоков в шкале rssi
int rssileveldrob=0; //количество палок в неполном блоке 0..5  rssi
float volt = 9.01;
int vlevel = 0;
int vlevelblock=0; //количество блоков в шкале
int vleveldrob=0; //количество палок в неполном блоке 0..5
int vl=0;
/* Описываем наши собственные символы в виде массивов битовых масок.
 * Каждый символ - это восемь масок по пять бит.
 */
enum { SYMBOL_HEIGHT = 8 };
byte block[SYMBOL_HEIGHT] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte one[SYMBOL_HEIGHT] =
{
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000
};
byte two[SYMBOL_HEIGHT] =
{
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000
};
byte three[SYMBOL_HEIGHT] =
{
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100
};
byte four[SYMBOL_HEIGHT] =
{
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110
};

void setup(){
    // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  /* Регистрируем собственные символы с кодами 0, 1 и 2 */
  lcd.createChar(0, block);
  lcd.createChar(1, one);
  lcd.createChar(2, two);
  lcd.createChar(3, three);
  lcd.createChar(4, four);
  analogWrite(ledPin, 100);//V0 contrast

  lcd.setCursor(0, 0);
  lcd.print("R ");
  lcd.setCursor(0, 1);
  lcd.print("V ");
}

void loop()
{




    ///test

   if (volt<=12.2)
    {
      volt = volt+0.01;
      delay(300);
    }
    if (volt>12) {volt=9;}


    if (rssi<=256)
    {
      rssi = rssi+3;
      delay(300);
    }
    if (rssi>256) {rssi=0;}
    //end test





    ///////////шкала вольтажа////////////////////////////////////////////////////

    //рисуем пустые клетки вольтажа
    vl=2;
    while (vl<16)
    {
      lcd.setCursor(vl, 1);
      lcd.print(" ");
      vl++;
    }

    vlevel      = map(volt*1000, 9000, 11900, 0, 4000);  //9-12V  0-4 000 palok
    vlevelblock = vlevel/500; //целых блоков 0..8
    vl=0;
    while (vl<vlevelblock) //рисуем блоки
    {
      lcd.setCursor(vl+8, 1);
      lcd.write(0); //our byte-char number 0
      vl++;
    }
    //узнаем, сколько палочек в недостающем блоке
    vleveldrob = (vlevel - vlevelblock* 500)/100;
    lcd.setCursor(vlevelblock+8, 1); //поставили курсор в первую чистаю клетку
    if (vleveldrob==1) {  lcd.write(1);  }
    else if (vleveldrob==2) {  lcd.write(2);  }
    else if (vleveldrob==3) {  lcd.write(3);  }
    else if (vleveldrob==4) {  lcd.write(4);  }


    ///////////шкала RSSI////////////////////////////////////////////////////
    //рисуем пустые клетки RSSI
    vl=2;
    while (vl<16)
    {
      lcd.setCursor(vl, 0);
      lcd.print(" ");
      vl++;
    }

    rssilevel      = map(rssi*100, 0, 25600, 0, 4000);  //0-256  0-4 000 palok
    rssilevelblock = rssilevel/500; //целых блоков 0..8
    vl=0;
    while (vl<rssilevelblock) //рисуем блоки
    {
      lcd.setCursor(vl+8, 0);
      lcd.write(0); //our byte-char number 0
      vl++;
    }
    //узнаем, сколько палочек в недостающем блоке
    rssileveldrob = (rssilevel - rssilevelblock* 500)/100;
    lcd.setCursor(rssilevelblock+8, 0); //поставили курсор в первую чистаю клетку
    if (rssileveldrob==1) {  lcd.write(1);  }
    else if (rssileveldrob==2) {  lcd.write(2);  }
    else if (rssileveldrob==3) {  lcd.write(3);  }
    else if (rssileveldrob==4) {  lcd.write(4);  }


    lcd.setCursor(2, 0);
    lcd.print(rssi);
    lcd.setCursor(2, 1);
    lcd.print(volt);


}
HATUUL

Спасибо попробую.А левел конвертер надо ставить?

Musgravehill
HATUUL:

левел конвертер надо ставить?

Не надо.
Я любительским вольтметром измерил переменное напряжение на TX пине ВЧ-блока, показало 4.68 В.
Вообще, я беру данные из ВЧ-блока в Ардуино (ее TTL 0…5В). А из Ардуины ничего не отправляю в ВЧ-блок. В мануалах не нашел, сколько вольт можно подать на RX ВЧ-блока.

Насчет приемника - прочитал, что ему нужно 0~3.3В по каналу пользовательских данных. В А1, А2 вроде тоже только 3.3В (на выходных смогу измерить выход телеметрийного делителя напряжения, который приехал с ХК).

HATUUL

Страно.Пощупал осцилографом значения пляшут на ТХ от -5 до +5.Думаю мах323 стоит поставить.
О.Побежали цыферки через Турнигу 9х.😁
Кажется тоже в попугаях.Правда вешал через 323 по этой схемке.

Musgravehill
HATUUL:

ТХ от -5 до +5

Я читал об этом на рц-гроупс. Автор писал, что там “настоящий” RS232 ±Vdd, поэтому требуется shifter для получения 0…Vdd. Также сигнал инвертированный, но библиотека Ардуино умеет инвертировать сигнал. Схема шифтера+инвертора показана в манулах, но я обошелся куском провода вместо нее. Похоже, для Ардуинки -5В = “0”, +5 =“1”.

Игорь_Лытнев
Musgravehill:

Я читал об этом на рц-гроупс. Автор писал, что там “настоящий” RS232 ±Vdd, поэтому требуется shifter для получения 0…Vdd. Также сигнал инвертированный, но библиотека Ардуино умеет инвертировать сигнал. Схема шифтера+инвертора показана в манулах, но я обошелся куском провода вместо нее. Похоже, для Ардуинки -5В = “0”, +5 =“1”.

Я диод последовательно ставил , потому как -5 не есть хорошо. Беда Ардуино что доку на камень внимательно читать не надо , а там, на входе, диод на массу , и какой у вас потечет ток зависит в основном от сопротивления выхода , в данном случае видимо китайцы ток как то ограничили , и вам повезло , но я бы не рисковал и добавил резстор и (или) диод .

Musgravehill
Игорь_Лытнев:

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

Можно подробнее? Что может сгореть - ардуинка или ВЧ-блок?

kuznetsovin

Добрый вечер всем, в ответ на пост 1044… Попрытался тоже использовать телеметрийный комплект от фриская. Использовал графический дисплей от моторолы Т190 интерфейс I2C проц в базе мега32, на сборе мега8535, применяю на лодке, соответственно датчики для этого. Из общих функций: отсечка по напряжению, израсходованной емкости, превышению температуры, таймеру. Индикация по выбору что нужно… общий вид на фото. Буду рад любой критике, замечаниям, пожеланиям и т.п…

Musgravehill
kuznetsovin:

Из общих функций

впечатляет!

kuznetsovin:

на сборе мега8535

В смысле, Мега собирает данные с датчиков и отдает в приемник? У вас получается на выходе ВЧ-блока FE-FD-длина слова-NU-byte1-…-byte6-FE? В байт 1-6 заданном порядке пишете указатель начала, значения параметров, указатель конца? С какой скоростью можно лить данные в приемник?

Игорь_Лытнев
Musgravehill:

Можно подробнее? Что может сгореть - ардуинка или ВЧ-блок?

В даташите на меги радел " Absolute maximum ratings" сказано:

Напряжение на любом выводе кроме RESET,
по отношению к земле …- 0,5 В до VCC +0,5 В

Что стоит на выходе ВЧ блока я не помню но думаю врядли правильно его ч.з. диод(см схему входа меги) на массу садить.

Pav_13

В приемник свои байты надо подавать на скорости 9600 никак их не оформляя - приемник сам сформирует из них пакет… Причем, если подавать в приемник, например, по 6 байт, то совсем не обязательно все шесть будут приходить одним пакетом… Может в одном пакете прийти 1 байт, а оставшиеся 5 в следующем пакете… Логику, по которой приемник передает пользовательские байты я до конца не понял… Это создает трудности при “декодировании” данных на приемной стороне…
Пока все, что могу сказать… Если кто знает больше - делитесь!

Игорь_Лытнев
Pav_13:

Логику, по которой приемник передает пользовательские байты я до конца не понял… Это создает трудности при “декодировании” данных на приемной стороне

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

kuznetsovin

Добрый день, к посту 1715: да, все верно мега 8535 собирает данные с датчиков, у меня 4-температуры-(датчики TMP36), ток-(датчик ACS754-100А), напряжение-(обычный делитель), 2-тахометра на INT0, INT1 висят-(оптрон H11L1 подключен в БК-регуляторе). Все собранное по уарту идет в приемник по известному протоколу на скорости 9600. Из шести пользовательских байтов у меня первый это указатель остальные мои данные. Мой полный кадр 15байт, в приемник пихать нужно с такой частотой чтобы битовая скорость (общаяя) была не больше 1200 (в протоколе в конце это отмечено). К посту 1717, да действительно как вы и написали такое есть что не всегда в юзерском пакете шесть байт, я тоже не знал что это за косяки при приеме, но поступаю просто: если на приеме не шесть байт, то этот кадр игнорирую. К посту 1716: с ВЧ-модуля выходит сигнал с обычного драйвера RS232, то есть он инвертированый с меняющейся полярностью, вполне достаточно поставить транзистор n-p-n перед приемным контроллером, как в схеме где описан протокол, или поставить драйвер ST232 к примеру, что я и сделал…

Pav_13
kuznetsovin:

если на приеме не шесть байт, то этот кадр игнорирую.

Поступил так же 😛… Если данные повторяющиеся, то - ничего страшного…
Спасибо за разъяснение по поводу битовой скорости, а то переводил-переводил - так и не понял, к чему это 😦? В моей программке “запихивается” по 6 байт 10 раз в секунду… как я понял - это далеко до предела…
В протоколе еще описаны тонкости обращения с данными, если они равны 7E или 7D… Тоже до конца не сообразил, поэтому пока тупо меняю такие значения на 7F… Но такой фокус можно проделывать не со всякими датчиками… Если можете пояснить что-нибудь по этому поводу - буду благодарен!

Musgravehill
kuznetsovin:

с ВЧ-модуля выходит сигнал с обычного драйвера RS232, то есть он инвертированый с меняющейся полярностью, вполне достаточно поставить транзистор n-p-n перед приемным контроллером, как в схеме где описан протокол, или поставить драйвер ST232 к примеру, что я и сделал…

Транзистор только инвертирует, но не сдвигает? Подскажите, пожалуйста! Инвертирование я успешно делаю программно. Но в Ардуинку идет -5 +5В, а хотелось бы 0…5В. Последовательно поставить диод? (рассматриваем только прием данных в Ардуинку из ВЧ-блока)

Игорь_Лытнев

Диод с резистором это минимум , для любителей экономить , транзистор лучше (он вам и проинвертирует), а еще лучше преобразователь уровня , но но в данном случае преобразователь уровня IMHO слегка излишество , но если бы делал не для себя а для промышленного применения то преобразователь уровня поставил бы обязательно. Транзистор IMHO самый оптимальный вариант , пример есть в описании протокола www.frsky-rc.com/…/20100921121837352.pdf только в вашем случае VCC = 5V

Musgravehill

По-моему, это самое простое. Сдвиг на диоде. Инвертирую программно.

Игорь_Лытнев
Musgravehill:

По-моему, это самое простое. Сдвиг на диоде. Инвертирую программно.

Самое простое для выполнения требований DS , но отсутствует какая либо защита.
Желателно добавить резистор между TX и диодом (ом 300 -500) и резистор между RX и GND (1-10К)

Pav_13:

Сделайте, как здесь forum.rcdesign.ru/…/attachment....6&d=1291153777

Почти правильная схема , не хватает резистора с базы T2 на массу

Первая схема будет работать с фрискаем но если воткнуть в полноценный сом порт ±12 сгорит а при ±3 работать не будет , вторая свободна от этих недостатков

Pav_13

Между входом RX и GND должен быть резистор в несколько КОм… На высокоомном входе можно получить неустойчивый “0”…

Игорь_Лытнев:

не хватает резистора с базы T2 на массу

Я тоже предпочитаю ставить резисторы с базы на корпус, особенно в тех случаях, когда устройство может эксплуатироваться с не подключенным входом…
Автор схемы, наверное, не планировал использовать свой модуль без подключения к источнику данных… Поэтому посчитал резистор ненужным 😉