Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control

Arduino за стрелки

<< < (35/38) > >>

pavel75:
КОД НА ПЪРВОТО АРДУИНО:

#include <Servo.h>
#include <SoftwareSerial.h>

SoftwareSerial Ardo1 (0, 1); //Пиновете за НС12

const int butonpin = 4;

void setup() {
  Ardo1.begin(9600);
  pinMode (butonpin,INPUT);
  pinMode (led_pravo, OUTPUT);
  pinMode (led_otklonenie, OUTPUT);
 
}

void loop() {
 
       int buton_push = digitalRead(butonpin);

             if(buton_push ==HIGH){
             Ardo1.println(15);
              }
             delay(200);
               
            }
}

КОД НА ВТОРОТО АРДУИНО:

#include <Servo.h>
#include <SoftwareSerial.h>

SoftwareSerial Ardo2 (0, 1); //Пиновете за НС12

const int pravo = 0;
const int diasno = 90;

const int servopin = 4;

// константа за периода на забавяне на върнете на сервото
const int period = 100;

//декрарираме сервото
Servo Strelka1;

//променливи за запомняне позицията на сервото
int pos = pravo; // текуща позиция
int pos_old = diasno; // предишна позиция


void setup() {
 
   Ardo2.begin(9600);
    Strelka1.attach(servopin); // закача сервото на пин 5
    Strelka1.write(pos); //сервото се обръща в права позиция
    delay (1000);
    Strelka1.detach();
   }

void loop() {
 
       if(Ardo2.available ()>1){
       int input = Ardo2.parseInt();
 
       if (input == 15)  {
       pos_old = pos; //запазва текущата позиция
 
       if(pos==pravo)
      {pos=diasno;}
      else{pos=pravo;}
      Ardo2.flush();
       
     if(pos_old<pos){
            Strelka1.attach(servopin);
            for(int i = pos_old + 1; i <=pos; i++){
              Strelka1.write(i); // записва следващата позиция на сервото
              delay(period); // забавяне
              //Ardo2.println(16);
              }
             Strelka1.detach();
      }
     
      if(pos_old>pos){
        Strelka1.attach(servopin);
       
             for(int i = pos_old - 1; i >=pos; i--){
             Strelka1.write(i); // записва следващата позиция на сервото
             delay(period); // забавяне
             Ardo2.println(17);
              }
              Strelka1.detach();
                  }
                     
      }
       
}   
       
}
           

VladoC:
"...Открих и още нещо - ако НС12 е закачено за Ардуиното дава същата грешка, че не може да качи програмата. Когато го махна този модул програмата се качва без никакви проблеми..."
Павка, мисля, че точно това ти е проблема. Когато програмираш Ардуино, задължително изключващ комуникационнивя модул!

pavel75:

--- Цитат на: VladoC link=topic=4987.msg112582#msg112582 date=1535961318 ---"...Открих и още нещо - ако НС12 е закачено за Ардуиното дава същата грешка, че не може да качи програмата. Когато го махна този модул програмата се качва без никакви проблеми..."
Павка, мисля, че точно това ти е проблема. Когато програмираш Ардуино, задължително изключващ комуникационнивя модул!

--- Край на цитат ---

Да, така ме посъветваха. Вече така го правя, но явно съм го съсипал нещо, защото вече не работи.

mitko0888:
Павка, първо:
При качване на програмите през USB порта не трябва да има нищо закачено на пинове 0 и 1, или ако има нещо то да не им пречи. Независимо дали е HC12 или каквото и да е.
Другото е малко заигравка, на мен не ми харесва и ако можеш го напиши по друг начин, защото не ми е ясно:
- Какво прави Ardo2.println(16)?
- кой ти каза че можеш да използваш функциите от Serial в SoftwareSerial? Гледам Ardo2.parseInt(). Не казвам че не става, ама не съм сигурен.
Освен това при четенето на бутончето според мен задължително използвай макар и най-простата проверка, напр.
четеш бутона, ако е HIGH -> правиш delay(50), четеш пак бутона. Ако пак е HIGH приемаш че е натиснат. Не е нужно да използваш debounce, но поне това сложи, върши работа.
А и на бутоните е добре единият край да е на минус, на маса, на земя или както се нарича. За да не гърми плюса при късо. Тогава при натиснат бутон ще четеш LOW. При инициализацията го правиш pinMode(5, INPUT_PULLUP);
Другото е добре да го оправиш във второто ардуино - като му дадеш една команда да не се бърка докато не я изпълни и дойде втора.

pavel75:

--- Цитат на: mitko0888 link=topic=4987.msg112584#msg112584 date=1535968876 ---Павка, първо:
При качване на програмите през USB порта не трябва да има нищо закачено на пинове 0 и 1, или ако има нещо то да не им пречи. Независимо дали е HC12 или каквото и да е.
Другото е малко заигравка, на мен не ми харесва и ако можеш го напиши по друг начин, защото не ми е ясно:
- Какво прави Ardo2.println(16)?
- кой ти каза че можеш да използваш функциите от Serial в SoftwareSerial? Гледам Ardo2.parseInt(). Не казвам че не става, ама не съм сигурен.
Освен това при четенето на бутончето според мен задължително използвай макар и най-простата проверка, напр.
четеш бутона, ако е HIGH -> правиш delay(50), четеш пак бутона. Ако пак е HIGH приемаш че е натиснат. Не е нужно да използваш debounce, но поне това сложи, върши работа.
А и на бутоните е добре единият край да е на минус, на маса, на земя или както се нарича. За да не гърми плюса при късо. Тогава при натиснат бутон ще четеш LOW. При инициализацията го правиш pinMode(5, INPUT_PULLUP);
Другото е добре да го оправиш във второто ардуино - като му дадеш една команда да не се бърка докато не я изпълни и дойде втора.

--- Край на цитат ---

При качване на програмите през USB порта не трябва да има нищо закачено на пинове 0 и 1, или ако има нещо то да не им пречи. Независимо дали е HC12 или каквото и да е. - Това го научих по трудния начин
Другото е малко заигравка, на мен не ми харесва и ако можеш го напиши по друг начин, защото не ми е ясно:
- Какво прави Ardo2.println(16)? - Това беше да праща сигнал към първото ардуино. Виж, че е в коментар сега. Забравил съм да го изтрия
- кой ти каза че можеш да използваш функциите от Serial в SoftwareSerial? Гледам Ardo2.parseInt(). Не казвам че не става, ама не съм сигурен. - Гледах примерите от този сайт - https://www.instructables.com/id/Long-Range-18km-Arduino-to-Arduino-Wireless-Commun/
Освен това при четенето на бутончето според мен задължително използвай макар и най-простата проверка, напр.
четеш бутона, ако е HIGH -> правиш delay(50), четеш пак бутона. Ако пак е HIGH приемаш че е натиснат. Не е нужно да използваш debounce, но поне това сложи, върши работа. - Да, това го знаех като проблем, но щях да го оправя по-натам. Сега исках да тествам нещата, който не съм правил никога.
А и на бутоните е добре единият край да е на минус, на маса, на земя или както се нарича. .... Бутона е вързан по следния начин - единият извод е на захранването, другият на пина на ардуиното, като самият пин през съпротивление 1 килоом е вързан на маса.
Другото е добре да го оправиш във второто ардуино - като му дадеш една команда да не се бърка докато не я изпълни и дойде втора.

Тъпото е, че не разбрах какво му направих на тоя модул. Ако знаех как и с какво съм го изгорил или каквото му се е случило щях следващият път да го избегна. Сега като не съм наясно може пак да свърша същата тъпотия.

Навигация

[0] Списък на темите

[#] Следваща страница

[*] Предходна страница

Премини на пълна версия