• 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
Kod dla początkującego
#1
Question 
Witam.
Tworząc swojego pierwszego robota na platformie arduino natrafiłem na pewien błąd.Otóż kiedy chcę aby serwomechanizm z czujnikiem obracał się niezależnie od komend które wykonują silniki po prostu się to nie udaję.Serwo się rusza ale już silniki nie reagują.Próbowałem wielu wersji kodu ale nadal nie umiem rozwiązać tego problemu.Może ktoś pomoże :Smile ?

Kod:
int Motor1 = 8;
int Motor2 = 9;
int Motor3 = 10;
int Motor4 = 11;


char command = 'S';
int velocity = 0;

#include "Servo.h" //Biblioteka służąca do obsługi serwomechanizmu

Servo myservo;  // Utworzenie obiektu myservo
int pos = 0; //Początkowa pozycja serwa

void setup()
{      
 Serial.begin(9600);              
 pinMode(Motor1, OUTPUT);
 pinMode(Motor2, OUTPUT);
 pinMode(Motor3, OUTPUT);
 pinMode(Motor4, OUTPUT);
 
 myservo.attach(12);  //Przyłaczenie serwomechanizmu do pinu 9 w Arduino

}

void loop(){

 //Analogiczne odejmowanie pozycji po osiągnięciu maksumum
 for(pos = 180; pos>=0; pos-=1)    
 {                                
  myservo.write(pos);              
  delay(20);                      
 }
 for(pos = 0; pos <= 180; pos += 1) //Zmiana pozycji (dodawanie) do 180 stopni
 {                                  
  myservo.write(pos); //ustawienie zadanej pozycji            
  delay(20); //Czas na zmiane pozycji                
 }

 if(Serial.available() > 0){
   command = Serial.read();
   
   /* Wraz z wciśnięciem konkretnego przycisku w aplikacji na smartphone,
      wysyłany jest dany sygnał do arduino przez moguł BT. W ustawieniach
      aplikacji wypisany jest opis wartości konkretnych liter.
  */
 
   switch(command){
   case 'R':  
   digitalWrite(Motor1, HIGH);    
   digitalWrite(Motor4, HIGH);
      break;
   case 'L':  
      digitalWrite(Motor2, HIGH);
      digitalWrite(Motor3, HIGH);
     break;
   case 'B':  
      digitalWrite(Motor2, HIGH);
      digitalWrite(Motor4, HIGH);
     break;
   case 'F':
      digitalWrite(Motor1, HIGH);
      digitalWrite(Motor3, HIGH);
     break;
   case 'S':  
      digitalWrite(Motor1, LOW);
      digitalWrite(Motor2, LOW);
      digitalWrite(Motor3, LOW);
      digitalWrite(Motor4, LOW);
     break;
     
      }
 }
}

   
  I schemat w załączniku


Załączone pliki Miniatury
   
 
Odpowiedź
#2
Niestety są ograniczenia a u ciebie podstawowy błąd w postaci pętli "for" która zatrzymuje program do własnych potrzeb . Poniżej masz kod który ci zastąpi pętle a nie spowoduje zatrzymania innych funkcji .

Kod:
#include <Servo.h>
Servo myservo;  
int pos = 0;  
byte state = 1;
long pm = 0;

void setup()
{
  Serial.begin(9600);
  myservo.attach(9);  
}

void loop()
{
   long cm = millis();

if ( cm - pm > 10 and state == 1){
    pos = constrain(pos, 0, 180);
    pos++;
    myservo.write(pos);              
if (pos >= 180)state = 2;
    pm = cm;}

if ( cm - pm > 10 and state == 2){
    pos = constrain(pos, 0, 180);
    pos--;
    myservo.write(pos);              
if (pos <= 0)state = 1;
    pm = cm;}
      
    Serial.println(pos);
        
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#3
Dziękuje.Rozważałem taką możliwość przy użyciu tego wariantu działa.Jednak zakłóca działanie czujnika hc sr 04 a raczej czujnik zakłóca prace serwa , które przez użycie tej samej funkcji po prostu bardzo spowalnia a także silniki znowu nie działają i znowu nie mam pomysłu jak rozwiązać ten problem

fragment kodu :
Kod:
long czas, dystans;

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

czas = pulseIn(echoPin, HIGH);
dystans = czas / 58;

Serial.print(dystans);
Serial.println(" cm");

delay(500);
 
Odpowiedź
#4
Na to też się znajdzie sposób ( czujnik daj na jakiejś gąbce , piance co by odseparować jak najlepiej serwo ) i daje kodzik z biblioteką NewPing dużo lepsza od standardu , czas odczytu zalecany 29ms ale przy 10ms daje radę a tyle masz w programie .

NewPing.zip

Kod:
#include <Servo.h>
Servo myservo;
#include <NewPing.h>
#define TRIGGER_PIN  10
#define ECHO_PIN     11  
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int pos = 0;  
byte state = 1;
long pm = 0;
byte echo = 0;

void setup()
{
  Serial.begin(9600);
  myservo.attach(9);  
}

void loop()
{
   long cm = millis();

if ( cm - pm > 1 )echo = sonar.ping_cm();
if ( cm - pm > 10 and state == 1){
    pos = constrain(pos, 0, 180);
    
    pos++;
    myservo.write(pos);              
if (pos >= 180)state = 2;
    pm = cm;}

if ( cm - pm > 10 and state == 2){
    pos = constrain(pos, 0, 180);
    pos--;
    myservo.write(pos);              
if (pos <= 0)state = 1;
    pm = cm;}
      
    Serial.print(pos);
    Serial.print(" - ");
    Serial.print(echo);
    Serial.println("cm");
        
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#5
Niestety silniki dalej nie reagują za to hc sr i serwo działają
 
Odpowiedź
#6
daj kod który napisałeś zerkniemy
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#7
Bardzo proszę

Kod:
#include <Servo.h>
Servo myservo;
#include <NewPing.h>
#define TRIGGER_PIN  11
#define ECHO_PIN     12  
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int pos = 0;  
byte state = 1;
long pm = 0;
byte echo = 0;

int Motor1 = 4;
int Motor2 = 5;
int Motor3 = 6;
int Motor4 = 7;

char command = 'S';
int velocity = 0;


void setup()
{  
  Serial.begin(9600);                  
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(Motor3, OUTPUT);
  pinMode(Motor4, OUTPUT);
  pinMode(TRIGGER_PIN, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
  pinMode(ECHO_PIN, INPUT);
  
  myservo.attach(8);  

}

void loop(){
{
   long cm = millis();

if ( cm - pm > 1 )echo = sonar.ping_cm();
if ( cm - pm > 10 and state == 1){
    pos = constrain(pos, 0, 180);
    
    pos++;
    myservo.write(pos);              
if (pos >= 180)state = 2;
    pm = cm;}

if ( cm - pm > 10 and state == 2){
    pos = constrain(pos, 0, 180);
    pos--;
    myservo.write(pos);              
if (pos <= 0)state = 1;
    pm = cm;}
      
    Serial.print(pos);
    Serial.print(" - ");
    Serial.print(echo);
    Serial.println("cm");
        
}
    switch(command){
    case 'F':  
    digitalWrite(Motor1, HIGH);    
    digitalWrite(Motor4, HIGH);
       break;
    case 'B':  
       digitalWrite(Motor2, HIGH);
       digitalWrite(Motor3, HIGH);
      break;
    case 'L':  
       digitalWrite(Motor2, HIGH);
       digitalWrite(Motor4, HIGH);
      break;
    case 'R':
       digitalWrite(Motor1, HIGH);
       digitalWrite(Motor3, HIGH);
      break;
    case 'S':  
       digitalWrite(Motor1, LOW);
       digitalWrite(Motor2, LOW);
       digitalWrite(Motor3, LOW);
       digitalWrite(Motor4, LOW);
      break;
      
       }
  }



Jeśli popełniłem błędy to przepraszam i proszę o zrozumienie
 
Odpowiedź
#8
A z czego ma wziąć komendę do jazdy ? Nie zdeklarowałeś w żaden sposób z kąd ma być , serial wifi z kosmosu ... Wink

a konkretnie takiej linijki

if (Serial.available() > 0)command = Serial.read();
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#9
Yhy działa działa tylko czemu gdy do kodu wstawie zakres pomiaru zatrzymania to nie działa: (chodzi o zakres cm kiedy poniżej 10 wszystkie silniki powinny się zatrzymac a tak się nie dzieje)

Proszę używać znacznika "code"

Kod:
#include <Servo.h>
Servo myservo;
#include <NewPing.h>
#define TRIGGER_PIN  11
#define ECHO_PIN     12  
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int pos = 0;  
byte state = 1;
long pm = 0;
byte echo = 0;

int Motor1 = 4;
int Motor2 = 5;
int Motor3 = 6;
int Motor4 = 7;

char command = 'S';
int velocity = 0;


void setup()
{  
 Serial.begin(9600);                  
 pinMode(Motor1, OUTPUT);
 pinMode(Motor2, OUTPUT);
 pinMode(Motor3, OUTPUT);
 pinMode(Motor4, OUTPUT);
 pinMode(TRIGGER_PIN, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(ECHO_PIN, INPUT);
 
 myservo.attach(8);  

}

void loop(){


{
  long cm = millis();

if ( cm - pm > 1 )echo = sonar.ping_cm();
if ( cm - pm > 10 and state == 1){
   pos = constrain(pos, 0, 180);
   
   pos++;
   myservo.write(pos);              
if (pos >= 180)state = 2;
   pm = cm;}

if ( cm - pm > 10 and state == 2){
   pos = constrain(pos, 0, 180);
   pos--;
   myservo.write(pos);              
if (pos <= 0)state = 1;
   pm = cm;}
     
   Serial.print(pos);
   Serial.print(" - ");
   Serial.print(echo);
   Serial.println("cm");

if ( cm < 10);
 {
  digitalWrite(Motor1, LOW);
  digitalWrite(Motor2, LOW);
  digitalWrite(Motor3, LOW);
  digitalWrite(Motor4, LOW);
 }


       
}
     if (Serial.available() > 0)command = Serial.read();
   switch(command){
   case 'F':  
   digitalWrite(Motor1, HIGH);    
   digitalWrite(Motor4, HIGH);
      break;
   case 'B':  
      digitalWrite(Motor2, HIGH);
      digitalWrite(Motor3, HIGH);
     break;
   case 'R':  
      digitalWrite(Motor2, HIGH);
      digitalWrite(Motor4, HIGH);
     break;
   case 'L':
      digitalWrite(Motor1, HIGH);
      digitalWrite(Motor3, HIGH);
     break;
   case 'S':  
      digitalWrite(Motor1, LOW);
      digitalWrite(Motor2, LOW);
      digitalWrite(Motor3, LOW);
      digitalWrite(Motor4, LOW);
     break;

     
      }
 }
 
Odpowiedź
#10
Ponieważ zatrzymanie ma tak : i jest to sprzeczne z instrukcją z BT

Kod:
if ( cm < 10);
{
  digitalWrite(Motor1, LOW);
  digitalWrite(Motor2, LOW);
  digitalWrite(Motor3, LOW);
  digitalWrite(Motor4, LOW);
}

wiec zamiast powyższego daj tak

if ( cm < 10)command = 'S';

i "stanie" się jasność Wink
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