Autor Wątek: Kontrolery Arduino  (Przeczytany 53422 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Odp: Kontrolery Arduino
« Odpowiedź #75 dnia: Lipca 31, 2016, 23:14:26 »
Witam

To kod szkicu od encoderów
#include <Rotary.h> // biblioteka do encoderów
#include <Bounce2.h> // biblioteka dla przycisków eliminująca drganie styków

int  led01 = 10;              // pin diody LED
int  led02 = 11;              // pin diody LED
int  led03 = 6;                // pin diody LED
int  but01 = 9;               // pin przycisku
bool but01_st = false;   // stan przycisku 1
int  d = 5;                      // dlugosc impulsu zapalenia diody

Bounce debouncer = Bounce();    // inicjalizacja biblioteki
Rotary rot01  = Rotary(7, 8);        // piny encodera 1
void setup()
{
  Serial.begin(9600);         // inicjalizacja serial monitora
  pinMode(led01,  OUTPUT); // ustawienie pinu diody led01
  pinMode(led02,  OUTPUT); // ustawienie pinu diody led02
  pinMode(led03,  OUTPUT); // ustawienie pinu diody led02
  pinMode(but01, INPUT_PULLUP); // ustawienie pinu przycisku encodera
  debouncer.attach(but01); // inicjalizacja biblioteki debouncer dla przycisku encodera
  debouncer.interval(20);  // ustawienia dla debouncer - długość opóźnienia
}

void encoder01 () // funkcja dla odczytu encodera
{
  unsigned char result01 = rot01.process(); // odczyt stanu ecodera i przypisanie do zmiennej result01
  if (result01 == DIR_CW ) { digitalWrite(led01, HIGH); delay(d); } // jeżeli encoder w prawo zapala diode 1 plus male opoznienie żeby było widać
    else { digitalWrite(led01, LOW); }  // jeżeli nie gasi diodę
  if (result01 == DIR_CCW ) { digitalWrite(led02, HIGH); delay(d);} // jeżeli encoder w lewo zapala diode 2 plus male opoznienie żeby było widać
    else { digitalWrite(led02, LOW); }  // jeżeli nie gasi diodę
  if (result01) // jeżeli encoder jest obracany
  {
    Serial.println(result01 == DIR_CW ? "Right" : "Left"); // wysyła na serial monitor tekst w zaleźności od kierunku
  }
}

void przycisk01 ()  // funkcja przycisku na encoderze
{
 debouncer.update();  // sprawdzanie czy przyciśnięty
 if (debouncer.fell()) { but01_st = !but01_st; }  // jeżeli tak - wykrywa zbocze i zmienia zmienną but01_st na przeciwny
 if ( but01_st == true ) { digitalWrite(led03, HIGH); }  // zapala diodę w zależności od stanu zmiennej but01_st
    else { digitalWrite(led03, LOW); }
}


void loop()  // główna pętla programu
{
  encoder01();
  przycisk01();

}

Starałem się wszystko opisać w komentarzach. To kod jaki napisałem jakiś czas temu, więc można jeszcze go poprawić, ale obsługa encodera a dokładnie biblioteki jest ok. W szkicu jest też obsługa biblioteki eliminującej drgania styków- Bounce2.h. Sorry za opóźnienie, ale jestem poza Warszawą - wracam za parę dni to będę bardziej dostępny. Jakby co to pytajcie.

pozdrawiam Zając
Zapraszam na stronę projektu www.simproject.zajac.waw.pl

Odp: Kontrolery Arduino
« Odpowiedź #76 dnia: Sierpnia 01, 2016, 00:06:37 »
Byłem na urlopie ale już wracam do żywych.
Co do mojego skryptu - nie mam na tyle doświadczenia żeby go odpowiednio zoptymalizować ale realizuje potrzebne mi funkcje. :(
Co do HAT'ów - testowałem tą funkcję u siebie ale nie działała poprawnie - haty się blokowały, reagowały z opóźnieniem albo reagował tylko jeden kąt. Podejrzewam, że jest to kwestia optymalizacji ale skoro działa na zwykłych przyciskach to już nie będę się z tym bawił, bo mam dużo innej pracy z kokpitem.
Wyciąganie danych z BMS:
Korzystałem z tego tutoriala do podjęcia tematu:
https://www.youtube.com/watch?v=lW0JXoOFTjo
Myślę, że przechwycenie programem okienkowym napisanym w C# i wysłanie do portu szeregowego nie powinno być większym problemem.
Póki co zdążyłem jedynie pobawić się kontrolką i wyświetlaniem czy faktycznie przechwytuje i przechwytuje. :)

Odp: Kontrolery Arduino
« Odpowiedź #77 dnia: Sierpnia 01, 2016, 00:48:03 »
A HATswitche jakie wykorzystujecie? te mikro switche? Mi się zamarzyły haty z dużym wychyleniem. Jedyne co znalazłem to te popularne minijoysticki jak z gamepadów.
Ponieważ tworzę nową elektronikę dla mojego joya - to mam teraz dostępne min. 16 wejść analogowych.
Podpiąłem więc analogowe joysticki jako 4kierunkowy hat switch. I działa.

Kod trochę siermiężny, ale działa. Jak ktoś ma pomysł jak to zoptymalizować to śmiało:
//obsługa pierwszego hata
potHat1LR= muxShield.analogReadMS(3, pin_Hat1LR);
potHat1UD= muxShield.analogReadMS(3, pin_Hat1UD);

    if (potHat1LR > hatProgD and potHat1LR < hatProgG){
            hat1LR_Wychyl=0;
     } else {

          if (potHat1LR >hatProgG) {
              hat1LR_Wychyl=1;
              Joystick.setHatSwitch(0,hatRight);
              hat1Kierunek="Prawo";
              } else {
              if (potHat1LR <hatProgD) {
               Joystick.setHatSwitch(0,hatLeft);
               hat1Kierunek="Lewo";
                hat1LR_Wychyl=1;
              }
          }
     }

      if (potHat1UD > hatProgD and potHat1UD < hatProgG){
            hat1UD_Wychyl=0;
     } else {

          if (potHat1UD >hatProgG) {
              hat1UD_Wychyl=1;
              hat1Kierunek="Gora";
              Joystick.setHatSwitch(0,hatUp);
              } else {
              if (potHat1UD <hatProgD) {
               Joystick.setHatSwitch(0,hatDown);
               hat1Kierunek="Dol";
                hat1UD_Wychyl=1;
              }
          }
     }

    if ( hat1LR_Wychyl==0 and hat1UD_Wychyl==0){
      Joystick.setHatSwitch(0,-1);
      hat1Kierunek="Srodek";
    }
   


Odp: Kontrolery Arduino
« Odpowiedź #78 dnia: Sierpnia 01, 2016, 08:14:56 »
Dzięki koledzy za włączenie się do tego wątku. Jest szansa, że kolega 3.14ter zaprojektuje sterownik (joystick), który będzie bardzo przydatny przy budowaniu kokpitów lub paneli dla symulatorów. Z tego co napisaliście wynika, że każdy stara się na własna rękę lepiej lub gorzej napisać dla swoich potrzeb szkic. Teraz jest szansa wymiany doświadczeń. Eksperymentowanie jest czasochłonne i może prowadzić do zniechęcenia.
Wracając do tematu. Szkic 3.14ter już działa w sensie kompilacji. Teraz połączę przerwania i wgram do kości. Powinien działać w moim testerze przycisków z MMJoy2. Następnie połączę konwerter USB->RS232 i sprawdzę monitorowanie. HC05 dopiero zamawiam. Dziękuje shopiK za szkic. Dzięki maciej za tutorial, to będzie następny temat do rozeznania. Dam znać jak działa szkic 3.14ter .

Odp: Kontrolery Arduino
« Odpowiedź #79 dnia: Sierpnia 01, 2016, 08:16:08 »
Ja robiłem pod Cougara a tam są microswitch'e.

Odp: Kontrolery Arduino
« Odpowiedź #80 dnia: Sierpnia 01, 2016, 09:11:11 »
shopiK
HATy z dużym wychyleniem? Wpadłem na taki pomysł (Twój software -> hardware): przy pomocy dość prostego układu można przerobić minijoystick na przełączniki.
Tak sobie myślałem: i tak trzeba jakoś mechanicznie zamontować ten minijoystick, raczej będzie to płytka + jakieś dystanse. A skoro już robimy płytkę, to można tam od razu wrzucić parę elemntów, które przetworzą analogowe sygnały na wyjścia logiczne. Do tego, wyprowadzając sygnał "Common" (patrz niżej na schemacie), można zastosować multipleksowanie. 4 Haty będą zajmować 8 pinów mikrokontrolera. Tyle samo co w wersji z liniami analogowymi, ale mogą to być dowolne wejścia logiczne, których zazwyczaj jest więcej. Wyjścia TOP,BOTTOM,LEFT,RIGT połączone są razem (komparatory mają wyjścia typu otwarty kolektor, można je sumować), to daje 4 piny. Wyjścia COMMON z każdego z HATów podłączamy do kolejnych 4 pinów. I teraz w programie:
COMMON1 = 0, reszta = 1 -> aktywny jest HAT 1, odczytujemy 4 linie Top itd.
COMMON2 = 0, reszta = 1 -> aktywny jest HAT 2, j.w.
itd. dla wszystkich 4 HATów.
Zasada działania jest bardzo prosta. Jeśli do suwaka potencjometru podłączymy masę, a oba końce "podwiesimy" przez resystory do VCC, to np. przesuwanie joysticka do góry będzie zmniejszać napięcie na linii TOP. Jeśli poziom będzie dość niski (ustalony przez dzielnik 10k-1k i podany na wejścia "-" ) komparator to wykryje i zewrze wyjście TOP_OUT do masy. Czyli zrobi dokładnie to co zrobiłby microswitch w klasycznym HAT.
Schemat wyglądałby mniej więcej tak:


Naturalnie muszę to sprawdzić jeszcze w praktyce.

Odp: Kontrolery Arduino
« Odpowiedź #81 dnia: Sierpnia 01, 2016, 10:52:55 »
Sprytna bestia jesteś :-)

