Arduino - ovladani DC motorku

Automatizace, řízení, měření, logování a programování s využitím platformy Arduino.
Odpovědět
Mrsina
Příspěvky: 2
Registrován: úte říj 22, 2013 7:16 pm
Reputace: 0

Arduino - ovladani DC motorku

Příspěvek od Mrsina »

Dobry den,

měl bych prosbu. Mam jako praci vytvorit plosinu se 2 stupni volnosti (toceni kolem osy o 360° a naklon vrchni casti plosiny o +/- 60°). Ovladani je reseno pres pocitat pres FTDI (seriovku). Nejlepe bych to chtel resit klavesami. Resim ted ovladani DC motorku, uz jsem si vytvoril par prototypu, ale u jednoho z nich se mi stava, ze jakmile zmacknu klavesu, tak se motorek rozjede, nasledne zastavi a pak dale jede (jakoby cukne). Samozrejme to resim tak, ze jakmile pustim klavesu, tak se motorek zastavi. Neni tu nekdo, kdo by mi mohl pomoct/poradit, jak toto vyresit, pripadne napsat, jak to resit? Aktualne jsem to resil bezdratove. Pro ovladani z klavesnice jsem pouzil terminalovej program putty.

Zde prikladam program z arudina.
String command = "";
uint8_t state = 0; // 0 = copy as hex, 1 char received, 2 = command, 3 = command ended, 4 esc
unsigned int time = 0;
unsigned long prev = 0;


void setup() {
Serial.begin(57600);
command.reserve(50);

digitalWrite(2,HIGH);
for (char i=2; i<13; ++i) pinMode(i,OUTPUT);

}

void loop() {
unsigned char x = '0';
if (Serial.available()) {
x = (char) Serial.read();
switch (state) {
case 0: if (x == '+') { state=2; } else if (x == 27) { state=4; } else if (x!='\r' && x!='\n') { state=1; } break;
case 2: if (x == '\n' || x == '\r') { state=3; } else { command += (char)x; } break;
case 4: if (x == '[') { state = 5; } else { state = 0; } break;
case 5:
switch (x) {
case 0x41: digitalWrite(4,HIGH); time=20; break;
case 0x42: digitalWrite(2,HIGH); time=20; break;
case 0x43: digitalWrite(6,HIGH); time=200; break;
case 0x44: digitalWrite(7,HIGH); time=200; break;
}
state = 0;
break;
}
}

if (state == 1) {
Serial.print((char)x);
Serial.print(' ');
state = 0;
} else if (state == 3) {
if (command == "CONNECTED") { digitalWrite(2,LOW); }
state=0;
command="";
}

if (time > 0) {
unsigned char tmp = millis() - prev; // char staci
if (tmp > 0) {
if (tmp > time) {
time = 0;
} else {
time -= tmp;
}
}
}
if (time == 0) {
digitalWrite(4,LOW);
digitalWrite(2,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
prev = millis();

}
Mrsina
Příspěvky: 2
Registrován: úte říj 22, 2013 7:16 pm
Reputace: 0

Re: Arduino - ovladani DC motorku

Příspěvek od Mrsina »

Zde jeste prilozim na prime ovladani bez bezdratu.
unsigned int time = 0;
unsigned long prev = 0;
void setup() {
}

void loop() {
unsigned char x = '0';
if (Serial.available()) {
x = (char) Serial.read();

switch (x) {
case 'a': case 'A':
digitalWrite(2,HIGH); time=200; break;
case 'b': case 'B':
digitalWrite(4,HIGH); time=200; break;
}
}
/* time = 200; */


if (time > 0) {
unsigned char tmp = millis() - prev; // char staci
if (tmp > 0) {
if (tmp > time) {
time = 0;
} else {
time -= tmp;
}
}
}

if (time == 0) {
digitalWrite(2,LOW); // zastavit kterykoliv smer
digitalWrite(4,LOW); // ... a bude se zastavovat ikdyz se jen neco blbe nastavi
}
prev = millis();



}

Odpovědět
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek