YaBB - Yet another Bulletin Board
   YaBB - Yet another Bulletin Board  



Добро пожаловать, Гость. Пожалуйста, выберите Вход или Регистрация
 

  ГлавнаяСправкаПоискВходРегистрация Закладки  
 
Страниц: 1 ... 6 7 [8] 
Указатель воздушной скорости "Своими руками" АРДУИНО (Прочитано 14850 раз)
sun
Старейший участник
*****
Вне Форума


Я люблю строить самолеты!

Сообщений: 1927
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #210 - 11.01.18 :: 09:10:26
 
лукич писал(а) 11.01.18 :: 08:15:25:
Если есть сырые данные АЦП с этого датчика в диапазоне -10+10, делитесь.

По моим очень грубым пркидкам, уход нуля в режиме УС более 1 км/ч на градус. Проверял выставляя устройство на балкон. Датчик аналоговый MPX 5004
Наверх
 
 
IP записан
 
Alex_Kaz
Full Member
****
Вне Форума


Вечный студент

Сообщений: 160
Пермь
Пол: male
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #211 - 11.01.18 :: 13:24:22
 
Цитата:
val1 = analogRead(mpxv);               // чтение аналогового датчика скорости
  val1 = map(val1, StartADC, StartADC+180, 0, 180);   // перевод диапазона числа АЦП в диапазон углов отклонения
  dps.getAltitude(&Altitude);            //получение данных о высоте с датчика BMP085
  val2 = (Altitude - Alt_0)/ 100;        //
  val2 = map(val2, 0, 500, 0, 180);      //  перевод диапазона высот в диапазон углов отклонения
  myservo1.write(180-val1);              // инвертируем отклонение, что бы с лево на право
  myservo2.write(180-val2);              //

лукич писал(а) 31.12.17 :: 08:27:14:
> А что так много жрет-то? Там что маленький кипятильник встроен? Жрёт много похоже потому ,что сервы напрямую подкинуты. Надо с резюками играть. 


>analogRead

ШИМ экономнее прямой подачи тока на движок, наверное у Вас как раз ШИМ. Также библиотека CyberLib экономит итерации, а значит и батарею, но за счёт задействования одного таймера в МК.

Кстати, по-умолчанию, этот код ставит сервы в угол 100 раз в секунду. Не слишком много? М.б. хватит и 5-10, и двигать сервы только по достижению счётчиком значения 10-20?
Наверх
 

Интересы CalculiX, Maxima, Scilab, динамика
 
IP записан
 
лукич
Senior Member
****
Вне Форума


Я люблю строить самолеты!

Сообщений: 373
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #212 - 11.01.18 :: 17:07:33
 
Да для серв использовано ШИМ (даже не рассматривал другой способ управления).

По поводу оптимизации кода  не спорю.
Не думаю что будет большая разница в потреблении если операции записи в регистры заменить операциями сравнения,( вы наверное от этом)
   Пока сервы неподвижны потребление 70 мА
   При движениях потребление возрастает до 200мА при одной серве и до 300мА с гаком при работе 2х серв,зависит от характера  работы моторов. Трудно заставить на  столе изменяться одновременно и скорость и высоту, дуть и втягивать воздух одновременно не получается.
    Благо приспособу придумал для фиксации давления, так хоть указатель скорости по УС нормально тарировать получилось.
Наверх
 
 
IP записан
 
лукич
Senior Member
****
Вне Форума


Я люблю строить самолеты!

Сообщений: 373
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #213 - 11.01.18 :: 17:10:17
 
кстати цикл программы получился порядка 100-150мс, так что около 10ти раз в секунду корректировка и проходит.
Наверх
 
 
IP записан
 
Alex_Kaz
Full Member
****
Вне Форума


Вечный студент

Сообщений: 160
Пермь
Пол: male
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #214 - 11.01.18 :: 18:38:16
 
Можно добавить некоторую погрешность чтобы не дёргать сервы  постоянно.
Нечто вроде
If (abs(val1-val1_предыдущее)>delta) {
     myservo1.write(180-val1);
}
If (abs(val2-val2_предыдущее)>delta ) {
     myservo2.write(180-val2);
}

По-моему вот тут может теряться точность
Цитата:
val2 = (Altitude - Alt_0)/ 100;        //
  val2 = map(val2, 0, 500, 0, 180);      //  перевод диапазона высот в диапазон углов отклонения


Не знаю, есть ли смысл переписать в таком виде?
Цитата:
val2 = Altitude - Alt_0;        // здесь Alt_0 в 100 раз больше
val2 = map(val2, 0, 50000, 0, 180);      //

или
Цитата:
val2 = map(Altitude - Alt_0, 0, 50000, 0, 180);      // здесь Alt_0 в 100 раз больше
Наверх
 

Интересы CalculiX, Maxima, Scilab, динамика
 
IP записан
 
sun
Старейший участник
*****
Вне Форума


Я люблю строить самолеты!

Сообщений: 1927
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #215 - 11.01.18 :: 19:14:24
 
лукич писал(а) 11.01.18 :: 17:07:33:
При движениях потребление возрастает до 200мА при одной серве и до 300мА с гаком при работе 2х серв,зависит от характера  работы моторов.

Купите маленькие сервы, вам же ими не рули ворочать.
Наверх
 
 
IP записан
 
