Řízení serva dvěma tlačítkama a vrácením do střední polohy

Honza Jan
Příspěvky: 5
Registrován: 15 led 2023, 19:45

Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od Honza Jan » 15 led 2023, 20:19

Dobrý den, prosím o radu.
Potřebuju ovládat servo pomocí dvou tlačítek. Při zmáčknutí a držení jednoho tlačítka se natočí do leva 0 stupňů a po puštění se vrátí do střední (výchozí) polohy 90 stupňů. Při zmáčknutí a držení druhého tlačítka se natočí do prava 180 stupňů a po puštění se vrátí do střední polohy 90 stupňů.
Mě se povedlo jen ovládat servo bez vrácení po puštění tlačítka. Přikládám kod.
Předem děkuji za jakoukoliv pomoc
Přílohy
Výstřižek.PNG

Uživatelský avatar
kiRRow
Příspěvky: 1242
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od kiRRow » 15 led 2023, 21:11

Já bych nejprve otestoval jestli jsou obě tlačítka uvolněná, pokud ano vracím motor na střed, pokud ne pátrám které tlačítko bylo stisknuto a dle toho natáčím servo.

Kód: Vybrat vše

if(digitalRead(VLEVO) == 1 && digitalRead(VPRAVO) == 1){
//nic neni stisknute, nastav ze se ma motor natocit na 90
} else {
//něco je stisknuté
	if(digitalRead(VLEVO) == 0){
	//stisknuto bylo vlevo, nastav 0
	}
	if(digitalRead(VPRAVO) == 0){
	//stisknuto bylo vpravo, nastav 180
	}
}
//zapiš do serva to co jsi nastavil
jak stiskneš obě tak se to zblázní :)

Honza Jan
Příspěvky: 5
Registrován: 15 led 2023, 19:45

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od Honza Jan » 15 led 2023, 21:58

Děkuji za radu. Kod jsem upravil. Servo se ale chová divně. Po stisknutí se servo otáčí a pak po puštění se má servo tendenci vracet ale nevrátí se úplně a škube sebou. Při stisknutí druhého tlačítka začne jet na druhou stranu a po puštění dělá to stejné. Nevíte čím by to mohlo být? Děkuji
Přikládám ještě kod
Výstřižek.PNG

Uživatelský avatar
gilhad
Příspěvky: 825
Registrován: 07 bře 2018, 11:22

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od gilhad » 16 led 2023, 01:25

1) nepřikládej obrázky kódu, ale skutečně kód, zabalený do tagu code (to je to </> tlačítko nahoře) - pak se to dá kopírovat, editovat a vůbec s tím nějak pracovat

2) podívej se, jak tam máš práci s tím servem a proměnnou uhel, je to nějaké pomotané

2.1) stisknu tlačítko a držím - servo se natáčí a po chvilce je uhel buď menší než 0 a furt klesá, nebo je větší než 180 a furt roste - musíš hlídat, aby ti to nevylezlo z rozsahu
2.2) pustím obě tlačítka - hodnota uhel zůstane poslední nastavená a furt kmitám mezi uhel a 90 - když je puštěno, nastav uhel na 90 a nech hlavní smyčku, ať to tam drží (nebo když je puštěno, tak pomalu lez s proměnnou uhel k 90 - a zase to nech na hlavní smyčce)

ukázka tagu code

Kód: Vybrat vše

int uhel = 90;

void loop()
{
  if (neco && cosi ) {
     delej(neco);
   } else {
     delej(opak);
   };
nedelej(nic);
}

Uživatelský avatar
kiRRow
Příspěvky: 1242
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od kiRRow » 16 led 2023, 10:43

Škube sebou, protože jsi uložil při stisku tlačítka hodnotu dejme tomu 180 do proměnné uhel a pak jsi napsal, že když nemáš stisknuto nic, motor se natvrdo má natočit na 90 a hned potom se má zase natočit na hotnotu uhel, počkat 15ms a pořád dokola....
Místo zápisu přímo do serva, přepiš tu hodnotu uhel na 90 ... nic víc. Zapíše se to do serva až na konci loopu.

Uživatelský avatar
kiRRow
Příspěvky: 1242
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od kiRRow » 16 led 2023, 10:54

V podstatě ten program je rozdělený na 3 části. V první části "přečteš" tlačítka, v druhé části vypočteš jaký chceš mít stav motoru, ve třetí části tento stav zapíšeš do servomotoru, a pořád dokola.

Honza Jan
Příspěvky: 5
Registrován: 15 led 2023, 19:45

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od Honza Jan » 17 led 2023, 21:37

Děkuju, po problémech se slabým zdrojem jsem vyzkoušel snad všechny možnosti. Ale nic nefunguje. Problém bude mezi stolem a židlí. Nějak nechápu jak to mám přepsat aby se to vracelo.
Ještě přikládám kód, tentokrát už snad správně.

