Řízení serva dvěma tlačítkama a vrácením do střední polohy
Řízení serva dvěma tlačítkama a vrácením do střední polohy
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
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
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.
jak stiskneš obě tak se to zblázní
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
Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy
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
Přikládám ještě kod
Re: Řízení serva dvěma tlačítkama a vrácením do střední polohy
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
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
Š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.
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
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
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ě.
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
Kód: Vybrat vše
if(digitalRead(VLEVO) == 1 && digitalRead(VPRAVO) == 1){
} //nic neni stisknute, nastav ze se ma motor natocit na 90
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
Kód: Vybrat vše
mojeServo.write(90); //zapiš do serva to co jsi nastavil
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
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
Jsem rád a gratuluji. A kdy přibude třetí tlačítko ? A co bude dělat ?
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti