Skocz do zawartości

aixI

Użytkownicy
  • Zawartość

    782
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    13

aixI zajął 1. miejsce w rankingu.
Data osiągnięcia: 8 maja 2015.

Treści użytkownika aixI zdobyły tego dnia najwięcej polubień!

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

Osiągnięcia użytkownika aixI

Innowator

Innowator (10/19)

  • Za 25 postów
  • Za 5 postów
  • Za 100 postów
  • Młodszy roboty
  • Juror

Odznaki

47

Reputacja

  1. @ethanak dzięki za odpowiedź. Zmieniłem trochę obecny program, dodałem obsługę przerwania dla drugiego wyjścia enkodera, który jest podpięty do pinu D3 (a nie do pinu D7 jak to było przedtem). Od razu go wrzuciłem na Arduino i włączyłem monitor szeregowy i odczytywałem wartości, tak jak wcześniej dostaje 22 impulsy na jeden obrót wału silnika. Chodzi o to, aby podczas pobierania jej wartości wyłączyć globalne zezwolenie na przerwania "cli()", a później włączyć zezwolenie na globalne przerwania "sei()"? Teraz nawet w funkcji "setup()" nie włączam globalnego zezwolenia na przerwania i chyba jest to błędem, tak? Bloku ATOMIC nigdy nie używałem - coś o tym kiedyś słyszałem, ale nie wiem jak z tego korzystać. Obecny program: #include <Wire.h> // Encoder 1 output A, B to Arduino Interrupt pin 2, 3 #define ENCODER_1_A 2 // D2 INT0 #define ENCODER_1_B 3 // D3 INT1 volatile long counter = 0; // interval for measurements int interval = 25; // Counters for milliseconds during interval long previousMillis = 0; long currentMillis = 0; void setup() { // Setup Serial Monitor Serial.begin(115200); pinMode(ENCODER_1_A, INPUT_PULLUP); pinMode(ENCODER_1_B, INPUT_PULLUP); // Attach interrupt - Syntax: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) attachInterrupt(digitalPinToInterrupt(ENCODER_1_A), readEncoder0, RISING); attachInterrupt(digitalPinToInterrupt(ENCODER_1_B), readEncoder1, RISING); // Setup initial values for timer previousMillis = millis(); } void loop() { currentMillis = millis(); if (currentMillis - previousMillis > interval) { previousMillis = currentMillis; Serial.print("Position: "); Serial.println(counter, DEC); } } void readEncoder0() { if (digitalRead(ENCODER_1_B) == LOW) counter++; else counter--; } void readEncoder1() { if (digitalRead(ENCODER_1_A) == LOW) counter--; else counter++; }
  2. @atMegaTona czemu zakładasz, że nie przyszło mi to do głowy? Przyszło i to nawet sprawdzałem, z tym że w tym samym momencie miałem "ogólny" problem ze zliczaniem impulsów. Ja pytałem Was jaki jest sposób odczytu. Czy podpinać taki enkoder z dwoma wyjściami do dwóch różnych pinów obsługujących przerwania, czy tylko jedno wyjście do pinu obsługującego przerwania, a drugie wyjście do normalnego pinu cyfrowego? Czy jeszcze jakoś inaczej? W tym momencie mam podłączone jedno wyjście enkodera do pinu D2 - INT0 obsługującego przerwania, a drugie wyjście do zwykłego pinu cyfrowego - D7 - czy taki pomiar impulsów, przy takim podłączeniu jest poprawny? Z moich pomiarów wynika, że tak (wyniki mam praktycznie takie same jak w moim pierwszym poście). No chyba, że można to robić inaczej. Na serial monitorze teraz dostaje wyniki ze znakiem + i -, kręcąc kołem w jedną lub drugą stronę. Jeden obrót wału silnika daje mi 22 impulsy. W tym momencie testuje tylko jeden silnik z enkoderem, stąd definicje w programie: ENCODER_1_A i ENCODER_1_B -> enkoder pierwszego silnika, kanały A i B. Podsyłam kod: #include <Wire.h> #define ENCODER_1_A 2 // D2 INT0 #define ENCODER_1_B 7 // D7 volatile long counter = 0; // interval for measurements int interval = 25; // Counters for milliseconds during interval long previousMillis = 0; long currentMillis = 0; void setup() { // Setup Serial Monitor Serial.begin(115200); pinMode(ENCODER_1_A, INPUT_PULLUP); pinMode(ENCODER_1_B, INPUT_PULLUP); // Attach interrupt attachInterrupt(digitalPinToInterrupt(ENCODER_1_A), readEncoder, CHANGE); // Syntax: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) // Setup initial values for timer previousMillis = millis(); } void loop() { currentMillis = millis(); if (currentMillis - previousMillis > interval) { previousMillis = currentMillis; Serial.print("Position: "); Serial.println(counter, DEC); } } void readEncoder() { if (digitalRead(ENCODER_1_A) == HIGH) { // found a low-to-high on channel A if (digitalRead(ENCODER_1_B) == LOW) // check channel B to see which way counter++; else counter--; } else { // found a high-to-low on channel A if (digitalRead(ENCODER_1_B) == LOW) // check channel B to see which way counter--; else counter++; } }
  3. Zabawa z enkoderami to pozornie łatwa sprawa jakby się wydawało. Sprawdzałem dalej, to co mi nie grało, czyli ilość impulsów na obrót koła oraz prędkość obrotu koła na minutę (po obliczeniu z dokumentacji silnika) i po moich testach wraz z Arduino. W każdym razie z moich testów wynika, że te silniki jakie mam są z przekładnią 56:1 (a nie 90:1), ponieważ przy 12V i 11-u sygnałach z jednego kanału enkodera na jeden pełny obrót wału silnika przypada mi ~616/618 impulsów - na jeden pełny obrót koła (56 x 11 = 616 według obliczeń). Przy czym dostaje ~170/172 RPM, co jest zbliżone w dokumentacji silnika (podają 56:1 @ 12V - 178RPM). Z kolei przy 6V dostaję wynik ~85RPM, kiedy w dokumentacji podają 100RPM. Z jednej strony nie wiem, co dalej o tym myśleć. Z jednej wygląda dobrze, zaś z drugiej coś nadal jest nie do końca jasne. Poza tym mam parę wątpliwości.. 1. Kiedy posiadam silnik DC i sparowany z nim enkoder kwadraturowy, który posiada dwa wyjścia A i B przesunięte względem siebie o 90°, to mogę wiedzieć, w którą stronę obraca się silnik/koło, czy w prawo, czy w lewo. Ale jaki jest sposób odczytu z takiego enkodera? Czy (załóżmy mam 11 impulsów na każde wyjście), kiedy chce się dowiedzieć, w którą stronę obraca się silnik, to muszę robić pomiar nie z jednego kanału, tylko z dwóch, prawda? Aby, np. dostać wynik ze znakiem + i -. Tylko jak robię pomiary z dwóch kanałów, to czy te 11 impulsów jest stałe dla jednego enkodera/silnika? czy wtedy mam 22 impulsy łącznie? Co za tym idzie łączna wartość impulsów na obrót koła będzie 2x większa? (test @ 12V) PULSES: 1781 SPEED: 172 RPM PULSES: 1781 SPEED: 172 RPM PULSES: 1783 SPEED: 173 RPM PULSES: 1780 SPEED: 172 RPM PULSES: 1784 SPEED: 173 RPM PULSES: 1784 SPEED: 173 RPM PULSES: 1783 SPEED: 173 RPM PULSES: 1783 SPEED: 173 RPM PULSES: 1786 SPEED: 173 RPM PULSES: 1782 SPEED: 173 RPM PULSES: 1783 SPEED: 173 RPM PULSES: 1785 SPEED: 173 RPM PULSES: 1782 SPEED: 173 RPM (test @ 6V) PULSES: 887 SPEED: 86 RPM PULSES: 883 SPEED: 85 RPM PULSES: 887 SPEED: 86 RPM PULSES: 889 SPEED: 86 RPM PULSES: 890 SPEED: 86 RPM PULSES: 890 SPEED: 86 RPM PULSES: 889 SPEED: 86 RPM PULSES: 887 SPEED: 86 RPM PULSES: 886 SPEED: 86 RPM PULSES: 892 SPEED: 86 RPM PULSES: 899 SPEED: 87 RPM PULSES: 891 SPEED: 86 RPM PULSES: 879 SPEED: 85 RPM Oraz kod, na którym testowałem. // Motor encoder output pulse per rotation #define ENC_COUNT_REV 618 // 616 // Encoder output to Arduino Interrupt pin #define ENC_IN 3 // Pulse count from encoder volatile long encoderValue = 0; // One-second interval for measurements int interval = 1000; // Counters for milliseconds during interval long previousMillis = 0; long currentMillis = 0; // Variable for RPM measuerment int rpm = 0; void setup() { // Setup Serial Monitor Serial.begin(9600); // Set encoder as input with internal pullup pinMode(ENC_IN, INPUT_PULLUP); // Attach interrupt attachInterrupt(digitalPinToInterrupt(ENC_IN), updateEncoder, RISING); // Setup initial values for timer previousMillis = millis(); } void loop() { // Update RPM value every second currentMillis = millis(); if (currentMillis - previousMillis > interval) { previousMillis = currentMillis; // Calculate RPM rpm = (float)(encoderValue * 60 / ENC_COUNT_REV); Serial.print("PULSES: "); Serial.print(encoderValue); Serial.print('\t'); Serial.print(" SPEED: "); Serial.print(rpm); Serial.println(" RPM"); encoderValue = 0; } } void updateEncoder() { // Increment value for each pulse from encoder encoderValue++; }
  4. Witaj Marku 🙂 Oczywiście nie chcę się poddać. Już odpowiadam. Nie widzicie mojego układu, ponieważ jest to (wydaje mi się) prosty układ połączeń silnik+enkoder+Arduino Nano. Wyjścia enkodera (kanały A,B) podłączone mam do pinów Arduino, na których mogę zliczać impulsy - są to D2 oraz D3 (INT0, INT1). Sam enkoder zasilam napięciem 5V, a silnik 12V. Co do samych pomiarów jakie wykonywałem, za obrót wału silnika stanowił mój palec, którym wprawiałem w ruch magnes enkodera, który osadzony jest na wale silnika. Z drugiej strony mam wał wyjściowy z przekładni a na nim zamocowane koło i wycięty z taśmy izolacyjnej wskaźnik oraz kartkę. na której zaznaczyłem krzyżyk, aby mieć jakiś punkt odniesienia. Wrzucam też kod, w którym zliczam tylko impulsy i wysyłam ja na serial monitor, nic więcej. /* * Red Wire - positive power supply of motor(+)(change positive and negative of motor the rotation will change) * White Wire - negative power supply of motor(-)(change positive and negative of motor the rotation will change)) * Yellow Wire - signal feedback (motor one turn has 11 signals) * Green Wire - signal feedback (motor one turn has 11 signals) * Blue Wire - positive of encoder power supply(+)(3.3-5V) * Black Wire - negative of encoder power supply(-)(3.3-5V) */ #define aPin 2 // Pin D2 INT0 #define bPin 3 // Pin D3 INT1 unsigned long lastTimer, timer = 0; int counter = 0; // Loop interval int interval = 25; void setup() { Serial.begin(115200); pinMode(aPin, INPUT_PULLUP); pinMode(bPin, INPUT_PULLUP); // Setting up interrupt attachInterrupt(digitalPinToInterrupt(aPin), ai0, RISING); attachInterrupt(digitalPinToInterrupt(bPin), ai1, RISING); } // Reading quadrature encoder void ai0() { if(digitalRead(bPin)==LOW) counter++; else counter--; } void ai1() { if(digitalRead(aPin)==LOW) counter--; else counter++; } void loop() { timer = millis(); // Main loop function if(timer - lastTimer > interval) { // Print (Serial monitor) Serial.print(counter); Serial.print(" pulses"); lastTimer = timer; } } Oraz przykładowy wynik - koło zamocowane na wale wyjściowym zakręcone ręką w jedną i w drugą stronę. 0 pulses 0 pulses 0 pulses 0 pulses 0 pulses 0 pulses 1 pulses 2 pulses 2 pulses 5 pulses 8 pulses 12 pulses 18 pulses 24 pulses 32 pulses 41 pulses 51 pulses 62 pulses 73 pulses 86 pulses 98 pulses 112 pulses 127 pulses 142 pulses 156 pulses 171 pulses 186 pulses 200 pulses 214 pulses 228 pulses 242 pulses 256 pulses 269 pulses 282 pulses 296 pulses 310 pulses 322 pulses 335 pulses 347 pulses 360 pulses 372 pulses 384 pulses 397 pulses 410 pulses 424 pulses 438 pulses 452 pulses 468 pulses 482 pulses 498 pulses 514 pulses 529 pulses 545 pulses 560 pulses 576 pulses 593 pulses 609 pulses 626 pulses 642 pulses 658 pulses 675 pulses 691 pulses 706 pulses 722 pulses 734 pulses 747 pulses 758 pulses 768 pulses 776 pulses 784 pulses 792 pulses 798 pulses 802 pulses 806 pulses 809 pulses 812 pulses 812 pulses 810 pulses 810 pulses 810 pulses 810 pulses 810 pulses 810 pulses 810 pulses 808 pulses 808 pulses 806 pulses 804 pulses 801 pulses 798 pulses 795 pulses 792 pulses 789 pulses 786 pulses 782 pulses 780 pulses 776 pulses 774 pulses 770 pulses 768 pulses 765 pulses 762 pulses 760 pulses 757 pulses 754 pulses 752 pulses 750 pulses 748 pulses 745 pulses 742 pulses 740 pulses 736 pulses 732 pulses 728 pulses 724 pulses 719 pulses 714 pulses 708 pulses 704 pulses 698 pulses 692 pulses 684 pulses 678 pulses 670 pulses 662 pulses 654 pulses 646 pulses 640 pulses 634 pulses 629 pulses 626 pulses 624 pulses 622 pulses 622 pulses 622 pulses 622 pulses 622 pulses 622 pulses 620 pulses 618 pulses 612 pulses 607 pulses 598 pulses 588 pulses 576 pulses 562 pulses 545 pulses 526 pulses 507 pulses 486 pulses 464 pulses 442 pulses 421 pulses 402 pulses 384 pulses 367 pulses 352 pulses 336 pulses 322 pulses 310 pulses 298 pulses 288 pulses 278 pulses 266 pulses 252 pulses 236 pulses 219 pulses 200 pulses 178 pulses 156 pulses 133 pulses 110 pulses 89 pulses 65 pulses 45 pulses 24 pulses 6 pulses -12 pulses -28 pulses -45 pulses -60 pulses -74 pulses -86 pulses -98 pulses -110 pulses -122 pulses -136 pulses -150 pulses -166 pulses -182 pulses -200 pulses -218 pulses -236 pulses -254 pulses -272 pulses -288 pulses -304 pulses -318 pulses -332 pulses -344 pulses -356 pulses -366 pulses -376 pulses -384 pulses -392 pulses -399 pulses -405 pulses -411 pulses -415 pulses -419 pulses -422 pulses -425 pulses -425 pulses -425 pulses -425 pulses -425 pulses -425 pulses -425 pulses Przy 12V było coś około 108RPM. Ale nie jestem w 100-u% pewny, że dobrze to "zbadałem".
  5. Tak też zrobiłem i wyniki prezentują się następująco: Odczyt tylko z pierwszego kanału enkodera: około 618 imp./obrót wału wyjściowego. Odczyt tylko z drugiego kanału enkodera: około 618 imp./obrót wału wyjściowego. Z kolei odczyt z dwóch kanałów enkodera jednocześnie daje wynik około 1236 imp./obrót wału wyjściowego. Oczywiście te odczyty były robione najdokładniej jak mogłem. Po trzy razy dla jednego kanału i tak samo dla obydwu. Wyniki były za każdym razem prawie takie same. Wyjściowy wał posiada pewien luz. A dla jednego obrotu wału silnika każdy kanał enkodera zlicza 11 impulsów.
  6. Cześć wszystkim. Otóż mam problem z impulsami (a dokładniej z ich odczytem, tudzież wyliczeniem). Chodzi o to, że kupiłem kiedyś dwie sztuki silników JGB37-520 z enkoderem, który ma 11 impulsów na obrót wału silnika na pojedynczym kanale. Ten enkoder ma dwa czujniki Halla i tak jak pisałem wyżej 11 imp. jest dla jednego czujnika. Sam silnik ponoć ma przełożenie 90:1 i 70RPM przy 6V i własnie coś tutaj mi nie gra. Ponieważ po przeliczeniu tych danych dla mojego silnika PPR (Pulses Per Revolution) wynoszą 11x90 = 990 (ewentualnie 22x90=1980). W Arduino IDE odczytuje sygnały z dwóch czujników Halla (sygnały A i B) i na jeden obrót wału silnika zliczone impulsy to 22 -> czyli 11x2 i w serial monitorze odczytuje wartość impulsów na jeden obrót wału wyjściowego z przekładni i mam wynik ~1236 imp./obrót.Więc ten wynik (1236) nie jest równy wyliczeniom z "dokumentacji" mojego silnika. Nie wiem co jest grane, wydaje mi się, że albo silnik nie ma przełożenia 90:1 albo chochlik siedzi gdzieś indziej. Jedno jest pewne - na jeden czujnik Halla przypada 11 impulsów na obrót wału silnika. Robiłem też test odczytu tylko kanału A mojego enkodera i wynik na serial monitorze miałem ~ 618 (połowa 1236, ponieważ odczyt tylko z jednego kanału). Myślę, że to już wszystkie dane. Mam nadzieję, że uda się rozwiązać problem. Podaje link do tabeli silnika. Edit: Zrobiłem prosty test polegający na wyliczeniu RPM za pomocą odczytu jednego kanału enkodera (moje stałe to PPR = 990 -> 11x90 -> gear ratio 90:1) Z obliczeń wyszło mi coś takiego - przykładowe wartości z serial monitora: 1788 pulse / 990 pulse per rotation x 60 seconds = 108 RPM 1787 pulse / 990 pulse per rotation x 60 seconds = 108 RPM 1783 pulse / 990 pulse per rotation x 60 seconds = 108 RPM Wynik to 108 RPM przy 12V, z kolei przy 6V mam 30 RPM..., a powinno być 70 RPM.
  7. aixI

    Czujnik CNY70 nie działa.

    @deshipu wydaje mi się, że to może być przyczyną, bo w bibliotece do Eagle tego czujnika chyba został odwrócony o 180* fototranzystor i może kolega podłączył czujnik patrząc na schemat (a nie w oparciu i notę katalogową). Niech sofnir to sprawdzi 😉
  8. aixI

    Czujnik CNY70 nie działa.

    Cześć! Jesteś pewny, że dobrze podłączyłeś czujnik? Najlepiej jak pobierzesz sobie .pdf tego czujniczka i dokładnie zobaczysz na zdjęciu, gdzie jest anoda, katoda diody IR oraz gdzie jest kolektor i emiter fototranzystora. Wartości 220R oraz 10k spokojnie wystarczają co poprawnej pracy czujnika. Zapodaj też zdjęcie swojego podłączenia tego czujnika - może będzie prościej pomóc 🙂
  9. Chciałbym powiadomić osoby, które borykały (albo nadal borykają) się z problemem poprawnej konfiguracji środowiska "System Workbench for STM32", a konkretniej, gdy program chce pobrać bibliotekę "STM32 Standard Peripheral Libraries" podczas tworzenia projektu. Należy wykonać opisane czynności, które przedstawił kolega Elvis: --------------------------------------------------------------------------------------------------------------- Osobiście sprawdzałem to na platformie x64 i Windows'ie 7 jak i 8.1 z zainstalowaną Javą (najnowszą) x86. Wszystko działa jak powinno, żadnych problemów. Pozdrawiam, Adam.
  10. Powitać! Myślę, że może Ci się przydać taka lektura 🙂 http://mirekk36.blogspot.com/2012/10/drgania-stykow-to-bajki-wiec-jak-to.html http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html Drgania styków możesz ograniczyć programowo, jak i sprzętowo.
  11. Witam wszystkich. Mam pewien problem, ponieważ nie mogę pobrać (przy tworzeniu nowego projektu - C Project) "Standard Peripheral Library (StdPeriph)". Zaznaczam tą bibliotekę (czarna kropka) i następnie klikam "Download target firmware" i nic :/, a z kolei jak chciałem (tylko aby zobaczyć co się stanie) pobrać tą drugą bibliotekę (Cube HAL), to po wybraniu tej biblioteki i kliknięciu "Download target firmware" zaczęła się pobierać. Ale zatrzymałem to pobieranie, bo według kursu bazujemy na tej pierwszej biblioteczce. Zaznaczam, że próbowałem już z ustawieniami "uruchom jako administrator" i jest tak samo, czyli nie pobiera mi się ta pierwsza biblioteka. Czy ktoś spotkał się z czymś takim? Ewentualnie może ktoś podać link do tej biblioteki i wystarczyłoby ją pobrać osobno i umieścić w jakimś katalogu?? Proszę o wytłumaczenie i pomoc 🙂 Edit: 18.07.2016 Pobrałem te sterowniki (?) ze strony st - dokładnie to - STSW-STM32143 - to jest to samo co jest opisane podczas kursu STM32 na Forbocie, czyli "STM32_Nucleo_FW_V1.2.1". Rozpakowałem na dysku C, ale nadal przy tworzeniu nowego projektu nie jest to widoczne dla programu System Workbench for STM32. Wydaje mi się, że trzeba umieścić te drivery w odpowiednim katalogu tylko pytanie, "gdzie"? Edit: 19.07.2016 Naprawdę nie da się tego problemu naprawić? Oo :/ Ciągle mam to samo, nic się nie zmieniło kiedy cokolwiek próbowałem zrobić z tym. Jak instalowałem sterowniki do ST-Link'a, to ten programator zainstalował mi się jako "ST-Link Debug", a w kursie było "STMicroelectronics STLink dongle" - jest to jakaś różnica? Jakby co działam na Win 8.1 Pro x64. Pozdrawiam, Adam
  12. Witam. Potrzebuję modułu Bluetooth HC-05. Czekam na propozycje - oczywiście rozsądne ceny. Ogólnie moduł może być używany (niższa cena), ale w pełni sprawny. Pozdrawiam.
  13. Poza tym po co "zawalać" takimi błahymi pytaniami forum, jak można zadać szybkie pytanie na stronie http://diy.szybkiepytanie.pl/ - po to właśnie istnieje ta strona... Pozdrawiam.
  14. Nie, to nie ten moduł, ale kolega, który pisał ten kurs użył BTM-222 i zrobił sobie sam podobny moduł (taki DIY) 🙂
  15. aixI

    Odczyt z czujnika temperatury

    Ja jeszcze zapytam kolegi akimata o ten czujnik - dokładnie o jego podłączenie. Sam pokazałeś screena z DS'a tego czujnika i pisze: "BOTTOM VIEW", czyli rysunek pokazuje tak jakby obudowę TO-92 nóżkami do góry. Zawsze możesz pokazać (zrobić zdjęcie) jak masz to fizycznie na płytce podłączone z opisem przewodów - gdzie który idzie. Edit: Jak posiadasz multimetr, to użyj go do sprawdzenia, gdzie masz anodę i katodę. Pozdrawiam.
×
×
  • 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.