• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino i sterowanie silnikiem DC
#1
Sad 
Witajcie!

Jestem tu nowy (świeżak, początkujący itp) dlatego prosze o wyrozumiałość Smile

posiadam Arduino UNO, projekt który chce zrealizować to: sterowanie silnikiem DC za pomocą arduino w taki sposób, że prędkość silnika będzie ustawiana za pomocą potencjometra, dodatkowo chce aby silnik skręcał w prawą stronę po naciśnieniu przycisku, zaś po puszczeniu się zatrzyma. Drugi przycisk będzie odpowiadał za obrót w lewą stronę, i analogicznie jak go puszczę ma się zatrzymać. Próbowalem już wielu sposobów ale niestety nie umiem tego ruszyć.....poniżej przedstawiam kod programu: może ktoś mi podpowie gdzie robię błąd?


Kod:
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int switchPin2 = 4;
int potPin = 0;

void setup()
{
 pinMode(in1Pin, OUTPUT);
 pinMode(in2Pin, OUTPUT);
 pinMode(enablePin, OUTPUT);
 pinMode(switchPin, INPUT_PULLUP);
 pinMode(switchPin2, INPUT_PULLUP);
}

void loop()
{
   int speed = analogRead(potPin) / 4; //odczyt wartości napięcia z portu A0
 if (digitalRead(switchPin) == HIGH){
   digitalWrite(10, HIGH);
   digitalWrite(11,LOW);
   
 } else{
    digitalWrite(10, LOW);
   }
if (digitalRead(switchPin2) == HIGH){
   digitalWrite(9, HIGH);
   digitalWrite(10, LOW);
   
 } else{
    digitalWrite(9, LOW);
   }
 }

 
 
void setMotor1_LEFT (int speed)
{
 analogWrite(enablePin, speed);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
}
void setMotor2_RIGHT (int speed)
{
 analogWrite(enablePin, speed);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, HIGH);
}
  

P.S po wgraniu na arduino nic się nie dzieje, silnik nie reaguje na przyciski.......na zdjęciu brakuje jeszcze 1 przycisku ale jest on podpiety ppod pin 4....

Proszę o pomoc....

Adrian


Załączone pliki Miniatury
   
 
Odpowiedź
#2
A bo i prawa działać nie ma bo jak ma coś działać skoro niema odnośnika do tego . W pętli głównej nie dałeś funkcji odwołującej do samej pracy silników które dałeś osobno jako podprogramy.




Kod:
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int switchPin2 = 4;
int potPin = 0;
int speed1 = 0;

void setup()
{

  Serial.begin(9600);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP); // jak dajesz pull_up to masz na nim zawsze stan wysoki
  pinMode(switchPin2, INPUT_PULLUP); // więc załączał będzie tylko na niskim
}

void loop()
{
    speed1 = analogRead(potPin) / 4; //odczyt wartości napięcia z portu A0


if (digitalRead(switchPin) == LOW){ // tu ma być LOW żeby z przycisku działał
    digitalWrite(10, HIGH);
    digitalWrite(9,LOW); // tutaj jeszcze był błąd ma być 9 a nie 11
    setMotor1_LEFT(speed1); // Tego nie było a to właśnie uruchamia silnik
    
  } else{
     digitalWrite(10, LOW);
    }
if (digitalRead(switchPin2) == LOW){
    digitalWrite(9, HIGH);
    digitalWrite(10, LOW);
    setMotor2_RIGHT(speed1);
  } else{
     digitalWrite(9, LOW);
    }


    
}



