Pocukávání servomotoru
Moderátor: Moderátoři
Pocukávání servomotoru
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
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
- Artaban001
- Příspěvky: 9457
- Registrován: 01 dub 2004, 02:00
- Bydliště: Pendrov
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á...
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.
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.
Jirka
Proč mi nemůže všechno chodit hned ?!!
Proč mi nemůže všechno chodit hned ?!!
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
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
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
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)
{
}
#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?
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?
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.
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)
{
}