лукич
Senior Member
****
Вне Форума


Я люблю строить самолеты!

Сообщений: 373
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #216 - 12.01.18 :: 11:02:46
 
val2 = (Altitude - Alt_0)/ 100;   - это перевод в метры

Для индикации на стрелке, вполне пойдёт.

Для вычислений вариометра использовал чистый высоту в сантиметрах:

пока код такой:



  //ПОЛУЧЕНИЕ ДАННЫХ, первичная обработка
  val1 = filter_acp(analogRead(mpxv));   // чтение аналогового датчика скорости с фильтрацией
  //0 536|40 544|50 55|60 567|70 583|80 596|90 610|100 632//536-10:
  // Serial.print (val1-StartADC);Serial.print("\t");
  dps.getAltitude(&Altitude);            //получение данных о высоте с датчика BMP085 
  val2 = filter_bmp(Altitude);
 
  //ОБРАБОТКА ДАННЫХ с датчиков для индикации
    //скорость
   //val1 = 40.59*log(val1-StartADC)-87.76;// 0-180 10гр  10км/ч
   // val1 = 55.77*log(val1-StartADC)-118.6;// 0-120 15гр  10км/ч
    val1 = 129.8*log(val1-StartADC)-447.3;// 50-110 30гр  10км/ч
   //val1 = map(val1, StartADC, StartADC+180, 0, 180);

    // вариометр скорость подьёма/спуска в spid_val2
  IntVar_IN = IntVar_IN + val2;
  ivar++ ; 
  if ( ivar == 10)
     {
      ivar = 0;
      IntVar_IN = IntVar_IN/10;
      spid_val2 = (IntVar_IN - IntVar_OUT)/165;   // скорость в м/с где 183 время между обращениями к данной строке милисикунд 
      //Serial.print(millis());Serial.println("\t");
      //Serial.print(spid_val2);Serial.println("\t");         
      IntVar_OUT = IntVar_IN;
      IntVar_IN = 0;
      
      // настройка индикации
       if (spid_val2 > 0)  //определение тендендции изменения высоты
        {
          on_redD  = 0;       // выключене светодиода противопольжного направления 
          on_grinD = 1;                
         }
       else
        {
          on_grinD = 0;
        }
      if (spid_val2 <=-1)  //определение тендендции изменения высоты
        {
          on_grinD = 0;  // выключене светодиода противопольжного направления                
          on_redD  = 1;
         }      
      else
        {
          on_redD = 0;
        }      
       }
   
   //высота в м ,преобразование для угла поворота на 180 для 600м
    val2 = val2/100;
    val2 = map(val2,0,600,0,180);

  //ВЫВОД ДАННЫХ 
  //стрелочные индикаторы
     myservo1.write(180-val1);              // инвертируем отклонение, что бы с лево на право
     myservo2.write(180-val2);               //
  //порт
  // Serial.print (val1);Serial.println("\t");
 
  //светодиодная индикация 
   if (val1<30)                    //условие включения сигнализатора ОПАСНОСТЬ,скорость меньше 60км/ч   
    { on_Alarm = 1;}
   else
    { on_Alarm = 0;}                            
      
if ( timer01 == t_timer)   //таймер мигания диодов
   {
      if (on_redD)
      {
        if (Flag_redD)
         {
          digitalWrite(redD,LOW);
          Flag_redD = 0;
         }
        else
         {
          digitalWrite(redD,HIGH);
          Flag_redD = 1;
         }
       } 
      else  digitalWrite(redD,LOW);
     if (on_grinD)
      {
        if (Flag_grinD)
         {
          digitalWrite(grinD,LOW);
          Flag_grinD = 0;
          }
        else
         {
          digitalWrite(grinD, HIGH);
          Flag_grinD = 1;
          }
      }         
      else  digitalWrite(grinD,LOW);
      
      if (on_Alarm)
      {
        if (Flag_Alarm)
         {
          digitalWrite(Alarm,LOW);
          Flag_Alarm = 0;
          }
        else
         {
          digitalWrite(Alarm, HIGH);
          Flag_Alarm = 1;
          }
      }         
      else  digitalWrite(Alarm,LOW);
      
      timer01 = 0;
   }
 
  timer01++;
   

  // КНОПКА
   if (digitalRead(knop) == HIGH) // кнопка нуля высоты
   {
   uroven0(); 
   delay(500);
   }

}
Наверх
 
 
IP записан
 
лукич
Senior Member
****
Вне Форума


Я люблю строить самолеты!

Сообщений: 373
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #217 - 12.01.18 :: 11:04:30
 
...сервы самые дешманские и лёгкие какие видел (9G). Если известны другие в широком доступе то в студию пожалуйста
Наверх
 
 
IP записан
 
sun
Старейший участник
*****
Вне Форума


Я люблю строить самолеты!

Сообщений: 1927
Re: Указатель воздушной скорости "Своими руками" АРДУИНО
Ответ #218 - 12.01.18 :: 15:22:31
 
лукич писал(а) 12.01.18 :: 11:04:30:
...сервы самые дешманские и лёгкие какие видел (9G). Если известны другие в широком доступе то в студию пожалуйста

Пардоньте, я думал у Вас что-то мощное...
Наверх
 
 
IP записан
 
Страниц: 1 ... 6 7 [8]