Чтение двоичного кода (нужна помощь)

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Доброго времени суток. Сам пока не могу, вот и побираюсь. Задача считывать и обрабатывать трехразрядный последовательный двоичный код, точнее код будет длинным и разной частоты, но поймать надо фрагменты. Конкрктнее, нужно чтоб ардуинка реагировала на две комбинации "101" и "010", т.е. старый добрый сдвиговый регистр мне нужен на три разряда с дешифратором, тока на основе ардуинки. Подскажите пару строчек кода с коментариями.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

давай точнее. откуда идет сигнал и т.д.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Можно просто считать 3 бита, и по их содержанию делать то, что нужно. Важно, что бы линии не висели в Z состоянии. Вот пример, в нём 3 сигнала подать на входы A0, A1, A2

void setup() {
Serial.begin(9600);
void loop(){
byte n=PINC&B00000111; //прочесть порт С
if (n==2) Serial.println("State1"); // если 010
if (n==5) Serial.println("State2"); //если 101
}

 

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну вот. это не одно и тоже как первоначальная задача

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Анатолий43978, зачем вы всё время своё сообщение редактируете? Уже не помню что вы там писали про энкодер. Если код последовательный, значит я вас неправильно понял, и скетч из #2 никаким боком не подойдёт. Тогда уточняйте, что должно синхронизировать чтение данных с ардуины? Если опираться на изменение логического уровня, то получится код 1010101010101 , который всегда будет соответствовать вашему условию 101 или 010.

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Это случаи зеркального отражения кода .....1001100110...., при изменении направления вращения: 010; 111; 101; 000, которые я и распознаю с уже оказанной Вами помощью. Энкодер самодельный состоит из зубчатого колеса и двух датчиков смещенных на Пи/2, так что два датчика могут видеть один зубец одновременно, но фронты зубцов они видят неодновременно. Код каждого датчика как Вы и сказали будет 10101010. По поводу последовательного кода я наломал дров, и ввел Вас в заблуждение. С одним датчиком невозможно распознать изменение направления вращения, а с двумя невозможен один последовательный общий код, подаваемый на один вход ардуинки. Так что два сигнала соединяем, подавая на два регистра соответственно 1 на 1-й, 2 на 2-й, а выходной параллельный код берем с чередующихся выходов первого и второго регистров. Получится наш параллельный код ....1001100110.... который будет сдвигатся новыми импульсами, а в момент реверса мы и сможем наблюдать наши зеркалки: 000; 010; 101; 111. От ардуинки мне нужно, чтобы она при каждом реверсе поочередно переводила один из двух выходов в состояние HIGH.Только вот еще вопрос, можно ли как-то попроще. А то получается нагромоздил я с этими регистрами.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Анатолий43978, а зачем вам "один последовательный общий код" ? Он наоборот всё усложнит. Подавайте два сигнала с двух датчиков на ардуино, и обрабатывайте как обычный энкодер.

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Спасибо. Вот тут все работает, использовал входы 2 и 4.

#define pinB 4

int val = 0;

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin (9600);
  attachInterrupt(0, encoder, FALLING);
}

void loop() {
  
}

void encoder() {
  if (digitalRead(pinB)) {
    val++;
    Serial.print("ROTATION FORWARD");
    digitalWrite(13, HIGH);
  }
  else {
    val--;
    Serial.print("ROTATION REARWARD");
    digitalWrite(13, LOW);
  }
  Serial.print (val);
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Гыыыыы! Ты еще делаев в обработчик прерываний налепи.

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Я понимаю, что чайники смешные. Но замечание справедливое . Работает он только на очень низкой частоте, около 100 Гц начинает глючить. Мож подскажете как скорость поднять, чтоб можно было до 100 кГц на вход принимать?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Анатолий43978, он вообще у вас и не должен работать нормально.  Причём тому 3 причины. Во первых вывод в сериал из под прерывания не обязан работать, он может просто виснуть. Во-вторых вы читаете пины энкодера не одновременно, а это чревато глюками, (как раз если данные будут быстро меняться). А если вы "держитесь" за одно прерывание, то читать нужно дважды, иначе опять глюки. В общем как-то так, пины сохранил ваши - 2 и 4.

int val = 0;
void setup() {
Serial.begin (9600);
attachInterrupt(0, encoder, CHANGE);
}

void loop() {
Serial.println(val);  
}

void encoder() {
byte n =PIND&B00010100;
if (n==4||n==16) val++;
if (n==0||n==20) val--;
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Понял...... сорри

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

trembo, PINx -порт чтения,  PORTx -порт записи :)

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Считает резво, как надо. Я тут попробовал задействовать pin13 как выход, получается что он меняет свое состояние при изменении значения, т.е. мигает при вращении. Ну подскажите бестолковому, мне нужно чтоб состояние выхода менялось только при смене направления вращения, неважно в плюсе или в минусе текущее значение.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Анатолий43978, в 13 и 14 строках обработка событий.. в одну строку добавьте включение светодиода, в другую выключение.. Собственно так же и в вашем скетче из #8 было.

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Так и сделал, но светодиод мигает при каждом импульсе.А мне нужно, чтоб менял состояние только при изменении направления врвщения , а до того сохранял состояние.

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

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

vvadim
Offline
Зарегистрирован: 23.05.2012

здесь все такие что будут смеяться....

Антон83
Offline
Зарегистрирован: 16.05.2022

Здравствуйте, сразу скажу делитант без стажа, нужна рлилщь или совет есть телеграфный канал, он преобразует со в бинарный, так вот возможно ли это бинарный отправить на ардуино так чтобы принятый бинарный код был отправлен на термопринтер, естественно уже от 0-9

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Антон83 На ардуино можно ракету в космос запустить !

Антон83
Offline
Зарегистрирован: 16.05.2022

А по сути вопроса или дать совет.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вы ошибки исправьте сначала, а то суть вопроса теряется !!!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Антон83 пишет:
Здравствуйте, сразу скажу делитант без стажа, нужна рлилщь или совет есть телеграфный канал, он преобразует со в бинарный, так вот возможно ли это бинарный отправить на ардуино так чтобы принятый бинарный код был отправлен на термопринтер, естественно уже от 0-9

Много встречных вопросов:

1. Кто такой "делитант"? Что он делит?

2. "рлилщь" -  Если на первый вопрос хоть идеи есть, то вот тут вообще пасую!

3. Что такое "со", в контексте "преобразует со"? Кто и что именно преобразует?

4. Про термопринтер и "от 0-9" я не смог угадать ничего. Хотя бы что означает "от 0-9"? От и до ...чего?

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

Антон83
Offline
Зарегистрирован: 16.05.2022

А мы тут русский пришли разбирать!?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Антон83 пишет:
А мы тут русский пришли разбирать!?

В объеме, достаточном для понимания твоей писанины. Пока ты "не сдал".

Антон83
Offline
Зарегистрирован: 16.05.2022

Я уже разобрался со своими вопросами, пока ты ошибки искал.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

И даже нах не пришлось посылать. Удачный заход. Не пиши сюда больше, прошу!