Odp: Kontrolery Arduino
« Odpowiedź #82 dnia: Sierpnia 01, 2016, 11:24:22 »
Pytanie do 3.14ter dotyczy pin w Leonardo do którego mają być połączone przerwania INT. Napisałeś D6 a ja nie widzę takiego oznaczenia na schemacie. Ponieważ INT są konfigurowane jako otwarty kolektor to czy wejście w Leonardo jest na pullup.


Odp: Kontrolery Arduino
« Odpowiedź #83 dnia: Sierpnia 01, 2016, 11:46:50 »
Ach, znowu literówka. Już poprawione. To ma być D7:


D7 trzeba ustawić jako wejście i wpisać 1 (pullup). Samo włączenie przerwania INT6 zrobione jest metodą klasyczną, przez działanie bezpośrednio na rejestrach.
Widzę właśnie, że Arduino przewiduje tam INT4. No i tak właśnie bywa z platformami wymyślonymi do błyskania LEDami dla artystów. W rzeczywistości, wg dokumentacji, na tym pinie jest INT6. Arduino ponumerowało sobie to po swojemu.
 
Jeszcze uwaga do używania tego przerwania: procesor potrafił się zawiesić, jeśli przerwania były zgłaszane bardzo szybko. Rozwiązałem to w ten sposób, że przerwanie zgłasza jedynie flagę, że są nowe dane i wyłącza się. Program główny sprawdza sobie flagę w pętli. Jeśli jest ustawiona, odbiera nowe dane z MCP23017, kasuje flagę i ponownie włącza INT6.

Odp: Kontrolery Arduino
« Odpowiedź #84 dnia: Sierpnia 01, 2016, 12:54:36 »
Panowie, chyba będzie mała zmiana planów.
Zacząłem szukać jakichś sensownych (niedrogich i dostępnych) przetworników AD dla bardziej precyzyjnych osi. Nie wygląda to za dobrze.
Cena takiego przetwonika będzie większa od całości płyki. Nie tędy droga.
Dlatego doszedłem do wniosku, że czas zmienić platformę na coś poważniejszego niź Arduino.
Mianowicie coś takiego:

http://www.cypress.com/documentation/development-kitsboards/cy8ckit-059-psoc-5lp-prototyping-kit-onboard-programmer-and



Zalety:
- koszt ok. 10$,
- wbudowany programator/debugger,
- darmowe IDE (PSoC Creator),
- dość wypasiony procesor Cortex M3 z natywnym USB2.0, ale nie to jest najważniejsze,
- ultra elastyczna 32 bitowa architektura, zamiast zestawu peryferii posiada 24 uniwersalne bloki, z których możemy zbudować sobie dowolne moduły typu I2C, UART itd.,
- 20bitowy ADC na pokładzie (!),
- drugi 12 bitowy ADC na pokładzie,
- remapowanie pinów, tylko niektóre są na stałe przypisane  do funkcji, resztę można sobie poustawiać do woli,
- a wszystko konfiguruje się graficznie.

Spróbowałem właśnie skonfigurować moduł USB wg napisanej wcześniej biblioteki dla Leonardo... i działa. System wykrył płytkę jako joystick.
Następnie spróbowałem ile funkcji sprzętowych będę mógł upadkować w procesor:



Rezultat:
- 8 analogowych osi w pełnych 16bitach,
- 15 analogowych osi 12bit (przesunie się do 16),
- 2 sprzętowe wejścia dla enkoderów, z odkłócaniem i innymi bajerami,
- I2C - ten wykorzystamy do podłączenia MCP23017 i obsługi przycisków. Myślę, że nie warto marnować pinów w procesorze na tak trywialne rzeczy, jak guziki,
- UART i SPI jako okna do świata zewnętrznego i dalszej eskpansji (np. moduły z dodatkowymi enkoderami).

Chyba trzeba będzie założyć nowy wątek o tym projekcie, z Arduino nie będzie miał już nic wspólnego.

Odp: Kontrolery Arduino
« Odpowiedź #85 dnia: Sierpnia 01, 2016, 13:00:45 »
Dzięki za wyjaśnienie. Dla pewności na ATMEGA32U4 pin1 (D7) jest wyprowadzone na pin 7 DIGITAL pcb (moje zdjęcie). Podobnie czy RX to pin0 a TX to pin 1 na zdjęciu pcb Leonardo. Z SCL oraz SDA nie ma problemu. Pullup dla wejścia INT pin 7 pcb Leonardo zrobiłeś programowo. Czy muszę w związku z "pomyłką literówki" wgrać nowy program.

Odp: Kontrolery Arduino
« Odpowiedź #86 dnia: Sierpnia 01, 2016, 13:08:57 »
Nie trzeba nic wgrywać. Błąd był tylko w opisie. Kod jest w porządku.

Odp: Kontrolery Arduino
« Odpowiedź #87 dnia: Sierpnia 01, 2016, 13:09:55 »
Jesteś fachowcem i wiesz najlepiej co ma sens. W takim układzie to faktycznie pozostaje założyć nowy wątek. Moje możliwości intelektualne są ograniczone, ale chętnie piszę się jako tester. Może na forum znajdą się partnerzy do aktywnej dyskusji.

Odp: Kontrolery Arduino
« Odpowiedź #88 dnia: Sierpnia 01, 2016, 13:30:13 »
Gratulacje 3.14ter model pracuje poprawnie na Twoim szkicu, oczywiście tylko dla jednego MCP23017. Testowałem programem WB_Btn Tester. W związku z nową propozycją czekam na decyzje tzn. co mam kupić, aby można było testować nowy projekt. Czy moduł HC05 dla monitorowania mam zamówić. Nie testowałem analogów, czekam na decyzje co dalej.

Odp: Kontrolery Arduino
« Odpowiedź #89 dnia: Sierpnia 01, 2016, 13:50:03 »
Żeby uruchomić odczyt z drugiego MCP wystarczy odkomentować linie
280 - inicjalizacja
143 - odczytanie stanów wejść i wpisanie je do banku przycisków pod adres 1

HC05 generalnie może być bardzo przydatny w wielu sytuacjach. Dobrze jest mieć coś takiego w szufladzie. Ja zamówiłem ich kilka szt. i przekonfigurowałem na różne prędkości, 9600, 115200 i inne, żeby za każdym razem tego nie robić jak zajdzie potrzeba.

Do nowego projektu potrzebny będzie ów kit: CY8CKIT-059. Niestety nie wiem jak z dostępnością w PL. Ja zamawiałem go u Mousera, podejrzewam, że więksi dystrybutorzy jak Digikey, Farnell/Element14 powinni je mieć.