Lolheadshootpl Napisano Maj 5, 2021 Udostępnij Napisano Maj 5, 2021 Witam. Potrzebuję jakiejś inspiracji lub czyjegoś projektu do sterowania serwomechanizmem przy pomocy tact switchy. Jestem w trakcie projektu ramienia robota i szukam kodu do pilota i odbiornika. Do kontrolowania jednego serwomechanizmu chcę użyć dwóch przycisków ( jeden obraca w jedną a drugi w drugą stronę). Pozdrawiam. Serwo : MG996R Kontroler : Arduino nano ( nadajnik) Arduino MEGA ( odbiornik) ps. jedną osią w robocie obracam za pomocą silnika krokowego i do tego też bym potrzebował jakieś porady.
deshipu Maj 6, 2021 Udostępnij Maj 6, 2021 Ja bym zaczął od zapoznania się z biblioteką do nrf24l01 — szczególnie przykładami. Dalej, badasz bibliotekę Servo i przykłady do niej, oraz szukasz biblioteki do sterownika silników jakiego planujesz użyć. Wszystkie one powinny mieć przykłady, co chyba powinno wystarczyć, jeśli dobrze zrozumiałem co masz na myśli przez "inspirację".
Lolheadshootpl Maj 7, 2021 Autor tematu Udostępnij Maj 7, 2021 Okej coś tam ogarnąłem lecz nie za bardzo działa. Co mam źle w tym programie? ( uprzedzając pytanie komunikacja pomiędzy nrf24l01 działa poprawnie) //Nadajnik #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); // CE, CSN const uint64_t pipe = 0xF0F0F0F0D2L; //Byte of array representing the address. This is the address where we will send the data. This should be same on the receiving side. int button_pin = 11; boolean button_state = 0; void setup() { pinMode(button_pin, INPUT); Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipe); } void loop() { button_state = digitalRead(button_pin); if(button_state == HIGH) radio.write(&button_state, sizeof(button_state)); //Sending the message to receiver } //Odbiornik #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> // include the Servo library Servo myServo1; boolean button_state = 0; int pos = 0; RF24 radio(7,8); //pin number for the arduino you're using. this pin is diffrent for diffrent arduino models. const uint64_t pipe = 0xF0F0F0F0D2L; void setup() { myServo1.attach(11); Serial.begin(9600); radio.begin(); radio.openReadingPipe(1, pipe); radio.startListening(); } void loop(){ if(radio.available()) radio.read(&button_state1, sizeof(button_state1)); if (button_state1 == HIGH && pos < 180) { pos++; myServo1.write(pos); } radio.read(&button_state, sizeof(button_state)); if (button_state == HIGH && pos > 0) { pos--; myServo1.write(pos); delay(15); } }
Lolheadshootpl Maj 7, 2021 Autor tematu Udostępnij Maj 7, 2021 Po tym że podłączam i nie ma reakcji ?
deshipu Maj 7, 2021 Udostępnij Maj 7, 2021 A jakiej reakcji oczekujesz? Wiesz, ciężko jest czytać w myślach i zgadywać jak twój program powinien twoim zdaniem działać. Ciężko też zgadnąć jak masz wszystko podłączone. Jak nam nie napiszesz, to jak mamy pomóc?
Lolheadshootpl Maj 7, 2021 Autor tematu Udostępnij Maj 7, 2021 Dobrze napisze jeszcze raz. Chce za pomocą dwóch przycisków kontrolować jedno serwo w taki sposób że jednym steruje obrotem w lewo a drugim w prawo. Chodzi o sterowanie ramienia robota więc wszystko powinno odbywać się powoli. W załączniki jest zdjęcie na którym jest poglądowy schemat połącznia ( sorki za jakość) Przyciski podłączone są również do rezystorów podciągających. Przy arduino nano podłączyłem piny MISO,MOSI,SCK do pinów ICSP (tych sześciu z tyłu płytki). Serwomechanizm podłączony do pinu 11. Kod powyżej.
deshipu Maj 7, 2021 Udostępnij Maj 7, 2021 A testowałeś najpierw samo serwo, same przyciski i samo radio? Jak na przyciskach masz rezystory podciągające, to domyślnie sygnał jest HIGH, a przy wciśniętym przycisku LOW — twój kod zakłada odwrotnie. W nadajniku masz tylko jeden przycisk i wysyłasz jeden bajt, a w odbiorniku czytasz dwa bajty. Skąd się bierze drugi? Jeden stopień to bardzo mała zmiana, jesteś pewien, że zauważysz? 1
Lolheadshootpl Maj 8, 2021 Autor tematu Udostępnij Maj 8, 2021 Radio , serwo , przyciski sprawne bo testowałem. Co do kodu to wiem że nie dodałem drugiego przycisku bo chciałem przetestować na jednym. A co do jednego stopnia do jak przytrzymam przycisk to zrobi parę stopni więc to zauważe. Zmienie jeszcze to HIGH na LOW i spróbuje.
deshipu Maj 8, 2021 Udostępnij Maj 8, 2021 (edytowany) 1 godzinę temu, Lolheadshootpl napisał: Co do kodu to wiem że nie dodałem drugiego przycisku bo chciałem przetestować na jednym. Ale odbiornik oczekuje dwóch, zresztą w bardzo dziwny sposób, bo sprawdzasz czy jest jeden bajt do odebrania, odbierasz go, a potem próbujesz odebrać drugi bez żadnego sprawdzania — jak to ma działać? Poza tym po co wysyłasz osobny bajt dla każdego przycisku, skoro mógłbyś wysyłać tylko jeden dla 8 przycisków, i tylko ustawiać w nim bity? Edytowano Maj 8, 2021 przez deshipu
deshipu Maj 8, 2021 Udostępnij Maj 8, 2021 1 godzinę temu, Lolheadshootpl napisał: Radio , serwo , przyciski sprawne bo testowałem. Jak byś testował, to chyba byś zauważył, że masz HIGH zamiast LOW? Słabo to testowałeś.
Lolheadshootpl Maj 8, 2021 Autor tematu Udostępnij Maj 8, 2021 Serwo testowałem testerem do serwomechanizmow, a radio testowałem przy użyciu programu Hello World.
deshipu Maj 8, 2021 Udostępnij Maj 8, 2021 No to przetestuj te kawałki swojego kodu, które się zajmują serwem, przyciskami i radiem — niezależnie od siebie. Będzie ci łatwiej potwierdzić, że kod jest dobry i/lub znaleźć co jest źle. Możesz na przykład, zamiast wysyłać radiem, wypisać coś na konsoli — żeby widzieć, że przycisk działa.
farmaceuta Maj 8, 2021 Udostępnij Maj 8, 2021 Takie cos chyba nie bedzie robilo tego co chcesz... if (button_state1 == HIGH && pos < 180) { pos++; myServo1.write(pos); } radio.read(&button_state, sizeof(button_state)); if (button_state == HIGH && pos > 0) { pos--; myServo1.write(pos); delay(15); } zwroc uwage ze jak juz otrzymasz informacje o wcisnietym guziku to w loop() nigdzie juz nie modyfikujesz tej zmiennej i warunek w if'ach (polowa) zawsze spelnione...poza tym zmienna "pos" na starcie ma "0" wiec pierwszy if sie wykona i doda "1"..w drugim if "pos" wieksze od zera i odejmie...i petla sie powtorzy, i tak caly czas dopoki nie zmienisz zmiennej od guzika..
Lolheadshootpl Maj 9, 2021 Autor tematu Udostępnij Maj 9, 2021 Okej znalazłem sobie nowy kod i sprawdziłem bez NRF'a w sensie normalnie podłączyłem do arduino 2 przyciski i wszystko elegancko działa i teraz moje pytanie jak dodać do tego kodu NRF'a. #include <Servo.h> Servo myservo; #define leftPin 2 #define rightPin 3 int pos = 90; int delayPeriod = 50; // increasing this slows down the servo movement void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object myservo.write(pos); // center the servo pinMode(leftPin, HIGH); // turn on pullup resistors pinMode(rightPin, HIGH); } void loop() { if(digitalRead(leftPin) == LOW) { // in steps of 1 degree if( pos > 0) --pos; myservo.write(pos); // tell servo to go to position in variable 'pos' delay(delayPeriod); } if(digitalRead(rightPin) == LOW) { if( pos < 180) ++pos; myservo.write(pos); // tell servo to go to position in variable 'pos' delay(delayPeriod); } } Chodzi mi dokładnie o ten moment. void loop() { if(digitalRead(leftPin) == LOW) { // in steps of 1 degree if( pos > 0) --pos; myservo.write(pos); // tell servo to go to position in variable 'pos' delay(delayPeriod); } if(digitalRead(rightPin) == LOW) { if( pos < 180) ++pos; myservo.write(pos); // tell servo to go to position in variable 'pos' delay(delayPeriod); } }
Pomocna odpowiedź
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ę »