Как узнать текущее количество плат ардуино подключенные через UART

sergiu920
Offline
Зарегистрирован: 27.12.2014

Приветствую дорогие форумчани! У меня к вам такой вопрос: Как узнать количество подключенных плат на данный момент, которые подключены через UART. То есть я знаю точно что например сейчас я подключил 3 платы, но мне надо чтобы это число 3 была видна в SerialMonitor.

На всех ардуинок должен быть один и тотже код программы.

Вот код которыи загружен на платах на данный момент:

#include <SoftwareSerial.h>

SoftwareSerial Serial_1 = SoftwareSerial(2,3); //Rx , Tx

int incoming = 0;
int incoming1 = 0;
int analogValue = 0;
int count_device = 0;
int val;

void setup()
{
  Serial.begin(9600);  //Begin Serial to talk to the Serial Monitor   
  Serial_1.begin(9600); //Begin Serial to talk to the Rx Arduino
  Serial.print("Количество подключенных плат: ");
  Serial.println(count_device);
}

void loop()
{
  analogValue = analogRead(0); //Считаем данные с потенциометра
  
/*  Через Serial Monitor отправляем число которая означает номер платы с которой хотим получить данные.
Например у меня подключено 3 платы. К каждой плате подключен один потенциометр к аналоговуму входу 0. Через Serial Monitor 
я отправляю например число 2. Это означает что я хочу получить данные с потенциометра который подключен ко второй плате. 
*/ 
 incoming = Serial.available(); 
  
  while (incoming != 0)           
  {
    nr_device_out = Serial.parseInt(); // В начале в переменную nr_device_out попадает число 2. 
    
    nr_device_out--; // Декрементируем. 2 - 1 = 1
    if (nr_device_out == 0) // Число 1 не равна нулю, значит через SoftwareSerial передаем число 1 к второй плате. 
    {
    /*
    Получаем данные с потенциометра который подключен к ардуино с номером которого послали через Serial Monitor, в нашом случае со второй платы.
    */
     Serial.println(analogValue); 
    }
    else{
       Serial_1.print(nr_device_out); // передаем число 1 к второй плате через SoftwareSerial. 
    }
    incoming = Serial.available();
  }

  //     From the Rx Arduino
  incoming1 = Serial_1.available();  // Получаем данные со второй платы
  
  while(incoming1 != 0)           //While there is something to be read
  {
    
    Serial.write(Serial_1.read()); // Выводим значение потенциометра, который подключен к второй платы.
    incoming1 = Serial_1.available();
  }
}



И вот я хочу чтобы в переменную count_device  попало число, которая означает количество подключенных плат на данный момент.

ВОПРОС: Как вычислить количество подключенных плат, которые соединены между собой через  UART ? 

На изображение показано как я соединил платы :

Спасибо и жду Ваших ответов!

Извиняюсь за мой русский!

mixail844
Offline
Зарегистрирован: 30.04.2012

на каждую плату добавить протокол запроса и ответа   :

если с "сервера" идет сообщение типа "скажи кто ты" то "клиент" отвечает  : "я плата номер 5" 

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

это решение "на пальцах" ,то есть детали нужно прорабатывать.

Pochemushka
Offline
Зарегистрирован: 12.12.2014

А зачем вам автоматически считать сколько у вас плат? Вы хотите, чтобы скетч на всех slave arduino был одинков и вы могли создав массив incoming в цикле читать значения со всех slave arduino? Вы при взаимодействии дуин будите в одну сторону гонять информацию от slave к master'у ? 

Почитайте тут,  и ваши мучения закончатся :) 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Не первый день тут.но до сих пор не знаю как также оформлять ссылки.в смысле как предыдущем посте.подскажите

Pochemushka
Offline
Зарегистрирован: 12.12.2014

jeka_tm пишет:
Не первый день тут.но до сих пор не знаю как также оформлять ссылки.в смысле как предыдущем посте.подскажите

Пишите "тут", "там", "отсюда" или любое что нравиться :) выделяете это слово или текст и жмакаете на маленький глобус в меню над окном собщений. Далее вставляем адрес ссылки все...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

УАЗИКЁЁЁ!!!!!

спасибо

sergiu920
Offline
Зарегистрирован: 27.12.2014

А зачем вам автоматически считать сколько у вас плат?

Ответ: Это курсовик и препод сказал так сделать, вот я и пытаюсь сделать.

Вы хотите, чтобы скетч на всех slave arduino был одинков и вы могли создав массив incoming в цикле читать значения со всех slave arduino?

Ответ: Да так надо чтобы на всех ардуин был один и тотже скетч. Нет, дело в другом. Я этот проект делаю с коллегой, он занимается платой FPGA Altera. Он должен прислать мне пакет из 2 байта, один байт указывает с какой платы ардуино получить данные а во втором байте будут 3 команды, 2 для светодиода( включить и выключить) и одна команда для потенциометра (считать данные). В начале и в конце каждого байта будет еще и бит старт(перед байтом) и стоп(в конце байта). Я должен отправить ему обратно номер ардуинки с которой считались данные и соответсвенно данные.

Возвращаюсь к первому вопросу. Ответ: Видимо мне нужно подсчитать кол-во плат для того чтобы мой коллега знал сколько плат подключены, для того чтобы он знал какой ардуинки отправлять пакет.

Вы при взаимодействии дуин будите в одну сторону гонять информацию от slave к master'у ?

