01-09-2015, 16:31
Witam.
w najbliższym czasie zamierzam zabrać się za zbudowanie robota, który napędzany będzie jednym silnikiem DC wraz z przekładnią oraz 2 serwami. Do sterowania tymi komponentami użyję Motor Shielda V1 - link- niestety nie posiadam wersji V2, modułu nadajnika i odbiornika radiowego 433 Mhz - link, dwóch Arduino UNO oraz 2 joysticków 5V od PS2.
Z początku chciałem wykorzystać moduł NRF24L01 jednak okazało się, że wykorzystuje on te same piny co motor shield i nie mógł bym wykorzystać silnika DC tylko serwo, co w moim przypadku nie wchodzi w grę, dlatego zdecydowałem się na moduł RF.
Napisanie kodu niestety mnie przerosło, gdyż co tu dużo mówić jestem zielony w tym temacie.
Jeżeli ktoś zna się na tym lepiej niż ja, był bym bardzo wdzięczny za pomoc w modyfikacji kodu czyli:
- zastąpieniu 2 silników DC na 1 silnik(sterowany pierwszym joystickiem) i dodaniu dwóch serv(sterowanych przy pomocy drugiego joysticka)
Nadajnik:
Odbiornik:
Z góry chciałbym podziękować za pomoc i poświęcony czas.
w najbliższym czasie zamierzam zabrać się za zbudowanie robota, który napędzany będzie jednym silnikiem DC wraz z przekładnią oraz 2 serwami. Do sterowania tymi komponentami użyję Motor Shielda V1 - link- niestety nie posiadam wersji V2, modułu nadajnika i odbiornika radiowego 433 Mhz - link, dwóch Arduino UNO oraz 2 joysticków 5V od PS2.
Z początku chciałem wykorzystać moduł NRF24L01 jednak okazało się, że wykorzystuje on te same piny co motor shield i nie mógł bym wykorzystać silnika DC tylko serwo, co w moim przypadku nie wchodzi w grę, dlatego zdecydowałem się na moduł RF.
Napisanie kodu niestety mnie przerosło, gdyż co tu dużo mówić jestem zielony w tym temacie.
Jeżeli ktoś zna się na tym lepiej niż ja, był bym bardzo wdzięczny za pomoc w modyfikacji kodu czyli:
- zastąpieniu 2 silników DC na 1 silnik(sterowany pierwszym joystickiem) i dodaniu dwóch serv(sterowanych przy pomocy drugiego joysticka)
Nadajnik:
Kod:
#include <VirtualWire.h>
const int transmit_pin = 3; // do tego pinu pin TX nadajnika XY-FST
int joystickPion = A0; // pin joysticka dla pionu
int joystickPoziom=A1; // pin joysticka dla poziomu
int a,b; // zmienne pomocnicze do obliczeń
long X = 0; // zmienna wynikowa, do przetworzenia w wiadomości
char wiadomosc[10]; // wiadomość tekstowa
// ------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
// konfiguracja nadajnika i protokołu transmisji
vw_set_tx_pin(transmit_pin);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
// -----------------------------------------------------------------------------
void loop() {
// czytamy stan manetek joysticka
a=analogRead(joystickPion);Serial.println(a);
b=analogRead(joystickPoziom);Serial.println(b);Serial.println("------");
X = a+b*1024L; // przetwarzamy stany na liczbę
ltoa(X, wiadomosc,10); // zamiana liczby na text do wysłania
vw_send((uint8_t *)wiadomosc, strlen(wiadomosc)); // wysłanie wiadomości
vw_wait_tx(); // konieczne dla skomunikowania modułów Nad.-Odb.
}
Odbiornik:
Kod:
#include <VirtualWire.h>
// --- piny dla układu L293D ( nie możesz używać pinu nr 3 !!! )------
#define IN1 2 // dla silnika 1 (przód-tył)
#define IN2 4 // dla silnika 1 (przód-tył)
#define EN1 10 // koniecznie pin PWM (~)
#define IN3 6 // dla serwa (lewo-prawo)
#define IN4 7 // dla serwa (lewo-prawo)
#define EN2 11 // koniecznie pin PWM (~)
// --- moce silników -------------------------------------------------
int PWM1;
int PWM2;
// --- zmienne -------------------------------------------------------
char *kierunek; // kierunek ruchu, potrzebne tylko dla Seriala :-)
long X; // stan joysticka XY (przetworzona wiadomość)
// --- dla modułu XY-MK ----------------------------------------------
const int receive_pin = 3; // koniecznie ten pin
char wiadomosc[10]; // odebrana wiadomość
// -------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
vw_set_rx_pin(receive_pin); // konfiguracja odbiornika
vw_set_ptt_inverted(true); // konfiguracja protokołu
vw_setup(2000); // konfiguracja protokołu
vw_rx_start(); // start odbiornika
// --- konfiguracja pinów ------------------------------------------
pinMode(IN1,OUTPUT);digitalWrite(IN1,LOW);
pinMode(IN2,OUTPUT);digitalWrite(IN2,LOW);
pinMode(IN3,OUTPUT);digitalWrite(IN3,LOW);
pinMode(IN4,OUTPUT);digitalWrite(IN4,LOW);
pinMode(EN1,OUTPUT);
pinMode(EN2,OUTPUT);
}
// -------------------------------------------------------------------
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN]; // definiujemy bufor do odbioru inf.
uint8_t buflen = VW_MAX_MESSAGE_LEN; // rozmiar bufora
if (vw_get_message(buf, &buflen)) // pobieramy wiadomość
{
int i;
for (i = 0; i < buflen; i++) // kopiujemy ją do zmiennej wiadomosc
{
wiadomosc[i] = char(buf[i]);
}
wiadomosc[buflen] = '\0'; // znak końca tekstu
X = atol(wiadomosc); // przetwarzamy tekst na liczbę
PWM1 = (int)(X%1024L); // obliczamy wychylenie w osi Y
if(PWM1>535){kierunek="do przodu";digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);PWM1 = map(PWM1,535,1023,0,255);analogWrite(EN1,PWM1);}
else if(PWM1<505){kierunek="do tylu";digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);PWM1 = map(PWM1,505,0,0,255);analogWrite(EN1,PWM1);}
if(PWM1>=505 && PWM1<=535){kierunek=" stop ";PWM1=0;analogWrite(EN1,0);}
Serial.print("Silnik 1: kierunek: ");Serial.print(kierunek);Serial.print(" moc: ");Serial.println(PWM1);
PWM2 = int(X/1024L); // obliczamy wychylenie w osi X
if(PWM2>535){kierunek="w prawo ";digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);PWM2 = map(PWM2,535,1023,0,255);analogWrite(EN2,PWM2);}
else if(PWM2<505){kierunek="w lewo";digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);PWM2 = map(PWM2,505,0,0,255);analogWrite(EN2,PWM2);}
if(PWM2>=505 && PWM2<=535){kierunek=" stop ";PWM2=0;analogWrite(EN2,0);}
Serial.print("Silnik 2: kierunek: ");Serial.print(kierunek);Serial.print(" moc: ");Serial.println(PWM2);
Serial.println("--------------------------------------");
}
}
Z góry chciałbym podziękować za pomoc i poświęcony czas.