Skocz do zawartości

Program do sterowania silnikami


Aarm

Pomocna odpowiedź

Mam problem z programem do sterowania silnikami.

Mam Arduino Mega 2560, dwukanałowy sterownik silników VNH5019 (shield dla Arduino), modul bluetooth HC05, 4 silniki pololu 34:1 6V 6A, akumulator LiPol 7,4V.

Uzywam programu Bluetooth RC Controller

Niestety ale nie umiem napisac programu do sterowania, znalazlem gotowy ale niestety nie dziala.

Bardzo prosze o pomoc.

#include "DualVNH5019MotorShield.h" 
DualVNH5019MotorShield md; 
char dataIn='S';char determinant;char det;int vel = 0; //Bluetooth Stuff 
//int power = 4; // Remove This To Enable Tollge Switch #2 
int overdrive = 13; //Press Toggle Switch #1, the pin13 LED will light up 

void setup(){ 
Serial.begin(9600);md.init(); 
/*pinMode(power , OUTPUT);*/ //toggle switch function 
pinMode(overdrive, OUTPUT); 
} 

void loop(){ det = check(); // You'l need to reconstruct this if your not using the Pololu Dual VNH5019 

while (det == 'F') // F, move forward 
{md.setSpeeds(vel,vel);det = check();} 

while (det == 'B') // B, move back 
{md.setSpeeds(-vel,-vel);det = check();} 

while (det == 'L') // L, move wheels left 
{md.setSpeeds(vel/4,vel);det = check();} 

while (det == 'R') // R, move wheels right 
{md.setSpeeds(vel,vel/4);det = check();} 

while (det == 'I') // I, turn right forward 
{md.setSpeeds(vel,vel/2);det = check();} 

while (det == 'J') // J, turn right back 
{md.setSpeeds(-vel,-vel/2);det = check();} 

while (det == 'G') // G, turn left forward 
{md.setSpeeds(vel/2,vel);det = check();} 

while (det == 'H') // H, turn left back 
{md.setSpeeds(-vel/2,-vel);det = check();} 

while (det == 'S') // S, stop 
{md.setSpeeds(0,0);det = check();} 

//---------------------Toggle switch code------------------// 
/* while (det == 'U') 
{digitalWrite(power, HIGH);det = check();} 
while (det == 'u') 
{digitalWrite(power, LOW);det = check();}*/ 
//---------------------Mains Power------------------// 
while (det == 'W') 
{digitalWrite(overdrive, HIGH);det = check();} 
while (det == 'w') 
{digitalWrite(overdrive, LOW);det = check();} 
} 

int check() 
{if (Serial.available() > 0) {dataIn = Serial.read(); 
if (dataIn == 'F'){determinant = 'F';} 
else if (dataIn == 'B'){determinant = 'B';}else if (dataIn == 'L'){determinant = 'L';} 
else if (dataIn == 'R'){determinant = 'R';}else if (dataIn == 'I'){determinant = 'I';} 
else if (dataIn == 'J'){determinant = 'J';}else if (dataIn == 'G'){determinant = 'G';} 
else if (dataIn == 'H'){determinant = 'H';}else if (dataIn == 'S'){determinant = 'S';} 
else if (dataIn == '0'){vel = 400;}else if (dataIn == '1'){vel = 380;} 
else if (dataIn == '2'){vel = 340;}else if (dataIn == '3'){vel = 320;} 
else if (dataIn == '4'){vel = 280;}else if (dataIn == '5'){vel = 240;} 
else if (dataIn == '6'){vel = 200;}else if (dataIn == '7'){vel = 160;} 
else if (dataIn == '8'){vel = 120;}else if (dataIn == '9'){vel = 80;} 
else if (dataIn == 'q'){vel = 40;}else if (dataIn == 'U'){determinant = 'U';} 
else if (dataIn == 'u'){determinant = 'u';}else if (dataIn == 'W'){determinant = 'W';} 
else if (dataIn == 'w'){determinant = 'w';}}return determinant;} 
Link do komentarza
Share on other sites

No dobra, a teraz Ty wyobraź sobie taką sytuację: przyciągam do Ciebie na lawecie mój samochód i mówię: "Niestety nie jeździ, zrób coś" 😐

Przecież w tym zestawie nie działać może wszystko. Począwszy od zasilania (zbyt niskie napięcie, zbyt mała wydajność zasilacza) , poprzez komunikację BT (jest sparowany z kompem?), łączność procesora z modułem BT (jaka jest prędkość UARTa modułu, gdzie masa i jego zasilanie?) itd.. Może napisz coś więcej. Czy rozumiesz jak to wszystko ma działać? To wykonaj po kolei testy upewniając się, że każdy element po kolei sprawdziłeś i jest OK. Pomierz napięcia, sprawdź jak jest ustawiony moduł (9600?), sprawdź jego zasilanie, poziomy sygnałów RX i TX, wykonaj proste testy silników bez komunikacji, po prostu ustawiając jakieś wysterowania, sprawdź kontakt z modułem BT, poprawność komunikacji przez UART itd... Powoli, systematycznie, krok po kroku. Opisz wszystko co zrobiłeś, jakie były wyniki testów i pokaż na czym się zaciąłeś, czego nie rozumiesz albo co jest niezgodne z Twoimi oczekiwaniami. To Ty powinieneś wiedzieć jak to ma działać i czego się spodziewać w każdym punkcie tego układu. Po prostu to sprawdź czy tak jest.

Link do komentarza
Share on other sites

Wszsytko jest sprawne. Masa i zasilanie modulu bluetooth sa tylko nie zaznaczylem ich na rys. Dopiero zaczynam "zabawe" z tym wszsytkim i z programowaniem mam problem.

Wczesniej mialem slabsze silniki i inny sterownik, wszystko dzialalo.

schemat polaczenia:

i kod

#include "SoftwareSerial.h"// import the serial library

const int sensorPin= A2;
const int buzzerPin= A3;
int smoke_level;
const int IN1=3;
const int IN2=5;
const int IN3=6;
const int IN4=9;
int BluetoothData;
SoftwareSerial HC05(10, 11); // RX, TX
int  SPEED_Control=200;
void setup() {
 // fIRST , define the Motor's pin as an OUTPUT
 pinMode(sensorPin, INPUT);//the smoke sensor will be an input to the arduino
pinMode(buzzerPin, OUTPUT);//the buzzer serves an output in the circuit
pinMode( IN1 ,OUTPUT);// Right Motor 1st wire
pinMode( IN2 ,OUTPUT);// Right Motor 2nd wire
pinMode( IN3 ,OUTPUT);// left Motor 1st wire
pinMode( IN4 ,OUTPUT);// left Motor 2nd wire
pinMode (13, OUTPUT);
pinMode (7, OUTPUT);




HC05.begin(9600);
}
void FORWARD(int Speed){
 //When we want to let Motor To Rotate clock wise
 // just void this part on the loop section .

 analogWrite(IN1,0);
 analogWrite(IN2,Speed);
 analogWrite(IN3,Speed);
 analogWrite(IN4,0);
}
void BACKWARD(int Speed){
 //When we want to let Motor To Rotate Counter clock wise
 // just void this part on the loop section .
 analogWrite(IN1,Speed);
 analogWrite(IN2,0);
 analogWrite(IN3,0);
 analogWrite(IN4,Speed);
}
void LEFT(int Speed){
 //When we want to let Motor To Rotate Counter clock wise
 // just void this part on the loop section .
 analogWrite(IN1,0);
 analogWrite(IN2,Speed);
 analogWrite(IN3,0);
 analogWrite(IN4,Speed);
}
void RIGHT(int Speed){
 //When we want to let Motor To Rotate Counter clock wise
 // just void this part on the loop section .
 analogWrite(IN1,Speed);
 analogWrite(IN2,0);
 analogWrite(IN3,Speed);
 analogWrite(IN4,0);
}

void Stop(){
 //When we want to let Motor To Rotate clock wise
 // just void this part on the loop section .
 analogWrite(IN1,0);
 analogWrite(IN2,0);
 analogWrite(IN3,0);
 analogWrite(IN4,0);
}

void loop() {
//Rise Up
smoke_level= analogRead(sensorPin); //arduino reads the value from the smoke sensor
Serial.println(smoke_level);//prints just for debugging purposes, to see what values the sensor is picking up
if(smoke_level > 200){ //if smoke level is greater than 200, the buzzer will go off
digitalWrite(buzzerPin, HIGH);
}
else{
digitalWrite(buzzerPin, LOW);
}

 if (HC05.available()){
BluetoothData=HC05.read();
Serial.println(BluetoothData);

 if(BluetoothData=='F'){   // if number 1 pressed .... 
  FORWARD(SPEED_Control);
  }
 if(BluetoothData=='B'){   // if number 1 pressed .... 
 BACKWARD(SPEED_Control);
  }
 if(BluetoothData=='L'){   // if number 1 pressed .... 
 RIGHT(SPEED_Control);

  }
 if(BluetoothData=='R'){   // if number 1 pressed ....
  LEFT(SPEED_Control);
  }
   if(BluetoothData=='S'){   // if number 1 pressed ....
 Stop();
  }
  if(BluetoothData=='0'){  SPEED_Control=0 ;}//Speed 
  if(BluetoothData=='1'){  SPEED_Control=50; }//Speed 
  if(BluetoothData=='2'){  SPEED_Control=100; }//Speed 
  if(BluetoothData=='3'){  SPEED_Control=120; }//Speed 
  if(BluetoothData=='4'){  SPEED_Control=140; }//Speed 
  if(BluetoothData=='5'){  SPEED_Control=160; }//Speed 
  if(BluetoothData=='6'){  SPEED_Control=180; }//Speed 
  if(BluetoothData=='7'){  SPEED_Control=200; }//Speed 
  if(BluetoothData=='8'){  SPEED_Control=220; }//Speed 
  if(BluetoothData=='9'){  SPEED_Control=240; }//Speed 
  if(BluetoothData=='q'){  SPEED_Control=255; }//Speed   
 }
     if(BluetoothData=='W'){   // if number 1 pressed ....
 digitalWrite(13, HIGH);
  }
   if(BluetoothData=='w'){   // if number 1 pressed ....
 digitalWrite(13, LOW);
  }
        if(BluetoothData=='U'){   // if number 1 pressed ....
 digitalWrite(7, HIGH);
  }
   if(BluetoothData=='u'){   // if number 1 pressed ....
 digitalWrite(7, LOW);
  }

}
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

No dobrze, ale nie zrobiłeś niczego o co prosiłem. Pokazałeś schemat jakiegoś innego urządzenia i inny program który na nim działa. Naprawdę wierzę, że istnieją na świecie inne samochody, które jeżdżą. Tylko dlaczego mój nie chce?

Miałeś przeprowadzić testy każdego elementu z osobna. Nie udowadniaj, że potrafisz kopiować urządzenia z cudzych projektów tylko pokaż, że rozumiesz jak ma działać to co chcesz zrobić.

Proste pytania:

1. Czy wiesz jak sprawdzić, czy działa komunikacja komputer-procesor przez BT?

2. Czy wiesz jak sprawdzić, czy działa driver silników?

3. Czy samodzielnie umiesz choćby pomrugać diodą LED za pomocą płytki Arduino?

4. Czy rozumiesz działanie pierwszego programu, który nam pokazałeś?

Jeżeli na któreś z tych pytań odpowiedź brzmi NIE, zabrałeś się za to hobby od złej strony i powinieneś przejść kurs konstrukcji i programowania Arduino od zera. Dlaczego myślałeś, że będziemy za Ciebie szukać błędów w jakimś kodzie ściągniętym z sieci tylko dlatego, że Tobie wydaje się, że powinien działać. Nikt za Ciebie nie nauczy się programowania a najlepszą metodą są małe kroki. Zrób chociaż jeden: napisz samodzielnie prosty kawałek programu który zweryfikuje działanie najprostszej rzeczy w Twoim zestawie. Zaproponuj co to będzie za rzecz, na czym będzie polegał test, jakich wyników oczekujesz i jakie otrzymałeś. Tak to działa. Czekamy.

Link do komentarza
Share on other sites

1. Komunikacja jest bt jest z telefonem i ona dziala

2.Sterownik tez jest sprawny, napisalem prosty program do obracania silnikami

3.Tak

3.Nie, rozumiem ten 2 i dlatego nie wiem czemu program ponizej nie dziala ze sterownikiem polou

#include "SoftwareSerial.h"// import the serial library

const int IN1=2;
const int IN2=4;
const int IN3=7;
const int IN4=8;
int BluetoothData;
SoftwareSerial HC05(1, 2); // RX, TX
int  SPEED_Control=200;
void setup() {
pinMode( IN1 ,OUTPUT);
pinMode( IN2 ,OUTPUT);
pinMode( IN3 ,OUTPUT);
pinMode( IN4 ,OUTPUT);




HC05.begin(9600);
}
void FORWARD(int Speed){

 analogWrite(IN1,0);
 analogWrite(IN2,Speed);
 analogWrite(IN3,Speed);
 analogWrite(IN4,0);
}
void BACKWARD(int Speed){
 analogWrite(IN1,Speed);
 analogWrite(IN2,0);
 analogWrite(IN3,0);
 analogWrite(IN4,Speed);
}
void LEFT(int Speed){
 analogWrite(IN1,0);
 analogWrite(IN2,Speed);
 analogWrite(IN3,0);
 analogWrite(IN4,Speed);
}
void RIGHT(int Speed){
 analogWrite(IN1,Speed);
 analogWrite(IN2,0);
 analogWrite(IN3,Speed);
 analogWrite(IN4,0);
}

void Stop(){
 analogWrite(IN1,0);
 analogWrite(IN2,0);
 analogWrite(IN3,0);
 analogWrite(IN4,0);
}

void loop() {

 if (HC05.available()){
BluetoothData=HC05.read();
Serial.println(BluetoothData);

 if(BluetoothData=='F'){   
  FORWARD(SPEED_Control);
  }
 if(BluetoothData=='B'){   
 BACKWARD(SPEED_Control);
  }
 if(BluetoothData=='L'){   
 RIGHT(SPEED_Control);

  }
 if(BluetoothData=='R'){  
  LEFT(SPEED_Control);
  }
   if(BluetoothData=='S'){   
 Stop();
  }
  if(BluetoothData=='0'){  SPEED_Control=0 ;}
  if(BluetoothData=='1'){  SPEED_Control=50; }
  if(BluetoothData=='2'){  SPEED_Control=100; }
  if(BluetoothData=='3'){  SPEED_Control=120; }
  if(BluetoothData=='4'){  SPEED_Control=140; }
  if(BluetoothData=='5'){  SPEED_Control=160; }
  if(BluetoothData=='6'){  SPEED_Control=180; }
  if(BluetoothData=='7'){  SPEED_Control=200; }
  if(BluetoothData=='8'){  SPEED_Control=220; }
  if(BluetoothData=='9'){  SPEED_Control=240; }
  if(BluetoothData=='q'){  SPEED_Control=255; }
 }

}
Link do komentarza
Share on other sites

No to teraz ja nie rozumiem. Skoro masz działającą komunikację oraz prosty program do silników, to dodaj do niego funkcję np. FORWARD i sprawdź czy ona działa. Wywołaj ją dla kilku różnych parametrów w odstępach powiedzmy 2 sekundowych i patrz czy i jak kręcą silniki. Nie? No to z tym i tylko z tym się męcz. Potem "podłącz" ją do odczytu z BT i tak kolejno z każdą funkcją. Pamiętaj, małe kroki. Żaden większy program nie działa od razu. Zacznij od prostego a potem go rozbudowuj bazując na tym, że to co już masz na pewno działa i jest sprawdzone na kilka sposobów. Wtedy po dopisaniu kilku nowych linijek kodu wiesz, że błędy są w tych linijkach.

Pokaż nam ten prosty, działający program silników a potem zmień go tak, by znalazła się w nim funkcja np. FORWARD dokładnie taka jaką nam pokazałeś. Odpal to i powiedz co widzisz. Tak wygląda uruchamianie programów - linijka po linijce. Do roboty.

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!

Gość
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.