Скетч для ардуино, отправки кода открытия шлагбаума CAME

Приемники и передатчики цифровые и аналоговые

Модератор: gurvinok

Аватара пользователя
GhostX
Сообщения: 1122
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 21 янв 2019, 01:13

gurvinok писал(а):
20 янв 2019, 23:40
Нарисуй пожалуйста схему включения модулей. Я попробую собрать все это на столе и проверю скетчи.
Там и схема не нужна, три провода. Плюс, гнд и дата. Дата на 8 пин у передатчика.
Тоже самое на приемнике, только 2 пин у дата, ну и плюс да гнд.

Аватара пользователя
gurvinok
Сообщения: 1521
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение gurvinok » 21 янв 2019, 14:08

Задом наперед данные приходят из-за криворукости авторов функций. Это к стати говоря частая проблема при использовании чужих библиотек))) Буквально недавно правил свою для работы с ds18b20. Не первый раз жалуются на нее.
Если долго мучиться, может быть получится.

sega1983
Сообщения: 5
Зарегистрирован: 19 янв 2019, 16:37

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение sega1983 » 22 янв 2019, 17:32

Изменения в скетче ничего не дали,там видимо не слабо напутано.У меня вопрос такого плана: код в (16) 5F8B75=10111111000101101110101(2), а BFF76C(16)=101111111111011101101100(2).А у вас при передаче.Цитирую: BFF76C и 111111011110111100110110
Одно и тоже число по коду передачи.Почему так получается,может не надо вносить изменения в скетче,а просто изменить код передачи?Как 5F8B75(16) правильно перевернуть для передачи?

Аватара пользователя
GhostX
Сообщения: 1122
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 23 янв 2019, 00:53

Почему так получается,может не надо вносить изменения в скетче,а просто изменить код передачи?
Из этого вопроса понимаю, что вы совсем не понимаете как работает программа.
Пробуем исправить этот пробел.
Как отправлять через этот скетч:


#define txPin 8 //назначаем порт txPin = 8 тоесть пин 8 можно другой использовать
#define Te 320 //присваиваем значение 320мкс переменной Te
//далее придет понимание что это такое.
void setup(){// надеюсь, что эта функция вопросов не вызывает.
pinMode(txPin, OUTPUT);// назначаем порт txPin (8) выходом.
}

void loop()
{
SendCame(0b111111011110111100110110); //код от моего шлагбаума шиворот навыворот. в HEX это BFF76C
//Вот тут мы вызываем функцию SendCame и передаем в нее значение 0b111111011110111100110110 количество бит имеет значение их 24 первые 0b, это значит, что число в бинаре. Можно передавать в 16ричной системе. Тогда писать надо 0x пример 0xBFF76C. В бинаре же написано, чтоб легче найти возможные ошибки.
}

void SendCameBit(byte b)// это функция передачи которая вызывается из цикла ниже.
{
delayMicroseconds(Te);//ждем Te, а Te у нас как назначили выше = 320 микросекунд
if (!b) digitalWrite(txPin,HIGH);// это условие логическое отрицание, дословно если !b верно дергаем ногу в единицу нога 8, это HIGH=1 дословно если вызвали функцию и отправили в нее 0, то это true, если пришла 1, то это false подробнее читаем тут http://arduino.ru/Reference/Boolean
delayMicroseconds(Te);// ждем 320 микросекунд
digitalWrite(txPin,HIGH);// ногу в high если была 0 стала 1, если была 1, то 1 и остается. Какое на ней состояние определяется условием выше
delayMicroseconds(Te);// снова ждем 320 микросекунд
digitalWrite(txPin,LOW);// и тушим ногу, состояние 0
// теперь разбираем кашу в голове. Чтоб шлагбаум понял, что приходит в пакете есть определенный алгоритм. После стартового импульса, ниже обозначу его, программа начинает считывать данные. Выглядит это так. Стартовый импульс, единица, висит 320 микросекунд потом Лог. «1» — 640мкс низкий уровень (два интервала), 320мкс высокий (один интервал)
Лог. «0» — 320мкс низкий уровень (один интервал), 640мкс высокий (два интервала). Теперь, чтоб совсем не запутаться смотрим наглядно тут http://phreakerclub.com/447#more-447/url

}

