roboforum.ru

Технический форум по робототехнике.

Ардуино не принимает данные из Com

Re: Ардуино не принимает данные из Com

SkyStorm » 20 окт 2012, 14:21

- В первом сообщении написано что Serial.print работает - т.е. с портами, настройками и железом все ОК.
- Но яркость не меняется! Мой вопрос - ПОЧЕМУ? - да много почему может быть. Схема рабочая? Диод правильно подключен? У людей которые не хотят думать такое часто бывает.
- То есть делаю вывод, что для Atmega328 это разные вещи, а для Atmega1280 - Да это разные контроллеры и есть специфика, но в случае если это пин 9 то должно работать.


Проверить работает ли диод при его прямом управлении без Serial
- digitalWrite
- analogWrite

Re: Ардуино не принимает данные из Com

Sirocco » 21 окт 2012, 01:01

SkyStorm писал(а):Проверить работает ли диод при его прямом управлении без Serial
- digitalWrite
- analogWrite

Ну естественно работает диод. Даже более того, работает данный пин, выставлял на нём разную яркость через analogWrite.
Не, мне интересно, что, ни у кого нет больше ардуины на ATmega328? Я вторую сегодня надыбал, на ней тоже не работает. А ведь это стандартный скетч от самих разработчиков данной железки, которые гарантируют его правильность.

Re: Ардуино не принимает данные из Com

SkyStorm » 22 окт 2012, 14:16

У меня есть штук 100 их. А вот времени нет.
Заинтриговал :) Вечером посмотрю :)

Re: Ардуино не принимает данные из Com

Sirocco » 23 окт 2012, 00:43

Привет! Есть такой код:
Код: Выделить всёРазвернуть

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

void setup() {
  Serial.begin(9600);
  pinMode(4, OUTPUT); //light
  pinMode(7, OUTPUT); // 11
  pinMode(8, OUTPUT); // 12
  pinMode(11, OUTPUT); // 21
  pinMode(12, OUTPUT); // 22
}

void loop() {

  if (Serial.available() >0 ) {  //если есть доступные данные// считываем байт
        incomingByte = Serial.read();
     
        if(incomingByte == 97) // a
          action = 7;
        if(incomingByte == 65) // 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);
           
        digitalWrite(action, HIGH);
        delay(100);
        digitalWrite(action, LOW);
        action = 0;
    }
}

Суть, понятна, думаю. Отправляем значение, Ардуино парсит его, в случае с четвёртым пином меняет его состояние на противоположное, в других случаях на 100 милисек выставляет высокий уровень на пине, соответствующем значению action, которое в свою очередь назначено распарсенному символу. Всё, вроде бы ок, и должно работать. Работает, если отправляю значения в порт через ардуино ide. Но, если отправлять значение из роутера, то происходит какая-то задержка, всегда равная установленному delay. А именно,когда пин HIGH, потом задержка, потом пин LOW, а потом, если сразу же послать команду (или слать непрерывно) пин не сразу переходит в HIGH, а через указанное delay. Такое только когда с роутера данные отправляю. Пробовал разные задержки ставить, до пяти сек, delay почемуто повторяется ещё раз. Это первая проблема.
Второе, если долго держать кнопку (а скетч не так быстро выполняется, как передаются данные), то происходит накопление комманд в ардуино, и после снятия воздействия (отпускания кнопки) эти комманды ещё долгое время выполняются, так долго, как долго держал кнопку. Это не приемлемо, так как эти кнопки - кнопки управления движением машинки, и получается, чтобы ей управлять, нужно либо постоянно тыкать на кнопку, как бы пошагово выполняя движение, (нажал кратковременно, отпустил, она поехала, остановилась, как остановилась, снова нажал, и т.д.) либо если держать, то это накопится в буфере ардуино, и потом эту машинку долго не остановишь. Вопрос, как решить эту проблему? Как-то можно каждый цикл очищать буфер комманд, ну или каждый n- цикл.
P.S. Я всё о том проекте: http://habrahabr.ru/post/153017/ , все скрипты и код отсюда.

Re: Ардуино не принимает данные из Com

noonv » 23 окт 2012, 15:35

а если после считывания принятого байта:
Код: Выделить всёРазвернуть
incomingByte = Serial.read();

добавить проверку:
Код: Выделить всёРазвернуть
if(incomingByte<0) return;

Re: Ардуино не принимает данные из Com

SkyStorm » 23 окт 2012, 17:09

Попробовал Dimmer из стандартных примеров на pin9 - Все работает.
Плата Arduino Pro 5V/16Mhz

Re: Ардуино не принимает данные из Com

Sirocco » 23 окт 2012, 18:40

