Помогите Разобраться

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Переделал маленько код,  код компиллируется , но не работает. Задача проста - читать серийный порт , и

исходя из прочитанного управлять портами. Ткните носом чаво не так

 

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);
        
    }
               
}

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

Ткнуть носом - это завсегда пожалуста:

1. Называйте темы как-то более информативно. От "нужно помощь", "помогите новичку" и т.п. - уже тошнит (угадайте про что были эти темы?) Сможете их отличить от сотни с таким же названием?

2. Вставка программного кода в тему/комментарий - это как бы "прикрепленная тема". И зачем ее прикрепили вверху форума?

3.

Код

  if(incomingByte == 115){   //S

Можно писать так:

  if(incomingByte == 'S'){ 

4. На аналоговые пины тоже можно делать digitalWrite. Вместо    analogWrite(4, 255); писать digitalWrite(A4,HIGH)

5.    pinMode(4, OUTPUT); - это вы, кстати включили на выход пин D4, а писать потом пытаетесь в A4

6. Говорят очень полезно - писать какие же ошибки возникают. Можно и не дождатся пока кому-нибудь будет не лениво у себя запустить. Да и вообще - зачем-то же их компилятор говорит. Иногда - это подсказки че там не так с синтаксисом. По крайней мере - на какие строчки обратить внимание. Глядишь и сами поймете.

7. Читаем про switch case и думаем "ну нафига нам столько if-фов

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Спасибо за продуктивную критику, слона (вставку) то я и не приметил. По поводу ошибок я бы сразу написал,  если бы они были.

Компилируется и заливается без ошибок... Вечерком покумекаю

 

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

antipod пишет:

Компилируется и заливается без ошибок... 

Хм.. я офигел. Действительно.  Но это скорее говорит о несовершенстве компилятора :(  Потому как однозначно сказать что вы хотели вот этим сделать:

 action = 4,5,6,7;   

Я лично не вижу возможности. Значит компилятор "сделал какую-то догадку", но совсем не факт что его "догадка" совпадает с вашим желанием.

Вообщем моем IMHO - тут однозначно надо было кричать об ошибке. А так это получилось "грабли сеном замаскировали".

Мне лично вообще не понятно "что это"? Это "4,5,6,7" - это явно не число, это явно не массив.... почему компилятор не ругнулся на это, а просто "проигнорировал то что не понятно" - загадка. 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013
int incomingByte = 0;
	int action = 0;
	 
	void setup() {
	  Serial.begin(115200);
	  
	  pinMode(4, OUTPUT); //ШИМ2
	  pinMode(5, OUTPUT); // СКОРОСТЬ2
	  pinMode(6, OUTPUT); // СКОРОСТЬ1
	  pinMode(7, OUTPUT); // ШИМ1
	}
	 
	void loop() {
	 if (Serial.available() > 0){
	  //Serial.print("1");
	int inByte = Serial.read();
	        incomingByte = Serial.read();
	        // отсылаем то, что получили
	          switch (inByte){ 
	         
	        case  'A':
	          digitalWrite(5, HIGH);
	          digitalWrite(6, HIGH);
	          digitalWrite(4, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	     
	        case 'D':
	          digitalWrite(5, LOW);
	          digitalWrite(6, LOW);
	          digitalWrite(4, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	            
	        case 'S':   
	          digitalWrite(4, HIGH);
	          digitalWrite(5, LOW);
	          digitalWrite(6, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	           
	        case 'W':  
	          digitalWrite(4, HIGH);
	          digitalWrite(5, HIGH);
	          digitalWrite(6, LOW);
	          digitalWrite(7, HIGH);
	          break;
	        }
	          
	       
	                
	        digitalWrite(action, HIGH);
	        delay(100);
	        digitalWrite(action, LOW);
	          
	         
	        digitalWrite(5, LOW);
	        digitalWrite(6, LOW);
	         
	      
	        Serial.print("250: ");
	        Serial.println(incomingByte, DEC);
	         
	    }
	                
	}

 

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

>слепил.. вроде верно

И шо... работает? Догадайтесь?

>digitalWrite(4, 255);

Это че? Вы уж определитесь. Либо analogWrite(4,255), либо digitalWrite(4,HIGH); Если у вас всегда 255 то зачем вам вообще что-то про шим говорить? Вообщем analogWrite(4,255) - будет конечно работать, только.... сбивает с толку.

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

> а писать потом пытаетесь в A4

А вот это уже я круто прогнал. Это уже меня заглючило. Чего мне там A4 примерещился? Сбили с толку :)

 action = 0;

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

tsostik
Offline
Зарегистрирован: 28.02.2013

leshak пишет:

Мне лично вообще не понятно "что это"? Это "4,5,6,7" - это явно не число, это явно не массив.... почему компилятор не ругнулся на это, а просто "проигнорировал то что не понятно" - загадка. 

[ капитан очевидность mode on]

Это выражение, состоящее из четырех операторов "зпятая". Оператор "запятая" вычисляет левый операнд, затем вычисляет операнд, значение выражения - значение правого операнда.

То есть в  данном случае эта строка обозначает "вычислить значени выражения "4", потом вычислить значения выражения "5", потом вычислить значение выражения "6", потом вычислить значение выражения "7", запомнить его и присвоить переменной action"

Правда ТС явно имел ввиду что-то другое.

[ капитан очевидность mode off]

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

tsostik пишет:

Это выражение, состоящее из четырех операторов "зпятая". Оператор "запятая" вычисляет левый операнд, затем вычисляет операнд, значение выражения - значение правого операнда.

1. Впервые слышу про "оператор запятая" (хотя допускаю, есть много вещей которые я не слышал)
2. Хоть и "капитан очевидность вещал" (в чем тут очевидность?), но компилятор думает по другому. В итоге в action - оказалась цифра 4-ре. Совсем не "значение правого операнда".

 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

и снова не так.... история такова вот исходник

int led = 13;
boolean laight = 0;
int incomingByte = 0;
int action = 0;

void setup() {
  Serial.begin(57600);
  
  pinMode(13, OUTPUT);
  pinMode(4, OUTPUT); //light
  pinMode(5, OUTPUT); // шим 1
  pinMode(6, OUTPUT); // шим 2
  pinMode(7, OUTPUT); // 11
  pinMode(8, OUTPUT); // 12
  pinMode(11, OUTPUT); // 21
  pinMode(12, OUTPUT); // 22
}

void loop() { 
  
  //Serial.print("1");
  
  if (Serial.available() > 0) {  //если есть доступные данные// считываем байт
        incomingByte = Serial.read();
        // отсылаем то, что получили
        digitalWrite(13, HIGH);
        
        if(incomingByte == 97) // A
          action = 7;
        if(incomingByte == 100) // D
          action = 8;
        if(incomingByte == 115) // S
          action = 11;
        if(incomingByte == 119) // W
          action = 12;
        if(incomingByte == 108) // L
          laight=!laight;  
                                  
        digitalWrite(4, laight);
                   
        //analogWrite(8, 255);
        //analogWrite(9, 255);
               
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
               
        digitalWrite(action, HIGH);
        delay(250);
        digitalWrite(action, LOW);
        
        action = 0;
        
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
        
        digitalWrite(13, LOW);
                          
        Serial.print("250: ");
        Serial.println(incomingByte, DEC);
    }
               
}

Со своей задачей он справлялся однако мне нужно чтобы работали одновременно  все четыре порта , но в разной комбинации. С усливиями  беда, да и компилятор лживый...   залил последнее творение с "кейсами" результат при первом нажатии на 4 и 7 портах появляется  напруга и остается там 5 и 6 -ой  мертвенькие

tsostik
Offline
Зарегистрирован: 28.02.2013

http://en.wikipedia.org/wiki/Comma_operator

Каюсь, наврал, оператор присваивания имеет приоритет выше, чем запятая.

Поэтому:

Цитата:

// Examples:               Descriptions:
i = (a, b);             // stores b into i    
i = a, b;               // stores a into i. Equivalent to (i = a), b;

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

Ну тогда понятно почему "компилятор промолчал". Значит есть таки это в стандарте. Только думаю что это скорее "отрыжка прошлого", "для совместимости".

Даже в варианте инициализации сразу нескольких переменных - редко встречается. Ибо - плохой стиль.

А 

i = a, b;               // stores a into i. Equivalent to (i = a), b;

Как-бы явно говорит о попытке "выполнить переменную" или... все равно непонятно что сделать мы тут хотим сделать с b. Если "ничего", то "нафига она тут", если... да даже если это было-бы property с замаскированным гетером и сеттером, то мы тут его читаем или пишем?

Вообщем "как ни выворачивай эту конструкцию", лично у меня кроме "это фигня какая-то, а не ежик" - не получается.

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Ну тады объясните как слепить ежика. Я так понял не до конца понятно что это и с чем его едят. Данный скетч нужен для  объединения  роутера( MR3020) и меги с шилдом L298P , с железом у меня все в порядке а вот с софтом беда (ежик не выходит)

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

>   action = 0;

Ну почему опять? Вроде же говорил что D0,D1 - лучше не трогать.

Компилятор... вы знаете он редко ошибается. Даже в данном случае выши - он следовал древнему стандарту и вся его вина была что "Не предупредил о странном коде". Но "странный код" - написали вы. Так что я бы не расчитывал на то что проблема в "лживом компиляторе". Соврать о том "где ошибка" - он может. Но "создать ее сам" - это вряд ли.

Зачем вы поять if-фов с кодами нагородили - тоже не понятно. Уже же был switch с символами нормально читаемый.

>Со своей задачей он справлялся однако мне нужно чтобы работали одновременно  все четыре порта , но в разной комбинации

Кроме вас - подозреваю пока никто не представляет "как вы все это видите себе".

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

Пока ни ваш код, ни ваши объяснения не дают вменяемой картины "что вы хотите". Если бы было "что-то одно понятное", то можно было бы в чем "объяснения не соотвествуют коду".

> залил последнее творение с "кейсами" результат при первом нажатии на 4 и 7 портах появляется  напруга и остается там 5 и 6 -ой  мертвенькие

А мы должны догадатся как это творение выглядит?  Либо давайте его, либо не нужно рассказывать как "что-то там работало не так, неизвестно что"

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Приведенный выше код не мой я брал его за основу - он рабочий, но мне не годится мой код в 4м посте

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

Вообщем в сообщении №4 - у вас было что-то самое вменяемое. Только разобратся чего же вы хотите от action. 

Если вы говорили про то код, что "5,6 - мертвые", то... ну вы же им сказали "быть мертвыми" (строки 57,58).

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

Вообщем возмите вот этот код (это код из №4 с выкинутым непонятным куском):

 

int incomingByte = 0;
	int action = 0;
	 
	void setup() {
	  Serial.begin(115200);
	  
	  pinMode(4, OUTPUT); //ШИМ2
	  pinMode(5, OUTPUT); // СКОРОСТЬ2
	  pinMode(6, OUTPUT); // СКОРОСТЬ1
	  pinMode(7, OUTPUT); // ШИМ1
	}
	 
	void loop() {
	 if (Serial.available() > 0){
	  //Serial.print("1");
	int inByte = Serial.read();
	        incomingByte = Serial.read();
	        // отсылаем то, что получили
	          switch (inByte){ 
	         
	        case  'A':
	          digitalWrite(5, HIGH);
	          digitalWrite(6, HIGH);
	          digitalWrite(4, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	     
	        case 'D':
	          digitalWrite(5, LOW);
	          digitalWrite(6, LOW);
	          digitalWrite(4, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	            
	        case 'S':   
	          digitalWrite(4, HIGH);
	          digitalWrite(5, LOW);
	          digitalWrite(6, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	           
	        case 'W':  
	          digitalWrite(4, HIGH);
	          digitalWrite(5, HIGH);
	          digitalWrite(6, LOW);
	          digitalWrite(7, HIGH);
	          break;
	        }
	          
	       
	         /* Выкинули пока, так как не ясно что тут хотели сделать 
	        digitalWrite(action, HIGH);
	        delay(100);
	        digitalWrite(action, LOW);
	          
	         
	        digitalWrite(5, LOW);
	        digitalWrite(6, LOW);
*/
	         
	      
	        Serial.print("250: ");
	        Serial.println(incomingByte, DEC);
	         
	    }
	                
	}

И попробуйте объяснить чем поведение этого кода отличается от "ваших пожеланий".

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013
int incomingByte = 0;
	int action = 0;
	 
	void setup() {
	  Serial.begin(115200);
	  
	  pinMode(4, OUTPUT); //ШИМ2
	  pinMode(5, OUTPUT); // СКОРОСТЬ2
	  pinMode(6, OUTPUT); // СКОРОСТЬ1
	  pinMode(7, OUTPUT); // ШИМ1
	}
	 
	void loop() {
	 if (Serial.available() > 0){
	  //Serial.print("1");
	int inByte = Serial.read();
	        incomingByte = Serial.read();
	        // отсылаем то, что получили
	          switch (inByte){ 
	         
	        case  'A':
	          digitalWrite(5, HIGH);
	          digitalWrite(6, HIGH);
	          digitalWrite(4, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	     
	        case 'D':
	          digitalWrite(5, LOW);
	          digitalWrite(6, LOW);
	          digitalWrite(4, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	            
	        case 'S':   
	          digitalWrite(4, HIGH);
	          digitalWrite(5, LOW);
	          digitalWrite(6, HIGH);
	          digitalWrite(7, HIGH);
	          break;
	           
	        case 'W':  
	          digitalWrite(4, HIGH);
	          digitalWrite(5, HIGH);
	          digitalWrite(6, LOW);
	          digitalWrite(7, HIGH);
	          break;
	        }
	          
                 Serial.print("");
                 Serial.println(incomingByte, DEC);
	       
	    }
	 }
          

Порезал, залил, но порты 6 и 5 все так  же молчат. светодиоды  воткнутые в 7 и 4 порты загатаются при нажатии  любой из клавиш  и не тухнут, если установить шиелд, то он сигналов не видит и ничем не моргает. На монитор порта выводится куча не повторяющихся цифр.

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

А вы, в сериал мониторе какую скорость ставите, а то у вас в одном скетче 57600, в другом 115200. Может вы просто шлете ему мусор, вот он и не может понять "че вы хотите"?

Скорость в скетче и сериал мониторе - должна совпадать.

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

115200 везде, 57600 не в моем исходнике

sva1509
Offline
Зарегистрирован: 07.12.2012

Исходя из программы в посту № 16 выводы 7 и 4 и должны всегда гореть.

Вы лучше напишите чего надо: что на входе, что на выходе

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

К тому же вы опять описали "что он не делает", но не описали "что он должен делать".

Вы хотите что-бы я вам сказал "как сделать".

Вот я читаю: "светодиоды  воткнутые в 7 и 4 порты загатаются при нажатии  любой из клавиш". По коду вижу "digitalWrite(7, HIGH); и     digitalWrite(4, HIGH);" в КАЖДОМ case. То есть - происходит ровно то что написанно в коде.  При каких клавишах они не должны загоратся, я телепатически должен догадатся?

>  и не тухнут

А они должны тухнуть? В каком случае? Вы что, партизан на допросе?

>но порты 6 и 5 все так  же молчат. 

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

>На монитор порта выводится куча не повторяющихся цифр.

Опять телепаты нужны?  Кстати между выводом цифр - сделайте вывод какого-то разделителя. Хотя-бы пробел между ними.

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Извеняйте товарищи...  туплю как не знаю кто.

имеется шиелд  L298P двухканальный.


//Arduino PWM Speed Control:
int E1 = 5; 
int M1 = 4;
int E2 = 6;                     
int M2 = 7;                       
 
void setup()
{
    pinMode(M1, OUTPUT);  
    pinMode(M2, OUTPUT);
}
 
void loop()
{
  int value;
  for(value = 0 ; value <= 255; value+=5)
  {
    digitalWrite(M1,HIGH);  
    digitalWrite(M2, HIGH);      
    analogWrite(E1, value);   //PWM Speed Control
    analogWrite(E2, value);   //PWM Speed Control
    delay(30);
  } 
}

это его тестовый код (по сути нужен лишь чтобы понять где какие пины).

Нужно получая сигнал с uart роутера управлять движками. нажал - едет , отпустил не едет.

Основной алгоритм, кнопка - порты ясен из моего кривенького кода

01	int incomingByte = 0;
02	    int action = 0;
03	      
04	    void setup() {
05	      Serial.begin(115200);
06	       
07	      pinMode(4, OUTPUT); //ШИМ2
08	      pinMode(5, OUTPUT); // СКОРОСТЬ2
09	      pinMode(6, OUTPUT); // СКОРОСТЬ1
10	      pinMode(7, OUTPUT); // ШИМ1
11	    }
12	      
13	    void loop() {
14	     if (Serial.available() > 0){
15	      //Serial.print("1");
16	    int inByte = Serial.read();
17	            incomingByte = Serial.read();
18	            // отсылаем то, что получили
19	              switch (inByte){
20	              
21	            case  'A':
22	              digitalWrite(5, HIGH);
23	              digitalWrite(6, HIGH);
24	              digitalWrite(4, HIGH);
25	              digitalWrite(7, HIGH);
26	              break;
27	          
28	            case 'D':
29	              digitalWrite(5, LOW);
30	              digitalWrite(6, LOW);
31	              digitalWrite(4, HIGH);
32	              digitalWrite(7, HIGH);
33	              break;
34	                 
35	            case 'S':  
36	              digitalWrite(4, HIGH);
37	              digitalWrite(5, LOW);
38	              digitalWrite(6, HIGH);
39	              digitalWrite(7, HIGH);
40	              break;
41	                
42	            case 'W': 
43	              digitalWrite(4, HIGH);
44	              digitalWrite(5, HIGH);
45	              digitalWrite(6, LOW);
46	              digitalWrite(7, HIGH);
47	              break;
48	            }
49	               
50	                 Serial.print("XXX");
51	                 Serial.println(incomingByte, DEC);
52	            
53	        }
54	     }

при нажатии 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
 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

опачки нашел оди косячек - порты попутал..

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

Шо-то сильно много левых символов видно. У вас там RX/TX нигде не закорочени никуда? (D0,D1)?

Если все от дуины отключить, то все вот эти 88 и т.п. видно? Если вы постылаетет только 'W',  то нормальными будут коды из этого списка: 87,13,10

Если есть еще что-то - проверяйте подключение. Попробуйте все отключить от дуины. Снизить скорость, взять другой кабель, проверить что рядом никакого трасформатора и т.п. нет.

 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Уточню, посылаю команду W через вебинтерфейс на роутер а тот в свою очередь посылает на RT0 TX0 ардуинке. Переписал RX1 TX1 на роутер и стало почище

XXX: -1
XXX: 13
XXX: 13
XXX: -1
XXX: -1
XXX: 118
XXX: 82
XXX: 48
XXX: 48
XXX: 13
XXX: 13
XXX: -1

 

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

antipod пишет:

Уточню, посылаю команду W через вебинтерфейс на роутер а тот в свою очередь посылает на RT0 TX0 ардуинке. Переписал RX1 TX1 на роутер и стало почище

Но все равно "грязно".  Что это за 118 - 'v', 82 - 'R', 48 - '0'?

Давайте вы не будете сразу запускать "космический корабль"? Раз не работает - проверяйте по частям. А то так можно проблему искать "до посинения". Возмите дуину, прицепите к ней светики, подключите ее к компу. Откройте Serial монтор, выставте скорость и Line Ending правильно. Добейтесь что-бы светики мигали "как задуманно". Потом подключите роутер - добъетесь "то же самое через роутер". Потом - роутер отключите подключите шилд свой - добъетесь правильной работы. ПОтом - все тоже самое только уже вместе.

А то, может вы и "посылаю команду W через вебинтерфейс на роутер", только на входе дуины видно что угодно кроме 'W'.

Как можно отлаживать логику, если команды нормально не доходят?

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

Стоп. А это что за чехарда?

 int inByte = Serial.read();
incomingByte = Serial.read();

Почему две разные переменные? Зачем два раза читаем? Диоды мы включаем по одной переменной, а выводим "для понимания что происходит" - другую. В чем смысл? Давайте incomingByte  - нафиг выкидываем. И выводим

 Serial.println(inByte, DEC);

 

sva1509
Offline
Зарегистрирован: 07.12.2012

1) зачем нужен incomingByte

2) управляющий символ получаете в inByte строка 16 он же в switch(inByte), так почему же отображаете Serial.println(incomingByte, DEC); естественно если он не прочитался - там мусор его вы и видете.

 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013
250: -1
250: -1
250: -1
250: -1

послал AWSD через монитор

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

antipod пишет:

250: -1
250: -1
250: -1
250: -1

послал AWSD через монитор

По количеству - похоже на правду. Только сами коды не сможем увидеть пока не выкините лишнюю переменну/чтение.

sva1509
Offline
Зарегистрирован: 07.12.2012

не может быть ! 

еще раз листинг в студию и какая плата ?

 

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

sva1509 пишет:

не может быть ! 

Почему не может? Если посылал их по одному... То первый read() вычитал и выполнил, а второй, который выводим естественно прочитал "-1" - нет символов. Так что "лишних символов", судя по всему уже нет. Но и "что же там пришло" (теперь, скорее всего "то что нужно") - пока не возможно увидеть.

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013
      int action = 0;
        void setup() {
        Serial.begin(115200);
        pinMode(4, OUTPUT); //ШИМ2
        pinMode(5, OUTPUT); // СКОРОСТЬ2
        pinMode(6, OUTPUT); // СКОРОСТЬ1
        pinMode(7, OUTPUT); // ШИМ1
        }
        void loop() {
              if (Serial.available() > 0){
           //Serial.print("1");
               int inByte = Serial.read();
             
             // отсылаем то, что получили
               switch (inByte){
              
               case  'A':
               digitalWrite(4, HIGH);
               break;
               case 'D':
               digitalWrite(5, LOW);
               break;
               case 'S': 
               digitalWrite(6, HIGH);
               break;
               case 'W':
               digitalWrite(7, HIGH);
               break;
              }
               
               Serial.print("XXX");
                 
                    }
            }

Подчистил, упростил залил. что бы не посылал в ответ XXXXXXX.   как следствие ничего не горит. Плата мега

sva1509
Offline
Зарегистрирован: 07.12.2012

в строке 31 замените Serial.print на Serial.write(inByte); и попробуйте опять монитором

должны возвращатся нажатые клавиши

 

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

Вот

int action = 0;
void setup() {
  Serial.begin(115200);
  pinMode(4, OUTPUT); //ШИМ2
  pinMode(5, OUTPUT); // СКОРОСТЬ2
  pinMode(6, OUTPUT); // СКОРОСТЬ1
  pinMode(7, OUTPUT); // ШИМ1
}
void loop() {
  if (Serial.available() > 0){
    //Serial.print("1");
    char inByte = Serial.read();

    // отсылаем то, что получили
    switch (inByte){

    case  'A':
      digitalWrite(4, HIGH);
      break;
    case 'D':
      digitalWrite(5, LOW);
      break;
    case 'S': 
      digitalWrite(6, HIGH);
      break;
    case 'W':
      digitalWrite(7, HIGH);
      break;
    }


    Serial.print("'");
    if(inByte>=32)Serial.write(inByte);
    Serial.print("' - ");
    Serial.println(inByte,DEC);

  }
}

Показывайте что выводит

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Заменил, ввод-вывод совпадают, но case Ы не работают - светодиод молчит

'w' - 119
's' - 115
'd' - 100
'a' - 97

 

sva1509
Offline
Зарегистрирован: 07.12.2012

что значит не работают у вас каждый символ подает только один сигнал на СВОЙ пин, замените в строке 21 5 на 4

и в кейсах поменяйте заглавные на прописные если с монитора подаете прописные

 

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

antipod пишет:

Заменил, ввод-вывод совпадают, но case Ы не работают - светодиод молчит

'w' - 119
's' - 115
'd' - 100
'a' - 97

 

буквы нужно послать те же что и в кодe. Если в коде у вас 'W' то посалыть нужно W, а не w

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

С прописными помогло. Как изменить, алгоритм срабатывал лишь при нажатой клавише?

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

Ну теперь напихивайте в кейзы свою комбинации digitalWrite-тов которые вы хотите.

sva1509
Offline
Зарегистрирован: 07.12.2012

5 на 4 поменяли ?

если да то светодиод на 4 пине должен по 'a' включаться по 'd' выключатся

 

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

antipod пишет:

 Как изменить, алгоритм срабатывал лишь при нажатой клавише?

Никак. У вас нет клавиш.

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Хм перефразирую, что нужно добавить что бы команда тот же (4,HIGH) отрабатывала лишь 0.1 - 0.3 секунды, пробовал delay впихнуть но она как то не к месту

Life23
Offline
Зарегистрирован: 10.08.2013

Serial.begin(115200); - а все работают тута на скоростях 115200? или только я учусь на 9600?

простите что влез не по теме..

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

Life23 пишет:

Serial.begin(115200); - а все работают тута на скоростях 115200? или только я учусь на 9600?

Пофиг. Логика - идентична. Лишь бы совпадало в сериал мониторе и скетче. А на паре символов, к тому же которые вы набираете руками - вы разницу в скорости и не сможете заметить. 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

to Sva1509 отрабатывает на ура, попробую с шилдом

sva1509
Offline
Зарегистрирован: 07.12.2012

что Вам надо сделать ?

у Вас двухканальный драйвер двигателя, где М1 и М2 отвечают за направление движения, а Е1 и Е2 за включение и отключение канала. Если на пин Е1 или Е2 подавать пачку импульсов, а не просто 1 то можно регулировать скорость вращения.

И так на ноги М1 и М2 можно digitalWrite(); эти отвечают за направление вращения.

На Е1 и Е2 analogWrite(); от 0 - отключить; до 255 - вращать на максимальной скорости

расставьте соответствующие команды в кейсы. И у вас должно все заработать.

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

antipod пишет:

Хм перефразирую, что нужно добавить что бы команда тот же (4,HIGH) отрабатывала лишь 0.1 - 0.3 секунды, 

Нужно добавить в свой арсенал "поиск по форуму" (верхний правый угол). Посмотреть пример "мигаем диодом без delay" ,почитать ро  функцию millis()

 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Благодарю, хоть чуток умнее стал. )

sva1509
Offline
Зарегистрирован: 07.12.2012

пример 

                 case 'a':
                             digitalWrite(M1,HIGH);  //задаем направление вращения
                             analogWrite(E1,128);    //устанавливаем половину скорости
                             analogWrite(E2,0);        //отключаем 2-ой канал
                             digitalWrite(M2,X);        //направление без разницы - канал отключен
                             break;

 

sva1509
Offline
Зарегистрирован: 07.12.2012

попробуйте и отпишите результат

к стати 7 пин вы используете зря он 16-ти битный уж лучше 4 и 13 они оба на 0-вом таймере 8 бит