• 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
warunkowe płynne zatrzymanie silnika DC
#1
Witajcie,
od kilku dni borykam się z napisaniem programu, który steruje jednym silnikiem DC i dwoma serwami. Udało mi się zmodyfikować i połączyć przykładowe programy do mojego projektu i wszystko działa tak jak bym chciał poza jednym elementem.
Chciałbym, aby po wykonaniu trzech ruchów serwem, silnik DC płynnie się zatrzymał. W obecnym projekcie silnik zatrzymuje się gwałtownie. Mam w projekcie łagodne zatrzymanie silnika, ale tylko po wciśnięciu przycisku. Wiem, że w kodzie gdzieś brakuje pętli, ale nie wiem gdzie i jak ją wpisać.
Co powinienem dopisać, żeby po wykonaniu 3 ruchów serwa silnik płynnie się zatrzymał?
Fragment kodu, który zatrzymuje silnik po 3 ruchach serwa nr2 jest na samym końcu pętli loop i zaczyna się od if (licznik < 3)...



/*

24.09.2018 silnik 2 serwa 5 włączników zatrzymanie po 3 ruchach serwa, uruchamianie silnika przyciskiem start brak miękkiego stopu
Controlling a servo with two Push buttons with Arduino
when Left push button is pressed, the servo start moving to the left until it reaches 180( or zero) degrees
when Right push button is pressed, the servo start moving to the right until it reaches 180( or zero) degrees
At any instance if the button is released, servo stops

May 22, 2018 at 01:00
Written by Ahmad S. for Robojax.com at Ajax, Ontario, Canada
Watch video for this code at https://youtu.be/7woqNH_qby4
This code is taken from http://robojax.com/learn/arduino
*/
//serwa
#include <Servo.h>

Servo myservo; // create servo object to control a servo
Servo myservo2; // create servo 2 object to control a servo 2

int angle =90; // initial angle for servo
int angleStep =20;
int angle2 =90;
int angleStep2 =20;
int i =0;
int licznik =0; // dana początkowa do licznika ruchów serwa 2
int b =1; // dana większająca zmienną 'licznik' po każdym ruchu serwa 2

int motorStep =1;
#define LEFT 12 // pin 12 is connected to left button
#define RIGHT 2 // pin 2 is connected to right button
#define RIGHT2 4

//silnik

int STBY = 10; //standby

//Motor A
int PWMA = 3; //Speed control
int AIN1 = 5; //Direction
int AIN2 = 8; //Direction

//Motor B
int PWMB = 7; //Speed control
int BIN1 = 1; //Direction
int BIN2 = 0; //Direction

#define SilnikStart 11
#define SilnikStop 13

void setup() {
// Servo button demo by Robojax.com
Serial.begin(9600); // setup serial
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo2.attach(6);
pinMode(LEFT,INPUT_PULLUP); // assign pin 12 ass input for Left button
pinMode(RIGHT,INPUT_PULLUP);// assing pin 2 as input for right button
pinMode(RIGHT2,INPUT_PULLUP); // pin uruchamiający pojedynczy ruch serwa 2
myservo.write(angle);// send servo to the middle at 90 degrees
myservo2.write(angle2); //send servo2 to the middle at 90 degrees

Serial.println("Robojax Servo Button ");

//silnik
pinMode(STBY, OUTPUT);

pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);

pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(SilnikStart, INPUT_PULLUP);
pinMode(SilnikStop, INPUT_PULLUP);
}


void loop() {
// Servo button demo by Robojax.com
while(digitalRead(RIGHT) == LOW){

if (angle > 0 && angle <= 180) {
angle = angle - angleStep;
if(angle < 0){
angle = 0;
}else{
myservo.write(angle); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(angle); // print the angle
Serial.println(" degree");
}
}

delay(1000); // waits for the servo to get there
}// while
// Servo button demo by Robojax.com

while(digitalRead(LEFT) == LOW){

// Servo button demo by Robojax.com
if (angle >= 0 && angle <= 180) {
angle = angle + angleStep;
if(angle >180){
angle =180;
}else{
myservo.write(angle); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(angle); // print the angle
Serial.println(" degree");
}
}

delay(1000); // waits for the servo to get there
}//

//serwo 2

while(digitalRead(RIGHT2) == LOW){
// change the angle for next time through the loop:
angle2 = angle2 + angleStep2;
licznik = licznik + b;

// reverse the direction of the moving at the ends of the angle:
if (angle2 <= 0 || angle2 >= 180) {
angleStep2 = -angleStep2;
}
myservo2.write(angle2); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(angle2); // print the angle
Serial.println(" degree");
delay(1000); // waits for the servo to get there

}
//silnik


while(digitalRead(SilnikStart) == LOW)
{licznik = 0;
for (int i = 0; i <= 128; i++){

move(1, i, 1); //motor 1, full speed, left
delay(15);

}
}

while(digitalRead(SilnikStop) == LOW)
{

for (int j = 128; j >= 0; j=j-1)
{
move(1, j, 1); //motor 1, full speed, left
delay(15);
}
}


if (licznik < 3) {licznik = licznik;
}
else{ move(1, 0, 1);
}
}



void move(int motor, int speed, int direction){
//Move specific motor at speed and direction
//motor: 0 for B 1 for A
//speed: 0 is off, and 255 is full speed
//direction: 0 clockwise, 1 counter-clockwise

digitalWrite(STBY, HIGH); //disable standby

boolean inPin1 = LOW;
boolean inPin2 = HIGH;

if(direction == 1){
inPin1 = HIGH;
inPin2 = LOW;
}

if(motor == 1){
digitalWrite(AIN1, inPin1);
digitalWrite(AIN2, inPin2);
analogWrite(PWMA, speed);
}else{
digitalWrite(BIN1, inPin1);
digitalWrite(BIN2, inPin2);
analogWrite(PWMB, speed);
}
}

void stop(){
//enable standby
digitalWrite(STBY, LOW);
}
 
Odpowiedź
#2
(24-09-2018, 09:40)michal napisał(a): Chciałbym, aby po wykonaniu trzech ruchów serwem, silnik DC płynnie się zatrzymał. W obecnym projekcie silnik zatrzymuje się gwałtownie. Mam w projekcie łagodne zatrzymanie silnika, ale tylko po wciśnięciu przycisku.
(...)
Co powinienem dopisać, żeby po wykonaniu 3 ruchów serwa silnik płynnie się zatrzymał?
Zrób licznik ruchów serwa, gdy osiągnie wymagana liczbę wywołaj funkcję, która jest wywoływana po naciśnięciu przycisku aby silnik płynnie zatrzymał się.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0, MC683xx, Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#3
(24-09-2018, 10:36)es2 napisał(a):
(24-09-2018, 09:40)michal napisał(a): Chciałbym, aby po wykonaniu trzech ruchów serwem, silnik DC płynnie się zatrzymał. W obecnym projekcie silnik zatrzymuje się gwałtownie. Mam w projekcie łagodne zatrzymanie silnika, ale tylko po wciśnięciu przycisku.
(...)
Co powinienem dopisać, żeby po wykonaniu 3 ruchów serwa silnik płynnie się zatrzymał?
Zrób licznik ruchów serwa, gdy osiągnie wymagana liczbę wywołaj funkcję, która jest wywoływana po naciśnięciu przycisku aby silnik płynnie zatrzymał się.
Dziękuję za odpowiedź. Wstawiłem dodatkową zmienną - inną niż ta, która była w pętli wyłączania silnika przyciskiem i wszystko działa tak jak chciałem.
Dzięki za pomoc.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości