Pohyb servomotorů v náhodném pořadí

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
kouba
Příspěvky: 3
Registrován: 13 led 2019, 01:09
Reputation: 0

Pohyb servomotorů v náhodném pořadí

Příspěvek od kouba » 13 led 2019, 01:37

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 :lol: . 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);
}

}

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Pohyb servomotorů v náhodném pořadí

Příspěvek od RomanB » 13 led 2019, 10:57

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);
}
}

kouba
Příspěvky: 3
Registrován: 13 led 2019, 01:09
Reputation: 0

Re: Pohyb servomotorů v náhodném pořadí

Příspěvek od kouba » 13 led 2019, 23:26

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.

kouba
Příspěvky: 3
Registrován: 13 led 2019, 01:09
Reputation: 0

Re: Pohyb servomotorů v náhodném pořadí

Příspěvek od kouba » 14 led 2019, 02:57

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 ;)

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Pohyb servomotorů v náhodném pořadí

Příspěvek od RomanB » 14 led 2019, 19:52

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.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů