Skocz do zawartości
Wiktor2019

Klawiatura + serwo

Pomocna odpowiedź

Witam

Chcę zrobić program z arduino uno, klawiatury, i serwo. Który po kliknięciu na klawiaturze przycisku ,,5'' serwo na pozycję np. 50 a po kliknięciu przycisków ,,2 i 3'' serwo na pozycje 170.

Nie wiem co w tym kodzie jest nie tak żeby działał tak jak chcę albo jak powinien wyglądać prawidłowy kod.

#include <Keypad.h> //biblioteka od klawiatury
#include <Servo.h> //Biblioteka odpowiedzialna za serwa
Servo serwo;

const byte ROWS = 4; // ile wierszy
const byte COLS = 4; //ile kolumn

byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy
byte colPins[COLS] = {6, 7, 8, 9}; //piny kolumn

char keys[ROWS][COLS] = { //mapowanie klawiatury
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 6; //Co ile ma się zmieniać pozycja serwa?

void setup() 
{ 
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 


  char klawisz = 5; //zmienna do przetrzymywania znakow z klawiatury
  int i = 0; //zmienna pomocnicza do pętli
  //Serwo na pozycje srodkowa 90 (bo zakres 0-180)
  serwo.write(50);
}

  char klawisz = 2,3; //zmienna do przetrzymywania znakow z klawiatury
  int i = 0; //zmienna pomocnicza do pętli
  //Serwo na pozycje srodkowa 90 (bo zakres 0-180)
  serwo.write(170);
}

 

Udostępnij ten post


Link to post
Share on other sites

@Wiktor2019 to na pewno cały kod? Chyba zgubiłeś początek pętli loop 😉

Szczerze mówiąc nie rozumiem jak miałoby to działać nawet z poprawnym loop'em. Co dokładnie chciałeś uzyskać za pomocą poniższego zapisu?

char klawisz = 2,3;

W tym wklejonym programie przecież nawet nigdzie nie odczytujesz znaków z klawiatury... Coś tu nie gra 😉

Udostępnij ten post


Link to post
Share on other sites

Program złożyłem z kurów arduino część 1 i 2. Za pomocą tego zapisu chciałem uzyskać że po wciśnięciu klawiszów 2 i 3 serwo przestawia się na pozycję 170. Myślałem, że

char klawisz = 2,3;

to wybór przycisku w tym wypadku 2 i 3. W takim wypadku jak powinien wyglądać taki kod?

Udostępnij ten post


Link to post
Share on other sites

W takim razie coś źle złożyłeś, bo brakuje tu ważnych elementów programu. Proponowałbym na początek wykonać ćwiczenia z kursu Arduino 2 (przynajmniej z tej części o klawiaturze), bo tutaj robisz takie błędy, że naprawdę ciężko jakoś sensownie pomóc bez pisania całości za Ciebie.

38 minut temu, Wiktor2019 napisał:

to wybór przycisku w tym wypadku 2 i 3. W takim wypadku jak powinien wyglądać taki kod?

W zmiennej tego typu możesz trzymać informację o jednym znaku, a nie o dwóch. Taki zapis z przecinkiem nie istnieje. Jeśli chcesz interpretować wpisywanie liczb to musisz zapamiętać pierwszą cyfrę, później drugą, stworzyć z nich liczbę i dopiero coś takiego interpretować dalej (pisząc w dużym skrócie) 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

To w takim razie taki kod będzie działał?

#include <Keypad.h> //biblioteka od klawiatury
#include <Servo.h> //Biblioteka odpowiedzialna za serwa

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 6; //Co ile ma się zmieniać pozycja serwa?
void setup() 
{ 
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 
 

const byte ROWS = 4; // ile wierszy
const byte COLS = 4; //ile kolumn

byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy
byte colPins[COLS] = {6, 7, 8, 9}; //piny kolum

char keys[ROWS][COLS] = { //mapowanie klawiatury
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury

void loop() {
  char klawisz = 0; //zmienna do przetrzymywania znakow z klawiatury
  int i = 0; //zmienna pomocnicza do pętli
}

klawisz  = klawiatura.getKey();
      if (klawisz == '5')  {
    serwomechanizm.write(50); //Wykonaj ruch
  } else { //Jeśli nie, to powrót na początek
    pozycja = 0;
      }
      
volatile int  serwomechanizm.write(0);
char pinCyfra1 = '1';
char pinCyfra2 = '2';

klawisz = klawiatura.getKey();
      if (klawisz) {
        //Czy kolejna podana cyfra jest poprawna?
        if (pinAlarmuPozycja == 1 && klawisz == pinCyfra1) { //Jesli sprawdzamy 1 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna
        } else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2){  //Jesli sprawdzamy 2 pozycje PINu     
         } else {
          serwomechanizm.write(120); //Wykonaj ruch
         }

      }
        

 

Udostępnij ten post


Link to post
Share on other sites

@Wiktor2019 ten kod nie ma praktycznie sensu, znów masz namieszane coś z pętlą główną, która kończy się zaraz po deklaracji zmiennych. Czy wykonałeś ćwiczenia z kursu elektroniki czy tylko próbujesz skleić kody? Naprawdę chętnie Ci pomożemy, ale widać, że przy tym łączeniu programów chyba nie wiesz co dokładnie i gdzie wklejasz. Pomijając pętlę główną reszta nadal jest źle. Nawet jak w końcu uda Ci się strzelić i poprawnie coś połączysz to zawiesisz się przy kolejnym programie. Gorącą zachęcam, aby "poświęcić" jeden dzień na naukę podstaw 😉

  • Lubię! 1

Udostępnij ten post


Link to post
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!

Gość
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...