Ответ: Я буду гонять информацию в обе стороны. В одну сторону ( с мастера к slave ), это когда приходит пакет с номером ардуинки и команды для этой ардуинки, а в другую сторону ( с slave к мастеру ) уже номер ардуинки с которой считались данные и соответсвенно данные.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Записать уникальный идентификатор в EEPROM.
Правда хардкод, но скетчи будут одинаковые.

Pochemushka
Offline
Зарегистрирован: 12.12.2014

Обратите внимание на подключение по ссылке которую я давал выше. 

алгоритм может быть следующим: при запуске master arduino шлет в uart пакет типа "кто здесь?", в ответ каждый slave arduino шлет что то типа "я здесь!", master arduino считает откликнувшихся(тупо считает кол-во прилетевших пакетов) складывает, таким образом вы получите кол-во контролеров. 

в качестве совета: реализуйте подключение и обмен через uart используя прерывание - избавитесь от многих проблем в последствии. 

sergiu920
Offline
Зарегистрирован: 27.12.2014

тест

sergiu920
Offline
Зарегистрирован: 27.12.2014

mixail844 пишет:

на каждую плату добавить протокол запроса и ответа   :

если с "сервера" идет сообщение типа "скажи кто ты" то "клиент" отвечает  : "я плата номер 5" 

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

это решение "на пальцах" ,то есть детали нужно прорабатывать.

А можно более подробно как это сделать?

Начнем по порядку.

 Как добавить на каждую плату протокол запроса и ответа?

Pochemushka
Offline
Зарегистрирован: 12.12.2014

sergiu920 пишет:

mixail844 пишет:

на каждую плату добавить протокол запроса и ответа   :

если с "сервера" идет сообщение типа "скажи кто ты" то "клиент" отвечает  : "я плата номер 5" 

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

это решение "на пальцах" ,то есть детали нужно прорабатывать.

А можно более подробно как это сделать?

Начнем по порядку.

 Как добавить на каждую плату протокол запроса и ответа?

Предлагаю определиться: Вам алгоритм подсказать как это сделать или кусок готового скетча написать? :) 

Предлагаю определиться Вам нужно алгоритм подсказать или кусок скетча готовый налобать? 

sergiu920
Offline
Зарегистрирован: 27.12.2014

Pochemushka пишет:

sergiu920 пишет:

mixail844 пишет:

на каждую плату добавить протокол запроса и ответа   :

если с "сервера" идет сообщение типа "скажи кто ты" то "клиент" отвечает  : "я плата номер 5" 

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

это решение "на пальцах" ,то есть детали нужно прорабатывать.

А можно более подробно как это сделать?

Начнем по порядку.

 Как добавить на каждую плату протокол запроса и ответа?

Предлагаю определиться: Вам алгоритм подсказать как это сделать или кусок готового скетча написать? :) 

Предлагаю определиться Вам нужно алгоритм подсказать или кусок скетча готовый налобать? 

Напишите кусок готового скетча а потом подскажите алгоритм, для тобо чтобы мне было легче разобратся что и как. Спасибо!!!

Pochemushka
Offline
Зарегистрирован: 12.12.2014

Предлагаю под чутким руководством форумчан напрячь мозг всетаки самому :). Итак запускаем стимулирующие мероприятия для головного мозга студента: 

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

Потом идем  сюда   и без всякого зазрения совести тупо пи№дим код для двухпроводной схемы. 

Потом заливаем скет из двух строчек который запишет в EEPROM  идентификатор платы ( для каждой платы свой). Потом из второй ссылки заливает постоянные скетчи  на платы - допиливаем светодиоды и крутяшки, выпячиваем грудь колесом и идем сдаваться преподу. 

Ну уж если и после этого будут вопросы - предлагаю пойти сразу к преподу и попросить его поставить двойку, чтоб уже не не мучаться :) 

Удачи... 

sergiu920
Offline
Зарегистрирован: 27.12.2014

Pochemushka пишет:

Предлагаю под чутким руководством форумчан напрячь мозг всетаки самому :). Итак запускаем стимулирующие мероприятия для головного мозга студента: 

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

Потом идем  сюда   и без всякого зазрения совести тупо пи№дим код для двухпроводной схемы. 

Потом заливаем скет из двух строчек который запишет в EEPROM  идентификатор платы ( для каждой платы свой). Потом из второй ссылки заливает постоянные скетчи  на платы - допиливаем светодиоды и крутяшки, выпячиваем грудь колесом и идем сдаваться преподу. 

Ну уж если и после этого будут вопросы - предлагаю пойти сразу к преподу и попросить его поставить двойку, чтоб уже не не мучаться :) 

Удачи... 

Как придать каждой плате уникальный номер, я понял. А что делать дальше?
На всех ардуинок должен быть один и тот же скетч.

Как создать пакет типа "кто здесь?" который отправлю с компа (пока что только он у меня может быть мастером), в ответ каждый slave arduino пошлет, что то типа "я здесь!".
И как slave arduino пошлет ответ "я здесь!" ?

Дальше, master  считает откликнувшихся(тупо считает кол-во прилетевших пакетов - Как он это сделает? ) складывает, таким образом вы получите кол-во контролеров.

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

Огромная просьба к Вам, опишите Ваш ответ как можно подробнее, что бы мне было четко ясно, что делать дальше и впоследствии у меня будут меньше вопросов, а если все пойму, то вообще не будут.

Еще раз огромное Вам спасибо за помощь!

 

sergiu920
Offline
Зарегистрирован: 27.12.2014

kisoft пишет:
Записать уникальный идентификатор в EEPROM. Правда хардкод, но скетчи будут одинаковые.

Записал уникальный идентификатор в EEPROM. Что делать дальше?