Соединение двух Arduino Uno по SPI...

Тема в разделе "Проводная и беспроводная связь", создана пользователем matwaysha, 2 май 2019.

  1. Daniil

    Daniil Гуру

    Пришлите, пожалуйста, скрин. Как у вас выглядит программа (терминальная) при отправке сообщений "руками"
     
    matwaysha и Belkin нравится это.
  2. Belkin

    Belkin Гик

    Не зацикливайтесь вы на этом светодиоде...
    Главный показатель сейчас - программа-терминал.

    Устойчивая передача есть ?
    Нужное количество байт передается правильно, без ошибок ?

    Когда в обоих случая будет "да" - переходите к приему.
    В качестве "источника" используйте требуемую в окончательном варианте цепочку (нужное количество байт).
    Причем в ходе отладки не обязательно использовать практические значения, можно любые.
    Главное - устойчивый прием, для начала от программы-терминала.
     
    matwaysha и Daniil нравится это.
  3. matwaysha

    matwaysha Нерд

    На самом деле, сейчас проверил ещё раз, подключив передатчик к приемнику, хоть ничего и не мигает - счетчик считает, значит данные приходят, поэтому теперь главный вопрос это прием, по терминальной программе - вроде бы приходит то, что нужно.
    вот так делаю последовательно всю нужную строчку:
    upload_2019-5-4_15-3-14.png
    upload_2019-5-4_15-4-6.png
    и так всё вот такую же строчку:
    upload_2019-5-4_15-5-5.png
    после каждого отправленного символа счетчик увеличивается на единицу.
    Кстати, если так же отправлять всю строчку вот так:
    upload_2019-5-4_15-6-34.png
    upload_2019-5-4_15-7-3.png
    счетчик так же работает и увеличивается за раз уже на семь, вроде бы правильно увеличивается.
    Сейчас позапихиваю счетчики в разные места.
     
  4. Daniil

    Daniil Гуру

    Прогресс есть.
    Нюанс в том, что то что вы отправляете (нажимая на ентер) должно появиться снизу в окне "transmitted data", чего на скринах не видно. Да и не вижу как вы определяете, что счётчики сработали.
    Даже если вы их определяете, то вы можете контролировать переменные indxStart, indxEnd, да и tmp можно выводить. Подозреваю, что и принятую строку можно отослать обратно. Что они показывают?
     
  5. matwaysha

    matwaysha Нерд

    Вот, а со счетчиками самое интересное - ставил их пока в три места
    Код (C++):
    void serialEvent(){
      while(Serial.available()){
        char inChar = (char)Serial.read();
        inputString += inChar;
        if(inChar == '\n'){
          stringComplete = true;
          //k++;
        }
       // k++;
      }
    }
    счетчик - это к.
    Код (C++):
    if(stringComplete = true){
        //k++;
        for(int i = 0; i < inputString.length(); i++){
          if(inputString[i] == '\n'){
            indexEnd = i - 1;
          }
          if(inputString[i] == ':'){
            indexStart = i + 1;
          }
        }
       
        for(int i = indexStart + 1; i <= indexEnd; i++){
          tmp = inputString[i];
          if(i != indexEnd){
            tmp = tmp << 8;
          }
        }
        if(inputString[indexStart] == 'A'){
          x = (((float)tmp) - 90)/1e3;
        }
        else{
          y = (((float)tmp) - 90)/1e3;
        }
        tmp = 0;
        stringComplete = false;
      }
    в первых двух случаях всё работает как надо, а вот в третьем - как только включаю программу, он начинает неограниченно расти. просто увеличивается и всё, безо всяких отправок. В низу не появляется, потому что не на энтер нажимаю, а на ту кнопку в autosend.
     
  6. matwaysha

    matwaysha Нерд

    Да, про счетчики, они выводятся на LCD.
     
  7. Daniil

    Daniil Гуру

    при инициализации stringComplete выставляется false?
    По началу лучше отправлять медленно. Чтобы все контролировать. А лучше руками. По одной посылке.
     
  8. matwaysha

    matwaysha Нерд

    Да, в обоих случаях так и делаю, на всякий случай даже в конце каждого цикла обработки выставляю false. Руками значит на ентер? Просто когда так делаю в отправленных появляется отправленное, но вместе с ним ещё знак лишний.
     
  9. Daniil

    Daniil Гуру

    слона то я и не заметил:D на телефоне раскрыл скриншот и сразу сдвигаю его к области передачи, поэтому не заметил доп. окошко.
     
  10. Daniil

    Daniil Гуру

    да. Там где галочки передатчика есть поле "send on enter" там выставлено "CR-LF" это значит, что программа автоматически добавляет к вашей строке ещё символы. Выберите что-нибудь вроде "none".
     
  11. matwaysha

    matwaysha Нерд

    Сделал, теперь без лишних символов.
     
  12. Daniil

    Daniil Гуру

    И как индексы, счетчики?
     
  13. matwaysha

    matwaysha Нерд

    Нашел из - за чего счетчик рос неограниченно... Я в проверке вместо == поставил =, и оно скорее всего присваивалось не смотря ни на что... Поставил два равно - всё нормально. Сейчас следующий странный момент, целых два. когда собрал вместе две платы - передающая ничего не отправляла, пока было питание на принимающей (там автономное питание у каждой от крон), отключаю питание от принимающей - передающая начинает мигать... Не знаю, с чем это связано. запустил на прием отдельно плату от программы - счетчик последний в обрабатывающей программе увеличивается на один с каждой целой отправленной строкой, на экране всё остальное - нули.
     
  14. matwaysha

    matwaysha Нерд

    Момент с отправкой решен - там батарейка стояла подсевшая. Поставил новую - передает, счетчик в обрабатывающей штуке считает, на экране нули.
     
  15. Daniil

    Daniil Гуру

    А индексы, а сама строка?
    Ещё раз повторю, не спешите. Отладьте программы отдельно. С передатчиком вы разобрались. Осталось с приемником разобраться
     
  16. matwaysha

    matwaysha Нерд

    Что Вы называете индексами? Просто при отправке с терминальной программы строк, тех же самых, что нужно, счетчик в последнем месте - в обрабатывающей части в луп увеличивается с каждой строкой на один, но при этом на экран выводятся нули. Значит ошибка где то в обрабатывающей части. сейчас ещё по переставляю счетчик.
     
  17. matwaysha

    matwaysha Нерд

    Сейчас поставил счетчик вот сюда:
    Код (C++):
    if(stringComplete == true){
     
        for(int i = 0; i < inputString.length(); i++){
          k++;
          if(inputString[i] == '\n'){
            indexEnd = i - 1;
          }
          if(inputString[i] == ':'){
            indexStart = i + 1;
          }
        }
     
        for(int i = indexStart + 1; i <= indexEnd; i++){
          tmp = inputString[i];
          if(i != indexEnd){
            tmp = tmp << 8;
          }
        }
        if(inputString[indexStart] == 'A'){
          x = (((float)tmp) - 90)/1e3;
        }
        else{
          y = (((float)tmp) - 90)/1e3;
        }
        tmp = 0;
        stringComplete = false;
      }
     
    Получил странные результаты - пять раз отправлял одну и ту же строку, при этом счетчик выводил цифры после каждой из них. Они шли в таком порядке 8 - 24 - 48 - 80 - 120 (первая отправка строки - 8, вторая - 24, проверял дважды)
    upload_2019-5-4_16-36-51.png
     
  18. Daniil

    Daniil Гуру

    Вы своими счётчиками регистрируете, что данные приходят, но говорите, что выводятся нули. Делаете вывод, что обработка косячная. Я согласен.
    Там где вы обрабатываете строку вы находите индексы начала/конца числа в пачке. Я про эти индексы говорю.
    после обработки строки вы ее не сбрасываете.
    добавьте тут
    Код (C++):
    inputString="";
    между кавычками не должно быть пробелов
    (кавычки нормальные поставьте, я на телефоне не могу найти одинарные:()

    у вас не сбрасывается строка. За первый проход счетчик равен 8. При отправке ещё команды, строка становится длиной 16, счетчик инкрементируется до 24 и т.д.
     
    Последнее редактирование: 4 май 2019
    Belkin и matwaysha нравится это.
  19. Daniil

    Daniil Гуру

    Если представить, что вы отправляете х=0.1, то в передатчике:
    (0.1+90)*1е3=90100
    в приемнике нужно проделать обратные операции в обратном порядке.
    90100/1е3 - 90 = 0.1
    сейчас у вас
    (90100-90)/1е3 = 90.01
    мой косяк, извиняюсь)
    причем, тут лучше явно показывать, что работаем с плавающей зпт.
    Код (C++):
    x= (float)tmp/1000.0 - 90.0;
     
    Последнее редактирование: 4 май 2019
    matwaysha нравится это.
  20. matwaysha

    matwaysha Нерд

    Попытался поставить одинарные - мне компилятор по рукам дал, поставил двойные - работает, выводит на экран с каждой новой строкой +8 к предыдущему значению, а первое 8. Переделал эту обратное превращение - теперь на экран выводятся два угла и счетчик, но есть одн момент - что при отправке с терминальной программы, что при отправке с другой платы выводятся на местах углов -89 и -89 (минус 89) для каждого из них, при абсолютно разных положениях гироскопа и разных строках с ручного ввода.
    При том, при разных строках давал разные результаты и счетчик:
    Это первая отправка (тут не считал)
    upload_2019-5-4_17-9-39.png
    При такой отправке было 8 - 15 - 22 - 29
    upload_2019-5-4_17-13-3.png
    При такой отправке 8 - 16 - 24 - 32 (тут вроде бы всё в порядке)
    upload_2019-5-4_17-14-27.png
    при такой отправке 7 - 15 - 22 - 29
    upload_2019-5-4_17-19-34.png

    код теперь такой:
    Код (C++):
    void loop() {
      lcd.setBacklight(255);
      lcd.home(); lcd.clear();
      if(stringComplete == true){
       
        for(int i = 0; i < inputString.length(); i++){
          k++;
          if(inputString[i] == '\n'){
            indexEnd = i - 1;
          }
          if(inputString[i] == ':'){
            indexStart = i + 1;
          }
        }
       
        for(int i = indexStart + 1; i <= indexEnd; i++){
          tmp = inputString[i];
          if(i != indexEnd){
            tmp = tmp << 8;
          }
        }
        if(inputString[indexStart] == 'A'){
          x = (((float)tmp)/1e3) - 90;
        }
        else{
          y = (((float)tmp)/1e3) - 90;
        }
        tmp = 0;
        stringComplete = false;
        inputString = "";
      }
     
      lcd.setCursor(0,1);
      lcd.print(x);
      lcd.setCursor(8,1);
      lcd.print(y);
      lcd.setCursor(13,1);
      lcd.print(k);
    }