Kód: Vybrat vše

#include <Servo.h>

#define SERVO   12
#define VLEVO   10
#define VPRAVO  9

#define MIN 0
#define MAX 180


Servo mojeServo;

void setup() 
{
  pinMode(VLEVO, INPUT_PULLUP);
  pinMode(VPRAVO, INPUT_PULLUP);
  mojeServo.attach(SERVO);
}

int uhel = 90;

void loop()
{
 
    if(digitalRead(VLEVO) == 1 && digitalRead(VPRAVO) == 1){
       
      }                                   //nic neni stisknute, nastav ze se ma motor natocit na 90
                                    
 else {
//něco je stisknuté
  if(digitalRead(VLEVO) == 0){            //stisknuto bylo vlevo, nastav 0
     if (uhel > MIN) uhel--;
  }
  if(digitalRead(VPRAVO) == 0){           //stisknuto bylo vpravo, nastav 180
     if (uhel < MAX) uhel++;  
  }
}

   
  mojeServo.write(90);                  //zapiš do serva to co jsi nastavil
  delay(10);   
}

Uživatelský avatar
gilhad
Příspěvky: 825
Registrován: 07 bře 2018, 11:22

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od gilhad » 17 led 2023, 22:34

Kód: Vybrat vše

    if(digitalRead(VLEVO) == 1 && digitalRead(VPRAVO) == 1){
       
      }                                   //nic neni stisknute, nastav ze se ma motor natocit na 90
Komentář OK, ale skutek utek - navrhuji

Kód: Vybrat vše

    if(digitalRead(VLEVO) == 1 && digitalRead(VPRAVO) == 1){
        uhel = 90 ;   // teda jako konstantou/define , například STRED by to bylo asi ještě lepší (a to samé počáteční hodnota uhel)
       
      }                                   //nic neni stisknute, nastav ze se ma motor natocit na 90
A když už ten uhel tak pracně spočítáme, tak ho třeba taky použít ... tedy místo

Kód: Vybrat vše

  mojeServo.write(90);                  //zapiš do serva to co jsi nastavil
dát

Kód: Vybrat vše

  mojeServo.write(uhel);                  //zapiš do serva to co jsi nastavil

Komentáře jsou důležité pro pochopení kódu, zvláště pokud se k němu autor vrací po delším čase, ale kompilátor je nečte a rovnou zahazuje, takže kód by také měl obsahovat zamýšlené akce :D

A ještě hezčí by možná bylo

Kód: Vybrat vše

    if(digitalRead(VLEVO) == 1 && digitalRead(VPRAVO) == 1){
        if (uhel > STRED) { uhel --; }; // pomalu dolu
        if (uhel < STRED) { uhel ++; }; // pomalu nahoru
        // jinak jsme na stredu a netreba nic menit
      }                                   //nic neni stisknute, dodriftuj na STRED (90)

Honza Jan
Příspěvky: 5
Registrován: 15 led 2023, 19:45

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od Honza Jan » 18 led 2023, 19:45

Moc děkuju. Všechno funguje jak má. Přikládám kód kdyby to ještě někdo někdy potřeboval.

Kód: Vybrat vše

#include <Servo.h>

#define SERVO   12
#define VLEVO   10
#define VPRAVO  9

#define MIN 0
#define MAX 180
#define STRED 90

Servo mojeServo;

void setup() 
{
  pinMode(VLEVO, INPUT_PULLUP);
  pinMode(VPRAVO, INPUT_PULLUP);
  mojeServo.attach(SERVO);
}

int uhel = 90;

void loop()
{
 
    if(digitalRead(VLEVO) == 1 && digitalRead(VPRAVO) == 1){
     if (uhel > STRED) { uhel --; };      // pomalu dolu
        if (uhel < STRED) { uhel ++; };   // pomalu nahoru
                                          // jinak jsme na stredu a netreba nic menit
                                          
      }                                   //nic neni stisknute, nastav ze se ma motor natocit na 90
                                    
 else {
//něco je stisknuté
  if(digitalRead(VLEVO) == 0){            //stisknuto bylo vlevo, nastav 0
     if (uhel > MIN) uhel--;
  }
  if(digitalRead(VPRAVO) == 0){           //stisknuto bylo vpravo, nastav 180
     if (uhel < MAX) uhel++;  
  }
}

   
  mojeServo.write(uhel);                  //zapiš do serva to co jsi nastavil
  delay(10);   
}

Uživatelský avatar
kiRRow
Příspěvky: 1242
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy

Příspěvek od kiRRow » 19 led 2023, 00:01

Jsem rád a gratuluji. A kdy přibude třetí tlačítko ? ;) A co bude dělat ? ;) ;)

Odpovědět

Kdo je online

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