Stránka 1 z 2

Pocukávání servomotoru

Napsal: 29 lis 2019, 20:55
od doga
Ahoj,
ovládám arduinem servomotorek a ten nahodile pocukává, polohu nemění, jen to v něm cukne.
Aplikace pojede na akumulátor a proto se snažím minimalizovat spotřebu.
Je toto chování u servomotoru normální?
Dík

Napsal: 29 lis 2019, 21:37
od misocko
na zaklade coho ovladas? nemeni sa vstupna hodnota? hlavne ked ides cez analog tak to bude ono. pomoze kondenzator na analog pin alebo osciloskop

Napsal: 29 lis 2019, 21:47
od pajosek2
Servo neni typ motoru,ale typ pohonu. Může to byt klidne uhlikovy motor a stejně tak krokový motor. Takže o jaký motor se jedná

Napsal: 29 lis 2019, 23:36
od doga
Jedná se o analogový servomechanismus - modelářský. Ovládám to pomocí knihovny Servo, která by to měla ovládat délkou pulzu.

Napsal: 29 lis 2019, 23:45
od Artaban001
Ahoj Dogo. Dáváš příliš málo informací. Servopohon bývá většinou zařízení, kde je nějaký motorek, který pohání nějaký akční člen, pak je tam něco, co snímá polohu akčního členu a posílá to zpět regulačnímu členu. Může se stát, že "zpětná vazba" v podobě snímání polohy akčního členu je příliš silná a proto se Ti to může rozkmitat. Taktéž to mohou způsobovat vůle v převodech, pokud není akční člen poháněn přímo. Pak ještě může nastat nežádoucí stav, kdy je zpětná vazba moc rychlá, nebo pomalá...

Napsal: 30 lis 2019, 00:31
od Celeron
Modelářský servo má přeci zpětnou vazbu přímo v sobě, poloha výstupní páky je přesně daná dýlkou řídícího pulzu v rozsahu cca 0,9-2 ms s opakováním každých cca 20 ms u analogových serv.
Zkus napsat jednoduchej prográmek, kterej by posílal na servo cca 1,2 ms počkat 30 sekund, pak 1,3 ms, zase pauzu a tak přidávat stále dokola do cca 1,9 ms aby do toho nemohlo nic jinýho z programu kecat. Jestli to servo bude v některý poloze cukat, tak bude zasviněnej zpětnovazební potenciometr v servu. U většiny jde vyčistit a promazat třeba Kontoxem.

Napsal: 30 lis 2019, 00:49
od doga
Dík za vaši snahu,
už jsem vyzkoušel ukázkový program a funguje to jak má. V mém programu používám Tasker a tak jsem původní cyklus pro pozvolné otáčení předělal na přičítací podmínku, kterou volám Taskerem. Původní cyklus by mi blokoval tlačítka a display ale to už je do jiné části fóra. Ještě jednou dík

Napsal: 02 pro 2019, 21:27
od doga
Ahoj,
tak to dělá onewire s čidly Dalas. Čidla nemusí být ani připojeny, stačí doplnit kód a servopohon začne pocukávat.
Nějaký nápad?
Dík

Kód: Vybrat vše

#include <Tasker.h>
#include <OneWire.h>
#include <DallasTemperature.h>

Tasker tasker;


#define ONE_WIRE_BUS 11 //pin 13 sběrnice pro DS
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
DeviceAddress inside1 = { 0x28, 0x80, 0x4E, 0xE9, 0x08, 0x00, 0x00, 0x40 };
DeviceAddress outside1 = { 0x28, 0x36, 0x66, 0x40, 0xA, 0x00, 0x00, 0x46 };

float Tin1 = 0;
float Tout1 = 0;

#include <Servo.h>     //zahrnutí knihovny pro ovládání servo motoru
Servo myservo;         //každý motor má svou instanci třídy Servo
int pos = 0;           //proměnná obsahující pozici motoru (úhel natočení)

void dvirka(int) {
    // Serial.println(pos);
    pos = 0;
     myservo.write(pos);
 }

void ctiSensor(int) {
Tin1 = sensors.getTempC (inside1);
Tout1 = sensors.getTempC (outside1);
}

void ctiTeplotu(int) {
    sensors.requestTemperatures();
    tasker.setTimeout(ctiSensor, 750);
    Serial.println(Tout1);
}

void setup() {

myservo.attach(12);   //tento motor je připojen na pin 9
Serial.begin(9600);
sensors.begin(); // Spuštění knihovny
sensors.setResolution(inside1, 12); // set the resolution to 10 bit (good enough?)
sensors.setResolution(outside1, 12);
   sensors.setWaitForConversion(false);
   
    tasker.setInterval(ctiTeplotu, 3000);
    tasker.setInterval(dvirka, 50);
    tasker.run();
 }

void loop(void)
{
} 

Napsal: 02 pro 2019, 21:30
od p32
Dával jsi to předtím jinam, ale teď je to zde. Když už tam něco vkládáš, tak to trošku porovnej. #include všechny za sebou atd. :wink:

Napsal: 02 pro 2019, 21:48
od misocko
#define ONE_WIRE_BUS 11 //pin 13 sběrnice pro DS - tak 13 alebo 11?
myservo.attach(12); //tento motor je připojen na pin 9 - 12 alebo 9 ?

v loope nemas nic, takto ti to cuka?

kedze tomu vobec nerozumiem, napada ma iba "delay" v citani DS senzora, ked ti nebezi pin na riadenie serva a servo cukne - alebo je tento pin rieseny ako PWM a bezi furt?

Napsal: 02 pro 2019, 23:34
od doga
Ahoj, nabyl jsem dojmu, že pokračování mého problému patří do jiné části fóra a admin mě vrátil zpět.
Omlouvám se za nepřesnosti v kódu, komenty jsou pouze informační ale pokusil jsem se to trochu učesat.

Kód: Vybrat vše

#include <Tasker.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Servo.h>     //zahrnutí knihovny pro ovládání servo motoru

Tasker tasker;

Servo myservo;         //každý motor má svou instanci třídy Servo

#define ONE_WIRE_BUS 11 //pin sběrnice pro DS
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
DeviceAddress inside1 = { 0x28, 0x80, 0x4E, 0xE9, 0x08, 0x00, 0x00, 0x40 };
DeviceAddress outside1 = { 0x28, 0x36, 0x66, 0x40, 0xA, 0x00, 0x00, 0x46 };

float Tin1 = 0;
float Tout1 = 0;
int pos = 0;           //proměnná obsahující pozici motoru (úhel natočení)

void dvirka(int) {
    // Serial.println(pos);
    pos = 90;
     myservo.write(pos); 
 } 

void ctiSensor(int) {
Tin1 = sensors.getTempC (inside1);
Tout1 = sensors.getTempC (outside1);
}

void ctiTeplotu(int) {
    sensors.requestTemperatures();
    tasker.setTimeout(ctiSensor, 750);
    Serial.println(Tout1);
}

void setup() {
myservo.attach(12);   //tento motor je připojen na pin 12
Serial.begin(9600);
sensors.begin(); // Spuštění knihovny
sensors.setResolution(inside1, 12); // set the resolution to 10 bit (good enough?)
sensors.setResolution(outside1, 12);
sensors.setWaitForConversion(false);
   
    tasker.setInterval(ctiTeplotu, 3000);
    tasker.setInterval(dvirka, 50);
    tasker.run();
 }

void loop(void)
{
}

Napsal: 03 pro 2019, 00:37
od doga
misocko píše: kedze tomu vobec nerozumiem, napada ma iba "delay" v citani DS senzora, ked ti nebezi pin na riadenie serva a servo cukne - alebo je tento pin rieseny ako PWM a bezi furt?
servo jsem dal na 3 pin s PWM ale bohužel bezezměny.

Napsal: 03 pro 2019, 19:04
od misocko
len je otazne ako ho riadi servo kniznica , ci ako PWM a teda kmita nezavisle na behu zvysku programu alebo len proste kmita a ked procak prave nema cas , tak sa kmity predlzuju

Napsal: 03 pro 2019, 20:00
od FHonza
Pro jakou to máš desku ? Docela důležitý údaj ...

Napsal: 04 pro 2019, 00:20
od doga
Arduino nano, napájené přes VIN z 6v baterie. Servo napájeno přímo z baterie.