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