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
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
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 ?