Stránka 1 z 17

Mega a 20 serv

Napsal: 01 zář 2023, 15:40
od luger
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

Re: Mega a 20 serv

Napsal: 01 zář 2023, 17:20
od kiRRow

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);

Re: Mega a 20 serv

Napsal: 01 zář 2023, 20:38
od luger
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.

Re: Mega a 20 serv

Napsal: 02 zář 2023, 19:27
od luger
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

Re: Mega a 20 serv

Napsal: 03 zář 2023, 10:56
od kiRRow
Ukaž jak vypadá celý program.

Re: Mega a 20 serv

Napsal: 03 zář 2023, 20:54
od luger
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;
}

Re: Mega a 20 serv

Napsal: 03 zář 2023, 21:08
od kiRRow
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.

Re: Mega a 20 serv

Napsal: 04 zář 2023, 10:45
od luger
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).

Re: Mega a 20 serv

Napsal: 04 zář 2023, 16:46
od kiRRow
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čí.

Re: Mega a 20 serv

Napsal: 04 zář 2023, 17:43
od luger
Ti robopavouci přece fungují . Taky jedou přes Megu a board. Jenom přijít na to jak.