Zdravim,
rád bych se na Vás obrátil s pomocí jednoduchého prográmku, s arduinem umím fakt hodně málo/prd . Dělám na školním projektu takový bot ze servomotorů, které se aktivují PIR čidlem. Nejsem ale schopen ty servomotory volat v náhodném pořadí, za sebou.
O co mi jde, potřeboval bych při detekování pohybu toho čidla spustit čtyři servomotory pokaždé v jiném pořadí, za sebou. Tedka mi to moc nešlape
Díky moc za jakoukoli radu.
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
int motion = 0;
int p1 = 100; //promenna pro rychlost pohybu serva
int p2 = 250;
int a = 60; //proměnné, (uhly, mezi kterými by se to servo mělo tocit)
int b = 100;
void setup () {
pinMode(3, OUTPUT); // výstupy pro serva
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(12, INPUT); //vstup pro PIR senzor
//////////////////////////
servo1.attach (3); //přiřazení výstupu k servomotoru
servo2.attach (5);
servo3.attach (6);
servo4.attach (9);
//////////////////////////
Serial.begin(9800);
}
void loop(){
motion = digitalRead(12); // vstup pro PIR čidlo
if (motion == HIGH) { // pokud je detekován pohyb před čidlem, spouští se tato operace:
servo1.write (a); // servo1. se pohne do uhlu (a)
delay (random (p1,p2)); // pak počká v náhodném rozmezí těchto dvou hodnot
servo1.write (b); // servo1. se pohne do uhlu (b)
delay (random (p1,p2)); // opět počká v náhodném rozmezí těchto dvou hodnot (mikrosekundy)
} else {
servo1.write (80); // servo1. se vrací do pozice (uhlu) 80
}
motion = digitalRead(12); // to samé platí pro servo2. až je ukončeno servo1.
if (motion == HIGH) {
servo2.write (a);
delay (random (p1,p2));
servo2.write (b);
delay (random (p1,p2));
} else {
servo2.write (80);
}
motion = digitalRead(12); // to samé platí pro servo3. až je ukončeno servo2.
if (motion == HIGH) {
servo3.write (a);
delay (random (p1,p2));
servo3.write (b);
delay (random (p1,p2));
} else {
servo3.write (80);
}
motion = digitalRead(12); // to samé platí pro servo4. až je ukončeno servo3.
if (motion == HIGH) {
servo4.write (a);
delay (random (p1,p2));
servo4.write (b);
delay (random (p1,p2));
} else {
servo4.write (80);
}
}
Pohyb servomotorů v náhodném pořadí
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Re: Pohyb servomotorů v náhodném pořadí
8 různých pohybů pomocí random
Kód: Vybrat vše
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
int motion = 0;
int p1 = 100; //promenna pro rychlost pohybu serva
int p2 = 250;
int a = 60; //proměnné, (uhly, mezi kterými by se to servo mělo tocit)
int b = 100;
void setup () {
pinMode(3, OUTPUT); // výstupy pro serva
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(12, INPUT); //vstup pro PIR senzor
//////////////////////////
servo1.attach (3); //přiřazení výstupu k servomotoru
servo2.attach (5);
servo3.attach (6);
servo4.attach (9);
//////////////////////////
Serial.begin(9800);
}
void loop(){
motion = digitalRead(12); // vstup pro PIR čidlo
if (motion == HIGH) {
byte P = random (1,8);
switch (P) {
case '1':
SERVO1();SERVO2();SERVO3();SERVO4();
break;
case '2':
SERVO2();SERVO3();SERVO4();SERVO1();
break;
case '3':
SERVO3();SERVO4();SERVO1();SERVO2();
break;
case '4':
SERVO4();SERVO1();SERVO2();SERVO3();
break;
case '5':
SERVO1();SERVO3();SERVO4();SERVO2();
break;
case '6':
SERVO1();SERVO4();SERVO2();SERVO3();
break;
case '7':
SERVO1();SERVO3();SERVO2();SERVO4();
break;
case '8':
SERVO1();SERVO2();SERVO4();SERVO3();
break;
default:
break;
}
}
}
void SERVO1(){
motion = digitalRead(12); // vstup pro PIR čidlo
if (motion == HIGH) { // pokud je detekován pohyb před čidlem, spouští se tato operace:
servo1.write (a); // servo1. se pohne do uhlu (a)
delay (random (p1,p2)); // pak počká v náhodném rozmezí těchto dvou hodnot
servo1.write (b); // servo1. se pohne do uhlu (b)
delay (random (p1,p2)); // opět počká v náhodném rozmezí těchto dvou hodnot (mikrosekundy)
} else {
servo1.write (80); // servo1. se vrací do pozice (uhlu) 80
}
}
void SERVO2(){
motion = digitalRead(12); // to samé platí pro servo2. až je ukončeno servo1.
if (motion == HIGH) {
servo2.write (a);
delay (random (p1,p2));
servo2.write (b);
delay (random (p1,p2));
} else {
servo2.write (80);
}
}
void SERVO3(){
motion = digitalRead(12); // to samé platí pro servo3. až je ukončeno servo2.
if (motion == HIGH) {
servo3.write (a);
delay (random (p1,p2));
servo3.write (b);
delay (random (p1,p2));
} else {
servo3.write (80);
}
}
void SERVO4(){
motion = digitalRead(12); // to samé platí pro servo4. až je ukončeno servo3.
if (motion == HIGH) {
servo4.write (a);
delay (random (p1,p2));
servo4.write (b);
delay (random (p1,p2));
} else {
servo4.write (80);
}
}
Re: Pohyb servomotorů v náhodném pořadí
Díky moc za vytvořený sampl, ale nefunguje mi, když pohybuju před čidlem rukou, serva se nehýbou, pokouším se v tom ještě trochu hrabat ale nevim kde je v těch příkazech chyba.
Re: Pohyb servomotorů v náhodném pořadí
Nakonec se mi to povedlo opravit. Chyba byla v tom switch {case"1"} to číslo za case se píše bez uvozovek. Už to funguje! skvělý díky moc
Re: Pohyb servomotorů v náhodném pořadí
To se omlouvám, nechtělo se mi to opisovat a tak jsem to okopíroval z programu, který jsem používal při seriové komunikaci. Tam ty uvozovky mají smysl.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 17 hostů