Skocz do zawartości

[C] Prosty robot wahadło- problem


Pomocna odpowiedź

Napisano

Witam

Jestem tutaj nowy wiec proszę o wyrozumiałość.

Ponieważ mam doświadczenie z elektronika, i mailem części w domu postanowiłem zbudować prostego robota opartego PIC-u na jednym silniku krokowym i czujniku (czujniki mam do wyboru może być to halla lub coś z optycznych).

Robot miał poruszać się do przodu następnie po otrzymaniu sygnału z czujnika ma się cofać i znów sygnał z czujnika i do przodu (taki rodzaj wahadła).Na chwile obecna robot jedzie tylko do przodu i ponieważ z programowaniem u mnie jest kiepsko proszę o pomoc w programowaniu...

czy musi byc to rodzaj pętli czy uzyc IF ELSE ?

potrzebował bym podpowiedzi w jaki sposób czujnik wysyła sygnał do kontrolera a ten zmienia kierunek ruchu?

czy czujnik jest podpięty pod inny port względem silnika czy mogą być na tym samym

dodam ze nie liczę tutaj na gotowca, a wytłumaczenie w jaki sposób uzyskać pożądany efekt

Herbaty z fusami nie lubię, a tarota gdzieś zgubiłem. Opisz dokładniej problem, chyba że mamy ci wymyślić jak ma wyglądać twój robot.

Z tego co zrozumiałem to chcesz zbudować odwrócone wahadło. Moim zdaniem silnik krokowy jest za wolny do takiego robota. i nie wiem w jaki sposób chcesz odczytywać odchylenie od równowagi za pomocą wymienionych czujników...

Wg mnie to nie odwrócone wahadło ale zwyczajny pojazd, który może poruszać się w 2 kierunkach i zmiana kierunku następuje po odebraniu sygnału od czujnika.

Czujnik zdecydowanie podpinasz pod inny port niż sterownik silnika. Pisałeś, że masz doświadczenie z elektroniką.

Zakładam, że masz funkcję, która poprzez odpowiednie ustawienie wyjść uC umie obracać silnikiem w jedną lub w drugą stronę. Zakładam też, że umiesz odebrać sygnał z czujnika. Jeśli czujnik wyzwala przerwanie, to w obsłudze przerwania zmieniasz wartość globalnej zmiennej oznaczającej kierunek, a w głównej pętli uruchamiasz funkcję kręcącą silnikiem w kierunku wskazującym przez tę główną zmienną.

Sprawa wydaje się wyjątkowo prosta, ale bez szczegółów budowy układu pozostaje Ci pytać na forum cechu wróżek jak już sashir wspomniał.

ok moze faktycznie opisalem to malo zrozumiale

Więc tak ma to być pojazd poruszający sie do przodu i do tylu oparty na pic i 1 silniku krokowym taki akurat mam, nie zależy mi na prędkości... na ośce pomiędzy kolkami zamotuje czujnik optyczny.

po podłączeniu zasilania pojedzie do przodu następnie dostanie sygnał z czujnika i pojedzie do tylu i tak w kolko...

ale jak już pisałem z programowanie stawiam pierwsze kroki.... mam taki kod który powoduje ze pojazd jedzie do przodu lub do tylu w zależności od zdefiniowania 1 z bitow, ale potrzebuje pomocy w jaki sposób sygnał z czujnika podpięty pod port D7 będzie zmieniał kierunek ruchu...


#pragma config OSC = HS    
#pragma config WDT = OFF  
#pragma config LVP = OFF   
#pragma config DEBUG = OFF       

#include < p18f4520.h>
#include <delays.h>

        void main (void)
        {
             LATD = 0x00;           
             TRISD = 0x00;          

             LATD = 0B00001000;    


             While (1)

             {
                   Delay1KTCYn(20);   
                   PORTDbits.RD0 = ~ PORTDbits.RD0;      


                                                          }

Użyj enkodera i licz obroty kół, po zadanej liczbie obrotów zmieniaj kierunek. Na pewno używasz silnika krokowego? Bo w kodzie nie mogę znaleźć funkcji odpowiedzialnej za jego działanie. W silniku krokowym możesz liczyć kroki i na ich podstawie zmieniać kierunek.

tak na 100% jest to silnik krokowy

wystarczy ze zmienię to LATD = 0B00001000; na to LATD = 0B00001010;

i jedzie w druga stronę, ale nie wiem ja zdefiniować port D7 jako wejście z czujnika ....

olimek, zakładam, że nie chce budować żadnego z wymienionych przez Ciebie. Zarówno robot balansujący jak i odwrócone wahadło wymagają wykorzystania regulatorów, a bestb, w pierwszym poście napisał, że kiepsko u niego z programowaniem.

Żeby ustawić port jako wejście w rejestrze TRISx należy ustawić bit danego portu.

W twoim przypadku to port d 7.

Do odczytu używaj Input(pin)

TRISD = 0x80;
while(1)
{
 if( Input(pin_D7))
 {
     LATD = 0B00001000; 
 } else
 {
     LATD = 0B00001010;
 }
}

Tu masz przykładowy kod. Jeżeli na pinie D7 jest stan wysoki silnik kręci się w jedną stronę, jeżeli stan niski silnik kręci się w drugą stronę.

  • Lubię! 1

dzieki oto mi chodzilo

czyli kod bedzie wygladac tak:


#pragma config OSC = HS   
#pragma config WDT = OFF 
#pragma config LVP = OFF   
#pragma config DEBUG = OFF       

#include < p18f4520.h>
#include <delays.h>

        void main (void)
   TRISD = 0x80;
   while(1)
   {
     if( Input(pin_D7))
     {
         LATD = 0B00001000;
     } else
     {
         LATD = 0B00001010;
     }
   }
{
                   Delay1KTCYn(20);   
                   PORTDbits.RD0 = ~ PORTDbits.RD0;     

                                                           }

A sprawdziłeś czy kod działa ?? Bo nie wiem czy po części nie jest on z innego środowiska. Jeżeli działa to postaw piwo 😃

ok dopiero we wtorek sprawdze a piwo postawie za dobre checi

jesli ktos ma jakis inny pomysl chetnie postawie piwo innym

A sprawdziłeś czy kod działa ?? Bo nie wiem czy po części nie jest on z innego środowiska. Jeżeli działa to postaw piwo 😃

nie jestem pewnien co do pin_d7 poniewaz widzialem takie przykladowe rozwiazanie

z uzyciem TRISD7

ale sprawdze to niebawem

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