Skocz do zawartości

Robocik jeżdżący - kręci się w koło - brak reakcji na czujnik


Pomocna odpowiedź

#define trig 2
#define echo 3
int pwmMotorA=6;
int InMotorA1=5;
int InMotorA2=4;
int pwmMotorB=10;
int InMotorB1=9;
int InMotorB2=8;
int IRpin=7;
boolean stan=0;



void setup () {

 pinMode(pwmMotorA, OUTPUT); 
 pinMode(pwmMotorB, OUTPUT); 
 pinMode(InMotorA1, OUTPUT); 
 pinMode(InMotorA2, OUTPUT);   
 pinMode(InMotorB1, OUTPUT); 
 pinMode(InMotorB2, OUTPUT);   
 pinMode (trig, OUTPUT);
 pinMode (echo, INPUT);
analogWrite(pwmMotorA,200);
analogWrite(pwmMotorB,200);}


void loop () {




int duration, distance;
 digitalWrite( trig, LOW);
 delayMicroseconds (2);
 digitalWrite (trig, HIGH);
 delayMicroseconds(10);
 digitalWrite (trig, LOW);
 duration = pulseIn(echo, HIGH);
 distance = (duration/2) / 29.1;



 if (distance<=30 ) {
 digitalWrite(InMotorA1, LOW); 
 digitalWrite(InMotorA2, HIGH);
 digitalWrite(InMotorB1, LOW); 
 digitalWrite(InMotorB2, LOW);
 //Ustawienie prędkości obrotowej na 50% (zakres PWM: 8bitów czyli 0-255)
 analogWrite(pwmMotorA,200);
 analogWrite(pwmMotorB,0);
 delay(1000); 
        if (digitalRead(IRpin) ==HIGH ); 
   delay (20);
   stan=!stan;
   digitalWrite(pwmMotorA, stan);
   digitalWrite(pwmMotorB, stan);
   while (digitalRead(IRpin)==HIGH);
   delay(20);}


   else 
 analogWrite(pwmMotorA,200);
 analogWrite(pwmMotorB,200);
 digitalWrite(InMotorA1, LOW); 
 digitalWrite(InMotorA2, HIGH);
 digitalWrite(InMotorB1, LOW); 
 digitalWrite(InMotorB2, HIGH);
 delay(1000);  

}

Jak poprawnie napisać ten program aby jeździł na czujnik i reagował na włączenie i wyłączenie poprzez pilota ir ?

Nadajesz w jakimś standardzie IR? Czy po prostu świecisz w podczerwieni? To drugie rozwiązanie do niczego dobrego nie prowadzi, poczytaj o RC5.

Odbiornik IR 36 kHz . Jak wgrywam ten program to faktycznie reaguje na pilota włącza i wyłącza ale już nie chce jeździć na ten czujnik prawidłowo. Jak zmienić ten kod ?

Czyli w końcu udało Ci się poprawnie uruchomić ten czujnik ultradźwiękowy? Jeszcze nie dawno on "sam z siebie" nie działał.

Tak działa nawet dobrze działa. Mam drugi kupiony za 12 zł 😋 i ten działa nawet lepiej bo nie ma żadnych mechanicznych usterek a tamten miał chyba opornik smd nadłupany 😋 i przez to czasem zaburzenia te impulsowe , tak mi się wydaje ale to takie na milisekundy więc przez delay się da wyeliminować 😋

Nawet chyba wiem czemu ten mikrokontroler głupiał bo pewnie źle fusebity ustawiłem . Będę próbował w niedalekiej przyszłości to naprawić 😉 Teraz działam na innym i ten ma prawidłowe odczyty z tego czujnika 😋

   else 
 analogWrite(pwmMotorA,200); 
 analogWrite(pwmMotorB,200); 
 digitalWrite(InMotorA1, LOW); 
 digitalWrite(InMotorA2, HIGH); 
 digitalWrite(InMotorB1, LOW); 
 digitalWrite(InMotorB2, HIGH); 
 delay(1000);  

Nie powinno przypadkiem wyglądać tak:

   else {
 analogWrite(pwmMotorA,200); 
 analogWrite(pwmMotorB,200); 
 digitalWrite(InMotorA1, LOW); 
 digitalWrite(InMotorA2, HIGH); 
 digitalWrite(InMotorB1, LOW); 
 digitalWrite(InMotorB2, HIGH); 
 delay(1000); 
 }

??

Po wgraniu tego programu robot załącza się na pilota . Po włączeniu go na pilot kręcą się oba koła po 10 sekundach przełącza się na jedno i tak pozostaje . Wtedy nie reaguje na czujnik tylko samego pilota . Jak to poprawić ?

Zacznij analizować kod, bo widzę, że ograniczasz się do wprowadzania zmian i tylko opisywania efektów. Spójrz, co i kiedy wykonuje się w kodzie, zrób jakieś testy. Nauczysz się czegoś przynajmniej.

Zastanów się czy sprawdzanie odbiornika IR powinno być wewnątrz innego if'a (tak jak teraz), czy może lepiej przenieść go gdzieś indziej?

Okej zrobię testy tylko już później bo teraz mam ważniejsze sprawy 😋 Robiłem kiedyś w drugim ifie ten IR ale też nie działało. Pokombinuje coś później. Ale to na tych if ,else będzie działać tak? Czy coś innego trzeba typu switch, while ? Pytam bo zielony w tym jestem 😋

Na dobrą sprawę, to nie wiem nawet, co chcesz uzyskać - nie wynika to jednoznacznie z Twoich postów. Jednak, co by to nie było, to instrukcje warunkowe if () {} else {} wystarczą. Sprawdź też sobie jaki wpływ na całość mają wstawiane opóźnienia.

Chce uzyskać aby robot włączał się na odbiornik IR po czym jechał do przodu i skręcał jak dojedzie do ściany w odległości 30 cm

Treker !

Weź proszę mi podpiwiedz jak to zrobić !

Mam dodane serwo jeszcze do tego co czujnik obraca. Nie chce mi przerwanie działać czemu ?

#include <Servo.h>
#include <interrupts.h>

Servo dservo;
#define trig 2
#define echo 3
int pwmMotorA=6;
int InMotorA1=5;
int InMotorA2=4;
int pwmMotorB=11;
int InMotorB1=10;
int InMotorB2=9;
volatile int IRpin=7;
volatile int stan=0;
int pos = 0;
volatile int imp=500;




void setup () {
 cli();
//Serial.begin(9600);
//Serial.println(“Initializing timerinterrupt”);

//  TCCR2A |= (1<<CS22);
//  TCCR2A &= ~((1<<CS21) | (1<<CS20));
//
//  TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
//
//  ASSR |= (0<<AS2);
// 
//  TIMSK2 |= (1<<TOIE2) | (0<<OCIE2A);

TIMSK1|= (1<<TOIE1);
TCCR1B|= (1<<CS10) | (1<<CS11);//preskaler 64

//cli();
//TCCR2A = 0;// zerujemy rejestr kontrolny A
//TCCR2B = 0;// zerujemy rejestr kontrolny B
// TCNT2  = 0;// zerujemy licznik
//  OCR2A = 124;// = (16000000) / (500*256) - 1
//  TCCR2A |= (1 << WGM21);  // ustawiamy timer2 w tryb obsługi przerwań (CTC)
//  TCCR2B |= (1 << CS12);     // ustawiam dzielnik na 256
//  TIMSK2 |= (1 << OCIE2A); // wzkazujemy że przerwanie ma być wywołane dla rejestro OCR2A




 dservo.attach(13);
 pinMode(pwmMotorA, OUTPUT);
 pinMode(pwmMotorB, OUTPUT);
 pinMode(InMotorA1, OUTPUT);
 pinMode(InMotorA2, OUTPUT);  
 pinMode(InMotorB1, OUTPUT);
 pinMode(InMotorB2, OUTPUT);  
 pinMode (trig, OUTPUT);
 pinMode (echo, INPUT);
 sei(); 
};


ISR(TIMER2_COMPA_vect){
 if(imp>500){
   pilot();
   imp=0;
 }
 if(imp>501){imp=501;}
 imp++;
 digitalWrite (1, HIGH);
}


void loop () {
 // pilot();
 if(stan==1){
   int duration, distance;
   digitalWrite( trig, LOW);
   delayMicroseconds (2);
   digitalWrite (trig, HIGH);
   delayMicroseconds(10);
   digitalWrite (trig, LOW);
   duration = pulseIn(echo, HIGH);
   distance = (duration/2) / 29.1;

   if (distance<=30 && distance >=10 ) {
     analogWrite(pwmMotorA,255);
     analogWrite(pwmMotorB,0);
     digitalWrite(InMotorA1, LOW);
     digitalWrite(InMotorA2, HIGH);
     digitalWrite(InMotorB1, LOW);
     digitalWrite(InMotorB2, LOW);
     //Ustawienie prędkości obrotowej na 50% (zakres PWM: 8bitów czyli 0-255)
   }

   if (distance <10) {
     analogWrite(pwmMotorA,255);
     analogWrite(pwmMotorB,255);
     digitalWrite(InMotorA1, HIGH);
     digitalWrite(InMotorA2, LOW);
     digitalWrite(InMotorB1, HIGH);
     digitalWrite(InMotorB2, LOW);
//      for(pos = 0; pos < 180; pos +=1)
//      {
//        dservo.write(pos);
//        delay(20);
//      }
//      for (pos = 180; pos>=1; pos-=1)
//      {
//        dservo.write(pos);
//        delay(20); 
//      }
//      for (pos = 1; pos < 90; pos +=1)
//      {
//        dservo.write(pos);
//        delay(20);
//      }

   }

   if(distance>30){
     analogWrite(pwmMotorA,255);
     analogWrite(pwmMotorB,255);
     digitalWrite(InMotorA1, LOW);
     digitalWrite(InMotorA2, HIGH);
     digitalWrite(InMotorB1, LOW);
     digitalWrite(InMotorB2, HIGH);
   }
 }
 if(stan==0){
     analogWrite(pwmMotorA,0);
     analogWrite(pwmMotorB,0);
     digitalWrite(InMotorA1, LOW);
     digitalWrite(InMotorA2, LOW);
     digitalWrite(InMotorB1, LOW);
     digitalWrite(InMotorB2, LOW);
 } 
}




void pilot() {
 if (digitalRead(IRpin) ==LOW){
   switch(stan){
     case 0:
       stan=1;
       break;
     case 1:
       stan=0;
       break;
   }
 }
} 

A co ma zainicjować to przerwanie ?

1.Brak globalnego zezwolenia na przerwanie sei();

2. Jest to przerwanie od Timera2, a inicjalizacja Timera2 jest zakomentowana

3. W Timerze1 jest tylko zezwolenie na wykonanie przerwania przez ten Timer oraz ustawiony jest preskaler, ale reszty ustawień nie ma.

4. cli() osobiście bym wyrzucił. I tak przerwania są wyłączone po resecie procka. Na początku warto zapomnieć o istnieniu cli(); 😉

EDIT: Znalazłem sei(); ale reszta pozostaje do poprawy.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...