Prosím o pomoc, zapojení NRF24L01+PA+LNA

Odpovědět
bernkop
Příspěvky: 14
Registrován: 07 dub 2023, 14:32
Reputation: 0

Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od bernkop » 07 kvě 2023, 00:21

Dobrý den, Prosím o pomoc jak zapojit 2x NRF24L01+PA+LNA přes arduino uno. Potřebuji ovládat 2x nema 23 + 1x servo. Ovládaní přes jedno uno funguje jak má (kód níže) teď mě jen zajímá jak zapojit "propojit" druhé uno na vzdálené ovládaní. Děkuji moc za odpověd!

Kód: Vybrat vše

//-----------------------------------------------------------
// Ovladani krokoveho motoru pomoci joysticku pres DRV8255
//       vlevo  / vpravo  .... prvni motor (osa X) - podle uhlu vychyleni zmena rychlosti krokovani 
//
//       nahoru  / dolu   .... druhy motor (osa y) - podle uhlu vychyleni zmena rychlosti krokovani
//
//       stisk tlacitka na joysticku najede servem do jedne nastavene polohy (parametr 'servo_ON')
//       uvolneni tlacitka na joysticku vrati servo do druhe nastavene polohy (parametr 'servo_OFF')
//       rychlost pohybu serva je nastavitelna (parametr 'rychlost_serva') 
//
//-----------------------------------------------------------


#include <Servo.h>                                                       // knihovna pro ovladani serva
Servo servo1;

//----------------------------------
//  prirazeni pinu
#define pin_X              A0                                            // joystick - osa X
#define pin_Y              A1                                            // joystick - osa Y

#define motor_X_STEP        4                                            // impulzni vstup X_DRV8255
#define motor_X_DIR         5                                            // smerovy vstup X_DRV8255

#define motor_Y_STEP        6                                            // impulzni vstup Y_DRV8255
#define motor_Y_DIR         7                                            // smerovy vstup Y_DRV8255

#define joystick_tl         8                                            // tlacitko na joysticku (vnitrne se spina proti GND)
#define pin_servo           9                                            // ovladaci pin serva



//----------------------------------
//  konstantni parametry

#define min_X               2                                            // skutecne krajni polohy joysticku (teoreticky se joystick vychyluje v rozsahu 0 az 1023)
#define max_X            1022
#define min_Y               2
#define max_Y            1022

#define nula_X            507                                            // skutecna hodnota, kterou posila joystick v klidu
#define nula_Y            504



#define pasmo_klidu        50                                        // Pokud je joystick v prime poloze +/- 'pasmo_klidu' motory se netoci.
                                                                         //     Teoreticky stred primeho joysticku je cislo 512, ale neda se na to presne spolehnout. 
                                                                         //     Pri nastavene konstante 'pasmo_klidu' na hodnotu 50 jsou motory v klidu pri hodnotach 462 az 562. 
                                                                         //     Zbytek rozsahu vychylky se linearne prevadi na rychlost mezi nasledujici konstanty

#define rychlost_max       1                                          // pocet milisekund mezi jednotlivymi kroky pri maximalnim vychyleni joysticku
#define rychlost_min     50                                            // pocet milisekund mezi jednotlivymi kroky pri minimalnim vychyleni joysticku (tesne pres 'pasmo_klidu')


#define servo_ON           90                                            // krajni poloha serva pri stisknutem tlacitku (rozsah 0 az 180)
#define servo_OFF         180                                            // krajni poloha serva pri uvolnenem tlacitku  (rozsah 0 az 180) 
#define rychlost_serva      1                                            // jakou rychlosti ma servo prejizdet (mensi cislo je rychlejsi prejezd)

//----------------------------------
// globalni promenne
unsigned int osa_X;                                                      // analogova hodnota vychyleni joysticku pro osu X
unsigned int osa_Y;                                                      // analogova hodnota vychyleni joysticku pro osu Y

unsigned long casovac;                                                   // pro urcovani pauzy mezi kroky
unsigned int pauza_X;                                                    // aktualni pauza mezi kroky podle vychyleni joysticku v ose X
unsigned int pauza_Y;                                                    // aktualni pauza mezi kroky podle vychyleni joysticku v ose Y


int uhel;                                                                // aktualni uhel serva
int smer_serva;                                                          // pricitani nebo odecitani jednicky pri pohybu serva (v zavislosti na tom, jestli je klidova poloha mensi nebo vetsi nez aktivni)
int cil;                                                                 // na jakou polohu se ma servo natocit (servo_ON nebo servo_OFF)
unsigned long posledni_zmena;                                            // casova znacka pro cas posledniho pootoceni serva o 1 stupen

//----------------------------------
void setup(void)
  {
    Serial.begin(9600);

    //  nastaveni smeru pinu
    pinMode(pin_X, INPUT);
    pinMode(pin_Y, INPUT); 

    pinMode(motor_X_STEP, OUTPUT); 
    pinMode(motor_X_DIR, OUTPUT); 
    pinMode(motor_Y_STEP, OUTPUT); 
    pinMode(motor_Y_DIR, OUTPUT); 

    pinMode(joystick_tl, INPUT_PULLUP);

    servo1.attach(pin_servo);
    servo1.write(servo_OFF);                                             // natoceni serva do klidove polohy
    uhel = servo_OFF;                                                    // do stejne polohy se nastavi i promenna 'uhel'
  }



//----------------------------------
//  hlavni smycka
void loop(void)
  {
    
    osa_X = analogRead(pin_X);                                           // v kazde smycce se zmeri napeti na obou osach
    osa_Y = analogRead(pin_Y);


    // -----------------------------------------------------------------------------------------------
           
    // -----------------------------------------------------------------------------------------------


    osa_X = constrain(osa_X, min_X , max_X);                             // pro jistotu, aby se nestalo, ze hodnota pri vychyleni prekroci zadane meze 'min_X' a 'max_X'
    osa_Y = constrain(osa_Y, min_Y , max_Y);                             // pro jistotu, aby se nestalo, ze hodnota pri vychyleni prekroci zadane meze 'min_Y' a 'max_Y'

    if (osa_X > (nula_X + pasmo_klidu))                                  // vychyleni smeru X do plusu
      {
        pauza_X = map(osa_X, nula_X + pasmo_klidu , max_X  , rychlost_min , rychlost_max );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_X)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_X_plus();                                               // ... provede se krok v ose X do plusu
          }
      }

    if (osa_X < (nula_X - pasmo_klidu))                                  // vychyleni smeru X do minusu
      {
        pauza_X = map(osa_X, min_X , nula_X - pasmo_klidu  , rychlost_max , rychlost_min );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_X)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_X_minus();                                              // ... provede se krok v ose X do minusu
          }
      }


    if (osa_Y > (nula_Y + pasmo_klidu))                                  // vychyleni smeru Y do plusu
      {
        pauza_Y = map(osa_Y, nula_Y + pasmo_klidu , max_Y  , rychlost_min , rychlost_max );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_Y)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_Y_plus();                                               // ... provede se krok v ose Y do plusu
          }
      }

    if (osa_Y < (nula_Y - pasmo_klidu))                                  // vychyleni smeru Y do minusu
      {
        pauza_Y = map(osa_Y, min_Y , nula_Y - pasmo_klidu  , rychlost_max , rychlost_min );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_Y)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_Y_minus();                                              // ... provede se krok v ose Y do minusu
          }
      }




    //   ---------------  SERVO ------------------
    if (digitalRead(joystick_tl) == LOW)       cil = servo_ON;           // tlacitko na joysticku je stisknute (cilovy uhel se nastavi na polohu 'servo_OFF')
    else                                       cil = servo_OFF;          // tlacitko na joysticku je uvolnene  (cilovy uhel se nastavi na polohu 'servo_ON')
      
    if ((uhel != cil) and ((millis() - posledni_zmena) > rychlost_serva))// se servem se otaci jen v pripade, ze se aktualni 'uhel' a 'cil' neshoduje. Jinak je servo v klidu
      {                                                                  //         Otaceni je mozne ale az po vyprseni nastaveneho intervalu
        if (uhel > cil)   uhel --;                                       // vypocet noveho uhlu natoceni serva
        else              uhel ++;

        servo1.write(uhel);                                              // otoceni serva na nove vypocteny uhel
        
        posledni_zmena = millis();                                       // nova znacka pro dalsi porovnani s pozadovanym casovym intervalem mezi krokovanim serva
      }
    //   ---------  KONEC SERVA  ------------------


  }
//-------------- konec hlavni smycky --------------------



//----------------------------------
//  pootoceni motoru v ose X o jeden krok dopredu
void krok_X_plus(void)
  {
    digitalWrite(motor_X_DIR,HIGH);
    digitalWrite(motor_X_STEP,HIGH);
    delay(1);
    digitalWrite(motor_X_STEP,LOW);
    delay(1);    
  }



//----------------------------------
//  pootoceni motoru v ose X o jeden krok dozadu
void krok_X_minus(void)
  {
    digitalWrite(motor_X_DIR,LOW);
    digitalWrite(motor_X_STEP,HIGH);
    delay(1);
    digitalWrite(motor_X_STEP,LOW);
    delay(1);        
  }



//----------------------------------
//  pootoceni motoru v ose Y o jeden krok dopredu
void krok_Y_plus(void)
  {
    digitalWrite(motor_Y_DIR,HIGH);
    digitalWrite(motor_Y_STEP,HIGH);
    delay(1);
    digitalWrite(motor_Y_STEP,LOW);
    delay(1);    
  }



//----------------------------------
//  pootoceni motoru v ose Y o jeden krok dozadu
void krok_Y_minus(void)
  {
    digitalWrite(motor_Y_DIR,LOW);
    digitalWrite(motor_Y_STEP,HIGH);
    delay(1);
    digitalWrite(motor_Y_STEP,LOW);
    delay(1);        
  }

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od AstroMiK » 07 kvě 2023, 08:31

Budeš muset ještě upřesnit, jak se bude to druhé Arduino ovládat.
To tam bude druhý joystick se stejnou funkcí?

Pak se musí ještě vyřešit, kdo bude mít přednost - místní nebo dálkové ovládání.
Nebo se bude nějakým způsobem přepínat, kdo si tu přednost přivlastní?

Přikládám trochu přeorganizovaný program s představou, jak by asi mělo to doplnění dálkového ovládání vypadat (kolem řádky 120).

V podstatě by mělo stačit podle dat z dálkového přenosu přepisovat původní hodnoty proměnných 'osa_X', 'osa_Y' a 'cil'.

Problém bude možná i s rychlostí.
Rychlost krokování motorů je teď závislá jen na rychlosti čtení dvou analogových a jednoho digitálního vstupu.
Když se ale místo toho bude přijímat a zpracovávat dálková komunikace, může se rychlost snížit.

Kód: Vybrat vše

//-----------------------------------------------------------
// Ovladani krokoveho motoru pomoci joysticku pres DRV8255
//       vlevo  / vpravo  .... prvni motor (osa X) - podle uhlu vychyleni zmena rychlosti krokovani 
//
//       nahoru  / dolu   .... druhy motor (osa y) - podle uhlu vychyleni zmena rychlosti krokovani
//
//       stisk tlacitka na joysticku najede servem do jedne nastavene polohy (parametr 'servo_ON')
//       uvolneni tlacitka na joysticku vrati servo do druhe nastavene polohy (parametr 'servo_OFF')
//       rychlost pohybu serva je nastavitelna (parametr 'rychlost_serva') 
//
//       Priprava na dalkove ovladani.
//-----------------------------------------------------------


#include <Servo.h>                                                       // knihovna pro ovladani serva
Servo servo1;

//----------------------------------
//  prirazeni pinu
#define pin_X              A0                                            // joystick - osa X
#define pin_Y              A1                                            // joystick - osa Y

#define motor_X_STEP        4                                            // impulzni vstup X_DRV8255
#define motor_X_DIR         5                                            // smerovy vstup X_DRV8255

#define motor_Y_STEP        6                                            // impulzni vstup Y_DRV8255
#define motor_Y_DIR         7                                            // smerovy vstup Y_DRV8255

#define joystick_tl         8                                            // tlacitko na joysticku (vnitrne se spina proti GND)
#define pin_servo           9                                            // ovladaci pin serva



//----------------------------------
//  konstantni parametry

#define min_X               2                                            // skutecne krajni polohy joysticku (teoreticky se joystick vychyluje v rozsahu 0 az 1023)
#define max_X            1022
#define min_Y               2
#define max_Y            1022

#define nula_X            507                                            // skutecna hodnota, kterou posila joystick v klidu
#define nula_Y            504



#define pasmo_klidu        50                                            // Pokud je joystick v prime poloze +/- 'pasmo_klidu' motory se netoci.
                                                                         //     Teoreticky stred primeho joysticku je cislo 512, ale neda se na to presne spolehnout. 
                                                                         //     Pri nastavene konstante 'pasmo_klidu' na hodnotu 50 jsou motory v klidu pri hodnotach 462 az 562. 
                                                                         //     Zbytek rozsahu vychylky se linearne prevadi na rychlost mezi nasledujici konstanty

#define rychlost_max       1                                             // pocet milisekund mezi jednotlivymi kroky pri maximalnim vychyleni joysticku
#define rychlost_min      50                                             // pocet milisekund mezi jednotlivymi kroky pri minimalnim vychyleni joysticku (tesne pres 'pasmo_klidu')


#define servo_ON           90                                            // krajni poloha serva pri stisknutem tlacitku (rozsah 0 az 180)
#define servo_OFF         180                                            // krajni poloha serva pri uvolnenem tlacitku  (rozsah 0 az 180) 
#define rychlost_serva      1                                            // jakou rychlosti ma servo prejizdet (mensi cislo je rychlejsi prejezd)

//----------------------------------
// globalni promenne
unsigned int osa_X;                                                      // analogova hodnota vychyleni joysticku pro osu X
unsigned int osa_Y;                                                      // analogova hodnota vychyleni joysticku pro osu Y

unsigned long casovac;                                                   // pro urcovani pauzy mezi kroky
unsigned int pauza_X;                                                    // aktualni pauza mezi kroky podle vychyleni joysticku v ose X
unsigned int pauza_Y;                                                    // aktualni pauza mezi kroky podle vychyleni joysticku v ose Y


int uhel;                                                                // aktualni uhel serva
int smer_serva;                                                          // pricitani nebo odecitani jednicky pri pohybu serva (v zavislosti na tom, jestli je klidova poloha mensi nebo vetsi nez aktivni)
int cil;                                                                 // na jakou polohu se ma servo natocit (servo_ON nebo servo_OFF)
unsigned long posledni_zmena;                                            // casova znacka pro cas posledniho pootoceni serva o 1 stupen

boolean prepnuto_na_mistni_ovladani = true;                              // prepinani mistniho nebo dalkoveho ovladani

//----------------------------------
void setup(void)
  {
    Serial.begin(9600);

    //  nastaveni smeru pinu
    pinMode(pin_X, INPUT);
    pinMode(pin_Y, INPUT); 

    pinMode(motor_X_STEP, OUTPUT); 
    pinMode(motor_X_DIR, OUTPUT); 
    pinMode(motor_Y_STEP, OUTPUT); 
    pinMode(motor_Y_DIR, OUTPUT); 

    pinMode(joystick_tl, INPUT_PULLUP);

    servo1.attach(pin_servo);
    servo1.write(servo_OFF);                                             // natoceni serva do klidove polohy
    uhel = servo_OFF;                                                    // do stejne polohy se nastavi i promenna 'uhel'
  }



//----------------------------------
//  hlavni smycka
void loop(void)
  {
    



    // -------- podle nastaveneho zpusobu ovladani se bud cte joystick, nebo komunikace z NRF ----------------
    
    if (prepnuto_na_mistni_ovladani == true)                             // ovladani mistnim joystickem
      {
        osa_X = analogRead(pin_X);                                       // zmeri se napeti na obou osach joysticku
        osa_Y = analogRead(pin_Y);
        if (digitalRead(joystick_tl) == LOW)       cil = servo_ON;       // tlacitko na joysticku je stisknute (cilovy uhel se nastavi na polohu 'servo_OFF')
        else                                       cil = servo_OFF;      // tlacitko na joysticku je uvolnene  (cilovy uhel se nastavi na polohu 'servo_ON')
      }
    else                                                                 // dalkove ovladani
      {
        // --------
        // 
        //  Tady by bylo nejake prijimani a zpracovavani dalkove komunikace NRF.
        // 
        //  Nezapomenout resit i pripad, kdy bude sice prepnuto na dalkovou komunikaci, ale z nejakeho duvodu se nepodari prijmout data.
        //  V tom pripade nastavit osu X a Y na stredni polohu joysticku (vypnute motory)a cil serva nechat na posledni prijate hodnote:
            unsigned int prijato_X     = nula_X;
            unsigned int prijato_Y     = nula_Y;
            int prijato_servo = cil;
        // 
        // ---------

        osa_X = prijato_X;                                                // pri dalkove komunikaci staci prepisovat hodnoty osy X, Y  a cil serva
        osa_Y = prijato_Y;
        cil   = prijato_servo;
      }    

    // --------------------------------------------------------


    osa_X = constrain(osa_X, min_X , max_X);                             // pro jistotu, aby se nestalo, ze hodnota pri vychyleni prekroci zadane meze 'min_X' a 'max_X'
    osa_Y = constrain(osa_Y, min_Y , max_Y);                             // pro jistotu, aby se nestalo, ze hodnota pri vychyleni prekroci zadane meze 'min_Y' a 'max_Y'

    if (osa_X > (nula_X + pasmo_klidu))                                  // vychyleni smeru X do plusu
      {
        pauza_X = map(osa_X, nula_X + pasmo_klidu , max_X  , rychlost_min , rychlost_max );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_X)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_X_plus();                                               // ... provede se krok v ose X do plusu
          }
      }

    if (osa_X < (nula_X - pasmo_klidu))                                  // vychyleni smeru X do minusu
      {
        pauza_X = map(osa_X, min_X , nula_X - pasmo_klidu  , rychlost_max , rychlost_min );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_X)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_X_minus();                                              // ... provede se krok v ose X do minusu
          }
      }


    if (osa_Y > (nula_Y + pasmo_klidu))                                  // vychyleni smeru Y do plusu
      {
        pauza_Y = map(osa_Y, nula_Y + pasmo_klidu , max_Y  , rychlost_min , rychlost_max );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_Y)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_Y_plus();                                               // ... provede se krok v ose Y do plusu
          }
      }

    if (osa_Y < (nula_Y - pasmo_klidu))                                  // vychyleni smeru Y do minusu
      {
        pauza_Y = map(osa_Y, min_Y , nula_Y - pasmo_klidu  , rychlost_max , rychlost_min );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_Y)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_Y_minus();                                              // ... provede se krok v ose Y do minusu
          }
      }




    //   ---------------  SERVO ------------------
    if ((uhel != cil) and ((millis() - posledni_zmena) > rychlost_serva))// se servem se otaci jen v pripade, ze se aktualni 'uhel' a 'cil' neshoduje. Jinak je servo v klidu
      {                                                                  //         Otaceni je mozne ale az po vyprseni nastaveneho intervalu
        if (uhel > cil)   uhel --;                                       // vypocet noveho uhlu natoceni serva
        else              uhel ++;

        servo1.write(uhel);                                              // otoceni serva na nove vypocteny uhel
        
        posledni_zmena = millis();                                       // nova znacka pro dalsi porovnani s pozadovanym casovym intervalem mezi krokovanim serva
      }
    //   ---------  KONEC SERVA  ------------------


  }
//-------------- konec hlavni smycky --------------------



//----------------------------------
//  pootoceni motoru v ose X o jeden krok dopredu
void krok_X_plus(void)
  {
    digitalWrite(motor_X_DIR,HIGH);
    digitalWrite(motor_X_STEP,HIGH);
    delay(1);
    digitalWrite(motor_X_STEP,LOW);
    delay(1);    
  }



//----------------------------------
//  pootoceni motoru v ose X o jeden krok dozadu
void krok_X_minus(void)
  {
    digitalWrite(motor_X_DIR,LOW);
    digitalWrite(motor_X_STEP,HIGH);
    delay(1);
    digitalWrite(motor_X_STEP,LOW);
    delay(1);        
  }



//----------------------------------
//  pootoceni motoru v ose Y o jeden krok dopredu
void krok_Y_plus(void)
  {
    digitalWrite(motor_Y_DIR,HIGH);
    digitalWrite(motor_Y_STEP,HIGH);
    delay(1);
    digitalWrite(motor_Y_STEP,LOW);
    delay(1);    
  }



//----------------------------------
//  pootoceni motoru v ose Y o jeden krok dozadu
void krok_Y_minus(void)
  {
    digitalWrite(motor_Y_DIR,LOW);
    digitalWrite(motor_Y_STEP,HIGH);
    delay(1);
    digitalWrite(motor_Y_STEP,LOW);
    delay(1);        
  }

bernkop
Příspěvky: 14
Registrován: 07 dub 2023, 14:32
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od bernkop » 07 kvě 2023, 16:57

Dobrý den moc děkuji za odpověď! Kód jsem si prošel změnu vidím ale teď jak dále? Přiznám se že tohle jde mimo moje chápaní!! Takže kód stejný do obou uno?? Nějaké "párovaní antén"? Každopádně k zapojení úplně jednoduše zapojeno jedno uno + 2x nema 23 + 1x servo + 1x joystick. A vize je taková že že bych si přál toto zapojení ovládat "vzdáleně" přes 2. uno s tím že bych u toho 1. una joystick odpojil a ovládal to pouze vzdáleně skrz uno 2. Doufám že Vám to dává aspoň trochu smysl ... Malé přirovnání je autíčko na dálkové ovládaní ( ovladač a auto) v mém případě ovladač a řízení motorů a serva

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od AstroMiK » 07 kvě 2023, 19:01

U toho prvního Arduina (toho, které je připojeno k motorům) bude ten kód, který jsem přiložil naposled.
Někdo tam ale bude muset doplnit ještě příjem a zpracování komunikace - to neumím / nemám na čem vyzkoušet.

Navíc tam přibyde ještě přepínač (třeba páčkový), kterým se bude přepínat "Místní" / "Dálková" komunikace.
Tím se jednoznačně vyřeší rozhodování, kdo má při ovládání motorů přednost.
Při přepnutí na "Dálkovou" komunikaci se pak bude moct klidně joystick od prvního Arduina odpojit a připojit k druhému.
Tuhle část programu s přepínačem v prvním Arduinu zatím nemám, ale jsou to jen 4 řádky kódu:

Do bloku přiřazení pinů se přidá řádka:

Kód: Vybrat vše

#define prepinac            2                               // pin pro pripojeni prepinace  "Mistne" / "Dalkove" 
Do setupu:

Kód: Vybrat vše

   pinMode (prepinac, INPUT_PULLUP);
A na začátek hlavní smyčky loop:

Kód: Vybrat vše

    if (digitalRead(prepinac) == LOW)     prepnuto_na_mistni_ovladani = true;
    else                                  prepnuto_na_mistni_ovladani = false;

Druhé Arduino (vzdálené) bude mít v sobě program, který bude ve smyčce číst naklonění joysticku a stav tlačítka na joysticku.
Přes komunikaci - (opět neumím / nemám na čem vyzkoušet) - bude tyhle 3 údaje vysílat k prvnímu Arduinu (u motorů), které je bude zpracovávat.

bernkop
Příspěvky: 14
Registrován: 07 dub 2023, 14:32
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od bernkop » 07 kvě 2023, 21:12

Děkuji za "pomoc" ale v případě nevím a neumím Já osobně se raději nezapojuji do debaty ..... Nemyslím to zle a jestli to tak vypadá omlouvám se!!!!! Jde mi jen o to tento "projekt" dokončit.

bernkop
Příspěvky: 14
Registrován: 07 dub 2023, 14:32
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od bernkop » 07 kvě 2023, 21:59

astroMIK moc se omlouvám!!! Ty si mi pomohl fakt moccc v tématu co se týkalo zapojeni těch motoru a serva a zvládl si to na n1!! Pak si se zmínil ze dálkové ovládání moc neznáš tak sem založil nové “vlákno” a vůbec sem si nevšiml ze ses o5 zapojil… fakt sorry!!!

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

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od kiRRow » 07 kvě 2023, 22:34

No ty ten kód teď musíš rozdělit na dvě části.
Arduino č2 bude číst data z joysitcku a místo toho, aby je poslalo do motoru, tak je pošle na vysílač. - tím pádem nebudeš potřebovat část pro ovládání motoru, ale musíš ji nahradit vysíláním dat
Arduino č1 bude číst data z přijímače místo toho aby je četlo z joysticku. - tím pádem zase nebude potřebovat tu část pro čtení ... ale musí se nahradit příjmem dat.

Teď bych se zaměřil na to jak dostat data z č2 na č1 ... v úplně novém a čistém programu ... Kus programu co ovládá motory funguje, kus co čte joysticky taky funguje - teď děláš kus co veme z jedné strany data, přečte - přepočítá - optimalizuje a přepošle druhé straně, který je musí umět příjmout a správně interpretovat ... nakonec se to poskládá dohromady.

bernkop
Příspěvky: 14
Registrován: 07 dub 2023, 14:32
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od bernkop » 07 kvě 2023, 23:12

OK veš "chápu" ale jak už jsem x* zmínil tak v tomhle tématu se fakt moc nevyznám! Vše co Jste napsal mi dává smysl ale hlavní problém je pro mě jak a co kde mam zapojit .....

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od AstroMiK » 08 kvě 2023, 21:51

Zkusil jsem program doplnit o to dálkové ovládání.
Je to ale jen provizorně pro Bluetooth moduly HC-05 / HC-06.
BT moduly se nejdřív musí nastavit na režim automatického propojení podle stránky:
https://howtomechatronics.com/tutorials ... -commands/

Teď už stačí, aby se toho chopil někdo, kdo zná ty NRF moduly a neměl by být problém to tam nějak "našroubovat" místo těch Bluetooth modulů.

V příloze jsou dva programy.
Jeden je pro dálkové Arduino - k tomu je připojený jen ten joystick a nějaký ten komunikační modul.
Podle stavu joysticku odesílá 7 bajtů dat. (jejich popis je taky v příloze).
Nic jiného nedělá.


Druhý program je pro místní Arduino. To je to Arduino, které je připojené k motorům, druhému komunikačnímu modulu a případně k druhému joysticku. Musí u něj být doplněn ten přepínač "Místní / Dálkové" ovládání.
Tohle Arduino na základě třech proměnných (osa_X, osa_Y a cil), které se získávají buď z místního joysticku, nebo z bezdrátové komunikace, pohybuje motory a servem.
Druhý program obsahuje i kontrolu, že při přepnutí na dálkové ovládání přicházejí správná data. Pokud se během půl sekundy od posledních přijatých dat neobjeví v bezdrátové komunikaci nějaká nová data, motory se zastaví.


Ukázkové video je tady:
https://youtu.be/cptBzKwDsps

Víc už pro tebe ale fakt udělat nemůžu.
Přílohy
joystick+bluetooth.zip
(5.36 KiB) Staženo 45 x

bernkop
Příspěvky: 14
Registrován: 07 dub 2023, 14:32
Reputation: 0

Re: Prosím o pomoc, zapojení NRF24L01+PA+LNA

Příspěvek od bernkop » 26 kvě 2023, 22:04

Tak po delší době jsem o malý krůček blíže k dokončení bezdrátové komunikace... kod 1: místní

Kód: Vybrat vše

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(9, 10); // CE, CSN

struct Data {
  int x;
  int y;
  bool button;
};

Data data;
Servo servo;
int servoPin = 3;

void setup() {
  radio.begin();
  radio.openWritingPipe(pipe);
  radio.stopListening();

  servo.attach(servoPin);
  servo.write(0); // Nastaví servomotor na počáteční pozici
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(3, INPUT_PULLUP);
}

void loop() {
  data.x = analogRead(A0);
  data.y = analogRead(A1);
  data.button = digitalRead(2) == LOW; // aktivní nízké tlačítko

  radio.write(&data, sizeof(Data));
  delay(20);
}
kod 2: vzdálený

Kód: Vybrat vše

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#include <AccelStepper.h> // Přidána knihovna pro krokové motory

const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(9, 10); // CE, CSN

struct Data {
  int x;
  int y;
  bool button;
};

Data data;
Servo servo;
int servoPin = 3;
AccelStepper stepper1(AccelStepper::DRIVER, 5, 6); // Přidán krokový motor 1
AccelStepper stepper2(AccelStepper::DRIVER, 7, 8); // Přidán krokový motor 2

void setup() {
  radio.begin();
  radio.openReadingPipe(1, pipe);
  radio.startListening();

  servo.attach(servoPin);
  servo.write(0); // Nastaví servomotor na počáteční pozici

  stepper1.setMaxSpeed(1000); // Nastaví maximální rychlost krokového motoru 1 (v krocích za sekundu)
  stepper1.setAcceleration(500); // Nastaví akceleraci krokového motoru 1 (v krocích za sekundu^2)
  
  stepper2.setMaxSpeed(1000); // Nastaví maximální rychlost krokového motoru 2 (v krocích za sekundu)
  stepper2.setAcceleration(500); // Nastaví akceleraci krokového motoru 2 (v krocích za sekundu^2)
}

void loop() {
  if (radio.available()) {
    radio.read(&data, sizeof(Data));

    if (data.button) {
      servo.write(30); // Nastaví servomotor na určitou pozici (30 stupňů)
    } else {
      servo.write(0); // Nastaví servomotor na počáteční pozici
    }

    stepper1.setSpeed(map(data.x, 2, 1022, -1000, 1000)); // Nastaví rychlost krokového motoru 1 na základě hodnoty X
    stepper1.runSpeed(); // Spustí pohyb krokového motoru 1

    stepper2.setSpeed(map(data.y, 2, 1022, -1000, 1000)); // Nastaví rychlost krokového motoru 2 na základě hodnoty Y
    stepper2.runSpeed(); // Spustí pohyb krokového motoru 2
  }
}
servo na stisknutí tlačítka joysticku reaguje jak má ale motory ne a ne rozchodit. V kodu 1 podle všeho chybí i plynule ovládaní osy X a Y. Ví nekdo kde je problem s těmi motory nebo umí doplnit ten joystick?? Podle tohoto vzoru?? Děkuji

Kód: Vybrat vše

//-----------------------------------------------------------
// Ovladani krokoveho motoru pomoci joysticku pres DRV8255
//       vlevo  / vpravo  .... prvni motor (osa X) - podle uhlu vychyleni zmena rychlosti krokovani 
//
//       nahoru  / dolu   .... druhy motor (osa y) - podle uhlu vychyleni zmena rychlosti krokovani
//
//       stisk tlacitka na joysticku najede servem do jedne nastavene polohy (parametr 'servo_ON')
//       uvolneni tlacitka na joysticku vrati servo do druhe nastavene polohy (parametr 'servo_OFF')
//       rychlost pohybu serva je nastavitelna (parametr 'rychlost_serva') 
//
//-----------------------------------------------------------


#include <Servo.h>                                                       // knihovna pro ovladani serva
Servo servo1;

//----------------------------------
//  prirazeni pinu
#define pin_X              A0                                            // joystick - osa X
#define pin_Y              A1                                            // joystick - osa Y

#define motor_X_STEP        4                                            // impulzni vstup X_DRV8255
#define motor_X_DIR         5                                            // smerovy vstup X_DRV8255

#define motor_Y_STEP        6                                            // impulzni vstup Y_DRV8255
#define motor_Y_DIR         7                                            // smerovy vstup Y_DRV8255

#define joystick_tl         8                                            // tlacitko na joysticku (vnitrne se spina proti GND)
#define pin_servo           9                                            // ovladaci pin serva



//----------------------------------
//  konstantni parametry

#define min_X               2                                            // skutecne krajni polohy joysticku (teoreticky se joystick vychyluje v rozsahu 0 az 1023)
#define max_X            1022
#define min_Y               2
#define max_Y            1022

#define nula_X            507                                            // skutecna hodnota, kterou posila joystick v klidu
#define nula_Y            504



#define pasmo_klidu        50                                        // Pokud je joystick v prime poloze +/- 'pasmo_klidu' motory se netoci.
                                                                         //     Teoreticky stred primeho joysticku je cislo 512, ale neda se na to presne spolehnout. 
                                                                         //     Pri nastavene konstante 'pasmo_klidu' na hodnotu 50 jsou motory v klidu pri hodnotach 462 az 562. 
                                                                         //     Zbytek rozsahu vychylky se linearne prevadi na rychlost mezi nasledujici konstanty

#define rychlost_max       1                                          // pocet milisekund mezi jednotlivymi kroky pri maximalnim vychyleni joysticku
#define rychlost_min     50                                            // pocet milisekund mezi jednotlivymi kroky pri minimalnim vychyleni joysticku (tesne pres 'pasmo_klidu')


#define servo_ON           90                                            // krajni poloha serva pri stisknutem tlacitku (rozsah 0 az 180)
#define servo_OFF         180                                            // krajni poloha serva pri uvolnenem tlacitku  (rozsah 0 az 180) 
#define rychlost_serva      1                                            // jakou rychlosti ma servo prejizdet (mensi cislo je rychlejsi prejezd)

//----------------------------------
// globalni promenne
unsigned int osa_X;                                                      // analogova hodnota vychyleni joysticku pro osu X
unsigned int osa_Y;                                                      // analogova hodnota vychyleni joysticku pro osu Y

unsigned long casovac;                                                   // pro urcovani pauzy mezi kroky
unsigned int pauza_X;                                                    // aktualni pauza mezi kroky podle vychyleni joysticku v ose X
unsigned int pauza_Y;                                                    // aktualni pauza mezi kroky podle vychyleni joysticku v ose Y


int uhel;                                                                // aktualni uhel serva
int smer_serva;                                                          // pricitani nebo odecitani jednicky pri pohybu serva (v zavislosti na tom, jestli je klidova poloha mensi nebo vetsi nez aktivni)
int cil;                                                                 // na jakou polohu se ma servo natocit (servo_ON nebo servo_OFF)
unsigned long posledni_zmena;                                            // casova znacka pro cas posledniho pootoceni serva o 1 stupen

//----------------------------------
void setup(void)
  {
    Serial.begin(9600);

    //  nastaveni smeru pinu
    pinMode(pin_X, INPUT);
    pinMode(pin_Y, INPUT); 

    pinMode(motor_X_STEP, OUTPUT); 
    pinMode(motor_X_DIR, OUTPUT); 
    pinMode(motor_Y_STEP, OUTPUT); 
    pinMode(motor_Y_DIR, OUTPUT); 

    pinMode(joystick_tl, INPUT_PULLUP);

    servo1.attach(pin_servo);
    servo1.write(servo_OFF);                                             // natoceni serva do klidove polohy
    uhel = servo_OFF;                                                    // do stejne polohy se nastavi i promenna 'uhel'
  }



//----------------------------------
//  hlavni smycka
void loop(void)
  {
    
    osa_X = analogRead(pin_X);                                           // v kazde smycce se zmeri napeti na obou osach
    osa_Y = analogRead(pin_Y);


    // -----------------------------------------------------------------------------------------------
           
    // -----------------------------------------------------------------------------------------------


    osa_X = constrain(osa_X, min_X , max_X);                             // pro jistotu, aby se nestalo, ze hodnota pri vychyleni prekroci zadane meze 'min_X' a 'max_X'
    osa_Y = constrain(osa_Y, min_Y , max_Y);                             // pro jistotu, aby se nestalo, ze hodnota pri vychyleni prekroci zadane meze 'min_Y' a 'max_Y'

    if (osa_X > (nula_X + pasmo_klidu))                                  // vychyleni smeru X do plusu
      {
        pauza_X = map(osa_X, nula_X + pasmo_klidu , max_X  , rychlost_min , rychlost_max );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_X)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_X_plus();                                               // ... provede se krok v ose X do plusu
          }
      }

    if (osa_X < (nula_X - pasmo_klidu))                                  // vychyleni smeru X do minusu
      {
        pauza_X = map(osa_X, min_X , nula_X - pasmo_klidu  , rychlost_max , rychlost_min );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_X)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_X_minus();                                              // ... provede se krok v ose X do minusu
          }
      }


    if (osa_Y > (nula_Y + pasmo_klidu))                                  // vychyleni smeru Y do plusu
      {
        pauza_Y = map(osa_Y, nula_Y + pasmo_klidu , max_Y  , rychlost_min , rychlost_max );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_Y)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_Y_plus();                                               // ... provede se krok v ose Y do plusu
          }
      }

    if (osa_Y < (nula_Y - pasmo_klidu))                                  // vychyleni smeru Y do minusu
      {
        pauza_Y = map(osa_Y, min_Y , nula_Y - pasmo_klidu  , rychlost_max , rychlost_min );       // vypocet pauzy v [ms] mezi kroky
        if (millis() - casovac > pauza_Y)                                // kdyz pauza mezi kroky vyprsela ...
          {
            casovac = millis();
            krok_Y_minus();                                              // ... provede se krok v ose Y do minusu
          }
      }




    //   ---------------  SERVO ------------------
    if (digitalRead(joystick_tl) == LOW)       cil = servo_ON;           // tlacitko na joysticku je stisknute (cilovy uhel se nastavi na polohu 'servo_OFF')
    else                                       cil = servo_OFF;          // tlacitko na joysticku je uvolnene  (cilovy uhel se nastavi na polohu 'servo_ON')
      
    if ((uhel != cil) and ((millis() - posledni_zmena) > rychlost_serva))// se servem se otaci jen v pripade, ze se aktualni 'uhel' a 'cil' neshoduje. Jinak je servo v klidu
      {                                                                  //         Otaceni je mozne ale az po vyprseni nastaveneho intervalu
        if (uhel > cil)   uhel --;                                       // vypocet noveho uhlu natoceni serva
        else              uhel ++;

        servo1.write(uhel);                                              // otoceni serva na nove vypocteny uhel
        
        posledni_zmena = millis();                                       // nova znacka pro dalsi porovnani s pozadovanym casovym intervalem mezi krokovanim serva
      }
    //   ---------  KONEC SERVA  ------------------


  }
//-------------- konec hlavni smycky --------------------



//----------------------------------
//  pootoceni motoru v ose X o jeden krok dopredu
void krok_X_plus(void)
  {
    digitalWrite(motor_X_DIR,HIGH);
    digitalWrite(motor_X_STEP,HIGH);
    delay(1);
    digitalWrite(motor_X_STEP,LOW);
    delay(1);    
  }



//----------------------------------
//  pootoceni motoru v ose X o jeden krok dozadu
void krok_X_minus(void)
  {
    digitalWrite(motor_X_DIR,LOW);
    digitalWrite(motor_X_STEP,HIGH);
    delay(1);
    digitalWrite(motor_X_STEP,LOW);
    delay(1);        
  }



//----------------------------------
//  pootoceni motoru v ose Y o jeden krok dopredu
void krok_Y_plus(void)
  {
    digitalWrite(motor_Y_DIR,HIGH);
    digitalWrite(motor_Y_STEP,HIGH);
    delay(1);
    digitalWrite(motor_Y_STEP,LOW);
    delay(1);    
  }



//----------------------------------
//  pootoceni motoru v ose Y o jeden krok dozadu
void krok_Y_minus(void)
  {
    digitalWrite(motor_Y_DIR,LOW);
    digitalWrite(motor_Y_STEP,HIGH);
    delay(1);
    digitalWrite(motor_Y_STEP,LOW);
    delay(1);        
  }

Odpovědět

Kdo je online

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