void setMotor1_LEFT (int speed1)
{
  analogWrite(enablePin, speed1);
  digitalWrite(in1Pin, HIGH);
  digitalWrite(in2Pin, LOW);
}
void setMotor2_RIGHT (int speed1)
{
  analogWrite(enablePin, speed1);
  digitalWrite(in1Pin, LOW);
  digitalWrite(in2Pin, HIGH);
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#3
Panowie zmienilem calkowicie program (napisalem od nowa) - efekt? silniki działają, teraz chcialbym podpiąc potencjometr by móc sterować szybkością silnika..... tylko jak to zrobić?

Kod:
void setup()
{
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(11, OUTPUT);
 digitalWrite(11, HIGH);
 pinMode(7, INPUT_PULLUP);
 pinMode(4, INPUT_PULLUP);
}

void loop()
{

if (digitalRead(7) == LOW) {
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
}else {
digitalWrite(10, LOW);
digitalWrite(9, LOW);  
if (digitalRead(4) == LOW) {
 
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
}else {
digitalWrite(10, LOW);
digitalWrite(9, LOW);
}
}
}


oto poprawny program który umnie działa........ Smile
 
Odpowiedź
#4
JasQ - bardzo dziekuje Smile program działa - już kapuje co robiłem źle Big Grin jesteś wielki - Bardzo dziękuje!
 
Odpowiedź
#5
Proszę bardzo poprawiony kod mini, ja dodałbym jeszcze wykluczenie bo w tej chwili możesz załączyć 2 przyciski i układ będzie dostawał 2 rozbieżne instrukcje 1 po 2 - giej .

Kod:
void setup(){
 
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(4, INPUT_PULLUP);
 pinMode(7, INPUT_PULLUP);
}

void loop(){
   
if (digitalRead(4) == LOW){
   digitalWrite(10, HIGH);
   digitalWrite(9, LOW);
 } else { digitalWrite(10, LOW); }

 
if (digitalRead(7) == LOW){
   digitalWrite(9, HIGH);
   digitalWrite(10, LOW);
 } else { digitalWrite(9, LOW); }

 analogWrite(11, ( analogRead(A0)/4));
}

kod z wykluczeniem . Teraz jak naciśniesz 2 naraz to silnik będzie stał

Kod:
void setup(){
 
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(4, INPUT_PULLUP);
 pinMode(7, INPUT_PULLUP);
}

void loop(){
   
if (digitalRead(4) == LOW and digitalRead(7) == HIGH ){
   digitalWrite(10, HIGH);
   digitalWrite(9, LOW);
 } else { digitalWrite(10, LOW); }

 
if (digitalRead(7) == LOW and digitalRead(4) == HIGH ){
   digitalWrite(9, HIGH);
   digitalWrite(10, LOW);
 } else { digitalWrite(9, LOW); }

 analogWrite(11, ( analogRead(A0)/4));
}

i kod do sterowania d4 silnik lewo , prawo d7 stop

Kod:
int silnik = 0;

void setup(){
 
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(4, INPUT_PULLUP);
 pinMode(7, INPUT_PULLUP);
}

void loop(){
   
if ( digitalRead(4) == LOW ){
if ( silnik == 0 or silnik == 1 )silnik = 2;
else if ( silnik == 2 )silnik = 1;
delay(250);}

 
if (digitalRead(7) == LOW ){
   digitalWrite(9, LOW);
   digitalWrite(10, LOW);
   silnik = 0;}

analogWrite(11, ( analogRead(A0)/4));

if ( silnik ==  1 ){
 digitalWrite(10, HIGH);
 digitalWrite(9, LOW);}
if ( silnik ==  2 ){
 digitalWrite(9, HIGH);
 digitalWrite(10, LOW);}
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#6
kod wycieraczki samochodowej Big Grin

Kod:
int silnik = 0;
long zmiana = 2000 ; // zmiana obrotów po czasie w milisekundach
long Pm = 0;

void setup(){
  
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(4, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  
}

void loop(){

  unsigned long Cm = millis();
    
if ( digitalRead(4) == LOW ){
if ( silnik == 0 )silnik = 1;
delay(250);}

  
if (digitalRead(7) == LOW ){
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    silnik = 0;
    Pm = Cm;}

analogWrite(11, ( analogRead(A0)/4));

if ( silnik ==  1 ){

if (Cm - Pm < zmiana ){
  digitalWrite(10, HIGH);
  digitalWrite(9, LOW);}
  
if (Cm - Pm > zmiana ){
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);}

if (Cm - Pm > (zmiana*2) ){Pm = Cm;}
  
}
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości