Stránka 1 z 2

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

Napsal: 15 led 2023, 20:19
od Honza Jan
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

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

Napsal: 15 led 2023, 21:11
od kiRRow
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í :)

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

Napsal: 15 led 2023, 21:58
od Honza Jan
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

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

Napsal: 16 led 2023, 01:25
od gilhad
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);
}

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

Napsal: 16 led 2023, 10:43
od kiRRow
Š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.

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

Napsal: 16 led 2023, 10:54
od kiRRow
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.

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

Napsal: 17 led 2023, 21:37
od Honza Jan
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);   
}

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

Napsal: 17 led 2023, 22:34
od gilhad

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)

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

Napsal: 18 led 2023, 19:45
od Honza Jan
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);   
}

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

Napsal: 19 led 2023, 00:01
od kiRRow
Jsem rád a gratuluji. A kdy přibude třetí tlačítko ? ;) A co bude dělat ? ;) ;)