Arduino Polska Forum
Kod dla początkującego - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: Kod dla początkującego (/watek-kod-dla-pocz%C4%85tkuj%C4%85cego)

Strony: 1 2


Kod dla początkującego - Bator11 - 09-05-2016

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


RE: Kod dla początkującego - JasQ - 09-05-2016

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);
        
}



RE: Kod dla początkującego - Bator11 - 10-05-2016

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);



RE: Kod dla początkującego - JasQ - 10-05-2016

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");
        
}



RE: Kod dla początkującego - Bator11 - 15-05-2016

Niestety silniki dalej nie reagują za to hc sr i serwo działają


RE: Kod dla początkującego - JasQ - 15-05-2016

daj kod który napisałeś zerkniemy


RE: Kod dla początkującego - Bator11 - 18-05-2016

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


RE: Kod dla początkującego - JasQ - 18-05-2016

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();


RE: Kod dla początkującego - Bator11 - 18-05-2016

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;

     
      }
 }



RE: Kod dla początkującego - JasQ - 18-05-2016

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