Страница 1 из 1
Код Грея для определения угла поворота.
Добавлено: Вт янв 17, 2017 19:32:12
Cyber-master
Здравствуйте.
Есть идея сделать цифровую метеостанцию. В частности, речь идет об определении направления ветра.
Используем абсолютный угловой энкодер с диском, размеченным кодом Грея. Дискретизация - 4 разряда, т.е. 16 румбов. На выходе датчика 4-х разрядный код Грея.
Подскажите, правильно ли думаю по алгоритму:
1. С некоторым интервалом опрашиваем входные линии с кодом Грея (опрашиваем так же как кнопки).
2. Преобразовываем в бинарный код, примерно так:
unsigned int graydecode(unsigned int gray)
{
unsigned int bin;
for (bin = 0; gray; gray >>= 1) {
bin ^= gray;
}
return bin;
}
3. Дальше. Алгоритм обработки помнит предыдущий результат, и при каждом измерении сравнивает - если изменение больше чем на 1 (по модулю) - то это явная ошибка, так?
4. Берем выводное значение (видимо, символьное, типа Северо-Восток и т.п.) из массива значений по данному (пункт 2) индексу .
Верно?
Re: Код Грея для определения угла поворота.
Добавлено: Вт янв 17, 2017 21:12:52
petrenko
Можно и 32 и 64 сектора сделать - ну это "на вкус и цвет" .
2. Преобразовывать в двоичный код необязательно - можно сразу по таблице в символьные строки - и отображать типа : "С-В"
3. Не факт. Надо бы для того знать ещё и скорость ветра.
4. см. отв. п.2
Re: Код Грея для определения угла поворота.
Добавлено: Вт янв 17, 2017 21:46:58
Cyber-master
ИМХО для розы ветров 16 румбов за глаза.
Можно разрядность и увеличить, но это увеличивает геометрию устройства и количество сигнальных линий. Как бы не дошло до отдельного мозгА для этого датчика, передающего данные в "голову" скажем, по SPI.
Хотя.. учитывая необходимость статистики (см. ниже) может быть до какого-нибудь простенького мозга и дойдет... типа тини13 или 24.
Переделываю я в двоичный код для того чтобы плюсминус1 ловить, то есть вероятную ошибку. Конечно, можно код Грея через CASE просунуть или через хитросортированный массив... Но хочется как то "колхозить поменьше", что ли... Чтоб алгоритм был понятный и прямой.
Скорость не ветра, а скорость изменения направления ветра, это разные вещи. Скорость ветра это другой датчик - крыльчатка и счетчик оборотов. Этот датчик это электронный флюгер.
Хотя надо предусмотреть качания, безусловно, и датчик должен стоять на открытой местности. Ну грубо говоря - утром с запада дует, а вечером с севера - изменение на 3 румба за 12 часов, то есть 1 измерение в 2 часа и нормально))))). Шутка. А насчет качаний - это же аналогия дребезга контактов, вот ее и решать дополнительно в двух направлениях - в механике и в софте (например, делать усреднение за период).
Кстати, вопрос из оптической области.
Вот с одной стороны диод, с другой фототранзистор скажем. Между ними шторка или иной загораживающий объект.
А дребезг в этом случае как гасится? Свет ведь может проходить и через полузакрытое окошко и т.п.?
Поправка - тут видимо не дребезг а "неопределенное состояние". Как его определить? или в любой схеме последний разряд в погрешность уходит?
Re: Код Грея для определения угла поворота.
Добавлено: Ср янв 18, 2017 00:11:17
petrenko
(IMHO) разрядность 6 будет слегка избыточной - 64 сектора - но ведь потом можно будет и округлить запросто, а 6 "треков" и линий соответственно всего лишь в 1.5 раза больше 4 (
кэп "очевидность" ) при увеличении точности вчетверо. Так что лучше сделайте шестиразрядный.
SPI выглядит несколько "не в своей тарелке" в данном поделии ( паки IMHO)
Переделывать код Грея в двоичный для отслеживания ошибки есмь жуткая ерунда - ибо код Грея как раз таки и решает задачу устранения ошибок - соседние сектора обязаны различаться строго одним разрядом ( в отличие от двоичного кода ).
XOR текущего и предыдущего сразу же покажет в скольких разрядах есть различия - если нет отличий или только в одном разряде - тогда больше вероятность правильного значения - и без всяких там "хитрых CASE " ..
Дребезг контактов и/или неполное перекрытие тоже почти сами собой "разрулятся" - это тоже одно из свойств кода .
(
ну для пущей уверенности - поставьте в конце линий триггеры шмитта навроде 555тл* - их как раз по шесть бывает в одной и.м.с. )
А насчёт скорости ветра - например был слабый южный ветер, и, вдруг, резкий порыв восточного - в таком случае резкая смена сектора на 90 объяснима, а вот слабый южный на слабый восточный быстро переменится навряд ли, что укажет на вероятную ошибку.
Всё это вроде как очевидно, даже странно, что Вы ещё не определились по всем этим вопросам.

Re: Код Грея для определения угла поворота.
Добавлено: Ср янв 18, 2017 08:32:07
Cyber-master
Несмотря на, то что это всё вроде как очевидно, у меня катастрофически мало практического опыта. И я не стесняюсь выглядеть тупым.
1. Таки не вижу, куда мне здесь точность выше 1/16. При 1/16 направление ветра хорошо описывается общепринятыми словами: север, северо-северо-восток, северо-восток, восток-северо-восток, восток и т.п. А при повышении точность измерять в чем? в градусах азимута? В них практический смысл слабо виден, неудобно в быту применять.
2. Оговорился, не SPI а I2C, вот как тут
http://easyelectronics.ru/avr-uchebnyj- ... c-i2c.html
3. Переделка кода Грея в двоичный... Тут в общем немного криво я выразился. Безусловно, по-быстрому проверить входящее значение это поXORить его на предыдущее. Но для отсечки лишних качаний флюгера я хочу сделать еще вдобавок усреднение данных, то есть так:
Организуем очередь данных, скажем из 10 ячеек. Когда возникает новое измерение, самый старый результат выкидывается. Когда нужно снять данные - снимаем
среднее со всей очереди. Пусть частота измерения, скажем, 1 раз в минуту. Тогда на выходе будет среднее направление за 10 минут. А мгновенное ИМХО и не несет никакой информации. Даже я бы и еще длиннее усреднение сделал, скажем, из 32 или 64 ячеек, чтоб делить удобнее.
Так вот для этой арифметики все равно код Грея проще на старте перевести.
4. Все таки про неопределенное состояние оптического датчика не понял - что значит
почти сами собой "разрулятся" - это тоже одно из свойств кода
?
Re: Код Грея для определения угла поворота.
Добавлено: Ср янв 18, 2017 15:10:28
petrenko
почти сами собой "разрулятся" - это тоже одно из свойств кода
Cyber-master писал(а):.. ?
Поясню насчёт того, что "дребезги" и неопределённости сами "разрулятся" :
wikipedia писал(а):... Если считыватель настолько медленный, что за время считывания показания несколько раз сменились, код Грея гарантирует, что ошибка будет невелика — меньше, чем реальное изменение сигнала. Например, если за время считывания показания сменились 010G=3 → 110G → 111G=5, то помимо этих трёх значений, можно получить 011G=2 — выходит ошибка на единицу.
Если датчик круговой .....
То есть ещё один пунктик "почему" лучше взять б
ольшую точность и потом уже огрубить.
при повышении точность измерять в чем?
В быту и так точнее чем восемь направлений как правило не отмечают. А вот в других ситуациях уже и "зюйд-зюйд-вест" говорят, ну а румбы Вы сами изволили упомянуть. В розе ветров иногда рисуют радиальные отрезочки-линейки числом более 16 именуя лишь 8 из них и не именуя промежуточные. Так что всё нормально, можете не заморачиваться на таких мелочах.
Если вдруг не "нагуглился" код длиннее 4 бит (
что тоже странно, но .. всякое быввает .. ), то вот , пожалуйста :
Спойлер
Код: Выделить всё
Dec Bin Gray
0 000000 000000
1 000001 000001
2 000010 000011
3 000011 000010
4 000100 000110
5 000101 000111
6 000110 000101
7 000111 000100
8 001000 001100
9 001001 001101
10 001010 001111
11 001011 001110
12 001100 001010
13 001101 001011
14 001110 001001
15 001111 001000
16 010000 011000
17 010001 011001
18 010010 011011
19 010011 011010
20 010100 011110
21 010101 011111
22 010110 011101
23 010111 011100
24 011000 010100
25 011001 010101
26 011010 010111
27 011011 010110
28 011100 010010
29 011101 010011
30 011110 010001
31 011111 010000
32 100000 110000
33 100001 110001
34 100010 110011
35 100011 110010
36 100100 110110
37 100101 110111
38 100110 110101
39 100111 110100
40 101000 111100
41 101001 111101
42 101010 111111
43 101011 111110
44 101100 111010
45 101101 111011
46 101110 111001
47 101111 111000
48 110000 101000
49 110001 101001
50 110010 101011
51 110011 101010
52 110100 101110
53 110101 101111
54 110110 101101
55 110111 101100
56 111000 100100
57 111001 100101
58 111010 100111
59 111011 100110
60 111100 100010
61 111101 100011
62 111110 100001
63 111111 100000
Ну и повторюсь :
для пущей уверенности - поставьте в конце линий триггеры шмитта навроде 555тл2 - их как раз по шесть бывает в одной и.м.с.
И , хотя,
код Грея не взвешенный и непригоден для обычных вычислительных операций без предварительного перевода в двоичный код
, но для розы ветров это не очень и нужно - там просто напросто радиальные отрезочки должны быть пропорциональны количеству записей соответствующего направления. То есть не так уж важно будет ли за сутки 24 записи или 86400 например - рисунок розы ветров за N суток будет почти такой же. Тоже можно не заморачиватья. Считали положение(норд-норд-вест например) -> инкрементировали переменную{nord_nord_west} -> в конце недели нарисовали розу ветров . Вместо инкрементирования можно прибавлять силу ветра, тогда будет видно не только какие ветры чаще , но и какие сильнее дуют ..
Re: Код Грея для определения угла поворота.
Добавлено: Ср янв 18, 2017 20:41:18
Cyber-master
ну-ну-ну, логгирование в самом МК это уже борщ, да и не влезу - там окромя этого датчика еще много чего предстоит.
Re: Код Грея для определения угла поворота.
Добавлено: Ср янв 18, 2017 23:37:32
petrenko
Cyber-master писал(а):.. логгирование в самом МК .... не влезу ..
Не хватит места для 64-ёх 32-битных переменных ?
Что за м.к. такой ?
Четырёхбитный какой нибудь - к1820ве1 или км1814ве3 ?

Re: Код Грея для определения угла поворота.
Добавлено: Чт янв 19, 2017 00:52:59
Ser60
ТС - а почему для определения направления ветра просто не использовать магнетометр?
Re: Код Грея для определения угла поворота.
Добавлено: Чт янв 19, 2017 19:21:24
Cyber-master
А по цене)
Энкодер Грея я сделаю, возможности есть (рекламное производство), диодов напаяю, логику напишу.
А магнетометр сколько бы стоил?
Re: Код Грея для определения угла поворота.
Добавлено: Чт янв 19, 2017 20:27:36
Ser60
А какая разница, особенно если единичное устройство для себя делаете? Кстати,
MAG3110 даже на плату распаянный стоит на Али всего 2.50 USD. Пусть даже энкодер Вам даром достанется, начнёте работать с электронным компасом - оцените удобство.
Re: Код Грея для определения угла поворота.
Добавлено: Пн янв 30, 2017 09:12:41
Men1
Cyber-master писал(а):там окромя этого датчика еще много чего предстоит.
А можно посмотреть на схему... для определении направления и скорости ветра?
И если есть исполнение в железе.....одним глазом на фото взглянуть...
Тоже интересует вопрос по метеостанции....

Re: Код Грея для определения угла поворота.
Добавлено: Вт янв 31, 2017 20:31:15
Brigadir
Cyber-master писал(а):А по цене)
Энкодер Грея я сделаю, возможности есть (рекламное производство), диодов напаяю, логику напишу.
А магнетометр сколько бы стоил?
А почему именно код Грея? А если просто: 16 площадок по кругу и центральный контакт?
Re: Код Грея для определения угла поворота.
Добавлено: Ср фев 01, 2017 08:24:09
shindax
Лично я не очень понял, каким с какого бока здесь можно приделать магнитометр, разве что саму плату крутить, так ведь опять-же, с неё показания снимать нужно, а вот магнитный датчик угла поворота типа AS5030 от Austriamicrosystems вполне будет уместен, но только для профессиональной метеостанции. Ибо в данном случае, IMHO, он будет давать избыточную точность и потребует относительно точной механики, специального магнита и последующей юстировки. Да и сам чип не из самых дешёвых.
Men1 писал(а):А можно посмотреть на схему... для определении направления и скорости ветра?И если есть исполнение в железе.....одним глазом на фото взглянуть...
О скорости ветра :
https://sdelaysam-svoimirukami.ru/224-anemometr.html
Можно взять электромотор от CD-ROM, сгородить формирователь, чтобы импульсы выдавал и так-же их считать, а можно считывать состояние встроенных в него датчиков Холла.
В общем много есть вариантов.
О направлении ветра уже, IMHO, достаточно насоветовали.
Re: Код Грея для определения угла поворота.
Добавлено: Сб июн 03, 2017 02:02:51
petrenko
[uquote="Brigadir",url="/forum/viewtopic.php?p=2998220#p2998220"].. А почему именно код Грея? А если просто: 16 площадок по кругу и центральный контакт?[/uquote]Так уже ж говорили - ошибко-устойчивость кода.
А "если просто" ,то, ошибки неизбежны и неустранимы никакими мат.методами.
Вот почему.
Re: Код Грея для определения угла поворота.
Добавлено: Вс июн 04, 2017 02:24:26
Men1
Сделано вот в таком плане.....
1.Скорость ветра -
http://windpower-russia.ru/showthread.php?t=77&page=36
2.Направление ветра 16 герконов и центральный контакт......
3. Все остальное от китайцев
Сейчас в стадии тестирования...