Анализатор сигнала

Marchcat
Offline
Зарегистрирован: 06.05.2012

 Я новичек !!!

Народ подскажите плиз !!! Хочу на ардуине мини собрать анализатор сигнала . антену собрали .

Сигнал шим . Т.е надо делать замер если на порту антены low > определенного времени то на комп передать один текст , если весит high > опр. времени то передпть дркгой текст . Если ( изменение с high на low до следующего изменения попадает в определенный интервал времени то вывести 1 , если в другой то 0 . 

попробовал

int Antpin = 2 ;

unsigned long t0;

unsigned long t1;
 

unsigned long tx;

void setup()

{

 Serial.begin(9600);

pinMode(Antpin, INPUT);

}

Void loop()

{

t0 = pulseIn(Antpin, LOW);

t1 = pulseIn(Antpin, HIGH);

tx = t0 + t1

if (t0 > 3000) Serial.print("Pustota");

if (t1 > 3000) Serial.print("Nakachca");

if (500 < tx < 1000) Serial.print("0");

if(1000 < tx < 2000) Serial.print("1");

}

 

 

 

 

Xoon
Offline
Зарегистрирован: 02.04.2012

 А в IDE код пишете именно с таким синтаксисом? )

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 А чем вас смущает синтаксис ?

Xoon
Offline
Зарегистрирован: 02.04.2012

 Например, с первого взгляда увидел что Void loop  с большой буквы, после "tx = t0 + t1" точки с запятой нет. Может быть поэтому не работает? )

maksim
Offline
Зарегистрирован: 12.02.2012

И фигурных скобок не хватает

#define Antpin 2
unsigned long t0, t1, tx;

void setup(){
  Serial.begin(9600);
}

void loop(){
  t0 = pulseIn(Antpin, LOW);
  t1 = pulseIn(Antpin, HIGH);
  tx = t0 + t1;
  if (t0 > 3000){ 
    Serial.println("Pustota");
  }
  if (t1 > 3000){
    Serial.println("Nakachca");
  }
  if (500 < tx && tx < 1000){
    Serial.print('0');
  }
  if(1000 < tx && tx < 2000){
    Serial.print('1');
  }
}

 

Marchcat
Offline
Зарегистрирован: 06.05.2012

факт того что постоянно в эфир шлет 1010101010101010  и тд 

maksim
Offline
Зарегистрирован: 12.02.2012

Marchcat пишет:

факт того что постоянно в эфир шлет 1010101010101010  и тд 

Мне не понятно, что вы хотите этим сказать...

Marchcat
Offline
Зарегистрирован: 06.05.2012

ардуино на комп шлет само по себе 10101010101010101 итд 

Marchcat
Offline
Зарегистрирован: 06.05.2012

хотя сигнала даже нет

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы перекопируйте еще раз код, я его редактировал.

Marchcat
Offline
Зарегистрирован: 06.05.2012

 на работу пойду закину еще разок ! потом отпишу )))

Marchcat
Offline
Зарегистрирован: 06.05.2012

а как можно полученные данные закинуть в массив и вывести их из бинарного в хекс виде ?? 

maksim
Offline
Зарегистрирован: 12.02.2012

Конечно можно, вот здесь есть немного информации arduino.ru/forum/programmirovanie/zapolnit-massiv , а мне уже пора спать...

maksim
Offline
Зарегистрирован: 12.02.2012

А длинна сообщения известна?

leshak
Offline
Зарегистрирован: 29.09.2011

 Такие вещи лучше делать не через pulseIn, а через attachInterrupt. Иначе вы рискуете "пропустить" импульсы.

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

А уже в loop, вычисляете как интерпретировать эти значения (накачка, пустота) и решаете что по этому поводу нужно сделать.

maksim
Offline
Зарегистрирован: 12.02.2012

