[image]

Уроки программирования Arduino

Перенос из темы «Чайные радиоэлектронные вопросы»
 
1 2 3 4 5 6 7 8 9
+
-
edit
 

Mishka

модератор
★★★
JackSmith> т.е. каждому участнику выдаются маячки, что-то вроде bluetooth маячков Beacon, при прохождении конрольной линии они считываются, идентифицируются
Не работает. Слишком много сразу и слишком быстро проходят. Бывает, что толпа человек в 30 может меньше, чем за секунду проскочить. Т.е. дёшево не получилось у многих. Да даже и дорогое, которое для триатлонов дают — не успевает сработать. В критериумах существенно группа, а в спринте (когда решают критериум спринтом) бывает, что всё полотно занимают по ширине. Если на треке, то у нас ширина метров 15, а, если н улице, то ширина 4-5-6 полосной дороги.
   37.037.0
Если сразу много, то лучше наоборот, принимать сигнал спортсменами, грубо говоря, передатчик выдает псевдослучайную последовательность, как приемник спортсмена поймал часть её, передает спокойно, с арбитражом, на центральный пост. Там коррелятор определяет, какую часть последовательности принял приемник спорстмена и из этого высчитывает время пересечения отметки.
   42.042.0

Mishka

модератор
★★★
GOGI> Если сразу много, то лучше наоборот, принимать сигнал спортсменами, грубо говоря, передатчик выдает псевдослучайную последовательность, как приемник спортсмена поймал часть её, передает спокойно, с арбитражом, на центральный пост. Там коррелятор определяет, какую часть последовательности принял приемник спорстмена и из этого высчитывает время пересечения отметки.

Я честно не знаю, как откалибровать датчики так, чтобы разница в 1 см была существенна. Вот на последней гонке по фотофинишу ровно одна покрышка в 23 мм была разница. Почему и хочу камеру на 120-240 кадров в секунду с нормальным разрешением. Но они уже дорогими получаются.
   37.037.0
GB JackSmith #10.11.2015 02:52  @Валентин_НН#09.11.2015 20:47
+
-
edit
 

JackSmith

втянувшийся

В.Н.> а что это за маяки? чё-то я сомневаюсь, что таким методом получишь требуемую точность


Там используется трилатерации для определения координат. Измеряется мощность сигнала и по нему высчисляется растояние. Далее определяются координаты как пересечение векторов. Чем больше маяков, больше точность. В данном случае каждый человек на пути между приемником и передатчиком будет вносить искажения Т.е. для "чистой" работы маяки должны раполагаться сверху, этаким куполом.

здесь можно почитать про маяки:

Навигация в помещениях с iBeacon и ИНС

  Представьте, что перед вами поставили задачу по реализации навигации внутри помещений. Соответственно, GPS/Глонасс и тому подобные системы спутниковой... // habrahabr.ru
 
   27.027.0
RU Валентин_НН #10.11.2015 08:24  @JackSmith#10.11.2015 02:52
+
-
edit
 

Валентин_НН

литератор
★★★
В.Н.>> а что это за маяки? чё-то я сомневаюсь, что таким методом получишь требуемую точность
JackSmith> Т.е. для "чистой" работы маяки должны раполагаться сверху, этаким куполом.
Если Мишка реализует эту систему, то в их провинциальный клуб очередь будет стоять на соревнования. Ещё бы - такой хайтек
   
RU Валентин_НН #10.11.2015 08:27  @Mishka#10.11.2015 01:48
+
-
edit
 

Валентин_НН

литератор
★★★
Mishka> Почему и хочу камеру на 120-240 кадров в секунду с нормальным разрешением. Но они уже дорогими получаются.

А дорого это сколько? У вас ведь в клуб и какой-то мульти миллионер входит?
   
Mishka> Я честно не знаю, как откалибровать датчики так, чтобы разница в 1 см была существенна.
Не, с такой точностью в любительских условиях нереально :)
   41.041.0
US Mishka #10.11.2015 20:18  @Валентин_НН#10.11.2015 08:27
+
-
edit
 

Mishka

модератор
★★★
В.Н.> А дорого это сколько? У вас ведь в клуб и какой-то мульти миллионер входит?

Миллионер входит сюда, а гонки проводит эта организация. И там есть особенности, т.к. первая non-profit, а вторая чисто спортивная в цепочке USA Cycling/UCI. И там просто так не получается денег взять. Надо много бумаг. Поэтому всё идёт на регистранционных взносах, которые очень небольшие, т.к. хотим сохранить массовость, и из них же надо отчислять наверх, выплачивать выигрышные, выплачивать официалам.

Дорого — это несколько тысяч долларов и до досятков, если говорить о скоростных камерах.
   37.037.0

Mishka

модератор
★★★
GOGI> Не, с такой точностью в любительских условиях нереально :)
Я с тобой согласен. Поэтому и говорю только про таймер с примочками. Т.е. автоматизировать ту часть работы, которую приходится делать ручками на каждой гонке — секундомер с отсечкой кругов и листок бумаги, на котором дата, название гонки, номер круга (первый столбец), номер выигравшего круг (вторая колонка), объявленный приз (если объявлен) и номер участника его выигравшего (он не обязательно тот же, что и выиграший круг, т.к. может быть отрыв, а prime выдаётся для пелотона, чтобы подстегнуть пелотон догнать отрыв), время круга (по выигравшенму), в конце время гонки, самый быстрый круг, самый медленный, подсчёт выигранных кругов каждым, т.к. выигравшему наибольшее количество кругов полагается приз за агрессивность. В общем много правил и всё ручками.

Проблема ещё и в том, что победа по пересечению финишной полосы колесом — самым его началом. А так рамы разного рамера, велосипедисты выбрасывают велосипед на финише, сдвигаясь назад.
   37.037.0
Это сообщение редактировалось 10.11.2015 в 20:29
RU Валентин_НН #12.11.2015 11:42  @Mishka#10.11.2015 20:18
+
-
edit
 

Валентин_НН

литератор
★★★
В.Н.>> А дорого это сколько? У вас ведь в клуб и какой-то мульти миллионер входит?
Mishka> Миллионер входит сюда, а гонки проводит эта организация. И там есть особенности, т.к. первая non-profit, а вторая чисто спортивная в цепочке USA Cycling/UCI. И там просто так не получается денег взять. Надо много бумаг.
Ну як диты, чесс слово.
Записуй слова заветные
Подходишь к нему и говоришь - Смит, ты нужен Америке велоспорту. Не спрашивай, что клуб сделал для тебя, спроси, что ты сделал для клуба.
В это время, кагбэ случайно, мимо проезжает велосипедист с флагом, проходит мимо ребенок, у которого из наушников доносится гимн. На лавочке рядом слышно, как седой негр ветеран гей рассказывает, как он на войне спас друга из-под огня.
В небе пролетает самолетик, который тащит растяжку "Я люблю Питтсбург"
И всё. Подгоняешь пикап и грузишь в него свою камеру.
   
US Mishka #12.11.2015 19:01  @Валентин_НН#12.11.2015 11:42
+
+1
-
edit
 

Mishka

модератор
★★★
В.Н.> Ну як диты, чесс слово.
В.Н.> Записуй слова заветные
В.Н.> Подходишь к нему и говоришь - Смит, ты нужен Америке велоспорту. Не спрашивай, что клуб сделал для тебя, спроси, что ты сделал для клуба.

Смит говорит: "А не пойти бы тебе на ...?" Слова про ты нужен Америке могут привести к тому, что получишь в лоб. А дядька, который вовсе и не Смит, здоровый — 194 ростом. И в молодости занимался л/а — был спринтером. Да и жил в гетто. Поэтому с реакцией у него всё хорошо, как и с навыками драться. :P

Не, он не против чего-то там делать для общества. Только приоритеты у него другие. Помогает бедным, вот грант пробил на то, чтобы купили велики и учили бедных велосипедить. Для здоровья. А спортсмены у него по приоритетам после того, как бедность победит. :F
   37.037.0
RU Валентин_НН #13.12.2015 21:17
+
-
edit
 

Валентин_НН

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

На будущее в планах добавить RTC модуль, чтобы если в ночи пошёл отлить, то свет не включался-бы махом на полную.
ну и в дальнейшем, конечно, подключить вайфайный модуль, чтобы светом в сортире ориентацией боевого блока рулить с любой точки планеты :D

ах, да, сам листинг прилагается

code c
  1.  
  2.  
  3. #define PIR_PIN    9  //пин пир сенсора
  4. #define LAMP_PIN   10  //пин светодиода
  5. #define CONTROL_LED 13  //пин контрольного светодиода
  6. float brightCurrent=0;  //текущая яркость
  7. int brightMax=254;      // максимальная яркость (в будущем зависит от времени суток)
  8. float brightDelta=0.002;  //дельта, с которой происходит изменение яркости светодиода
  9. unsigned long timerCurrent=80000;
  10. unsigned long timerMax=100000;  //максимальная задержка, в течении которой горит светодиод с максимальной яркостью
  11.  
  12. //задаем состояния светодиода
  13. enum lampState
  14. {
  15.   LIGHT_OFF,  //свет выключен
  16.   LIGHT_UP,   //свет разжигается
  17.   LIGHT_ON,   //свет полностью включен
  18.   LIGHT_DOWN,  //свет выключен
  19.   TOTAL_STATES
  20. };
  21. //задаём исходные значения переменных
  22.  
  23. int lampState = LIGHT_OFF;
  24. bool pirStatus = false;
  25.  
  26.  
  27. void setup()
  28. {
  29.  
  30.     pinMode(PIR_PIN, INPUT);
  31.     pinMode(LAMP_PIN, OUTPUT);
  32.     pinMode (CONTROL_LED,OUTPUT);
  33.    
  34. }
  35.  
  36. void loop()
  37. {
  38.    bool pirStatus = digitalRead(PIR_PIN);
  39.        //analogWrite (CONTROL_LED,255);
  40.   switch (lampState) {
  41.    
  42.     //блок выключеного света
  43.     // если обнаружено движение, то текущий статус меняется на LIGHT_UP- розжиг светодиода
  44.     // если движения нет, то статус остаётся прежним - LIGHT_OFF
  45.   case LIGHT_OFF:
  46.     if (pirStatus==1) {  //
  47.     lampState=LIGHT_UP;  //если обнаружено движение, то меняем статус лампы на "розжиг"
  48.     }                    //
  49.    
  50.     else {
  51.     lampState=LIGHT_OFF;
  52.     }
  53.     brightCurrent=0;  //текущую яркость лампы принимаем равную 0
  54.   break;
  55.  
  56.  // плавный розжиг светодиода
  57.  // к текущей яркости добавляем дельту.
  58.  // если яркость достигает максимума, то меняем состояние светодиода на LIGHT_ON
  59.   case LIGHT_UP:
  60.   brightCurrent= brightCurrent+brightDelta;
  61.   if (brightCurrent >=brightMax){
  62.     timerCurrent=timerMax;
  63.     lampState= LIGHT_ON;
  64.   }
  65.  
  66.    
  67.   break;
  68.        
  69.  // свечение с постоянной (максимальной) яркостью
  70. // если обнаружено движение, то таймер принимает максимальное значение
  71. // если движения нет, то уменьшаем таймер
  72. // если таймер достиг минимального значения, то статус светодиода меняем на LIGHT_DOWN
  73.   case LIGHT_ON:
  74.     if (pirStatus){
  75.       timerCurrent=timerMax;
  76.     }
  77.     else {
  78.       timerCurrent=timerCurrent-1;
  79.     }
  80.     if (timerCurrent<1) {
  81.       lampState =LIGHT_DOWN;
  82.       brightCurrent=brightMax;
  83.     }
  84.     //analogWrite(LAMP_PIN, 100);
  85.   break;
  86.        
  87. // плавное гашение светодиода
  88. //если движение не обнаружено, то от текущей яркости отнимаем дельту
  89. //если движение обнаружено, то переходим к розжигу светодиода в блоке LIGHT_UP
  90. // если достигнута минимальная яркость, то ререходим в блок LIGHT_OFF
  91.   case LIGHT_DOWN:
  92.   if (pirStatus==0){
  93.     brightCurrent= brightCurrent-(brightDelta/2);
  94.     }
  95.     else {
  96.       lampState=LIGHT_UP;
  97.       timerCurrent=timerMax;
  98.     };
  99.   if (brightCurrent <1){
  100.    lampState= LIGHT_OFF;
  101.   }
  102.        //analogWrite(LAMP_PIN, 255);
  103.   break;
  104.  
  105.     //default:
  106.     //lampState=LIGHT_OFF;
  107.    
  108.    };
  109.  
  110.  
  111.    //светим светодиод с текущей яркостью brightCurrent
  112.    analogWrite(LAMP_PIN, brightCurrent);
  113.    
  114.    //это для контроля - когда яркость максимальная, то зажигаем контрольный светодиод
  115.    if (lampState==LIGHT_ON) {
  116.      analogWrite(CONTROL_LED,255);
  117.    }
  118.    else {
  119.      analogWrite (CONTROL_LED,0);
  120.    }
  121. }
   42.042.0
RU Валентин_НН #14.12.2015 16:58  @Валентин_НН#13.12.2015 21:17
+
-
edit
 

Валентин_НН

литератор
★★★
В.Н.> Хотелось-бы свою программу превратить в подпрограмму(?) функцию(?) внешний модуль(?) в которую на вход подавал бы статус текущего сенсора, показание текущего таймера, а она выдавала-бы яркость для текущего светодиода.
господа, чего молчим?

вы хоть скажите, в какую сторону смотреть? в сторону #include ?
   42.042.0
RU GOGI #14.12.2015 17:36  @Валентин_НН#14.12.2015 16:58
+
+1
-
edit
 
Я тебе вечером напишу. Начал на работе, понял, что не успеваю.
   42.042.0
RU GOGI #14.12.2015 22:02  @Валентин_НН#13.12.2015 21:17
+
-
edit
 
RU Валентин_НН #14.12.2015 22:14  @GOGI#14.12.2015 22:02
+
-
edit
 

Валентин_НН

литератор
★★★
GOGI> Я завтра отвечу, засыпаю...

батюшки, ты мне там не цельную лекцию готовишь? ты это, не надсажайся, а то перегоришь раньше времени, а у меня ещё вопросы есть
   42.042.0
RU GOGI #15.12.2015 11:00  @Валентин_НН#13.12.2015 21:17
+
-
edit
 
Думал-думал, как сделать так чтобы и не переделывать все и более-менее нормально получилось.
В общем, самое простое, все переменные сделать статическими массивами, типа
loop сделать функцией
code c
  1. unsigned char loop(unsigned char NumOfChannel)
  2. {
  3.  static float brightCurrent[3];
  4.  тело функции
  5.  return (unsigned char)brightCurrent[NumofChannel];
  6. }

и, кстати, float в данном случае лучше не использовать, он очень много ресурсов жрет и в данном случае не нужен, нет причин не использовать целочисленную переменную.
   42.042.0
RU Валентин_НН #15.12.2015 11:58  @GOGI#15.12.2015 11:00
+
-
edit
 

Валентин_НН

литератор
★★★
GOGI> Думал-думал...
Ага, func, return. Ну, в принципе, я так и догадывался
Даже и не знаю, платить тебе обещаную тыщу или нет? :)

Идею я понял. Осталось дело за малым - обернуть свою прогу в фантик функции.
Но я вот еще что хотел спросить-то. Я хочу, чтобы в теле самой программы было меньше строк. Это уже мне include понадобится?
   
RU GOGI #15.12.2015 12:14  @Валентин_НН#15.12.2015 11:58
+
-
edit
 
В.Н.>Это уже мне include понадобится?
Да, но сначала разберись с заголовочными файлами. Я почему-то в свое время не нашел нормального описания и долго не мог понять, для чего, к примеру, нужны прототипы функций. Борись с желанием написать #include "super-mega-vikluchatel.c", только #include "super-mega-vikluchatel.h"
   42.042.0
LU JackSmith #15.12.2015 13:15  @Валентин_НН#14.12.2015 16:58
+
-
edit
 

JackSmith

втянувшийся

В.Н.> господа, чего молчим?
В.Н.> вы хоть скажите, в какую сторону смотреть?

такие штуки надо делать на прерываниях.
Обработку PIR вешать на внешнее прерывание,
а свет на таймер в FastPWM режиме.
   27.027.0
Это сообщение редактировалось 15.12.2015 в 13:23
RU Валентин_НН #15.12.2015 14:57  @JackSmith#15.12.2015 13:15
+
-
edit
 

Валентин_НН

литератор
★★★
JackSmith> такие штуки надо делать на прерываниях.
JackSmith> Обработку PIR вешать на внешнее прерывание,
JackSmith> а свет на таймер в FastPWM режиме.

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

Да, а что значит фраза "свет на таймер в быстромШИМ режиме"? Каждое слово по отдельности понимаю, а предложение - нет :(
   
HU JackSmith #15.12.2015 17:08  @Валентин_НН#15.12.2015 14:57
+
-
edit
 

JackSmith

втянувшийся

В.Н.> Э, нет, так не пойдет. Ответ не принимается.
прерывания - это обычная функция, которая выполняется когда, произошло то или иное событие. Например: сработал PIR сенсор. Т.е. не нужно будет постояно проверять изменилось ли состояние сенсора или нет. Когда это произойдет, микроконтроллер сам вызовет вашу функцию, в которой нужно будет написать, что делать при срабатывании сенсора.

В.Н.>на ардуине нельзя кучу кнопок повесить на прерывания.
есть же дополнительные внешние прерывания)
   27.027.0
+
-
edit
 

Mishka

модератор
★★★
JackSmith> прерывания - это обычная функция, которая выполняется когда, произошло то или иное событие.
Нет, не обычная. Она вызывается асинхронно и там много чего ещё есть, что иногда делать нельзя, нельзя иметь ввиду разметку стека и прочее.
   37.037.0
US Mishka #15.12.2015 18:18  @Валентин_НН#15.12.2015 14:57
+
-
edit
 

Mishka

модератор
★★★
В.Н.> Э, нет, так не пойдет. Ответ не принимается.

Давай я тебе расскажу почти байку — как знакомый аспирант объяснял красивой (и не глупой) девочке (студентке матмеха) про прерывания (interruption) и опрос (polling).

-- Представь, Таня (так звали студенку), вот сидишь ты и работаешь на машине, чего-то там пишешь. А, поскольку ты симпатичная (тут девочка заливается краской), то на тебе возложили ещё и некоторые обязанности секретарши. Т.е. ты должна готовить чай. Т.е. надо налить воды в чайник, включить в розетку. А потом периодически бегать к чайнику и проверять, что он закипел. Не успеешь, вода выкипит, чайник расплавится — плохо (пример из жизни, почти все через него проходили). Это называется опросом — ты приостанавливаешь другие дела и смотришь на чайник. А теперь представь, что на чайнике есть свисток. Он закипел и засвистел, ты услышала и пошла готовить чай. Это работа с прерыванием.
   37.037.0
RU Валентин_НН #15.12.2015 18:46  @Mishka#15.12.2015 18:18
+
-
edit
 

Валентин_НН

литератор
★★★
Mishka>Это работа с прерыванием.

да не :) я кагбэ представляю, что такое прерывания (мне отец про них рассказывал, когда он на РК-86 программы писал)
проблема в том, как эти сакральные знания воплотить в программе.

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

а то, пока я всё это изучать буду, пока то, да сё, свет в туалете так и будет сутками гореть
   42.042.0
1 2 3 4 5 6 7 8 9

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru