Skocz do zawartości

Sterowanie serwomechanizmami - joystick shield + nrf24l01


belkocik

Pomocna odpowiedź

Czesc. Podlaczylem serwa wedlug schematu w zalaczniku tylko zasilanie jest 6v z dwoch aku 18650 zamiast baterii 9v. Arduino uno i joystick shield zasilany bedzie z portu USB do komunikacji. Mialem problem z napisaniem programu zeby tym sterowac i nie jestem pewny czy go wgrywac zeby nie bylo fajerwerkow tak wiec wole sie zapytac czy kod jest poprawny. Zostal napisany prze zemnie sugerujac sie projektami z sieci oraz roznych poradnikow. Jestem raczej zielony w te klocki tak wiec jest tam pewnie masa bledow. ;/ Celem jest aby dwa serwa (micro praca ciagla 360) krecily sie do przodu jesli skieruje joystick na pozycje gorna, a w przypadku krecenia w druga strone to joystick skierowany w dol (poruszanie tylko w osi y - przod, tyl). Trzecie serwo typu standard tez o pracy ciaglej 360 po nacisneciu przycisku na joystick shield np. (A) ma krecic sie w jedna strone - ponowne  jego nacisniecie spowoduje zatrzymanie sie serwomechanizmu, a po nacisnieciu np. przycisku (B) ma krecic sie w druga strone i tez po ponownym nacisnieciu ma sie zatrzymac serwomechanizm. Tego zabraklo w kodzie bo nie mam pojecia jak za to sie zabrac.

Bardzo prosze o pomoc o sprawdzenie kodu oraz jesli cos nie gra to nakierowanie czego mam sie douczyc i czego szukac. Dziekuje bardzo z gory 🙂

edit: Przy okazji zapytam, czy plytka stykowa wytrzyma ok. 3A - przy zablokowanych walach (jak wlacze wszystkie serwa)?

//JOYSTICK SHIELD + UNO

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

#define CE_PIN   9
#define CSN_PIN 10

#define y_axis A1 // y axis
#define button1 8 // joystick button
#define button2 2 // A button
#define button3 3 // B button
#define button4 4 // C button
#define button5 5 // D button
#define button6 6 // E button
#define button7 7 // F button

const uint64_t pipe = 0xE8E8F0F0E1LL; 
RF24 radio(CE_PIN, CSN_PIN); 
int data[8];  

void setup()  
{
  radio.begin();
  radio.openWritingPipe(pipe);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  pinMode(button5, INPUT);
  pinMode(button6, INPUT);
  pinMode(button7, INPUT);
}


void loop()  
{
  data[0] = analogRead(y_axis);
  data[1] = digitalRead(button1);
  data[2] = digitalRead(button2);
  data[3] = digitalRead(button3);
  data[4] = digitalRead(button4);
  data[5] = digitalRead(button5);
  data[6] = digitalRead(button6);
  data[7] = digitalRead(button7);
  radio.write( data, sizeof(data) ); 
}
// UNO + serwa

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

#define A1 3 // pin PWM - sygnal SERVO micro [servo1m]
#define A2 5 // pin PWM - sygnal SERVO micro [servo2m]
#define A3 6 // pin PWM - sygnal SERVO standaard [servo3s]

Servo servo1m, servo2m, servo3s;
int pozycja = 0;
int zmiana = 6;


//NRF CONFIG {

#define CE_PIN   9
#define CSN_PIN 10

const uint64_t pipe = 0xE8E8F0F0E1LL;

RF24 radio(CE_PIN, CSN_PIN); 

int data [8];

// }

void setup() {
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);

  servo1m.attach(A1);
  servo2m.attach(A2);
  // servo3s.attach(A3);
  

  Serial.begin(9600);  

  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1,pipe);
  radio.startListening();
}

void przod()
{
  if (pozycja < 360) { //Jeśli pozycja mieści się w zakresie
    servo1m.write(pozycja); //Wykonaj ruch pierwszego serwa
    servo2m.write(pozycja); //Wykonaj ruch drugiego serwa
  }
  pozycja = pozycja + zmiana; // ruch w przod (+)
}  

void tyl()
{
    if (pozycja < 360) { //Jeśli pozycja mieści się w zakresie 0-360
    servo1m.write(pozycja); //Wykonaj ruch pierwszego serwa
    servo2m.write(pozycja); //Wykonaj ruch drugiego serwa
  }
  pozycja = pozycja - zmiana; // ruch w tyl (-)
}
  

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

   Serial.print("Y: "); 
 
Serial.println(data[0]);
    
    odczyt(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]); 
  }

}

void odczyt(int y_axis, int button1, int button2, int button3, int button4, int button5, int button6, int button7) 
{

  if(y_axis>600)
  {
    przod();
  }
  else if(y_axis<400)
    {
    tyl();   
    }
}
  

 

schemat serwo_bb.png

66398184_319978478879285_1621758128888479744_n.jpg

66824204_929289284087987_2514252118248914944_n.jpg

Edytowano przez belkocik
Link do komentarza
Share on other sites

8 godzin temu, belkocik napisał:

po nacisneciu przycisku na joystick shield np. (A) ma krecic sie w jedna strone - ponowne  jego nacisniecie spowoduje zatrzymanie sie serwomechanizmu, a po nacisnieciu np. przycisku (B) ma krecic sie w druga strone i tez po ponownym nacisnieciu ma sie zatrzymac serwomechanizm. Tego zabraklo w kodzie bo nie mam pojecia jak za to sie zabrac.

Pierwsze co musisz zrobić to wyeliminować drżenie styków, następnie zbuduj liczniki do 2 i zależnie od ich stanu uruchamiaj obroty w prawo, lewo lub zatrzymaj silnik.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)
5 godzin temu, InspektorGadzet napisał:

Pierwsze co musisz zrobić to wyeliminować drżenie styków, następnie zbuduj liczniki do 2 i zależnie od ich stanu uruchamiaj obroty w prawo, lewo lub zatrzymaj silnik.

Dziekuje za odpowiedz 🙂 Mozna bardziej rozwinac mysl o budowie tego licznika. Nie za bardzo rozumiem jak by mial ten kod wygladac. Troche pobuszowalem po sieci i nie moge znalezc informacji o budowie licznika i wykorzystaniu go do takiej funkcji. O drzenie stykow to w przypadku tego rozwiazania jakbym uzywal jeden przycisk do dwoch funkcji - 1. wlaczanie lewych obrotow, 2. zatrzymanie sie -zytalem ze odstepy czasowe zalatwiaja sprawe, a co jesli przypisze jedna funkcje do jednego przycisku - (bo jest ich 7 na joystick shield wiec mam pole do manewru) to nie bede musial kombinowac z tym timerem i eliminacja drzenia stykow? Szczerze mowiac to ciezko znalezc cokolwiek na ten temat. ;/ Chcialbym zeby kod byl najlatwiejszy do napisania poniewaz jestem bardzo slaby z programowania. Ewentualnie jakich zagadnien mam szukac w ksiazkach/sieci.

edit: wgralem ten kod. Serwa ciagle kreca sie powoli w jedna strone, nie reaguja na ruch joysticka.

Edytowano przez belkocik
Link do komentarza
Share on other sites

3 godziny temu, belkocik napisał:

ozna bardziej rozwinac mysl o budowie tego licznika. Nie za bardzo rozumiem jak by mial ten kod wygladac.

Licznik do 2

zmienna++;
zmienna &= 1;

Inne, których podstawą jest potęga liczby 2 tak samo tyle, że zamiast &=1 musisz wpisać &=3, &=7 itd. inne pojemności

if( zmienna >= POJEMNOSC ) zmienna=0;

 

3 godziny temu, belkocik napisał:

Troche pobuszowalem po sieci i nie moge znalezc informacji o budowie licznika i wykorzystaniu go do takiej funkcji.

Pełno tego w sieci, w każdym kursie programowania znajdziesz takie przykłady.

 

3 godziny temu, belkocik napisał:

-zytalem ze odstepy czasowe zalatwiaja sprawe,

Nie najlepszy pomysł ale często skuteczny i wystarczający. Moim zdaniem dobry jest programowy filtr RC.

 

3 godziny temu, belkocik napisał:

to nie bede musial kombinowac z tym timerem i eliminacja drzenia stykow? Szczerze mowiac to ciezko znalezc cokolwiek na ten temat

Słabo szukałeś, bo tak samo jak w przypadku liczników pełno tego w sieci, w każdym kursie programowania to znajdziesz.

Z jakimi kursami dotychczas się zapoznałeś? Jakie książki czytałeś?

Edytowano przez InspektorGadzet
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

24 minuty temu, InspektorGadzet napisał:

Licznik do 2


zmienna++;
zmienna &= 1;

Inne, których podstawą jest potęga liczby 2 tak samo tyle, że zamiast &=1 musisz wpisać &=3, &=7 itd. inne pojemności


if( zmienna >= POJEMNOSC ) zmienna=0;

 

Pełno tego w sieci, w każdym kursie programowania znajdziesz takie przykłady.

 

Nie najlepszy pomysł ale często skuteczny i wystarczający. Moim zdaniem dobry jest programowy filtr RC.

 

Słabo szukałeś, bo tak samo jak w przypadku liczników pełno tego w sieci, w każdym kursie programowania to znajdziesz.

Z jakimi kursami dotychczas się zapoznałeś? Jakie książki czytałeś?

Szkola programowania Stefana Prata, ale nie od deski do deski tylko zagadnienia ktore byly mi potrzebne i to pol roku temu i do pare tematow z cpp0x z tego co pamietam. Mialem malo wspolnego z programowaniem dlatego mam teraz wielki problem. Zrobic kurs to jedno bo wszystko masz na przykladach, a pozniej zrobic cos samemu zeby dzialalo to trzeba glowkowac. Nawet proste funkcje nie chca mi dzialac.

Link do komentarza
Share on other sites

Zacznij więc od kursu Arduino na Forbocie. Innego pomysłu nie mam, bo gdy ja się uczyłem programowania w C (zeszłe tysiąclecie) to Arduino jeszcze nie istniało. Nie wiem jakie są dobre kursy Arduino. Co do C, też nie mam pojęcia, książki, które miałem rozdałem. Jak cos potrzebuję wpisuję w Google C/C++ i naprzód.

Edytowano przez InspektorGadzet
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.