|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jjedat Član
Pridružen-a: Ned 17 Avg 2014 13:57 Prispevkov: 104 Aktiv.: 0.88 Kraj: Vojnik
|
Objavljeno: Čet Nov 24, 2016 8:42 pm Naslov sporočila: Arduino program - pomoč |
|
|
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 |
|
|
jjedat Član
Pridružen-a: Ned 17 Avg 2014 13:57 Prispevkov: 104 Aktiv.: 0.88 Kraj: Vojnik
|
Objavljeno: Čet Nov 24, 2016 9:56 pm Naslov sporočila: |
|
|
Mi je že uspelo. Vseeno hvala.
|
|
Nazaj na vrh |
|
|
Branez Moderator
Pridružen-a: Pon 14 Apr 2003 7:21 Prispevkov: 7771 Aktiv.: 34.86 Kraj: Koprivnica HR
|
Objavljeno: Pet Nov 25, 2016 7:54 am Naslov sporočila: |
|
|
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 |
|
|
jjedat Član
Pridružen-a: Ned 17 Avg 2014 13:57 Prispevkov: 104 Aktiv.: 0.88 Kraj: Vojnik
|
Objavljeno: Pet Nov 25, 2016 10:20 pm Naslov sporočila: |
|
|
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);
}
}
Opis: |
|
Velikost datoteke: |
1.92 MB |
Pogledana: |
16 krat |
|
|
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.04
|
Objavljeno: Pet Nov 25, 2016 11:21 pm Naslov sporočila: |
|
|
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 |
|
|
overload Član
Pridružen-a: Tor 23 Jun 2015 10:30 Prispevkov: 71 Aktiv.: 0.66
|
Objavljeno: Sre Nov 30, 2016 2:56 pm Naslov sporočila: |
|
|
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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.89 Kraj: Grosuplje
|
Objavljeno: Sre Nov 30, 2016 3:52 pm Naslov sporočila: |
|
|
Praviš, da ti delay() zaustavi celoten program, kar pomeni, da želiš, da program še nekaj počne?
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
overload Član
Pridružen-a: Tor 23 Jun 2015 10:30 Prispevkov: 71 Aktiv.: 0.66
|
Objavljeno: Sre Nov 30, 2016 4:08 pm Naslov sporočila: |
|
|
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 |
|
|
MarkoM Član
Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 13.17 Kraj: Lovrenc na P.
|
Objavljeno: Sre Nov 30, 2016 5:18 pm Naslov sporočila: |
|
|
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 |
|
|
Obelix Član
Pridružen-a: Pon 19 Maj 2008 13:59 Prispevkov: 1862 Aktiv.: 9.60 Kraj: Maribor
|
Objavljeno: Sre Nov 30, 2016 6:07 pm Naslov sporočila: |
|
|
Č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 |
|
|
malci Član
Pridružen-a: Sob 15 Sep 2007 21:05 Prispevkov: 793 Aktiv.: 3.92 Kraj: Polhov Gradec
|
Objavljeno: Sre Nov 30, 2016 6:26 pm Naslov sporočila: |
|
|
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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.89 Kraj: Grosuplje
|
Objavljeno: Sre Nov 30, 2016 7:40 pm Naslov sporočila: |
|
|
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 |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.04
|
Objavljeno: Sre Nov 30, 2016 8:44 pm Naslov sporočila: |
|
|
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 |
|
|
overload Član
Pridružen-a: Tor 23 Jun 2015 10:30 Prispevkov: 71 Aktiv.: 0.66
|
Objavljeno: Čet Dec 01, 2016 3:30 pm Naslov sporočila: |
|
|
tnx igo, saj sem vedel da je čisto enostavno
|
|
Nazaj na vrh |
|
|
|
|
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: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|