Помогите Разобраться
- Войдите на сайт для отправки комментариев
Переделал маленько код, код компиллируется , но не работает. Задача проста - читать серийный порт , и
исходя из прочитанного управлять портами. Ткните носом чаво не так
int incomingByte = 0;
int action = 0;
void setup() {
Serial.begin(9600);
pinMode(4, OUTPUT); //ШИМ2
pinMode(5, OUTPUT); // СКОРОСТЬ2
pinMode(6, OUTPUT); // СКОРОСТЬ1
pinMode(7, OUTPUT); // ШИМ1
}
void loop() {
//Serial.print("1");
if (Serial.available() > 0) { //если есть доступные данные// считываем байт
incomingByte = Serial.read();
// отсылаем то, что получили
if(incomingByte == 97)
{action = 4,5,6,7; //A
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
analogWrite(4, 255);
analogWrite(7, 255);}
if(incomingByte == 100){
action = 4,5,6,7; //D
digitalWrite(5, LOW);
digitalWrite(6, LOW);
analogWrite(4, 255);
analogWrite(7, 255);}
if(incomingByte == 115){ //S
action = 4,5,6,7;
analogWrite(4, 255);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
analogWrite(7, 255);}
if(incomingByte == 119){ //W
action = 4,5,6,7;
analogWrite(4, 255);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
analogWrite(7, 255);
}
digitalWrite(action, HIGH);
delay(100);
digitalWrite(action, LOW);
action = 0;
digitalWrite(5, LOW);
digitalWrite(6, LOW);
Serial.print("250: ");
Serial.println(incomingByte, DEC);
}
}
Ткнуть носом - это завсегда пожалуста:
1. Называйте темы как-то более информативно. От "нужно помощь", "помогите новичку" и т.п. - уже тошнит (угадайте про что были эти темы?) Сможете их отличить от сотни с таким же названием?
2. Вставка программного кода в тему/комментарий - это как бы "прикрепленная тема". И зачем ее прикрепили вверху форума?
3.
Код
Можно писать так:
4. На аналоговые пины тоже можно делать digitalWrite. Вместо analogWrite(4, 255); писать digitalWrite(A4,HIGH)
5. pinMode(4, OUTPUT); - это вы, кстати включили на выход пин D4, а писать потом пытаетесь в A4
6. Говорят очень полезно - писать какие же ошибки возникают. Можно и не дождатся пока кому-нибудь будет не лениво у себя запустить. Да и вообще - зачем-то же их компилятор говорит. Иногда - это подсказки че там не так с синтаксисом. По крайней мере - на какие строчки обратить внимание. Глядишь и сами поймете.
7. Читаем про switch case и думаем "ну нафига нам столько if-фов
Спасибо за продуктивную критику, слона (вставку) то я и не приметил. По поводу ошибок я бы сразу написал, если бы они были.
Компилируется и заливается без ошибок... Вечерком покумекаю
Компилируется и заливается без ошибок...
Хм.. я офигел. Действительно. Но это скорее говорит о несовершенстве компилятора :( Потому как однозначно сказать что вы хотели вот этим сделать:
Я лично не вижу возможности. Значит компилятор "сделал какую-то догадку", но совсем не факт что его "догадка" совпадает с вашим желанием.
Вообщем моем IMHO - тут однозначно надо было кричать об ошибке. А так это получилось "грабли сеном замаскировали".
Мне лично вообще не понятно "что это"? Это "4,5,6,7" - это явно не число, это явно не массив.... почему компилятор не ругнулся на это, а просто "проигнорировал то что не понятно" - загадка.
>слепил.. вроде верно
И шо... работает? Догадайтесь?
>digitalWrite(4, 255);
Это че? Вы уж определитесь. Либо analogWrite(4,255), либо digitalWrite(4,HIGH); Если у вас всегда 255 то зачем вам вообще что-то про шим говорить? Вообщем analogWrite(4,255) - будет конечно работать, только.... сбивает с толку.
Если вы используете пин как цифровой - так пользуется digitalWrite. То что на этом пине можно шим включить - не означает что его обязательно так использовать. Как "обычный цифровой" - он тоже замечательно работает.
> а писать потом пытаетесь в A4
А вот это уже я круто прогнал. Это уже меня заглючило. Чего мне там A4 примерещился? Сбили с толку :)
>
action = 0;
Что это вообще за зверь? Зачем он там вообще? Никогда не меняется. Всегда ноль. Из-за него, зачем-то дергается подтягивающий резистор на D0? Вообщем если мы не хотим проблем с Serial и заливками скетчей, пины D0,D1 - нужно никогда не трогать. Ни програмно, ни снаружи к ним ничего не цеплять.
Мне лично вообще не понятно "что это"? Это "4,5,6,7" - это явно не число, это явно не массив.... почему компилятор не ругнулся на это, а просто "проигнорировал то что не понятно" - загадка.
[ капитан очевидность mode on]
Это выражение, состоящее из четырех операторов "зпятая". Оператор "запятая" вычисляет левый операнд, затем вычисляет операнд, значение выражения - значение правого операнда.
То есть в данном случае эта строка обозначает "вычислить значени выражения "4", потом вычислить значения выражения "5", потом вычислить значение выражения "6", потом вычислить значение выражения "7", запомнить его и присвоить переменной action"
Правда ТС явно имел ввиду что-то другое.
[ капитан очевидность mode off]
Это выражение, состоящее из четырех операторов "зпятая". Оператор "запятая" вычисляет левый операнд, затем вычисляет операнд, значение выражения - значение правого операнда.
1. Впервые слышу про "оператор запятая" (хотя допускаю, есть много вещей которые я не слышал)
2. Хоть и "капитан очевидность вещал" (в чем тут очевидность?), но компилятор думает по другому. В итоге в action - оказалась цифра 4-ре. Совсем не "значение правого операнда".
и снова не так.... история такова вот исходник
Со своей задачей он справлялся однако мне нужно чтобы работали одновременно все четыре порта , но в разной комбинации. С усливиями беда, да и компилятор лживый... залил последнее творение с "кейсами" результат при первом нажатии на 4 и 7 портах появляется напруга и остается там 5 и 6 -ой мертвенькие
http://en.wikipedia.org/wiki/Comma_operator
Каюсь, наврал, оператор присваивания имеет приоритет выше, чем запятая.
Поэтому:
http://en.wikipedia.org/wiki/Comma_operator
Ну тогда понятно почему "компилятор промолчал". Значит есть таки это в стандарте. Только думаю что это скорее "отрыжка прошлого", "для совместимости".
Даже в варианте инициализации сразу нескольких переменных - редко встречается. Ибо - плохой стиль.
А
Как-бы явно говорит о попытке "выполнить переменную" или... все равно непонятно что сделать мы тут хотим сделать с b. Если "ничего", то "нафига она тут", если... да даже если это было-бы property с замаскированным гетером и сеттером, то мы тут его читаем или пишем?
Вообщем "как ни выворачивай эту конструкцию", лично у меня кроме "это фигня какая-то, а не ежик" - не получается.
Ну тады объясните как слепить ежика. Я так понял не до конца понятно что это и с чем его едят. Данный скетч нужен для объединения роутера( MR3020) и меги с шилдом L298P , с железом у меня все в порядке а вот с софтом беда (ежик не выходит)
>
action = 0;
Ну почему опять? Вроде же говорил что D0,D1 - лучше не трогать.
Компилятор... вы знаете он редко ошибается. Даже в данном случае выши - он следовал древнему стандарту и вся его вина была что "Не предупредил о странном коде". Но "странный код" - написали вы. Так что я бы не расчитывал на то что проблема в "лживом компиляторе". Соврать о том "где ошибка" - он может. Но "создать ее сам" - это вряд ли.
Зачем вы поять if-фов с кодами нагородили - тоже не понятно. Уже же был switch с символами нормально читаемый.
>Со своей задачей он справлялся однако мне нужно чтобы работали одновременно все четыре порта , но в разной комбинации
Кроме вас - подозреваю пока никто не представляет "как вы все это видите себе".
Попробуйте взять бумажку и выписать "хочу, что-бы послал то-то, включилось то-то, а если вот это послал, то вот так включиться должно". Сделайте табличку. Справа "что вы посылаете", справа - что у вас в итоге должно произойти в дуине.
Пока ни ваш код, ни ваши объяснения не дают вменяемой картины "что вы хотите". Если бы было "что-то одно понятное", то можно было бы в чем "объяснения не соотвествуют коду".
> залил последнее творение с "кейсами" результат при первом нажатии на 4 и 7 портах появляется напруга и остается там 5 и 6 -ой мертвенькие
А мы должны догадатся как это творение выглядит? Либо давайте его, либо не нужно рассказывать как "что-то там работало не так, неизвестно что"
Приведенный выше код не мой я брал его за основу - он рабочий, но мне не годится мой код в 4м посте
Вообщем в сообщении №4 - у вас было что-то самое вменяемое. Только разобратся чего же вы хотите от action.
Если вы говорили про то код, что "5,6 - мертвые", то... ну вы же им сказали "быть мертвыми" (строки 57,58).
Вообщем возмите вот этот код (это код из №4 с выкинутым непонятным куском):
И попробуйте объяснить чем поведение этого кода отличается от "ваших пожеланий".
Порезал, залил, но порты 6 и 5 все так же молчат. светодиоды воткнутые в 7 и 4 порты загатаются при нажатии любой из клавиш и не тухнут, если установить шиелд, то он сигналов не видит и ничем не моргает. На монитор порта выводится куча не повторяющихся цифр.
А вы, в сериал мониторе какую скорость ставите, а то у вас в одном скетче 57600, в другом 115200. Может вы просто шлете ему мусор, вот он и не может понять "че вы хотите"?
Скорость в скетче и сериал мониторе - должна совпадать.
115200 везде, 57600 не в моем исходнике
Исходя из программы в посту № 16 выводы 7 и 4 и должны всегда гореть.
Вы лучше напишите чего надо: что на входе, что на выходе
К тому же вы опять описали "что он не делает", но не описали "что он должен делать".
Вы хотите что-бы я вам сказал "как сделать".
Вот я читаю: "светодиоды воткнутые в 7 и 4 порты загатаются при нажатии любой из клавиш". По коду вижу "digitalWrite(7, HIGH); и digitalWrite(4, HIGH);" в КАЖДОМ case. То есть - происходит ровно то что написанно в коде. При каких клавишах они не должны загоратся, я телепатически должен догадатся?
> и не тухнут
А они должны тухнуть? В каком случае? Вы что, партизан на допросе?
>но порты 6 и 5 все так же молчат.
На букву 'A', если ничего большего не посылать - должны оба включится. Если с железом все нормально.
>На монитор порта выводится куча не повторяющихся цифр.
Опять телепаты нужны? Кстати между выводом цифр - сделайте вывод какого-то разделителя. Хотя-бы пробел между ними.
Извеняйте товарищи... туплю как не знаю кто.
имеется шиелд L298P двухканальный.
это его тестовый код (по сути нужен лишь чтобы понять где какие пины).
Нужно получая сигнал с uart роутера управлять движками. нажал - едет , отпустил не едет.
Основной алгоритм, кнопка - порты ясен из моего кривенького кода
при нажатии W
XXX: -1
XXX: 13
XXX: 13
XXX: 88
XXX: 88
XXX: 32
XXX: 49
XXX: 10
XXX: 10
XXX: 88
XXX: 58
XXX: 49
XXX: 13
XXX: 13
XXX: 88
XXX: 88
XXX: 32
XXX: 51
XXX: -1
XXX: 118
XXX: 82
XXX: 48
XXX: 48
XXX: 13
XXX: 13
XXX: -1
опачки нашел оди косячек - порты попутал..
Шо-то сильно много левых символов видно. У вас там RX/TX нигде не закорочени никуда? (D0,D1)?
Если все от дуины отключить, то все вот эти 88 и т.п. видно? Если вы постылаетет только 'W', то нормальными будут коды из этого списка: 87,13,10
Если есть еще что-то - проверяйте подключение. Попробуйте все отключить от дуины. Снизить скорость, взять другой кабель, проверить что рядом никакого трасформатора и т.п. нет.
Уточню, посылаю команду W через вебинтерфейс на роутер а тот в свою очередь посылает на RT0 TX0 ардуинке. Переписал RX1 TX1 на роутер и стало почище
Уточню, посылаю команду W через вебинтерфейс на роутер а тот в свою очередь посылает на RT0 TX0 ардуинке. Переписал RX1 TX1 на роутер и стало почище
Но все равно "грязно". Что это за 118 - 'v', 82 - 'R', 48 - '0'?
Давайте вы не будете сразу запускать "космический корабль"? Раз не работает - проверяйте по частям. А то так можно проблему искать "до посинения". Возмите дуину, прицепите к ней светики, подключите ее к компу. Откройте Serial монтор, выставте скорость и Line Ending правильно. Добейтесь что-бы светики мигали "как задуманно". Потом подключите роутер - добъетесь "то же самое через роутер". Потом - роутер отключите подключите шилд свой - добъетесь правильной работы. ПОтом - все тоже самое только уже вместе.
А то, может вы и "посылаю команду W через вебинтерфейс на роутер", только на входе дуины видно что угодно кроме 'W'.
Как можно отлаживать логику, если команды нормально не доходят?
Стоп. А это что за чехарда?
Почему две разные переменные? Зачем два раза читаем? Диоды мы включаем по одной переменной, а выводим "для понимания что происходит" - другую. В чем смысл? Давайте incomingByte - нафиг выкидываем. И выводим
1) зачем нужен incomingByte
2) управляющий символ получаете в inByte строка 16 он же в switch(inByte), так почему же отображаете
Serial
.println(incomingByte, DEC); естественно если он не прочитался - там мусор его вы и видете.
послал AWSD через монитор
послал AWSD через монитор
По количеству - похоже на правду. Только сами коды не сможем увидеть пока не выкините лишнюю переменну/чтение.
не может быть !
еще раз листинг в студию и какая плата ?
не может быть !
Почему не может? Если посылал их по одному... То первый read() вычитал и выполнил, а второй, который выводим естественно прочитал "-1" - нет символов. Так что "лишних символов", судя по всему уже нет. Но и "что же там пришло" (теперь, скорее всего "то что нужно") - пока не возможно увидеть.
Подчистил, упростил залил. что бы не посылал в ответ XXXXXXX. как следствие ничего не горит. Плата мега
в строке 31 замените Serial.print на Serial.write(inByte); и попробуйте опять монитором
должны возвращатся нажатые клавиши
Вот
Показывайте что выводит
Заменил, ввод-вывод совпадают, но case Ы не работают - светодиод молчит
что значит не работают у вас каждый символ подает только один сигнал на СВОЙ пин, замените в строке 21 5 на 4
и в кейсах поменяйте заглавные на прописные если с монитора подаете прописные
Заменил, ввод-вывод совпадают, но case Ы не работают - светодиод молчит
буквы нужно послать те же что и в кодe. Если в коде у вас 'W' то посалыть нужно W, а не w
С прописными помогло. Как изменить, алгоритм срабатывал лишь при нажатой клавише?
Ну теперь напихивайте в кейзы свою комбинации digitalWrite-тов которые вы хотите.
5 на 4 поменяли ?
если да то светодиод на 4 пине должен по 'a' включаться по 'd' выключатся
Как изменить, алгоритм срабатывал лишь при нажатой клавише?
Никак. У вас нет клавиш.
Хм перефразирую, что нужно добавить что бы команда тот же (4,HIGH) отрабатывала лишь 0.1 - 0.3 секунды, пробовал delay впихнуть но она как то не к месту
Serial
.begin(115200); - а все работают тута на скоростях
115200? или только я учусь на 9600?простите что влез не по теме..
Serial
.begin(115200); - а все работают тута на скоростях
115200? или только я учусь на 9600?Пофиг. Логика - идентична. Лишь бы совпадало в сериал мониторе и скетче. А на паре символов, к тому же которые вы набираете руками - вы разницу в скорости и не сможете заметить.
to Sva1509 отрабатывает на ура, попробую с шилдом
что Вам надо сделать ?
у Вас двухканальный драйвер двигателя, где М1 и М2 отвечают за направление движения, а Е1 и Е2 за включение и отключение канала. Если на пин Е1 или Е2 подавать пачку импульсов, а не просто 1 то можно регулировать скорость вращения.
И так на ноги М1 и М2 можно digitalWrite(); эти отвечают за направление вращения.
На Е1 и Е2 analogWrite(); от 0 - отключить; до 255 - вращать на максимальной скорости
расставьте соответствующие команды в кейсы. И у вас должно все заработать.
Хм перефразирую, что нужно добавить что бы команда тот же (4,HIGH) отрабатывала лишь 0.1 - 0.3 секунды,
Нужно добавить в свой арсенал "поиск по форуму" (верхний правый угол). Посмотреть пример "мигаем диодом без delay" ,почитать ро функцию millis()
Благодарю, хоть чуток умнее стал. )
пример
попробуйте и отпишите результат
к стати 7 пин вы используете зря он 16-ти битный уж лучше 4 и 13 они оба на 0-вом таймере 8 бит