Skocz do zawartości

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


daniel89

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 ?

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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 ?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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ł.

Link do komentarza
Share on other sites

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 😋

Link do komentarza
Share on other sites

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

??

Link do komentarza
Share on other sites

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ć ?

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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 😋

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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;
   }
 }
} 
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.