Servo se zpětnou vazbou 270°
Moderátor: Moderátoři
-
pdp7
- Příspěvky: 314
- Registrován: 15 zář 2014, 00:00
Servo se zpětnou vazbou 270°
Snažil jsem se to tam dobastlit připojením čtvrtého drátu na běžec poťáku a čekal ve správnou funkci. Minimálně se podle aktuální polohy výstupní hřídele ono napětí mění od 0.3 - 3V. Na 500us puls je ta nejnižší hodnota napětí.
Pokud na to pustím jednoduchý program v IDE umožňující mi zadat polohu přes serial monitor vrací mi to na analogRead nesmyslný hodnoty. Očekával bych tam na nejmenší úhel nejmenší napětí a postupně až ke druhému konci dojezdu serva největší (a nebo opačně) ale není to tak! Vracejí se fakt kraviny.
-
misocko
- Příspěvky: 1531
- Registrován: 26 čer 2009, 00:00
- Bydliště: Hlohovec (Sk)
-
Valdano
- Příspěvky: 3238
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
-
pdp7
- Příspěvky: 314
- Registrován: 15 zář 2014, 00:00
K tomu zapojení, jsou tam 4 dráty. napájení 5V, GND, PWM na D9, feedback na A0. Arduino je zapojené do PC přes USB, všechno.
Napětí do A0 jsem teď měřil na 1.5ms je cca 1.5V na 2.5ms 3V na 0.5ms je těch 0.3V.
Serial.print ukazuje něco jinýho. Viz. screen
Valdano: Arduino Nano a nevím co tam má být napsáno jestli 3.3 či 5V
-
Valdano
- Příspěvky: 3238
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
To záleží na tom na jaké provozní napětí máte to Arduino Nano. Dělají se totiž s provozním napětím na 5V a také na 3,3V a každé má jinou referenci.pdp7 píše:Valdano: Arduino Nano a nevím co tam má být napsáno jestli 3.3 či 5V
Pokud máte verzi pro 5V tak je správně
Kód: Vybrat vše
napeti = val * (5.0 / 1023.0);Kód: Vybrat vše
napeti = val * (3.3 / 1023.0);-
Valdano
- Příspěvky: 3238
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
Kód: Vybrat vše
#include <Servo.h>
Servo myServo;
int pos,val;
float napeti;
double dat;
unsigned long cas;
void setup()
{
Serial.begin(9600);
myServo.attach(9);
myServo.write(0);
cas = millis();
}
void loop()
{
Serial.println("Enter position: ");
if (Serial.available() > 0) {
pos = Serial.readString().toInt();
if (pos >= 0 && pos <= 180){
myServo.write(pos);
Serial.print("Turned to: ");
Serial.println(pos);
} else {
Serial.println("Invalid postition!");
}
}
if ((millis() - cas) > 10000 {
val = analogRead(A0);
napeti = val * (5.0 / 1023.0);
Serial.print("Feedback: ");
Serial.print(napeti);
Serial.println("V");
dat = (double)val * 0.47 - 33.4;
Serial.print("Uhel: ");
Serial.print(dat);
Serial.println("°");
}
}-
pdp7
- Příspěvky: 314
- Registrován: 15 zář 2014, 00:00
-
bum
- Příspěvky: 292
- Registrován: 04 zář 2011, 00:00
-
Valdano
- Příspěvky: 3238
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
Zkuste to takto.
Kód: Vybrat vše
#include <Servo.h>
Servo myServo;
int pos,val;
float napeti;
double dat;
unsigned long cas;
void setup()
{
Serial.begin(9600);
myServo.attach(9);
myServo.write(0);
Serial.println("Enter position: ");
cas = millis();
}
void loop()
{
if (Serial.available() > 0) {
pos = Serial.readString().toInt();
if (pos >= 0 && pos <= 180) {
myServo.write(pos);
Serial.print("Turned to: ");
Serial.println(pos);
} else {
Serial.println("Invalid postition!");
}
}
if ((millis() - cas) > 1000) {
val = analogRead(A0);
napeti = val * (5.0 / 1023.0);
Serial.print("Feedback: ");
Serial.print(napeti);
Serial.println("V");
dat = (double)val * 0.47 - 33.4;
Serial.print("Uhel: ");
Serial.print(dat);
Serial.println("°");
cas = millis();
}
}-
Celeron
- Příspěvky: 20701
- Registrován: 02 dub 2011, 00:00
- Bydliště: Nový Bydžov
Myslím, že odběr motoru serva dělá pulzní úbytky na napájení serva a proto ti to analogový napětí z potenciomeru kolísá.
Proč mi nemůže všechno chodit hned ?!!
-
Valdano
- Příspěvky: 3238
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
Když to udělá tak jak jsem upravil ten příklad naposledy výše tak by měl výslednou pozici vidět po chvíli správně až se servo na tu pozici nastaví tak by hodnota vrácená AnalogRead() měla odpovídat správné žádané poloze.
-
pdp7
- Příspěvky: 314
- Registrován: 15 zář 2014, 00:00
Nikdy jsem v Arduinu (wiring) nedělal, tak se omlouvám, za lamí dotazy.
Kde mám vypisovat tu val proměnnou?
-
Valdano
- Příspěvky: 3238
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
Udělejte to přesně takto viz níže.
Kód: Vybrat vše
#include <Servo.h>
Servo myServo;
int pos,val;
float napeti;
double dat;
unsigned long cas;
void setup()
{
Serial.begin(9600);
myServo.attach(9);
myServo.write(0);
Serial.println("Enter position: ");
cas = millis();
}
void loop()
{
if (Serial.available() > 0) {
pos = Serial.readString().toInt();
if (pos >= 0 && pos <= 180) {
myServo.write(pos);
Serial.print("Turned to: ");
Serial.println(pos);
} else {
Serial.println("Invalid postition!");
}
}
if ((millis() - cas) > 1000) {
val = analogRead(A0);
napeti = val * (5.0 / 1023.0);
Serial.print("Feedback: ");
Serial.print(napeti);
Serial.println("V");
dat = (double)val * 0.47 - 33.4;
Serial.print("Uhel: ");
Serial.print(dat);
Serial.println("°");
cas = millis();
}
}-
pdp7
- Příspěvky: 314
- Registrován: 15 zář 2014, 00:00
https://github.com/jlecomte/ascom-telescope-cover-v2
kde je to vpodstatě se vším všudy. Ale ono to nefunguje ani podle toho (s tímhle mým 🤐 servem).[/url]
-
pdp7
- Příspěvky: 314
- Registrován: 15 zář 2014, 00:00
V PC seeeduino připojím, program pro ovládání observatoře ho vidí, ale servo si po kliknutí na otevřít jen tak tiše poťukává a jinak nic.
Na pinu PWM na osciloskopu vidím pulsy od 500-2500us, mosfet spíná studený konec napájení serva, ale funguje to divně, tak že gate budí jen při kliknutí na zavřít dekl. Podle mě to neví kde servo je a ve feedbacku je něco jinýho než u origo serva.