Не проверял, но не будет ли прерывание влиять на передачу данных на комп? Т.е. предположим, что интервалы времени между пакетами (если они вообще есть) очень малы и дуина не будет успевать за этот интервал отправлять все данные и они будут теряться, я сам этого не проверял так что не знаю, может и не будет влиять.

И вместо millis() нужно использовать micros().
 

leshak
Offline
Зарегистрирован: 29.09.2011

 >Не проверял, но не будет ли прерывание влиять на передачу данных на комп?

Конечно будет. В момент обработки прерывания - все остальное ждет. Поэтому в функцию обработки прерывания и нужно делать как можно меньшей. Только регистрацию времени импульса.

 Но это намного лучше чем быть занятым отправкой в serial (как скетч выше), и при этом проворонить пришедший импульс. 

>очень малы и дуина не будет успевать за этот интервал отправлять все данные и они будут теряться

Ну  с этим ничего не сделаешь. Если данные приходят быстрее чем их возможно отправлять - какая-то часть будет потерянна.

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

>И вместо millis() нужно использовать micros().

Да, вы правы. Проглядел что там есть интервалы в 500 микросекунд, показалось что все больше 1000.

 

 

Marchcat
Offline
Зарегистрирован: 06.05.2012

половину данных теряется ! как запихнуть по битово в массивы и вывести инфу в хексе ???

leshak
Offline
Зарегистрирован: 29.09.2011

>как запихнуть по битово в массивы

Вообщем-то побитово запихивается в байты, а не массивы

 http://arduino.cc/en/Reference/HomePage

Раздел "Bitwise Operators"  (в русской доке не т этого раздела)

> и вывести инфу в хексе

http://arduino.ru/Reference/Serial/Print

 

 

 

 

 

Marchcat
Offline
Зарегистрирован: 06.05.2012

 int pin = 2;
byte m[8];
unsigned long t0, t1, tx;

void setup(){
Serial.begin(38400);
}
void loop(){
t0 = pulseIn(pin, LOW);
t1 = pulseIn(pin, HIGH);
tx = t0 + t1 ;
for (int i=0; i<8 ; i++){
if ( 30 < t0 ){
if ( 140 < tx && tx < 180 ){
m[i] = 0 ;}
if ( 200 < tx && tx < 260 ){
m[i] = 1;}
}
}
for (int i=0; i<8 ; i++){
Serial.println(m[i]);}
}

 

что не так ???

leshak
Offline
Зарегистрирован: 29.09.2011

 >что не так ???

Я не телепат. Откуда я знаю что вы видите в serial мониторе и чего вы ждали там увидеть.

Marchcat
Offline
Зарегистрирован: 06.05.2012

как мне загнать 64 бита по байтам ! а потом вывести их на сериал монитор ?? 

leshak
Offline
Зарегистрирован: 29.09.2011

 1. Прочитат ссылки, которые я давал выше. Первая - как загоднять биты в байты. Вторая - как выводить hex в сериал.

2. В том счектче что вы написали вы делаете следующие (подозреваю что вы хотели не этого). Делаете один(!) замер импульсов, а потом на его основании заполняете массив. Но так как каждый элемент массива вы заполняете исходя из данных одного и того же измерения - естествено все элементы этого массива будут получаться одинаковыми. Либо все 1, либо все 0. Если вы хотите что-бы каждый элемент массива содержал результаты разных измерений, то и pulseIn вам нужно делать внутри цикла, а не перед ним.

Marchcat
Offline
Зарегистрирован: 06.05.2012
 int pin = 2;
byte m[8];
byte z[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000};
unsigned long t0, t1, tx;

void setup(){
Serial.begin(9600);
pinMode(pin, INPUT);
}
void loop(){
t0 = pulseIn(pin, LOW);
t1 = pulseIn(pin, HIGH);
tx = t0 + t1 ;
if ( 30 < t0 ){
for (int i=0; i<8 ; i++)
{ 
for (int n=0; n<8 ; n++)
{
if ( 110 < tx && tx < 180 ){bitClear(z[i], n);}
if ( 190 < tx && tx < 300 ){bitSet(z[i], n);}
}
if ( i = 7 ){
for (int t=0; t < 8 ; t++ )
{
Serial.print(z[t], HEX);}
}
}}}

 

leshak
Offline
Зарегистрирован: 29.09.2011

 1. Обязательно прочитайте arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii (и поправте сообщение #23)

2.  Было-бы не плохо, не просто дать скетч, он еще сообщить по какому поводу он дан. Что это? Примор "вот так зарабтало" или "вот так не работает"? Скорее всего второе, но коммент "в чем проявляется неправильность его работы" и чего вы хотите добится его публикацией - сильно не помешал бы.

3. Пункт 1, из сообщения #22, вы  выполнили. Хексы выводите, в биты в байты загоняете. Хотя и не теми операторами что я советовал, bitClear, bitSet вообщем-то тут абсолютно правомочны и будут рабоать, но советую, все-таки, разобртся именно с операторамии << и |

В 99% примеров кода, которые имеются в интернете, используются именно они. И уметь ими пользоваться - нужно.

4. Пункт 2, из сообщения #22, вы явно проигнорировали. В результате, скорее всего имеете на выходе либо все нули, либо все FF.

5. После самомго последнего for (в котором вы выводите в Serial), я бы рекомендовал добавить строчку "Serial.println(); " . Что-бы каждый восемь байт были в отдельной строке и их было легче читать, а не сливались в бесконечную "бракодабру".

Marchcat
Offline
Зарегистрирован: 06.05.2012

 Я Собираю Анализатор обмена данных между машиной и чипом pcf7936 . На антене 125Khz .сейчас программа работает но не совсем коректно . пишет байт потом семь 0 и тд. не знаю ка от семи 0 избавиться .А также от To ! постоянно шлет массив в эфир !!!!

int pin = 2;
byte m[8];
unsigned long t0, t1, tx, t2;

void setup(){
  Serial.begin(9600);
  pinMode(pin, INPUT);
}
void loop(){
         t0 = pulseIn(pin, LOW);
   if ( 30 < t0 ){
      for (int i=0; i<8 ; i++)
      { 
        for (int n=0; n<8 ; n++)
        {
         t1 = pulseIn(pin, HIGH);
                t2 = pulseIn(pin, LOW);
            tx = t1 + t2 ;
    if ( 110 < tx && tx < 180 ){bitClear(m[i], n);}
     if ( 190 < tx && tx < 300 ){bitSet(m[i], n);}
   }
  if ( i = 7 ){
    for (int t=0; t < 32 ; t++ )
    {
     Serial.print(m[t], HEX);}
   }
}}}


leshak
Offline
Зарегистрирован: 29.09.2011

Во первых, хоть и не критично, но имеет смысл вынести цикл for(int t=0... , за пределы цикла for(int i=0, тогда проверка if(i=7) станет не нужна.

Во вторых, вы наверное удивитесь, строчка if( i=7 ) не проверяет равна ли переменная  i семи. Она присваивает i значение 7 (вне зависимости чему она была равно до этого), и проверяет больше ли нуля полученный результат. А 7 мь, естественно, всегда будет больше нуля.

В третьих, почему в, с рочке 22, t<32? Откуда взялись эти 32? У вас же восемь байт. Даже если предположить что вы случайно постчитали количество бить, то 8*8=64.

Итого: вы заполняете первый байт, устанавливаете i в 7 (фактическим этим вы завершается цикл for(ini i=), пройдя его всего одни раз), выводите массив 8-ми байтов (хотя успели заполнить только первый) плюс еще 24-ре байта мусора (какой-то случайный участок памяти, в котором может быть что угодно).

Все. Дальше вы опять ждете импульса длинно больше 30 микросекунд и исполняете этот танец (прочитали одинй байт, вывели кучу) по новой.

-----------------

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