Skocz do zawartości

Kurs budowy robotów - #9 - ekspander I/O, serwo


Pomocna odpowiedź

@Dami12250 pierwsza uwaga to #define nie jest funkcją tylko procedurą preprocesora. Co to za stwór? Preprocesor to etap przetwarzania przed kompilacją kodu, gdzie do kodu który piszesz wklejany jest kod z innych miejsc (#include) lub podmieniane są etykiety (#define) lub sprawdzane są warunki (#if...).

Zatem #define służy do definiowania stałych jako kawałek kodu lub makr (takich mini funkcji). Popularne makro w AVR to przesunięcie bitowe _BV.

Tu jest przykład kodu z kursu:

#include "Adafruit_MCP23008.h" //Dodanie biblioteki
Adafruit_MCP23008 ekspander; //Deklaracja "ekspandera"

void setup() {  
  ekspander.begin(); //Rozpoczęcie komunikacji na domyslnym adresie 0x20

  //Konfiguracja pinu 0 ekspandera jako wejscie
  ekspander.pinMode(0, INPUT);
  //Wlaczenie wewnetrznego podciagniecia do dodatniej szyny zasilania
  ekspander.pullUp(0, HIGH);

  //Konfiguracja pinu 13 Arduino jako wyjscie (dla diody)
  pinMode(13, OUTPUT);
}

void loop() {
  if (ekspander.digitalRead(0) == LOW) { //Jesli przycisk wcisniety
      digitalWrite(13, HIGH); //Wlacz diode    
  } else { //Jesli nie
       digitalWrite(13, LOW); //Wylacz diode       
  }
}

Jak widać jest tu użyta metoda z instancji klasy Adafruit_MCP23008. Może nie jestem specjalistą ale makra na takie coś nie wymyślę, możesz co najwyżej napisać sobie etykietę na pin jaki chcesz wysterować, np.:

#define EXP_SOMETHING_PIN 0

#include "Adafruit_MCP23008.h" //Dodanie biblioteki
Adafruit_MCP23008 ekspander; //Deklaracja "ekspandera"

void setup() {  
  ekspander.begin(); //Rozpoczęcie komunikacji na domyslnym adresie 0x20

  //Konfiguracja pinu 0 ekspandera jako wejscie
  ekspander.pinMode(EXP_SOMETHING_PIN, INPUT);
  //......

 

Edytowano przez Gieneq
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzień dobry,

Mój kod:
https://github.com/mateuszlanduch/robot-wolf.git

mateusz.landuch@gmail.com

Idea: Robot jeździ sterowanie pilotem, jazda, linefollower (1), kwadrat-jazda(2), 3 automatyczna jazda.

3 automatyczna jazda - ta automatyczna jazda jak włączę działa bez przerwy. Line follower da się wyłączyć(jest ok), jak zrobić żebym mógł wyłączyć automatyczną jazdę. Domyślam się że jest lipa przez te delay.

Ktoś coś? 

Edytowano przez Mattti87
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

@Mattti87 czyli problem sprowadza się do tego, że nie działa Ci podczerwień, którą zmieniasz tryby? Jeżeli tak, to faktycznie problem leży w delayach. Przy kodzie powodującym opóźnienia biblioteka RC5 nie działa poprawnie. Możesz spróbować wyrzucić opóźnienia i sterować działaniem przez zmienne stanu i funkcję millis(). Patrząc że znasz się na gicie to może spróbuj robić program na kilka plików, bo jednak 350+ linii kodu to już dość dużo 😄 

Link do komentarza
Share on other sites

Cześć,

Mam jakiś problem z ekspanderem portów. Jak tylko dodam linijkę do setup:

ekspander.begin();

to wyświetlacz z 1 cz. kursu Arduino HD44780 pokazuje dziwne znaki. Gubi się nawet ustawiony potencjometrem kontrast. Pytanie co ma wspólnego ekspander z resztą podzespołów? Ekran wpięty na normalne piny w Robot Shield: 

LiquidCrystal lcd(7, 8, A2, A3, A4, A5); //Informacja o podłączeniu nowego wyświetlacza

Wyświetlacz bez włączonego ekspandera:

ekran przed wl ekspandera.JPG

Wyświetlacz z włączonym ekspanderem:

ekran po wl ekspandera.JPG

Jak się okazało- to samo mam jak chcę włączyć czujnik temperatury AM2320 - I2C. Samo dodanie poniższej linijki oddziałuje na ekran (pozostałe moduły działają prawidłowo)

am2320.begin();//do czujnika wilgotnosci i temperatury

 

 

Mój pojazd 😉

Robot1.JPG

Robot2.JPG

Edytowano przez Lukasc
Link do komentarza
Share on other sites

To ma wspólnego, że wykorzystuje piny A4 i A5 (czyli SDA i SCL).

Jeśli podłączasz cokolwiek przez i2c nie możesz używać tych pinów do innych celów.

Możesz użyć wyświetlacza z modułem i2c, wtedy będzie ładnie współdziałał z ekspanderami i czujnikami, a przy okazji odzyskasz resztę pinów.

Edytowano przez ethanak
  • Lubię! 1
Link do komentarza
Share on other sites

@ethanak dziękuję za podpowiedź. To tak to zrobię. Tylko coś dziwnego tu się dzieje- piny A4 i A5 zostawione w spokoju a mimo wszystko ekran nie działa. Podpięty czujnik temperatury do SDA i SCL nie daje temperatury (nan). Coś tu się porobiło- mam nadzieję, że nie zepsułem shielda albo arduina ;/

Link do komentarza
Share on other sites

Ja by spróbował uruchomić jakiś prosty program, który korzysta tylko z i2c (choćby ten termometr). Większość modułów ma wbudowane rezystory podciągające, Uno do tego dokłada własne... teoretycznie powinno to działać, ale sprawdzić nie zaszkodzi.

A jeśli nie zadziała - sprawdzić to na Uno bez żadnych shieldów. Wtedy na 100% będzie wiadomo czyja wina.

  • Lubię! 2
Link do komentarza
Share on other sites

Sama płytka Arduino UNO i i2c działały poprawnie. Nie bawiłem się w dalsze testy, tylko zakupiłem moduł i2c do ekranu i wszystko działa już ok. Na pewno wiele innych moich "bugów" tworzyło utworzone przerwanie z obsługa pilota.

// attachInterrupt(digitalPinToInterrupt(TSOP_PIN), obsluga_pilotaV2, CHANGE);// wylaczylem bo dziwne rzeczy sie dzieja...

Teraz wszystko działa jak należy- musze tylko wymyślić jak obsługiwać pilot i równocześnie mieć uruchomione voidy. 

  • Lubię! 1
Link do komentarza
Share on other sites

@Lukasc przy obsłudze pilota ważne jest aby komunikacja odbywała się bez przerw, możesz spróbować napisać program, który nie będzie miał żadnych delayów, ale uwaga nawet przerwania od I2C czy timerów (ewentualne serwo) mogą narobić bałaganu.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

9 godzin temu, Gieneq napisał:

@Lukasc przy obsłudze pilota ważne jest aby komunikacja odbywała się bez przerw, możesz spróbować napisać program, który nie będzie miał żadnych delayów, ale uwaga nawet przerwania od I2C czy timerów (ewentualne serwo) mogą narobić bałaganu.

@Gieneq dziękuję za radę. Prawie kończę zamianę wszystkich delay na milis'y. Z pilota RC5 właśnie rezygnuję na rzecz modułu radiowego nrf24l01

I tu pojawił się kolejny "problem" z nakładką Robot Shield 😞 Nie widzę wyprowadzenia ICSP z pinami np.  MOSI, MISO itd? Podłączyć się "po chamsku" do pinów MOSI, MISO w Arduino Uno itd kabelkami a następnie docisnąć z powrotem shielda? 😉

Dolutowałem się już do wyprowadzenia 3,3V. 

image.thumb.png.a34456f9b2d46514c73b6812f6be80d9.png

Edytowano przez Lukasc
Link do komentarza
Share on other sites

@ethanak To 10 i resztę pinów podpiąć mogę do ekspandera portów. Problem w takim razie z pinem 11, który jest dedykowany pod serwo, którego używam. Najwyżej rozdzielę kable serwa i podepnę do gniazda serwa tylko zasilanie i masę a zamiast 11 wepnę do pinu gdzieś w ekspander.
 Dzięki.

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.