Stránka 1 z 1

Prosba o pomoc - Inverzní otáčení servo motorů pomocí dvou tlačítek

Napsal: 03 úno 2022, 10:44
od Martin82
Zdravím, najde se zde někdo, kdo by bych ochotný pomoci s ovládáním dvou servo motorů pomocí Arduina?
Cíle jsou dva. Ovládání pomocí dvou tlačítek a vzdáleně přes remote. (U obou variant se musí otáčet serva inverzně)
Bohužel jsem na internetu nenašel nic podobného, co by mi poradilo (nejspíš je to tím, že jsem úplný laik :). Uvítám každou pomoc.

Poradíte, prosím, jak na to?

Re: Prosba o pomoc - Inverzní otáčení servo motorů pomocí dvou tlačítek

Napsal: 03 úno 2022, 14:41
od kiRRow
Asi uplně dobře nerozumím tomu "inverzně". To jako zmáčknu tl. doleva a ony se oba budou točit doprava, nebo se jeden vždy musí točit v opačném směru ? Že v podstatě ovládám jeden krokový motor a ten druhý dělá naprostý opak ? To by pak stačilo znát maximální pozici serva a od ní odečíst pozici prvního serva a zapsat ji do druhého. Maximální pozice je např 180 ... servo1 je na pozici 20, takže servo2 je na pozici 180-20=160

Re: Prosba o pomoc - Inverzní otáčení servo motorů pomocí dvou tlačítek

Napsal: 03 úno 2022, 15:39
od Martin82
Špatně jsem to napsal, ale pochopil jste to správně - při stisknutí tlačítka se vždy jeden musí točit v opačném směru. Servo motory jsou to tyto https://www.bighobby.cz/jx-servo-pdi-11 ... gIesPD_BwE

Re: Prosba o pomoc - Inverzní otáčení servo motorů pomocí dvou tlačítek

Napsal: 03 úno 2022, 18:11
od kiRRow
No, tak to potom, když si třeba vemeš tenhle example : https://docs.arduino.cc/learn/electronics/servo-motors tak je tam kód co čte potenciometr a podle něj točí servem.

Kód: Vybrat vše

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}
Když v tom example vytvoříš ještě jedno Servo myservo2, v setupu ho attachneš na jinačí pin (ale musí být PWM) a za myservo.write(val) hodíš řádek myservo2.write(180-val), tak by to mělo dělat přibližně to co myslíš, akorát to bude číst potenciometr místo dvou tlačítek. Ale to se pořeší příště ...

PS: Moje zkušenosti ze stavby robota ottíka - serva nenapájet z arduino desky, při rychlejším pohybu více serv najednou dochází k restartu, nebo zaseknutí procesoru

Re: Prosba o pomoc - Inverzní otáčení servo motorů pomocí dvou tlačítek

Napsal: 05 úno 2022, 19:02
od Martin82
Super, diky, funguje, potenciometr mi se servy toci presne jak potrebuju... Poradis jak tam ted dostat ty tlacitka, aby se to pri jejich stisknuti otacelo po triceti stupnich doleva a doprava?

Re: Prosba o pomoc - Inverzní otáčení servo motorů pomocí dvou tlačítek

Napsal: 05 úno 2022, 19:12
od kiRRow
Jen při stisknutí ? ... tzn, stisknu, držím a ono se to pootočí o 30° a i kdybych to půl roku držel tak nic dalšího ? Co se má stát, když se budeš chtít dostat tlačítky mimo rozsah hodnot motoru ?

Re: Prosba o pomoc - Inverzní otáčení servo motorů pomocí dvou tlačítek

Napsal: 05 úno 2022, 19:26
od kiRRow
int val; // variable to read the value from the analog pin je třeba nahradit int val = 0; ( 0 je původní hodnota a musíš si ji změnit dle potřeby )

v setupu si musíš určit dva piny, co nastavíš jako INPUT_PULLUP, a oproti zemi je připojíš zkrz tlačítko ...

Kód: Vybrat vše

  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
tento kod musí jít pryč a být nahrazen kodem

Kód: Vybrat vše

if(tady si musis precist tlacitko1==LOW){
val = val + 30;
}
if(tady si musis precist tlacitko2==LOW){
val = val - 30;
}
nejsou ošetřeny zákmity tlačítek, využívá se delay na konci loopu

a neni osetren stisk ... to by pak bylo

Kód: Vybrat vše

if(tady si musis precist tlacitko1==LOW){
	if(zmenil se stav tlacitka1?){
		val = val + 30;
	}		
}
if(tady si musis precist tlacitko2==LOW){
	if(zmenil se stav tlacitka2){
		val = val - 30;
	}	
}