Прочитать успеет, это точно. Надо писать, готового решения я не видел, так как так обычно не делают. Но если очень хочется... разберитесь, как сигнал заводится в ардуино, как подключаются кнопки.(подскажу, есть два варианта, когда кнопка коммутируется на 5в и когда на gnd), тут будет похоже. Посмотрите как работать не с отдельными кнопками а с портом ардуино (одновременно 8 пинов).
Подключение DAT на 2 вход ардуино. Програмка осцилографа у вас есть
код для Arduino слудующий. (я вывод на цифровой изменил, может что получиться). Надо 4 - 6 пакетов подряд(можно на разных экранах). И что бы на 1 экране было 2 пакета
byte head[3]={170,204,195};
byte MyBuff[800];
unsigned int i=0;
void setup()
{
Serial.begin(115200);
}
void loop()
{
for (i=0; i < 800; i++)
{
MyBuff[i] = digitalRead(2);
}
Serial.write(head,3);
Serial.write(MyBuff,800);
}
Вообще 0 ниче не ловит. но у меня завтра будет возможность но нормальном осциле посмотреть. Просто бесит уже вотчувствую что ниче гениального здесь нет и не думаю что мк на плате лучше чем атмега 328)
А вот еще идея а что если снимать как нить данные перед Мк в основном блоке? там стоит такой же МК что и на индикаторе который как я понял шифрует все дело это. Есть идеи?
Вот фото платы вообщем состоит из 2ух основных частейгенератора и мультиплексора который передает и принимает эхо и МК на вывод который шифрует данные. Из схемы понятно что МК смотрит по 2 каналам только с мультиплесора на Мк выходят 2 линии. они на фото не видны они снизу.
Я же написал, на второй выход. Второй цифровой. Это в скетче видно же... У цифрового частота выше , с запасом хватит. Только разметка шкалы осцилографа будет не верной, но это не столь принципиально сейчас
Вот то что успеваю поимать первая картинка без препятствий вторая с упор препятствия. ниче разобрать не получается так как куоск того куоск того в целом не хвататет даже деления и масштаба.
Видно что пачки по пять милисекунд и по 1 милисекунде а связать не могу никакой закономерности.( Стоит на осцилографффе смотреть нормальном? и что именно смотреть завтра к другу на работу заиду у енго есть осцил нормальный.
не по пять, сейчас шкала неправильная. пока не заморачивайтесь на датчики и растояния. Надо понять как 0 и 1 закодировано, и как идут паузы между пачками импульсов идут...
я вижу что 0 - это короткий, 1 - длинный, но что между пачками импульсов и как выглядит пачка полностью, я не пойму....
По данным пульсин - в начале идет синхросигнал, но на ваших последних графиках я его не вижу.
Попробуйте еще поймать начало пачки импульсов и конец. (так что бы пачка имульсов была на пол экрана)
Прут длинные импульсы , перемежаемые парами коротких, чтобы интерпретировать картину нужна точка отсчета, по которой долдна стартовать синхронизация ...
Попробуй вот этот скеч, он выведет в порт точные тайменги и по ним можно будет понять где синхро импульс. В данной конфигурации этот код замеряет тайменги низкого уровня, если хочешь можешь заменить RISING на FALLING и замерять тайминги высокого уровня.
Вопрос к Роману: Не подскажите как организовать массив на 12 байт и записывать туда при 5мс - 1 и при 2мс - 0 и при сигнале 8мс обнулить буфер, так что бы был масив с которым можно было уже работать, назначать действия, и отправить в комп в виде пакета.
#include <TimerOne.h>
#define BTNPIN 2 // Вход сигнала
#define TEST 13 // Тест
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
void setup()
{
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
startImpuls=0;
lengthImpuls=0;
pinMode (TEST, OUTPUT);
Serial.begin(115200);
Timer1.initialize(1000); // Интервал срабатывания таймера 1мс
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, FALLING); // Запуск таймера при наличии сигнала LOW
// Замеряем только низкий уровень сигнала
}
void callback() { timerCount++; }
void loop()
{
if (lengthImpuls > 0)
{
uint16_t li = lengthImpuls;
lengthImpuls=0;
if (li > 7 && li < 9) // При сигнале длинной 8мс начало пакета
digitalWrite(13, LOW);
if (li > 1 && li < 3) // При сигнале длинной 2мс соответствует - 0
digitalWrite(13, LOW);
if (li > 4 && li < 6) // При сигнале длинной 5мс соответствует - 1
digitalWrite(13, HIGH);
Serial.println (li, DEC); // Отправляем в порт для тестового просмотра
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, RISING);
}
// Функция обработки прерывания на падение
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, FALLING);
}
Я коненчо гляну. А что народ думает про тот вариант чтобы снять показания до МК который в основном блоке стоит? может проще. будет. Как вы думает с мультиплексора какой сигнал заводится на мК?
Нет никаких проблем изменить частоту, там где у меня стоит 1000 (1мс) измени частоту на 100 и посмотри что придет в порт а там уже в таком виде в каком в порт придет можешь подставлять свои значения в код где сравнение сигналов
ps: таймер работает с частотой от 1 мкс, но это не нужный расход машинного времени, 100 в твоем случае самое оно
А кстати в коде ошибку выдает не помню какую что то по поводу индефикатора но бибила есть на таимер. Странно глянь код еще раз свои че то может не хватает?
А кстати в коде ошибку выдает не помню какую что то по поводу индефикатора но бибила есть на таимер. Странно глянь код еще раз свои че то может не хватает?
Видно что по четыре пачки отправляет по каждому датчику? без препятствии первые две цифры закономерно повторяются а при появлении препятствия меняются. Может не все ловит дуня?
Ну так последний скеч работает ;) 72-75 адрес датчика. 7- признак исправности (подключите числа немного другие будут ) 255 - расстояние. Подключайте датчик, смотрите что покажет. В принципе вы же хотели на цинтрафузу, а на форуме это было.
Если в BIN виде вывидите, увидите как датчик адресуется. 4 пачки - так в проге задано. Вроде похоже на правду. Для уточнения надо осцилограф посмотреть.
А вот сравнение). Есть закономерность но не поиму что за че отвечает точнее понимаю но расшифровать незнаю как. Где (-) - это нет препятствия. А вот (0.0) практически в упор. (0.4) и (1.0) приблизительно могу ошибится в 10 см. Что скажите
Код на ардуино похоже немного кривой ) считает немного неверно. 66 скорее всего ошибка счета. Зацепилась 1 из следуюших 4 битов. 148, 38 - расстояние в попугаях. Будет меняться в зависимости от расстояния. Адрес датчика 65. Дальнейшие планы какие ? 6,7 самодиагностика, живой или нет. Если в бинарном виде смотреть, то это 0/1 на 5 бите, кажется. Надо калькулятор, под рукой нет. Выведите бинарном виде, понятно станет
Мне не для Центрафуза у меня свое ПО для ПСкар и я могу написать че угодно мне просто принцип нужен зависимости. что за что отвечает тут понятниее уже но с расстоянием не поиму и с первыми цифрами которые отвечают за датчик. Что на подключенных что на отключенных тоже самое.
Прочитать успеет, это точно. Надо писать, готового решения я не видел, так как так обычно не делают. Но если очень хочется... разберитесь, как сигнал заводится в ардуино, как подключаются кнопки.(подскажу, есть два варианта, когда кнопка коммутируется на 5в и когда на gnd), тут будет похоже. Посмотрите как работать не с отдельными кнопками а с портом ардуино (одновременно 8 пинов).
ОК гляну.
А давайте еще вот так попробуем:
Подключение DAT на 2 вход ардуино. Програмка осцилографа у вас есть
код для Arduino слудующий. (я вывод на цифровой изменил, может что получиться). Надо 4 - 6 пакетов подряд(можно на разных экранах). И что бы на 1 экране было 2 пакета
Я попробую. но вы же говорили что частоты мало у дуни(
Вообще 0 ниче не ловит. но у меня завтра будет возможность но нормальном осциле посмотреть. Просто бесит уже вотчувствую что ниче гениального здесь нет и не думаю что мк на плате лучше чем атмега 328)
А вот еще идея а что если снимать как нить данные перед Мк в основном блоке? там стоит такой же МК что и на индикаторе который как я понял шифрует все дело это. Есть идеи?
Вот фото платы вообщем состоит из 2ух основных частейгенератора и мультиплексора который передает и принимает эхо и МК на вывод который шифрует данные. Из схемы понятно что МК смотрит по 2 каналам только с мультиплесора на Мк выходят 2 линии. они на фото не видны они снизу.
Я же написал, на второй выход. Второй цифровой. Это в скетче видно же... У цифрового частота выше , с запасом хватит. Только разметка шкалы осцилографа будет не верной, но это не столь принципиально сейчас
Все сделал вообще не ловит не прикаких параметрах линия пустая.
Сорру, там действительно у меня ошибочка небольшая.
вместо
MyBuff[i] = digitalRead(2);
напишите
MyBuff[i] = digitalRead(2) * 255;
(просто изначально в проге 5 в - это 255)
Вот то что успеваю поимать первая картинка без препятствий вторая с упор препятствия. ниче разобрать не получается так как куоск того куоск того в целом не хвататет даже деления и масштаба.
Видно что пачки по пять милисекунд и по 1 милисекунде а связать не могу никакой закономерности.( Стоит на осцилографффе смотреть нормальном? и что именно смотреть завтра к другу на работу заиду у енго есть осцил нормальный.
не по пять, сейчас шкала неправильная. пока не заморачивайтесь на датчики и растояния. Надо понять как 0 и 1 закодировано, и как идут паузы между пачками импульсов идут...
я вижу что 0 - это короткий, 1 - длинный, но что между пачками импульсов и как выглядит пачка полностью, я не пойму....
По данным пульсин - в начале идет синхросигнал, но на ваших последних графиках я его не вижу.
Попробуйте еще поймать начало пачки импульсов и конец. (так что бы пачка имульсов была на пол экрана)
Прут длинные импульсы , перемежаемые парами коротких, чтобы интерпретировать картину нужна точка отсчета, по которой долдна стартовать синхронизация ...
Если вы не понимаете то я подавно(. завтра могу на осциле обычном нормальном глянуть. Стоит?
inspiritus прав. По вашим последним графикам это как раз таки и непонятно.
Попробуйте еще поймать начало пачки импульсов и конец. (так что бы пачка имульсов была на пол экрана)
Сделаете фотки с осцилографа, будет вообще шикарно... Только начало пачки явно покажите... (скорее всего там будет +5 около 1000 мкС) ну и конец.
Попробуй вот этот скеч, он выведет в порт точные тайменги и по ним можно будет понять где синхро импульс. В данной конфигурации этот код замеряет тайменги низкого уровня, если хочешь можешь заменить RISING на FALLING и замерять тайминги высокого уровня.
Вопрос к Роману: Не подскажите как организовать массив на 12 байт и записывать туда при 5мс - 1 и при 2мс - 0 и при сигнале 8мс обнулить буфер, так что бы был масив с которым можно было уже работать, назначать действия, и отправить в комп в виде пакета.
Прикольно сделали. не думал что так можно :) В прерывании переключить тип прерывание это круто :) можно сэкономить на чтение значения порта.
К сожадению у Seltvik частота следования импульсов 400 мкС. Так что ваш код не подойдет. Вы мереете кажду 1 мС.
Мысль в целом верная.
По поводу массива. я бы сделал так:
обьявить массив (к примеру) mas
обьявить переменную (к примеру) t
счетчик - я бы использовала micros()
прерывание на + -> обнулить счетчик
прерывание на - -> если значение счетчика от 1000 до 3000 то mas[t] = 0; ++t
от 4000 до 6000 то mas[t] = 1; ++t
от 7000 до 9000 то t = 0
у Seltvik аналогично, только тайминги другие.
Да не подоидет мне код(. У меня частота другая(.
Я коненчо гляну. А что народ думает про тот вариант чтобы снять показания до МК который в основном блоке стоит? может проще. будет. Как вы думает с мультиплексора какой сигнал заводится на мК?
Нет никаких проблем изменить частоту, там где у меня стоит 1000 (1мс) измени частоту на 100 и посмотри что придет в порт а там уже в таком виде в каком в порт придет можешь подставлять свои значения в код где сравнение сигналов
ps: таймер работает с частотой от 1 мкс, но это не нужный расход машинного времени, 100 в твоем случае самое оно
С мультиплексором будет сложней :) Варианты по сложности: 1) снять инфу с дисплея 2) протокол (чем тут и занимаемся) 3) напрямую с датчиков.
Ок попробую завтро все проделать. Отпишу. Спасибо.
А кстати в коде ошибку выдает не помню какую что то по поводу индефикатора но бибила есть на таимер. Странно глянь код еще раз свои че то может не хватает?
А кстати в коде ошибку выдает не помню какую что то по поводу индефикатора но бибила есть на таимер. Странно глянь код еще раз свои че то может не хватает?
Нужна библиотека TimerOhne скачай здесь, распакуй и убери лишние символы из названия папки должно остаться TimerOne http://arduino-timerone.googlecode.com/files/TimerOne-r11.zip
А это не поможет http://www.mp3car.com/hardware-development/121995-custom-usb-parking-sen...
С этого начали :)
Кстати, можно и без библиотеки таймера. так как в данном случае это аналогично функциям micros() и millis() (токак код поправить надо)
А вот это? http://www.compcar.ru/forum/showthread.php?p=77195&mode=linear#post77195
Вот это тема. Я щас все прочитаю и тоже буду тестить
похоже на протокол, который у XsanderS. ТАйминги похожи на ваши... Где данные с осцилографа ?
Пока нет не дошел до друга планы по работе изменились завтра только.
Пока попробую скетч который предложил мне XsanderS
Попробуйте лучше этот. Тут тайминги правильные для вашего случая. (это с форума взято, с 4 страницы)
Вообщем сделал вот результат со скетча с интервалом в 1000 мкс XsanderS.
А вот тот же скетч только с интервалом в 100мкс
А вот скетч который под споилером с тои ссылки с 4 странице.
А вот с одним подключеным датчиком А результат с препятствием где то пол метра наверно. ТАм где было 72 255 0 0 стало 64 28 0 0 что думаете?
Видно что по четыре пачки отправляет по каждому датчику? без препятствии первые две цифры закономерно повторяются а при появлении препятствия меняются. Может не все ловит дуня?
Ну так последний скеч работает ;) 72-75 адрес датчика. 7- признак исправности (подключите числа немного другие будут ) 255 - расстояние. Подключайте датчик, смотрите что покажет. В принципе вы же хотели на цинтрафузу, а на форуме это было.
Если в BIN виде вывидите, увидите как датчик адресуется. 4 пачки - так в проге задано. Вроде похоже на правду. Для уточнения надо осцилограф посмотреть.
Возможно, в расстоянии биты местами поменять прийдется...
А вот сравнение). Есть закономерность но не поиму что за че отвечает точнее понимаю но расшифровать незнаю как. Где (-) - это нет препятствия. А вот (0.0) практически в упор. (0.4) и (1.0) приблизительно могу ошибится в 10 см. Что скажите
Первая 6 или 7 ,вероятнее всего, дает признак пищать или не пищать...
Код на ардуино похоже немного кривой ) считает немного неверно. 66 скорее всего ошибка счета. Зацепилась 1 из следуюших 4 битов. 148, 38 - расстояние в попугаях. Будет меняться в зависимости от расстояния. Адрес датчика 65. Дальнейшие планы какие ? 6,7 самодиагностика, живой или нет. Если в бинарном виде смотреть, то это 0/1 на 5 бите, кажется. Надо калькулятор, под рукой нет. Выведите бинарном виде, понятно станет
Это первая строка в переводе в бин.
Я тоже понял что первые два как то связаны с номером датчика вторые три расстояние а два нуля в конце хз
Мне не для Центрафуза у меня свое ПО для ПСкар и я могу написать че угодно мне просто принцип нужен зависимости. что за что отвечает тут понятниее уже но с расстоянием не поиму и с первыми цифрами которые отвечают за датчик. Что на подключенных что на отключенных тоже самое.
Что ты вы криво превели... Посчитайте нормально. Вывод в скетче поправите. В Serial.print(packet[i], DEC); вместо DEC поставте BIN
Что именно поправить? Я перевел просто данные величина а вы про скетч имелли ввиду чтобы в бин выводил?
Просто не понял вас сначало) щас сек.