Управление несколькими АРДУИНАМИ по UART

Тема в разделе "Проводная и беспроводная связь", создана пользователем rff-ei, 27 авг 2016.

  1. rff-ei

    rff-ei Гик

     
    Nikodim нравится это.
  2. rff-ei

    rff-ei Гик

    Код (C++):
    /*
    Автор: Рябикин Олег.  2016г. olegryaba@gmail.com
    Прошивка для "МАСТЕРА"
    */
     
    #include <Wire.h>                    
         char privet; // у каждой "ведомой" ардуины  свое имя у одной 'A' у другой 'B' у следующей  'C'
         int LED=13;//светодиод на 13 пине
         int knopka=5;//пусть кнопка будет на 5 пине
         int f=0;    // переменная для счетчика
         char g;  //временная переменная для хранения полученного символа по порту
         byte metka=0;//метка , в этом примере у нее два  значения 0, 1
    void setup()
        {
         pinMode(LED, OUTPUT);//настраиваем 13 пин как выход
         digitalWrite(LED,LOW);//выключаем светодиод
         pinMode(knopka, INPUT_PULLUP);//подтягиваем кнопку к +5в внутренним сопротивлением

         Serial.begin(9600);    // открываем последовательный порт на скорости 9600 бод
                             // на всех ардуинках должна быть одинаковая
         }
    void loop(){
     
       if(digitalRead(knopka)==LOW&&metka==0) //если нажать на кнопку когда метка=0 ,в порт отошлем привет на выбранный адресс
      {
         do
             {
                digitalWrite(LED,HIGH);//включаем светодиод
                delay(500);
                digitalWrite(LED,LOW);//выключаем светодиод
                delay(500);
                f++; //прибавляем 1 к предыдущему значению счетчика
             } while (digitalRead(knopka)==LOW);//пока нажата кнопка включаем светодиод и запускаем счетчик (считаем количество марганий светодиода)  
                  if(f==1){privet='A';}//если светодиод маргнул 1 раз, выбирали адресс A (первая ардуинка)
             else if(f==2){privet='B';}//если светодиод маргнул 2 раза, выбирали адресс B (вторая ардуинка)
             else if(f==3){privet='C';}//если светодиод маргнул 3 раза ,выбрали адресс  C (третья ардуинка)
              else if(f>3){privet=' ';metka=0;}////если светодиод маргнул больше 3 раз ,а у нас всего три "ведомых" начинаем заного выбирать ведомого
            Serial.print(privet);  // как только отпустим кнопку отправляем в порт "привет" одному из трех ардуин
            f=0;// обнуляем счетчик для следующей передачи
            metka=1;//меняем значение метки для подготовки "мастера" к передаче данных
           
      }
     
     
      if(digitalRead(knopka)==LOW&&metka==1) //если нажать кнопку когда метка=1 ,в порт подготовим данные для выбранной ардуины
      {
           do
             {
                digitalWrite(LED,HIGH);//включаем светодиод
                delay(500);
                digitalWrite(LED,LOW);//выключаем светодиод
                delay(500);
                f++; // удерживая кнопку ,прибавляем 1 к предыдущему значению счетчика
             }  while (digitalRead(knopka)==LOW);//пока нажата кнопка включаем светодиод и запускаем счетчик (считаем количество морганий светодиода)
             delay(1000);  
             if(f>9){metka=0;f=0;}//если нечаяно выбрали число  больше 9,  в порт отсылаем 0    
        Serial.print(f);  // как только отпустим кнопку отправляем в порт колич морганий светода
        f=0;// обнуляем счетчик для следующей передачи
        metka=0;// устанавливаем 0,и начинаем все с начала
       
      }
       
        }      
     
  3. rff-ei

    rff-ei Гик

    Код (C++):
    /*
    * ПРОШИВКА ДЛЯ "ВЕДОМОГО"
    * Автор: Рябикин Олег.  2016г. olegryaba@gmail.com
    *
    */

                         
         char adres='B'; // у каждой "ведомой" ардуины  свой адресс допустим у одной 'A' у другой 'B' у следующей  'C'
         int LED=13;//светодиод на 13 пине
         int f=0;    // переменная для счетчика
         char g=0;  //временная переменная для хранения полученного символа по порту
         int t=0; // переменная для хранения полученного целого числа из символа
         byte metka=0;// вспомогательная метка , в этом примере у нее два значения 0, 1
    void setup()
        {
         pinMode(LED, OUTPUT);//настраиваем 13 пин как выход

         Serial.begin(9600);    // открываем последовательный порт на скорости 9600 бод
                             // на всех ардуинках должна быть одинаковая
         }
    void loop(){
       if(Serial.available()>0) // если в последовательном порту есть данные для чтения
       {
       g=Serial.read(); //читаем и присваиваем переменной g полученный символ
        if(g==adres)//если мастер прислал наш адресс то...
        {
          metka=1; //готовимся к приему данных
          digitalWrite(LED,HIGH);
          delay (100);
          digitalWrite(LED,LOW);
          delay (100);//маргнем 1 раз( покажем,кого мастер  выбрал из трех ардуин)
        }
       if(metka==1&&g!=adres){//если метка=1 значит мастер выбрал меня
        t=0;//обнулем переменную
            if(g=='1'){t=1;}//преобразуем символ числа в целое число
       else if(g=='2'){t=2;}// и присваиваем это значение переменной t
       else if(g=='3'){t=3;}
       else if(g=='4'){t=4;}
       else if(g=='5'){t=5;}
       else if(g=='6'){t=6;}
       else if(g=='7'){t=7;}
       else if(g=='8'){t=8;}
       else if(g=='9'){t=9;}
        for(int r=0;r<t;r++)// количество марганий на "ведомом" будет равно полученному числу от "мастера"
        {
          digitalWrite(LED,HIGH);
          delay (300);
          digitalWrite(LED,LOW);
          delay (300);
        }

         metka=0;
      }}
        }      
     
  4. ostrov

    ostrov Гуру

    RS485 не правильнее для такой задачи?
     
  5. rff-ei

    rff-ei Гик

    НУ почему же ? ИМХО для понимания само то .
     
  6. RogerRU

    RogerRU Нерд

    А какое практическое применение данного метода??
     
  7. Developer-RU

    Developer-RU Гик

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

    то есть несколько самих контроллеров(можно без плат, то есть не ардуино) копеечной стоимости.
     
  8. rff-ei

    rff-ei Гик

    Допустим создаем робота, "МАСТЕР" его мозг
    МАСТЕР подает команды своим рукам ,ногам и т.д
    Мастер:
    -Ведомый A Шаг вперед.
    -Ведомый B Удержи заготовку по координатам x=10;y=200;z=78;
    -Ведомый С стукни молотком по координатам x=20;у=250;z=100
    и т.д.
     
  9. ostrov

    ostrov Гуру

    Это называется "сеть", она, как правило, формируется при помощи 485, это тот же UART, только удобно и правильно организованный. И робот может быть огромным при этом, с руками длиной до 1200м. )
     
  10. rff-ei

    rff-ei Гик

    Вот я и хочу поглубже въехать во все эти протоколы I2C,RS485,SPI и т.д ))),но пока ...
     
  11. ostrov

    ostrov Гуру

    Почитайте пример в вики Амперки, называется "офисная активность" или как то так.