|
Электрика и DCC Обсуждение цифрового и аналогового управления |
|
Опции темы | Опции просмотра |
14.08.2017, 23:57 | #151 |
Заглянувший
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
|
и с ним тоже были приключения ( похоже происходит когда у ардуины нет отдельного питания ).
посмотрел монитором данные которые отправляются - какой-то бред - Serial.print("packet; "); Serial.println(packet); packet; ZZ packet; XX packet; VV packet; UU packet; SS packet; RR packet; случайный пример из монитора. может вместо пакета как-то массив можно создать ? по ссылкам - темный лес для меня( |
15.08.2017, 00:01 | #152 | |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Цитата:
Код:
void sendPacket(int address, char *packet, int len) { Wire.beginTransmission(address); // transmit to device Wire.write(packet, len); Wire.endTransmission(); } Код:
... sendPacket(11, packet, sizeof(packet)); ... |
|
Пользователь сказал cпасибо: |
15.08.2017, 00:17 | #153 |
Заглянувший
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
|
|
15.08.2017, 00:34 | #154 | |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Для этого есть специальная кнопка
Цитата:
Чтобы было куда добавлять аргументы, увеличим массив packet, чтобы можно было отправлять 1 команду и 9 ее аргументов максимально: Код:
char packet[10]; |
|
15.08.2017, 01:12 | #155 | |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
Коллега, если мы так будем в лоб все говорить, камрад так и будет ждать готовый вариант
Я дал направление изучения, и даже пальцем ткнул в нужно место... ---------- Сообщение добавлено в 01:12 ---------- Предыдущие сообщение было в 01:04 ---------- Цитата:
Arduino код:
Arduino код:
|
|
15.08.2017, 09:53 | #156 |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Да, в частном случае сработает, но как только появятся команды длиннее 2-х байт, то ожидают проблемы.
---------- Сообщение добавлено в 09:53 ---------- Предыдущие сообщение было в 09:53 ---------- Речь про вот эту строку: |
15.08.2017, 10:53 | #157 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
Да ну
Вы тоже самое делаете, только в другом месте и передаете полученный результат в функцию в качестве аргумента зачем передавать аргументом то, что вычислить можно "на месте"? с sizeof(packet) проблемы будут в том случае, если массив не одномерный. а чтобы избежать проблем наверняка, то считать лучше так sizeof(myarray) / sizeof(myarray[0]); Ну и в целом, что бы я сделал по другому. 1. как пример, я приводил протоколы DCC++ и JMRI WiThrottle, как можно было заметить - они содержат команды в одну строку, в которой есть признак начала и окончания "пакета". Это позволяет "выгребать" буфер приемника и анализировать его не привязываясь к размеру того, что должно было прийти. ну в крайнем случае, я бы использовал не массив, а структуру. ее проще разобрать и однозначно идентифицировать данные. 2. я бы привел все команды к одному стандарту, например первый элемент - команда, 2-й адрес исполнительного устройства (номер выхода на модуле, номер ШИМ и т.п.) и 3-й - значение. например 10 3 128 - где 10 = команда на изменение скорости, 3 = 3-й пин (PWM A моторшилда), 128 = значение которое нужно записать (хотя, в качестве команды я бы всетаки букву использовал) или 11 12 1 - где 11 = команда на изменение направления, 12 = 12 пин (DIR A моторшилда), 1 = значение, которое в него записать 12 5 0 - где 12 = команда на переключение аксессуарного декодера, 5 пин значение 0. 3. я бы не делал map на стороне передатчика Arduino код:
более того, на соседнем форуме я уже коллеге писал и приводил конкретные примеры, для того, чтобы сдвинуть лок с места, значения ШИМ 1 не достаточно, локи разных фирм трогаются при разных минимальных значениях, от 50 до 70, т.е. значение ШИМ нужно менять не в диапазоне 0-255, а 60-255. да и в любом случае, всегда лучше отдать с передатчика то, что на нем измерили, а на приемнике уже привести в соответствие с тем, как именно этот приемник должен обработать полученные данные. Можно начинать кидать в меня тапками |
15.08.2017, 10:59 | #158 | |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Цитата:
Вопрос с том, что именно передается в sendPacket. Обратите внимание на "*" в описании аргумента packet. ---------- Сообщение добавлено в 10:59 ---------- Предыдущие сообщение было в 10:57 ---------- Тут идет работа с указателями. В стек вызова ф-ии идет не сам массив, а указатель на него. Поэтому и надо указывать длину, т.к. по указателю непонятна длина куска памяти, который надо обработать. |
|
15.08.2017, 11:03 | #159 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
ЗЫ... А чтобы избежать лишней работы в последствии, я бы сделал команду четырех битной, добавил бы еще адрес устройства, которому адресована эта команда вторым аргументом
10 11 2 128 Понятно, что для I2C это не актуально, но вдруг, комуто понравится реализация передатчика, но связь захочется через RS485 сделать (возможно и сам коллега к этому придет). Такая реализация позволит избежать в дальнейшем перелопачивание всего кода. Всегда смотрите с прицелом на будущее, я на работе уже запарился вставлять "костыли" в код тех, кто думает и живет сегодняшним днем ---------- Сообщение добавлено в 11:03 ---------- Предыдущие сообщение было в 11:00 ---------- Пробовал Работает. Прежде, чем указать коллеге на место, где нужно "копать", все было проверено на натурных испытаниях... Более того, так как я не большой специалист в C++, для меня самого стало неожиданностью, почему отправляется массив из двух элементов, а по ссылке прилетает три. И указанные коллеги ссылки были найдены мной в процессе выяснения, почему так происходит... |
15.08.2017, 11:06 | #160 |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
|
15.08.2017, 11:11 | #161 | |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
Цитата:
Wire.write(packet, len); - тут? И чем принципиально в таком случае отличается ..... sendPacket(11, packet, sizeof(packet)); ....... void sendPacket(int address, char *packet, int len) ....... Wire.write(packet, len); ....... от ..... sendPacket(11, packet); ....... void sendPacket(int address, char *packet) ....... Wire.write(packet, , sizeof(packet)); ....... ? ---------- Сообщение добавлено в 11:08 ---------- Предыдущие сообщение было в 11:07 ---------- нет, я проверял на трех байтах... но длину массива высчитывал как указывал выше, sizeof(myarray) / sizeof(myarray[0]); ---------- Сообщение добавлено в 11:11 ---------- Предыдущие сообщение было в 11:08 ---------- на сколько я понимаю, принципиально это влияет только на то, что все изменения которые вы внесете в функции в этот массив, будут применены к нему глобально, а не локально... |
|
15.08.2017, 11:18 | #162 | |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Отличается тем, что sizeof(packet) внутри sendPacket всегда будет выдавать 2.
Цитата:
---------- Сообщение добавлено в 11:18 ---------- Предыдущие сообщение было в 11:15 ---------- Типа того, т.к. при вызове в sendPacket не передается копия переменной packet, а только адрес памяти, с которого начинается глобальная переменная packet. |
|
15.08.2017, 11:25 | #163 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
|
15.08.2017, 15:25 | #164 |
Заглянувший
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
|
|
15.08.2017, 15:34 | #165 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
всмысле как??? что считали в analogRead - то и передавайте.
Да хоть 4294967295 можете передать, как unsigned long В чем проблема то? Я к чему... Вот, допустим, у вас два блок участка управляемых с одного пульта. Один из них станционный или маневровый, где максимальная скорость ограничена. Передавая все, что вы сняли с analogRead пульта, на модулях можно замапить по разному. На главном ходу на полную, а на станции - в половину, к примеру. Можно, конечно и замапленное еще раз замапить, но это как то не кошерно |
15.08.2017, 15:57 | #166 | |
Заглянувший
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
|
одним байтом ?
Цитата:
ограничения скорости по блок-участкам можно локально на модулях сделать. А так же на пульте можно разные скоростные режимы для разных типов локов сделать ( паровоз/тепловоз/ и тд ). я с пакетами опять подзапутался - если на пульте N-е кол-во переменных от кнопок и потенциометров - как всю передачу данных организовать - последовательно каждую комманду по 2 байта или массивом |
|
15.08.2017, 16:02 | #167 | |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Цитата:
Другая ф-ия смотрит эту очередь и отправляет по мере сил или по мере загруженности канала. |
|
15.08.2017, 17:09 | #168 |
Заглянувший
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
|
я сейчас пробовал с таким вариантом -
Код:
void loop() { value=map(analogRead(0), 0, 1024, 0, 255); if(value!=speed) { speed=value; packet[0]=10; // 10 - будет команда на изменение скорости packet[1]=speed; // значение - скорость sendPacket(8, packet,sizeof(packet));} { if ( digitalRead(2) == HIGH ) { dir=1;} else { dir=0;} packet[0]=11; // 11 - будет команда на изменение направления packet[1]=dir; // значение - скорость sendPacket(8, packet,sizeof(packet));} |
15.08.2017, 17:17 | #169 | |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
зачем вам байты, прочитайте то, что я выше писал, как бы сделал я...
Цитата:
отвяжитесь от байтов, передавайте структурой или текстом! рано или поздно, вы поймете, что вам байтов не хватает и начнете перелопачивать весь код, о чем я также выше писал. не живите днем сегодняшним, смотрите в будущее и делайте на перспективу. иначе, потом придется "костыли" вставлять в код... |
|
15.08.2017, 17:54 | #170 |
Заглянувший
Регистрация: 07.09.2015
Адрес: SPb
Сообщений: 76
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 8
Поблагодарили 6 раз(а) в 6 сообщениях
Репутация: пока неопределено (6)
|
да я бы рад,но с байтами мне есть от чего плясать ,а примеров со строкой у меня не имеется.Я понимаю, что вы имели в виду,но без контекста и с 0.5 не разобраться будет )))
какой из примеров по строке в IDE брать за основу ? |
15.08.2017, 17:57 | #171 | |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Цитата:
Поменял тип элементов массива и его размерность. Несложно посчитать, что в памяти массив займет 20 байт (4*5=20). "unsigned long" занимает 4 байта, элементов в массиве 5 шт. К анализу предлагаю такой несложный скетч: Код:
unsigned long packet[5]; void setup() { Serial.begin(250000); sendPacket(packet); } void loop() { } void sendPacket(unsigned long *packet) { Serial.print("sizeof(packet[0]):"); Serial.println(sizeof(packet[0])); Serial.print("sizeof(packet):"); Serial.println(sizeof(packet)); } Не открывая ответ, подумайте, что на Ваш взгляд выдаст ф-ия sendPacket в порт, в соответствии со скетчем? sizeof(packet[0]): - ? sizeof(packet): - ? Если правильно понял, то с Вашей точки зрения скетч напишет: sizeof(packet[0]): 4 sizeof(packet): 20 ... однако ... оффтопик |
|
15.08.2017, 18:31 | #172 |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
Про указатели.
Кстати, нельзя не заметить что вот так непринужденно начали работать на ТС сейчас про С все расскажем, уже было про обработчики событий/команд и т.д. ... оффтопик |
15.08.2017, 20:54 | #173 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
я вам приводил массу ссылок и даже кусков кода... изучайте.
все это реализовано в DCC++, ну разве что даные там через serial гоняются, но это не принципиально, так как всеравно считывается из буфера и побайтно. ---------- Сообщение добавлено в 20:54 ---------- Предыдущие сообщение было в 20:37 ---------- хм... снимаю шляпу... сам лопух, я же не со ссылкой "ковырялся", а с копией... со ссылкой действительно выдает всегда 2... |
15.08.2017, 23:02 | #174 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Репутация: репутация неоспорима (2791)
|
и не говорите...
вникайте... Потенциометр к пину A0 подключайте. Пульт: Arduino код:
Arduino код:
|
Пользователь сказал cпасибо: |
16.08.2017, 00:42 | #175 |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,858
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,650
Поблагодарили 3,274 раз(а) в 1,172 сообщениях
Репутация: репутация неоспорима (3285)
|
|
Опции темы | |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
цифровое управление садовой дорогой | Залызныця | Садовые жд (Уличные макеты) | 76 | 01.12.2022 08:55 |
кран едк-2000 цифровое управление | manfred | Электрика и DCC | 1 | 21.08.2011 20:37 |
Цифровое управление Marklin | Stepanov | Электрика и DCC | 4 | 03.02.2010 20:57 |
помогите разобраться, управление цифровое... | Leonar | Электрика и DCC | 12 | 20.01.2010 18:02 |
Цифровое управление | Илья | Электрика и DCC | 26 | 15.07.2008 19:52 |