void SendCame(long Code) //это та самая функция в которую мы передаем наш код. Назначаем переменную полученным данным (long ее тип, занимает 4 байта в памяти) (Code имя переменной)
{
for (int j=0;j<5;j++) // посылку посылаем как и брелок - 4 раза подряд.(это цикл который посылает 4 раза наш код)
{
digitalWrite(txPin,HIGH);// а это наш стартовый импульс включен 320 мкс и выключается
delayMicroseconds(Te); //ждем 320мкс
digitalWrite(txPin,LOW);// посылаем стартовый импульс( вот тут команда выключения)

for (byte i=24;i>0;i--){ // углубляемся. Это цикл который перебирает наш отправляемый код по битику. 24, это количество битиков из которых состоит наш код. Для наглядности там на верху он записан в бинаре.
SendCameBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код( тут подробнее остановимся. bitRead это команда на чтение бита. Code, это та самая переменная которой мы назначили тип long. Тоесть в этой переменной сейчас и находится наш код, который мы начинаем перебирать. i-1 это номер бита. Нумерация начинается с младшего бита с право на лево. Подробнее об этом, идем к нашим украинским коллегам. https://doc.arduino.ua/ru/prog/BitRead
Для каждого бита дергаем функцию, что выше которая состоит из 320мкс вкючили-выключили. Она 24 раза вызывается, на каждый бит отдельно.
}
// никаких стоповых битов нет. Так что при необходимости, можно увеличивать длину кода или уменьшать в зависимости от поставленных задач. Ну само собой с изменением количества вызовов цикла.
delay(16); // сделать паузу после кода внутри пакета.(эта пауза между блоками посылок, тех, что 4 раза отправляются.)
}
delay(2000); // сделать паузу после посылки на 2 с(эта пауза между блоками что по 4 посылки отправлены были. Тобишь отправили 4 раза наш код и ждем пару секунд.)
}

Ну вот наверное и все.
Теперь вы сможете просто изменить код передачи. Например для отправки кодов не для CAME, а например NICE. Описание на него вы уже видели проходя по ссылкам.
Ничего сложного, только муторно.
А и да. Для проверки правильности отправки с право на лево или с лева на право используйте 0b000000000000000000000101
Если придет он же, то все верно, если придет наизнанку, 0b1010000....0 значит не правильно.
Думаю вы теперь дня на 3 пропадете изучая материал. Пишите о своих успехах в изучении.
PS. Алексей, я знаю, что ты прочитаешь эту писанину, и я знаю, что допускал в описании не точности, и возможно что то обозвал не так как положено называть. Попрошу быть снисходительным, не перегрузи излишним педантизмом человека.))

Аватара пользователя
GhostX
Сообщения: 1122
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Скетч для ардуино, отправки кода открытия шлагбаума CAME

Сообщение GhostX » 26 янв 2019, 09:42

sega1983 писал(а):
22 янв 2019, 17:32
А у вас при передаче.Цитирую: BFF76C и 111111011110111100110110
Одно и тоже число по коду передачи.
Добрался до компьютера. BFF76C ≠ 111111011110111100110110, это не обязательно ошибка. Изначально там скорее всего стояло соответствие BFF76C, а потом код поменял, а комментарий остался не тронутым. Поэтому голову над этим не соответствием ломать не стоит. Я уже писал, что алгоритм этот ушел в проект не связанный со шлагбаумами.
Дальше.
Бегло пробежался по скетчу приема. Изначально было все правильно переворачивать не надо было.
sega1983 писал(а):
22 янв 2019, 17:32
Как 5F8B75(16) правильно перевернуть для передачи?
Правильно перевернуть для передачи можно будет, когда напишите скетч, который заливаете на прием, на передачу и то, что приходит.
Без этой информации, изучаете как оно работает сами, так экстрасенсов тут нет... извините.

Ответить