noonv писал(а):а если после считывания принятого байта:
Код: Выделить всёРазвернуть
incomingByte = Serial.read();

добавить проверку:
Код: Выделить всёРазвернуть
if(incomingByte<0) return;

Не меняет ситуации... Откуда берётся эта задержка?

Добавлено спустя 7 минут 19 секунд:
SkyStorm писал(а):Попробовал Dimmer из стандартных примеров на pin9 - Все работает.
Плата Arduino Pro 5V/16Mhz

А у меня вот не работает, на двух платах. Парадокс. Ну как не работает... Работает так: отправляю ноль, на пине должен быть ноль. А на пине устанавливается не ноль, а 48. То есть отправляется не символ, а код. Если отправляю "а", то на пине ставится уровень 97, диод светится ярче. Чё за хрень? Почему может не работать? Как добиться того, чтоб отправлялось то, что надо? И почему оно где-то у кого-то нормально отправляется, а у меня нет. На всякий случай: Windows 7 64 bit RU, Arduino IDE от 0018 до 1,0,1.

Re: Ардуино не принимает данные из Com

Angel71 » 23 окт 2012, 18:44

код символов: "а" 160, "a" 97, "0" 48. :)

Re: Ардуино не принимает данные из Com

Sirocco » 23 окт 2012, 18:58

noonv писал(а):добавить проверку:
Код: Выделить всёРазвернуть
if(incomingByte<0) return;

Допёр, блин... Дело было вот в чём: при отправке из роутера отправляется ещё 10 13.
Добавил
Код: Выделить всёРазвернуть
if(incomingByte<14) return;

и задержка исчезла.
Так как не знаю, как убрать отправку из роутера "10" и "13", то собираюсь исключить их обработку в ардуино.
Так корректно будет, или есть способ лучше/правильнее?:
Код: Выделить всёРазвернуть
if(incomingByte=10) return;
if(incomingByte=13) return;


Добавлено спустя 3 минуты 19 секунд:
Angel71 писал(а):код символов: "а" 160, "a" 97, "0" 48. :)

Это я уже понял, пока пытался догнать как мне всё таки отправлять стандартное "160", и чтобы оно приняло эти "160". А не отправлять "а", чтобы дошло "160". Так и не понял, почему происходит конвертация и как её избежать.

Re: Ардуино не принимает данные из Com

Angel71 » 23 окт 2012, 19:00

10 13 это возврат каретки и переход на новую строку.
если меня не клинит, оболочка на процессинге. а процессинг это ява. ява это значит, что можно отправлять именно так, как нужно. шучу, почти. :) на самом деле есть такое гроооооомаднейшее предположение, что у вас в скетче (или как оно там у вас называется в этом "dimmer") вы данные не из кода отсылаете, а из этого чудного окошка
Изображение
и весь этот гимор до смешного легко лечится.

Re: Ардуино не принимает данные из Com

Sirocco » 23 окт 2012, 19:21

Всё это сделано на роутере. И скрипт отправки на RxTx ардуино с RxTx платы роутера находится в недрах этого роутера. Кажись, он на яве. Если не ошибаюсь, этот код зарыт где-то тут:
serial.cgi
Код: Выделить всёРазвернуть
#!/usr/bin/awk -f
function unescape(s)
{
   gsub(/\+/," ",s)
   res = ""
   do {
     p = match(s,/%[0-9a-fA-F]{2}/)
     if(p>0) {
        res = res substr(s,0,p-1) sprintf("%c",0+("0x" substr(s,p+1,2)))
        s = substr(s,p+3)
     }
   } while(p>0)
   return res s
}

BEGIN {
   RS = "&"
   FS = "="
}
{
   if($1 == "SERIAL_DATA" ) print unescape($2) > "/dev/ttyATH0"
}
END
{
   print "202"
}


или тут:
index.html
Код: Выделить всёРазвернуть
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>OR-WIFI-ROBOT</title>
    <link rel="stylesheet" type="text/css" href="res/main.css"/>
    <script type="text/javascript">
        var lastTurn = -1;
   var lastPress = -1;
        var lastPos = -1;

   function submitUART(uartString)
   {
       document.getElementById('serialData').value=uartString;
            document.getElementById('serialForm').submit()
       

   };

        function scrollCam(val)
        {
            document.getElementById("scr").parentNode.scrollLeft=val;
   };

   function keyPressed(e)
   {
      var keynum
      var keychar
      var numcheck

      if(window.event) // IE
      {
      keynum = e.keyCode
      }
      else if(e.which) // Netscape/Firefox/Opera
      {
      keynum = e.which
      }
      keychar = String.fromCharCode(keynum);
      //submitUART(keychar);
      if(keychar == "w" || keychar == "ц" || keychar == "W" || keychar == "Ц") submitUART("W");
      if(keychar == "a" || keychar == "ф" || keychar == "A" || keychar == "Ф") submitUART("A");
      if(keychar == "s" || keychar == "ы" || keychar == "S" || keychar == "Ы") submitUART("S");
      if(keychar == "d" || keychar == "в" || keychar == "D" || keychar == "В") submitUART("D");
      if(keychar == "l" || keychar == "д" || keychar == "L" || keychar == "Д") submitUART("l");
      return true;
   };

function keyUp(e)
   {
      var keynum
      var keychar
      var numcheck

      if(window.event) // IE
      {
      keynum = e.keyCode
      }
      else if(e.which) // Netscape/Firefox/Opera
      {
      keynum = e.which
      }
      keychar = String.fromCharCode(keynum);
      //submitUART(keychar);
      /*if(keychar == "w" || keychar == "ц" || keychar == "W" || keychar == "Ц") submitUART("w");
      if(keychar == "a" || keychar == "ф" || keychar == "A" || keychar == "Ф") submitUART("a");
      if(keychar == "s" || keychar == "ы" || keychar == "S" || keychar == "Ы") submitUART("s");
      if(keychar == "d" || keychar == "в" || keychar == "D" || keychar == "В") submitUART("d");
      
      if(keychar == "w" || keychar == "ц" || keychar == "W" || keychar == "Ц")
         {submitUART("w"); submitUART("w"); submitUART("w");}
      if(keychar == "a" || keychar == "ф" || keychar == "A" || keychar == "Ф")
         {submitUART("a"); submitUART("a"); submitUART("a");}
      if(keychar == "s" || keychar == "ы" || keychar == "S" || keychar == "Ы")
         {submitUART("s"); submitUART("s"); submitUART("s");}
      if(keychar == "d" || keychar == "в" || keychar == "D" || keychar == "В")
         {submitUART("d"); submitUART("d"); submitUART("d");}*/
      return true;
   };

   /*window.setInterval(
      function(){
         var pos = document.getElementById("scr").parentNode.scrollLeft;
         if(lastPos!=pos){
            submitUART("t");
            lastPos=pos;
         };
      },100
   );*/

    </script>
</head>
<body onKeyPress="return keyPressed(event)" onKeyUp="keyUp(event)" bgcolor="black" text="green">
<pre class="banner">
* <b>Made by <a href="http://open-robotics.ru/" target="_blank">Open-Robotics.ru</a></b>                       Powered by <a href="http://openwrt.org" target="_blank">OpenWrt.org</a> *
</pre>
<table align="center">

    <tr>
        <td>
            <script type="text/javascript">
                document.write("<img alt='Robot Eye' class='bot-eye' src='http://" + document.location.host + ":8080/?action=stream'/>")
            </script>
            <br/>
        </td>
     
        <td align="right">
            <hr style="width: 240px;margin-top: 15px">
       Chassis control: W-Forward, A-Left, S-Backward, D-Right<br>
      <button type="button" onclick="submitUART('W')">Forward</button><br>
        <button type="button" onclick="submitUART('A')">Left</button>
        <button type="button" onclick="submitUART('l')">Light</button>
        <button type="button" onclick="submitUART('D')">Right</button><br>
        <button type="button" onclick="submitUART('S')">Backward</button>
             
            <hr style="width: 480px;margin-top: 15px">
            <form id="serialForm" action="cgi-bin/serial.cgi" method="POST" target="hidden">
                <label>Serial data:<br/>
                    <textarea id="serialData" name="SERIAL_DATA" rows="2" cols="20">TEST SERIAL</textarea>
                </label><br/>
                <input type="submit" value="Send">
            </form>
        </td>
    </tr>
</table>
<hr/>
<iframe name="hidden" src="/nothing.html" style="width: 1px;height: 1px;visibility: hidden"></iframe>

<a href="admin/index.html" >>Robot administration</a>
</body>
</html>

Если видите где они, эти "10 13", скажите, я их вырежу отсюда.

Добавлено спустя 5 минут 36 секунд:
Angel71 писал(а):на самом деле есть такое гроооооомаднейшее предположение, что у вас в скетче (или как оно там у вас называется в этом "dimmer") вы данные не из кода отсылаете, а из этого чудного окошка
и весь этот гимор до смешного легко лечится.

Я данные и из этого окошка отсылаю, и из роутера, код отсылки и скрипт привёл. Как же это лечится? Просто об этом нигде ни слова не встретил. Есть гарантированно рабочий пример (гарантия от производителя ардуины и программы arduino ide), сказано, что оно работает, и всё. Точка. И некоторые утверждают что действительно работает.

Re: Ардуино не принимает данные из Com

Angel71 » 23 окт 2012, 19:45

Код: Выделить всёРазвернуть
 <form id="serialForm" action="cgi-bin/serial.cgi" method="POST" target="hidden">
                <label>Serial data:<br/>
                    <textarea id="serialData" name="SERIAL_DATA" rows="2" cols="20">TEST SERIAL</textarea>
                </label><br/>
                <input type="submit" value="Send">
            </form>

т.е. в текстовом поле написали символ, и выплюнули его в уарт. дык, всё правильно оно отсылает
код символов: "а" 160, "a" 97, "0" 48.

естесственно символ и получили.
с 10 13 пока даже пытаться не буду в телепата играть. более детально описывайте, а то у вас то скетч, то роутер, то один код, то другой + хз что конкретно где делаете. где вылезают эти 10 13 я хз. сидеть гадать в каком участке кода ошибку искать... дануне.
либо стирайте всё в этом cgi и начинайте смотреть что пришло (выплёвывайте куда там сейчас выплёвывается) полученые данные и их длину. а там уже видно будет.
Последний раз редактировалось Angel71 23 окт 2012, 20:06, всего редактировалось 1 раз.

Re: Ардуино не принимает данные из Com

Sirocco » 23 окт 2012, 20:05

Angel71 писал(а):сидеть гадать в каком участке кода ошибку искать... дануне.

Может быть это что-нибудь вам прояснит: http://roboforum.ru/forum86/topic12113.html#p253442
Проблема раз: Отправляю циферку "0", ардуино видит не "цифру ноль", а её код "48". Отправляю через arduino ide или как вы сказали "т.е. в текстовом поле написали символ, потом взяли его код и выплюнули в уарт". Как сделать чтоб видела "0" а не код нуля, при отправке нуля, в том и другом способе. Как брать символ, и отправлять символ, а не его код?
И ранее я писал, что отправляя через старую версию arduino IDE, и возвращая отправленное обратно, приходит как раз не "48" вместо отправленного "0", а именно ноль. Но, этото значение на пине всё равно не устанавливается, устанавливается "48", делаю вывод, что так отображает программа
Проблема два: при способе "т.е. в текстовом поле написали символ, потом взяли его код и выплюнули в уарт" отправляется "10" и "13". А не нужно. Как и где исправить.
А ваще уже надоело переформулировать одно и то же разными словами для разных желающих помочь. В ответ на мои вопросы, получаю ещё больше вопросов. Считаю, что достаточно ясно сформулировал проблему.

Re: Ардуино не принимает данные из Com

Angel71 » 23 окт 2012, 20:10

плииин. ещё раз повторяю. на форме веб страницы вы пишите символы в текстовое поле. потом берёте этот текст и отправляете его на роутер cgi скрипту. если в скетче дуни вы отправляете через ото мелкое окошко внизу и чуть левее, то там таже самая ситуация - тестовое поле ака куча символов. "0" ака '0' совсем не тоже самое, что и число 0. или можно поподробней где именно вы отсылаете число 0, а не символ "0"? в коде? в каком? при чём тут опять ардуина, когда только что речь была за вебстраницу и роутер? где код скетча? просил же более жетально всё описывать. :) давайте по одной проблеме за раз и без всякого "смешались в кучу кони, люди,..."? а то и вас не поймут и вы ничего не поймёте. :pardon: или ждите телепатов, у которых есть дуня и роутер с таким же софтом и они либо поковыряются в вашем коде или просто выложат свой рабочий код для примера.

Re: Ардуино не принимает данные из Com

Sirocco » 23 окт 2012, 20:42

Попробую как блондинка объяснить. Хочу с клавиатуры num pad ввести в то самое окошко, или текстовое поле веб странички(давайте на веб страничке остановимся) циферку(символ, а не его код), например "0", и чтоб он прилетел в ардуино не кодом этого символа "48", а нулём, тем самым нулём, который установит уровень напряжения на пине в ноль. Анологично от 0 до 255. Если 255 установить на пине, это будет соответствовать пяти вольтам.
Вот код, который беру за основу:
Код: Выделить всёРазвернуть
const int ledPin = 9;      // the pin that the LED is attached to

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  byte brightness;

  // check if data has been sent from the computer:
  if (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    brightness = Serial.read();
    // set the brightness of the LED:
    analogWrite(ledPin, brightness);
  }
}

Всё упёрлось в то, что когда я ввожу в окно(поле) отправки свой символ "ноль", отправляется не сам "ноль", а его код "48". Соответственно вопрос, как мне отсылать не коды символов, а сами символы. Или пусть шлются коды символов, как сейчас, но тогда нужен скетч, который бы их переводил в символы. Уж не знаю что проще сделать.


Rambler\'s Top100 Mail.ru counter