Hogyan lehet arduino-n egyszerre lejátszani programot?
Egy pl.:"if(pos>pos1){
t();
o();
}
void t()
{ servo.write(90);
}
void o(){
servo2.write(45);
}
hogyan lehet a "t és o" hogy egyszerre mozogjanak, álljanak a pozíciójukba?
Nem multitask, tehát programozással. Nem ismerem. Nem ismerem a pontos szintaxist, de a lényeg valami ilyesmi (feltéve ha a servo2.write paramétere az h mennyinél álljon meg és em az h mennyivel forduljon. Ha az h mennyivel forduljon akkor csak 2,1):
for (i=0;i<45;i++)
{
servo.write(i*2);
servo.write(i);
}
A lényeg az, hogy nem egyszerre forgatod el őket, hanem egy ciklusba behajítod és felváltva forgatsz rajtuk kicsiket, így egyszerre fognak mozogni.
És ha igy néz ki:
servo1.write(90);
servo.write(45);
if(pos=pos){
t()
}
void t(){
for(pos = 45; pos < 135; pos += 1)
{
servo.write(pos);
servo1.write(pos*1,5) // de nem akarom hogy a servo1 visszamenjen 90-ről 45-re és onnan csinálja
}
Én úgy csinálnám meg, hogy írnék egy loopból hívható függvényt, ami adott növekménnyel mozgatná a két szervót, addig, de csak akkorha még érte el a kívánt végpozíciót.
Az aktuális és a célpozíció, valamint a növekmény is globális változó lenne. Minden loop lefutás során csak minimális elmozdulás lenne, de a szervók arányosan, látszólag egyszerre futnának.
Egy lehetséges megoldás (nem teszteltem):
#include <Servo.h>
Servo servo1, servo2;
double start1, end1, increment1, pos1;
double start2, end2, increment2, pos2;
void servo_init() {
.... start1 = 45;
.... end1 = 90;
.... start2 = 90;
.... end2 = 0;
.... increment1 = 0.5;
.... increment2 = -1;
.... servo1.attach(9)
.... servo2.attach(10)
.... servo1.write(start1);
.... servo2.write(start2);
.... pos1 = start1;
.... pos2 = start2;
}
void servo_update {
.... if (increment1 > 0 && pos1 < end1) {pos1 = pos1 + increment1};
.... if (increment1 < 0 && pos1 > end1) {pos1 = pos1 + increment1};
.... if (increment2 > 0 && pos2 < end2) {pos2 = pos2 + increment2};
.... if (increment2 < 0 && pos2 > end2) {pos2 = pos2 + increment2};
}
void setup() {
.... servo_init(
}
void loop() {
.... servo_update();
}
A .... a behúzást jelzi.
Bocs, a servo_update() végéről kimaradt ez a két sor:
.... servo1.write(int(pos1));
.... servo2.write(int(pos2));
Köszi szépen. Egy-két helyesírási probléma révén tökéletes volt. :) Nagyon köszi!
#include <Servo.h>
Servo servo1, servo2;
double start1, end1, increment1, pos1;
double start2, end2, increment2, pos2;
void servo_init() {
start1 = 45;
end1 = 90;
start2 = 90;
end2 = 0;
increment1 = 0.5;
increment2 = -1;
servo1.attach(9);
servo2.attach(10);
servo1.write(start1);
servo2.write(start2);
pos1 = start1;
pos2 = start2;
}
void servo_update () {
if (increment1 > 0 && pos1 < end1)
{
pos1 = pos1 + increment1;
}
if (increment1 < 0 && pos1 > end1)
{
pos1 = pos1 + increment1;
}
if (increment2 > 0 && pos2 < end2)
{
pos2 = pos2 + increment2;
}
if (increment2 < 0 && pos2 > end2)
{
pos2 = pos2 + increment2;
}
servo1.write(int(pos1));
servo2.write(int(pos2));
}
void setup() {
servo_init();
}
void loop() {
servo_update();
}
Ennek különösen örülök, mert még sose programoztam Arduinot :)
De PLC programot régebben írtam már, és annak is hasonló az elve.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!