Mechano Maj 3, 2014 Udostępnij Maj 3, 2014 Mam 5 takich czujników i na żadnym z tych "mikrofonów" nie mam przejścia. Cytuj Link do komentarza Share on other sites More sharing options...
daniel89 Maj 9, 2014 Autor tematu Udostępnij Maj 9, 2014 #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 ? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 9, 2014 Udostępnij Maj 9, 2014 Nadajesz w jakimś standardzie IR? Czy po prostu świecisz w podczerwieni? To drugie rozwiązanie do niczego dobrego nie prowadzi, poczytaj o RC5. Cytuj Link do komentarza Share on other sites More sharing options...
daniel89 Maj 9, 2014 Autor tematu Udostępnij Maj 9, 2014 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 ? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Treker (Damian Szymański) Maj 9, 2014 Udostępnij Maj 9, 2014 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ł. Cytuj Link do komentarza Share on other sites More sharing options...
daniel89 Maj 9, 2014 Autor tematu Udostępnij Maj 9, 2014 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 😋 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 9, 2014 Udostępnij Maj 9, 2014 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); } ?? Cytuj Link do komentarza Share on other sites More sharing options...
daniel89 Maj 9, 2014 Autor tematu Udostępnij Maj 9, 2014 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ć ? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 9, 2014 Udostępnij Maj 9, 2014 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? Cytuj Link do komentarza Share on other sites More sharing options...
daniel89 Maj 9, 2014 Autor tematu Udostępnij Maj 9, 2014 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 😋 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 9, 2014 Udostępnij Maj 9, 2014 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. Cytuj Link do komentarza Share on other sites More sharing options...
daniel89 Maj 9, 2014 Autor tematu Udostępnij Maj 9, 2014 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 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 9, 2014 Udostępnij Maj 9, 2014 Więc, tak, dasz rade tylko na if'ach. Cytuj Link do komentarza Share on other sites More sharing options...
daniel89 Maj 14, 2014 Autor tematu Udostępnij Maj 14, 2014 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; } } } Cytuj Link do komentarza Share on other sites More sharing options...
ps19 Maj 14, 2014 Udostępnij Maj 14, 2014 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. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!