Mega a 20 serv

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
luger
Příspěvky: 197
Registrován: 30 dub 2023, 11:06

Mega a 20 serv

Příspěvek od luger » 01 zář 2023, 15:40

Zdravím,
mám v plánu projekt "pavouk". Deska Mega, servo board pro 32 serv, několik senzorů ...

Servo Board by se měl ovládat přes UART (RX,TX) např. příkazem :
SoftSerial.print("#9P1500T500\r\n"); kde #9 je číslo serva, P je pozice, T je rychlost

Tento příkaz s konstantama funguje, ale já bych potřeboval ty konstanty nahradit proměnnýma. A nevím jak.
Můžete někdo prosím poradit?

Díky moc

Uživatelský avatar
kiRRow
Příspěvky: 1239
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Mega a 20 serv

Příspěvek od kiRRow » 01 zář 2023, 17:20

Kód: Vybrat vše

SoftSerial.print("#");
SoftSerial.print(ovladanyMotor);
SoftSerial.print("P");
SoftSerial.print(poziceMotoru);
SoftSerial.print("T");
SoftSerial.print(rychlostMotoru);
SoftSerial.print("\r\n");

Kód: Vybrat vše

void ovladejMotor(int ovladanyMotor, int poziceMotoru, int rychlostMotoru) {
	SoftSerial.print("#");
	SoftSerial.print(ovladanyMotor);
	SoftSerial.print("P");
	SoftSerial.print(poziceMotoru);
	SoftSerial.print("T");
	SoftSerial.print(rychlostMotoru);
	SoftSerial.print("\r\n");
}
ovladejMotor(9, 1500, 500);
ovladejMotor(8, 1200, 400);
ovladejMotor(7, 1000, 300);

luger
Příspěvky: 197
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 01 zář 2023, 20:38

Díky moc, vyzkouším.
Momentálně testuji jiný způsob, ale je to na mě dost složité.
Jedná se o plynulý pohyb serva z jedné polohy do druhé.

Kód: Vybrat vše

SoftwareSerial SoftSerial(14, 15); // RX, TX

char buffer[50];  

int servoNum=11;  
//int position=1500;  
int speed=1500;  

void setup() {
  SoftSerial.begin(9600);
delay(100);

for (int i=500;i<=1500;i++)      
{
    snprintf(buffer, sizeof(buffer), "#%dP%dT%d\r\n", servoNum, i, speed);
    Serial.print(buffer);

delay(50);
}
}
void loop() {
}
Servo se sice hýbe, ale cuká sem a tam. Někdy se uklidní a pomalu otáčí. Prostě pokaždé jinak.

luger
Příspěvky: 197
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 02 zář 2023, 19:27

Tak jsem vyzkoušel i tu vaši metodu. Je pro mě(začátečníka) srozumitelná. Jenom ty serva pořád cukají a skáčou jak kozy. Pak se uklidní a už jedou normálně. Nevíte co s tím ?
Nepoužívám už smyčku for.... ale jen přímé příkazy Serial.Print
Díky

Uživatelský avatar
kiRRow
Příspěvky: 1239
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Mega a 20 serv

Příspěvek od kiRRow » 03 zář 2023, 10:56

Ukaž jak vypadá celý program.

luger
Příspěvky: 197
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 03 zář 2023, 20:54

Zjistil jsem zajímavou věc - i když vůbec nezapojím Megu (připojím jen samotný servo board k napájení) tak se stejně serva pohnou a uspořádají se do nějakých středních hodnot. Jako by měl něco předdefinované a to asi dělá ten bordel.

Kód: Vybrat vše

void loop() {
  nohaPZ();       //   noha pravá zadní ---------------------------
  SoftSerial.print("#");
  SoftSerial.print(servoZL2);
  SoftSerial.print("P");
  SoftSerial.print(poziceZL2);
  SoftSerial.print("T");
  SoftSerial.print(rychlostZL2);
  SoftSerial.print("\r\n");

  delay(1000);

  nohaPS();

  SoftSerial.print("#");
  SoftSerial.print(servoZL2);
  SoftSerial.print("P");
  SoftSerial.print(poziceZL2);
  SoftSerial.print("T");
  SoftSerial.print(rychlostZL2);
  SoftSerial.print("\r\n");
  delay(1000);
}
// -------------------------------------------------------------------

void nohaPZ() {
  //poziceZL2 =Serial.parseInt();        // nactena hodnota pozice srva
  servoZL2 = 17;       // servo č.1
  poziceZL2 = 750;   // rozsah pozice 750-1100
  rychlostZL2 = 800;
}

void nohaPS() {
  //pozice =Serial.parseInt();        // nactena hodnota pozice srva

  servoZL2 =17 ;
  poziceZL2 = 1100;
  rychlostZL2 = 800;
}

Uživatelský avatar
kiRRow
Příspěvky: 1239
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Mega a 20 serv

Příspěvek od kiRRow » 03 zář 2023, 21:08

No to je docela pochopitelné, že bez příkazu bůh ví jaký servoboard nastaví serva do středové pozice ... problém je v programu. Běhá ti to v loopu a každou vteřinu přepisuje a odesílá nové parametry tomu servoboardu. Musíš je posílat jen, když chceš tím motorem opravdu hnout.

luger
Příspěvky: 197
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 04 zář 2023, 10:45

Myslím že ta smyčka je v pořádku. Potřebuji vidět že se servo hýbe sem a tam. Tento způsob ovládání není vhodný pro současný pohyb dvou a více serv. Vždy jede jen jedno. Možná by to šlo vložit do smyčky for .... s postupným nabýváním hodnoty pozice, ale to se mi zdá krkolomné a složité. Servoboard sice umožňuje skupinové ovládání více serv, ale hodnoty tam nejdou vložit jako proměnné (aspoň si myslím).

Uživatelský avatar
kiRRow
Příspěvky: 1239
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Mega a 20 serv

Příspěvek od kiRRow » 04 zář 2023, 16:46

Ten servoboard má vlastní procesor ... tomu řekneš, kterým motorem, kam a jak rychle má hnout ... pokud ten pohyb v důsledku pomalé rychlosti trvá například 10s a ty do něj celou dobu budeš furt hustit to samé, že má jít na tu pozici a takhle rychle, tak se bude kousat ... musí zpracovat novou informaci, vypočíst nové hodnoty a začít je znova zapisovat do toho motoru.

Jednoduše otestuješ tak, že tam dáš naschvál delay jak kráva ... aby jsi předešel tomu, že loop odešle ten samý příkaz ještě dříve, než ho servoboard dokončí.

luger
Příspěvky: 197
Registrován: 30 dub 2023, 11:06

Re: Mega a 20 serv

Příspěvek od luger » 04 zář 2023, 17:43

Ti robopavouci přece fungují . Taky jedou přes Megu a board. Jenom přijít na to jak.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti