www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Arduino program - pomoč

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jjedat
Član
Član



Pridružen-a: Ned 17 Avg 2014 13:57
Prispevkov: 104
Aktiv.: 0.88
Kraj: Vojnik

PrispevekObjavljeno: Čet Nov 24, 2016 8:42 pm    Naslov sporočila:  Arduino program - pomoč Odgovori s citatom

Pozdravljeni.
Zanima me kako bi združil ta dva programa v en program. Prvi program je za premikanje koračnega motorja levo in desno , drugi pa za premikanje servomotorja levo in desno(naprej, nazaj).
PRVI:
Koda:
#include <Stepper.h>

  int naprejx = A0;
  int nazajx = A1;
  int korakix = 0;
  Stepper motorx(200,8,9,10,11);   
     
void setup()
{
  pinMode(naprejx,INPUT);
  pinMode(nazajx,INPUT);
  motorx.setSpeed(50);
  Serial.begin(9600);
}

void loop()
{
  int Speed = analogRead(A7);
  int RPM = map(Speed, 0, 1023, 0, 100);
  int f = digitalRead(naprejx);
  int r = digitalRead(nazajx);
  if(f == 1 && r == 0 && RPM > 1)
 
  {

 korakix++;
 if( korakix <260)
 
  {
   
   motorx.step(1);
    delay(.01);
   
   }

  }
  if (korakix >259)korakix=260;
  if(r == 1 && f== 0  && RPM > 1)

  {
    korakix--;
 if( korakix >0)

   {
    motorx.step(-1);
        delay(.01);

   }
   if (korakix <0)korakix=0;
   
  }
  delay(0.1);
  Serial.println(korakix);

  }


DRUGI:
Koda:
#include<Servo.h>
int pozicija = 80;
Servo servo;

void setup() {
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  servo.attach(6);
}
void loop() {
  if (digitalRead(A4) == LOW && pozicija < 132) {
    pozicija++;
    servo.write(pozicija);
    delay(0.1);
  }
  if (digitalRead(A5) == LOW && pozicija > 80) {
    pozicija--;
    servo.write(pozicija);
    delay(0.1);
  }
}



Lp.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jjedat
Član
Član



Pridružen-a: Ned 17 Avg 2014 13:57
Prispevkov: 104
Aktiv.: 0.88
Kraj: Vojnik

PrispevekObjavljeno: Čet Nov 24, 2016 9:56 pm    Naslov sporočila:   Odgovori s citatom

Mi je že uspelo. Vseeno hvala.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Branez
Moderator
Moderator



Pridružen-a: Pon 14 Apr 2003 7:21
Prispevkov: 7770
Aktiv.: 34.87
Kraj: Koprivnica HR

PrispevekObjavljeno: Pet Nov 25, 2016 7:54 am    Naslov sporočila:   Odgovori s citatom

Nič ne bi škodilo, če objaviš rezultat in še napišeš kaj o njem. Mogoče bo še kdo rabil podobno izkušnjo.
_________________
The true sign of intelligence is not knowledge but imagination.
Creativity is intelligence having fun!

Albert Einstein
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
jjedat
Član
Član



Pridružen-a: Ned 17 Avg 2014 13:57
Prispevkov: 104
Aktiv.: 0.88
Kraj: Vojnik

PrispevekObjavljeno: Pet Nov 25, 2016 10:20 pm    Naslov sporočila:   Odgovori s citatom

Imam problem in sicer ne vem kako bi krmilil koračni motor y, rad bi, da dela enako kot koračni motor x vendar ne znam kako bi napisal program v void loop še za motor y. Poskusil sem vse podvojiti vendar mi vedno zameša tipke na analognem vhodu. Program ki ga pripenjam deluje. Vse skupaj se gre za zaključno projektno nalogo in sicer arduino CNC plotter. Seveda bom objavil in razložil program, ko bo končan (bom dodal še komentarje v program), ter brez napak.
PROGRAM:
#include <Stepper.h>
#include<Servo.h>

int naprejx = A0;
int nazajx = A1;
int korakix = 0;
int naprejy =A2;
int nazajy =A3;
int korakiy =0;
int naprejz = A4;
int nazajz = A5;
int pozicija = 80;
Stepper motorx(200,8,9,10,11);
Stepper motory(200,2,3,4,5);
Servo servo;

void setup()

{
pinMode(A0,INPUT);
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
motorx.setSpeed(50);
motory.setSpeed(50);
servo.attach(6);
Serial.begin(9600);
}

void loop()

{
int Speed = analogRead(A7);
int RPM = map(Speed, 0, 1023, 0, 100);
int f = digitalRead(A0);
int r = digitalRead(A1);
if(f == 1 && r == 0 && RPM > 1)

{

korakix++;
if( korakix <260)

{

motorx.step(1);
delay(.01);

}

}
if (korakix >259)korakix=260;
if(r == 1 && f== 0 && RPM > 1)

{
korakix--;
if( korakix >0)

{
motorx.step(-1);
delay(.01);

}
if (korakix <0)korakix=0;

}
delay(0.1);
Serial.println(korakix);

if (digitalRead(A4) == LOW && pozicija < 100)

{
pozicija++;
servo.write(pozicija);
delay(0.1);

}

if (digitalRead(A5) == LOW && pozicija > 80)

{
pozicija--;
servo.write(pozicija);
delay(0.1);
}

}



IMG_20161125_211116.jpg
 Opis:
 Velikost datoteke:  1.92 MB
 Pogledana:  16 krat

IMG_20161125_211116.jpg


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.05

PrispevekObjavljeno: Pet Nov 25, 2016 11:21 pm    Naslov sporočila:   Odgovori s citatom

Malo sem oklestil kodo, da bodo 0<=korakix<=260 .
Pri 8-bitnem MCU je čista potrata za f in r uporabljati 16-biten int, saj zadostuje 8-bitni byte .
Na hitro sem uredil, da se bo Hitrost odzivala na zasuk potenciometra, a bo DelayMicroseconds() primernejši od Delay (ki dela na milisekunde). Načeloma tudi ne rabiš 256 stopenj hitrosti. Zadostovalo bo naprimer 32 stopenj, ko namesto Analogread/4 daš Analogread / 32, v Delay pa (32-Speed) ali kaj podobnega. To uredi sam.

Koda:

#include <Stepper.h>
#include<Servo.h>

int naprejx = A0;
int nazajx = A1;
int korakix = 0;
int naprejy =A2;
int nazajy =A3;
int korakiy =0;
int naprejz = A4;
int nazajz = A5;
int pozicija = 80;
Stepper motorx(200,8,9,10,11);
Stepper motory(200,2,3,4,5);
Servo servo;

void setup()

{
pinMode(A0,INPUT);
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
motorx.setSpeed(50);
motory.setSpeed(50);
servo.attach(6);
Serial.begin(9600);
}

void loop()

{
int Speed = analogRead(A7) / 4 ; // = (0...1023) / 4 = (0...255) = (MIN...MAX)
int RPM = map(Speed, 0, 1023, 0, 100);
byte f = digitalRead(A0);
byte r = digitalRead(A1);
  if(f == 1 && r == 0 && RPM > 1) // forward X++
  {
   if( korakix <260)
   {
    korakix++;
    motorx.step(1);
    delay(255-Speed); // višja hitrost zmanjša pavzo
   }
  }

  if(r == 1 && f== 0 && RPM > 1) // reverse X--
  {
   if( korakix >0)
   {
    korakix--;
    motorx.step(-1);
    delay(255-Speed);
   }
  }
  delay(0.1);
  Serial.println(korakix);

  if (digitalRead(A4) == LOW && pozicija < 100)
  {
   pozicija++;
   servo.write(pozicija);
   delay(0.1);
  }

  if (digitalRead(A5) == LOW && pozicija > 80)
  {
   pozicija--;
   servo.write(pozicija);
   delay(0.1);
  }
}

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
overload
Član
Član



Pridružen-a: Tor 23 Jun 2015 10:30
Prispevkov: 71
Aktiv.: 0.66

PrispevekObjavljeno: Sre Nov 30, 2016 2:56 pm    Naslov sporočila:   Odgovori s citatom

Da ne odpiram nove teme- rabil bi pomoč glede zakasnitve. Ukaz delay() ne pride upoštev, ker mi ustavi celoten program.

Recimo, da želim potem, ko je vhod 1=1 čez 10 minut aktivirati izhod 2, kako lahko to rešim?

if ((VH1==1))&&(T1>25)&&(T4<(tempTk-2)))
delay(60000);
digitalWrite (RELAY2, HIGH);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Sre Nov 30, 2016 3:52 pm    Naslov sporočila:   Odgovori s citatom

Praviš, da ti delay() zaustavi celoten program, kar pomeni, da želiš, da program še nekaj počne?
_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
overload
Član
Član



Pridružen-a: Tor 23 Jun 2015 10:30
Prispevkov: 71
Aktiv.: 0.66

PrispevekObjavljeno: Sre Nov 30, 2016 4:08 pm    Naslov sporočila:   Odgovori s citatom

točno tako. z zakasnitvijo želim vključiti rele, obenem pa želim, da se ostale stvari normalno odvijajo (tipanje temperatur, drugi releji,...)

vem da moram nekaj z millis(), pa mi ne uspeva najbolje
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MarkoM
Član
Član



Pridružen-a: Tor 12 Sep 2006 15:29
Prispevkov: 2825
Aktiv.: 13.18
Kraj: Lovrenc na P.

PrispevekObjavljeno: Sre Nov 30, 2016 5:18 pm    Naslov sporočila:   Odgovori s citatom

Ne delam z arduino...., ampak delay funkcije ne delajo absolutno nič, le krmilnik držijo v neskončni zanki, da ta ne izvaja nič drugega. Če hočeš imeti 10 min delay, brez, da krmilnik 10 min nič ne dela, moraš uporabiti kakšen časovnik. Zagotovo arduino to pozna, inicializiraš časovnik (časovnik je hardwarsko vgrajen v krmilnik in deluje neodvisno od toka programa), da npr. proži prekinitev vsakih xy ms in v prekinitvi povečuješ neko (globalno) spremenljivko. V tvoji neskončni zanki pa potem preverjaš to spremenljivko z if stavkom in ko mine 10 min, bo imela ta spremenljivka vrednost (preračunaš, glede na časovno konstanto proženja prekinitve) in takrat pač prožiš rele, nato pa jo zopet pobrišeš itd.

Edit: Še primer http://playground.arduino.cc/Code/Timer1
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Obelix
Član
Član



Pridružen-a: Pon 19 Maj 2008 13:59
Prispevkov: 1862
Aktiv.: 9.61
Kraj: Maribor

PrispevekObjavljeno: Sre Nov 30, 2016 6:07 pm    Naslov sporočila:   Odgovori s citatom

Če nisi vajen "časovnikov" (timer-jev) in prekinitev (interrupt-ov) lahko uporabiš primitvno metodo.

V program vstaviš delay(1 sekunda). S tem dobiš neke vrste "časovnik" s periodo ene sekunde. Za tem ukazom povečaš nek števec za eno enoto. Vsakokrat povprašaš, če je števec dosegel željeno vrednost (10 minut ?). Ko doseže števec teh 10 minut, opraviš kar želiš in postaviš ta števec na (recimo) 0.
Potem pa se zadeva ponovi. Z delay(1 sekunda) ne boš bistveno upočasnil tvojega programa. Vsekakor bolje od tega, da program 10 minut ne počne "nič".
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
malci
Član
Član



Pridružen-a: Sob 15 Sep 2007 21:05
Prispevkov: 792
Aktiv.: 3.92
Kraj: Polhov Gradec

PrispevekObjavljeno: Sre Nov 30, 2016 6:26 pm    Naslov sporočila:   Odgovori s citatom

Tudi Obelix-ova varianta je vredu, če časi niso kritični in si lahko privoščiš 1 sekundne delay-e, elegantneje je pa v ardoinotu uporabiti ukaz millis. ( kot si že sam namignil)

Mislim, da je na povezavi, ki je spodaj prav lepo razložen primer uporabe ukaza millis.

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

lp

Uroš

_________________
Elektronika za hobi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Sre Nov 30, 2016 7:40 pm    Naslov sporočila:   Odgovori s citatom

MakoM je napisal, kaj je potrebno. Seveda zna Arduino to, zakaj pa ne?
Tudi z millis() gre, ko je izpolnjen pogoj, preneseš v nek čas millis() in ga v vrtenju zanke preverjaš, če ni potrebno "genau" 10 minut.
In brez 1s zakasnitev.
Sicer je tole pisanje, bolj kot ne, na pamet saj se ne ve, kaj vse tvoj program počenja in kako izgleda loop()

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.05

PrispevekObjavljeno: Sre Nov 30, 2016 8:44 pm    Naslov sporočila:   Odgovori s citatom

overload je napisal/a:
Recimo, da želim potem, ko je vhod 1=1 čez 10 minut aktivirati izhod 2, kako lahko to rešim?

milistar in milinov morata biti unsigned long
Koda:

    milinov = millis(); // milinov se osveži ob vsakem prehodu zanke
    if ((VH1==1))&&(T1>25)&&(T4<(tempTk-2)))
    {
      ... // Če je pogoj izpolnjen, se milistar ne spreminja ...
    }
    else
    {
      milistar = milinov; // ... sicer pa se stalno osvežuje.
    }

   if((milinov - milistar) > 600000) // Če (je ob izpolnjenem pogoju milistar obtičal in) je razlika večja od 600s ...
   {
      digitalWrite (RELAY2, HIGH); // ... se vklopi rele ...
   }
   else
   {
     digitalWrite (RELAY2, LOW); // ... sicer se izklopi.
   }


_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
overload
Član
Član



Pridružen-a: Tor 23 Jun 2015 10:30
Prispevkov: 71
Aktiv.: 0.66

PrispevekObjavljeno: Čet Dec 01, 2016 3:30 pm    Naslov sporočila:   Odgovori s citatom

tnx igo, saj sem vedel da je čisto enostavno Laughing
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 70 dni


Powered by phpBB © 2001, 2005 phpBB Group