Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'Arduino'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino, ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 181 wyników

  1. #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 } void loop() { if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie serwomechanizm.write(pozycja); //Wykonaj ruch } else { //Jeśli nie, to powrót na początek pozycja = 0; } pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa delay(200); //Opóźnienie dla lepszego efektu } Witam, jest to mój pierwszy post na forum oraz pierwszy tydzień zabawy z Arduino, dlatego z góry dziękuję za pomoc i komentarze, nawet jeśli problem jest banalny. Buduję model, w którym jednym z elementów jest rozdzielacz hydrauliczny z 3 serwami. Zadaniem serw jest pełne otwarcie zaworu oraz odczekanie zadanego czasu. Po jego upływie zawór zamyka się i znowu czekamy, aż upłynie zadany czas. Powyższy kod to kod z kursu do Aruduino (lekcja z zastosowaniem PWM). Kod działa i serwo pracuję non stop, otwiera i zamyka zawór, bez przerwy. Kombinowałem z funkcją delay jednak nic to nie dało, albo zrobiłem to źle. Czytałem, że musi zostać zastosowana tutaj jedna z funkcji arduino - millis(), ponieważ w trakcie pracy rozdzielacza inne elementy będą działać równolegle. Z tym również próbowałem, ale nie wyszło Przejdźmy do sprawy: jak zmodyfikować kod, aby - 1) Istniała możliwość pracy innych elementów w czasie pracy rozdzielacza 2) Serwa robiły pauzę na określony czas po otwarciu i zamknięciu zaworu
  2. Chciałbym zaprezentować oraz poddać opinii forumowiczom zaprojektowany przez naszą firmę układ, który to chcemy wprowadzić na rynek. Ktoś mógłby go nazwać uniwersalnym sterownikiem. My określamy go jako Swobodnie Programowalny Moduł Sterowania. Moduł ten może być programowany w języku C (przykładowo Atmel Studio) lub też w Arduino, gdyż układ ten jest zgodny z Arduino Mega2560 oraz dodatkowo używa znacznie więcej nóżek mikrokontrolera niż wykorzystano w rodzimym Arduino Mega2560. W załączniku można znaleźć opis wyprowadzeń płytki. Może zamiast się rozpisywać, przytoczę treść naszej ulotki na temat układu – znajdują się tu wszystkie najważniejsze cechy modułu: ” … Nasz moduł imponuje ilością interfejsów komunikacyjnych przewodowych i bezprzewodowych, mnogością wejść/wyjść cyfrowych i analogowych, wyjść przekaźnikowych oraz peryferiami nietypowymi jak dla tego typu modułów, takimi jak wyjście typu TRIAC, detektor przejścia przez zero, układ pomiaru prądu, wyjścia PWM, karta SD i wiele innych. Dodatkowym atutem naszego modułu jest to, że posiada złącze rozszerzeń, do którego możemy zaprojektować dowolny układ elektroniczny realizujący funkcje wykraczające poza te, które moduł oferuje w standardzie. Nasz układ elektroniczny można bardzo łatwo oprogramować. Wybierając nasz moduł sterowania dostajesz na jednej płycie: - 8 izolowanych wejść cyfrowych 12 – 24 VDC. - 8 izolowanych wyjść cyfrowych o wydajności 0,5 A, polaryzowanych dowolnie. - 6 analogowych wejść 0-10 V lub 0-20 mA. - 2 wyjścia analogowe 0-10 V lub 0-20 mA. - 6 wyjść przekaźnikowych 250 VAC 4 A - 3 przełączalne SPDT i 3 zwierne SPST. - 2 wyjścia PWM kluczujące napięcie zasilania. - 2 wejścia czujników temperatury PT100. - Izolowane wyjście typu TRIAC 250 VAC 10 A. - Detektor przejścia przez zero sinusoidy napięcia sieciowego. - Izolowany kanał analogowy do pomiaru prądu w zakresie od -10 do +10 A. - Przewodowe interfejsy komunikacyjne: RS485, Ethernet 10/100 Mbit, USB, RS232, I2C, SPI, OneWire, UART TTL. - Bezprzewodowe interfejsy komunikacyjne: WiFi i Bluetooth. - Karta microSD. - Wyjście na panel HMI - LCD ze sterownikami rodziny FT8xx. - Zegar czasu rzeczywistego RTC po I2C z podtrzymaniem bateryjnym. - 8 wyprowadzeń mikrokontrolera GPIO z poziomami logicznymi TTL 0-5 VDC. - Możliwość podpięcia klawiatury 4x4 do ww. GPIO. - 3 diody sygnalizacyjne R, G, B. - Zasilanie układu 24 lub 12 VDC ze złącza rozłączalnego lub gniazda 5,5 mm. - Złącze rozszerzeń pozwalające na użycie dowolnego układu elektronicznego z dodatkowymi funkcjonalnościami. - Łatwe wgrywanie firmwareu przez USB. - Języki programowania C, C++. „ Do opisu warto dodać, że widziana matryca zworkowa pozwala na podpinanie do UARTów mikrokontrolera peryferii RS232, RS485, WiFi, Bluetooth, dzięki temu można wybrać UART z którego chcemy korzystać (również dostępny jest UART softwareowy użyty w Arduino). Listwa kołkowa opisana jako 8 x TTL GPIO, to nóżki procesora które oprócz dla optoizolowanych wejść można zamiennie wykorzystać do czegoś innego – przykładowo do podpięcia klawiatury 4x4. Obecnie posiadamy do tego modułu płytkę rozszerzeń na której jest 8 dodatkowych wyjść cyfrowych oraz brzęczyk. Nasz moduł sterowania został doceniony medalem targowym INDUSTRYmeeting 2019. Cieszymy się tym uznaniem. Na końcu postu można znaleźć kilka zdjęć/filmów z akcji – układy pracują w naszej gablocie targowej komunikując się po RS485. Obydwa układy mają podpięte dotykowe wyświetlacze 7 calowe. Ten po lewej robi za panel operatorski na którym można odczytać wartości lub posterować wyjściami tego drugiego modułu, a ten drugi właśnie (po prawej) robi za driver stołu liniowego XY oraz podpięte są do niego wszystkie peryferia wystawy (czujniki temperatury PT100, czujnik pływakowy, czujnik zbliżeniowy, listwa LEDowa pod PWM, rygiel elektromagnetyczny). Stół liniowy XY podąża za pozycją palca na prawym ekranie. Docelowo będziemy dostarczać bibliotek programistycznych do obsługi interfejsów i peryferii. Na ten moment chcielibyśmy zacząć wprowadzać na rynek ten moduł bez docelowej biblioteki, ale publikując przykłady obsługi peryferii. Największą wątpliwość jaką mamy, to taka czy wprowadzać urządzenie na rynek w stanie takim jakie jest, czy też wyposażyć go w bardziej wydajny mikrokontroler. Z drugiej jednak strony, obecnie zastosowany mikrokontroler ATmega2560 z komunikacją USB za pośrednictwem ATmega16U2 czyni nasz moduł atrakcyjnym dla sympatyków Arduino, jako że ten zestaw jest bardzo podobny do rodzimego Arduino MEGA2560 a nawet wyposażony w znacznie więcej niż ten rodzimy. Bylibyśmy wdzięczni za szczere i grzeczne opinie, na zasadzie takiej czy ktoś uważa, że nasz moduł może mieć zainteresowanie na rynku czy też nie i co myśli na temat wydajności z zastosowanym mikrokontrolerem. Zastosowany mikrokontroler może i nie kwalifikuje modułu sterującego do demonów prędkości, ale daje za to łatwość programowania a wydajność procesora mimo iż niższa od (przykładowo) 32 bitowych ARMów to i tak powinna zaspokoić wespół z liczebnymi peryferiami płytki szerokie spektrum zastosowań. Co o tym wszystkim myślicie? Gdyby też ktoś był zainteresowany dostępnością naszego modułu to jesteśmy w stanie dostarczyć takie moduły jeszcze ”przedpremierowo” czyli zanim wprowadzimy je oficjalnie na rynek. Link do filmiku naszych układów sterowania przedstawiający je w akcji:
  3. Witam ponownie. Stanąłem przed kolejnym problemem. W mojej instalacji mianowicie znajduje się konduktometr. Dokładnie taki: https://de.aliexpress.com/item/2017-New-verison-CM-230-Conductivity-Meter-Conductivity-Conductivity-Tester-Monitor-Pure-water-meter-monitor-4/32787845538.html?spm=a2g0s.9042311.0.0.62f74c4d8N9nCQ Wszystko cacy tylko to ustrojstwo nadaje sygnałem w standardzie 4-20mA a jak wiadomo Arduino takowego nie posiada. Znacie jakiś sposób by podpiąć ten standard do Arduino? Znalazłem w sieci coś takiego: https://www.antratek.de/4-20ma-r-click?gclid=CjwKCAjw583nBRBwEiwA7MKvoEtQ-9ha0XTjF-PoOqQApiY-AhSTKSdmt9WJobyYYrahC8DUUneehRoCHEEQAvD_BwE można by to jakoś użyć do odczytu sygnału? Wcześniej zamówiłem taki przetwornik ale nie wiem czy to dokładne będzie. https://de.aliexpress.com/item/Current-To-Voltage-Module-0-4-20mA-To-0-3-3V-5V-10V-Voltage-Transmitter-Integrated/32824693659.html?spm=a2g0s.9042311.0.0.20dd4c4dCwbp2k
  4. Mam problem z połączeniem kodu ardiunu. Napisałem działający kod na sterowanie dwoma silnikami przez mostek, oraz kod na sterowanie dwoma serwo. Kody te osobno działają lecz przy próbach połączenia kodów nic nie działa. Dopiero zaczynam programować w arduino. Wiem że to pewnie prosta sprawa dla kogoś kto już troche w tym siedzi ale to dla mnie początki. Pierwszy kod do sterowania silnikami: https://pastebin.com/eLdFuPBV?fbclid=IwAR2gle7I_ltJhNnZ5NYrGbPog7Eu33zzu-CwV8DazjPd6IxyswPJcXlZ5yw Kod do sterowania dwoma serwo: https://pastebin.com/Dmhz6TwH?fbclid=IwAR1jieyCyECJCqomrRivB8H0d_qAJRlPoy9_m85_Xi1HhayHlehIvkObiZA Schemat połączenia :
  5. Mam pytanie i proszę o pomoc Więc tak, zaprogramowałem wyświetlacz LCD 2x16 z klawiaturą membranową w ten sposób, że to co wcisnę to się pojawia na wyświetlaczu. Ma to służyć do wpisywania PINu i tu zaczyna się mój problem gdyż w razie pomyłki chciałem klawiszem 'A' usunąć znak przed kursorem (po jego lewej stronie) ale kompletnie nie wiem jak to zrobić Kombinowałem coś z funkcją lcd.rightToLeft() i żeby wtedy wypisał pusty znak ale nie działa Pomoże ktoś??
  6. Cześć. Jestem tu dlatego że sie poddałem... Plan był taki aby za pomocą pilota 433Mhz sterować pprzekaźnikiem 2ch. Gdy mi już coś wyszło po naciśnięciu któregoś z 2 przycisków przekaźnik zaczyna wariować (załącza sie i wyłącza z 2 razy na sekunde). Szukałem gotowych kodów by znaleźć swój błąd lecz żaden nawet nie załączał przekaźnika. Niestety chce wykorzystać tylko jedno arduino nano/uno które bedzie sterowane pilotem. Może nie tyle o gotowe programy co o naprowadzenie jak to ugryźć. Posiadam: przetwornica (posiadam tez 4ch ale i tak chce wykorzystać 2) Moduł+pilot Arduino nano/uno #include <rm4.h> static const int kEnablePin = 12; static const int kData0Pin = 7; static const int kData1Pin = 8; static const int kData2Pin = 16; static const int kData3Pin = 13; const int relay1 = 10; const int relay2 = 11; const int relay3 = 14; const int relay4 = 15; RM4 remote(kData0Pin, kData1Pin, kData2Pin, kData3Pin); void setup() { Serial.begin(9600); pinMode(kEnablePin, OUTPUT); digitalWrite(kEnablePin, HIGH); pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); } void loop() { const int button_code = remote.buttonCode(); if (button_code == 8) { digitalWrite(relay1, LOW); delay (2000); } else { digitalWrite(relay1, HIGH); } if (button_code == 2) { digitalWrite(relay2, LOW); delay (2000); } else { digitalWrite(relay2, HIGH); } if (button_code == 1) { digitalWrite(relay3, LOW); delay (2000); } else { digitalWrite(relay3, HIGH); } if (button_code == 4) { digitalWrite(relay4, LOW); delay (2000); } else { digitalWrite(relay4, HIGH); } } Z góry dzięki za pomoc
  7. Mam wyświetlacz 1602A i moduł i2c (PCF8574AT), jak podłączam do arduino GND - GND Vcc - 5V SDA- A4 SCL - A5 to skaner i2c nie pokazuje adresu. Jednak czytając datasheety adres to 0x3F i jak wgrywam do przykładów podstawowy program, to wyświetlacz nic nie pokazuje. Kontrast działa, a korzystam z biblioteki NewLiquidCrystal (najnowszej wersji).
  8. Cześć, mam prosty program na arduino nano - wpisujemy w klawiaturę kod ( klawiatura 4x3, keypad.h), jeśli jest poprawny, zmienia stan na przekaźniku i wyłącza elektromagnes, jeśli nie, nic się nie dzieje. Dodatkowo reset wpisanego hasła za pomocą '*'. Otóż program po prostu przestaje działać w losowym momencie, nie pomaga reset ani wyłączenie zasilania na dłuższy czas, jedynie wgranie programu od nowa. Spotkał się ktoś kiedyś z taką sytuacją? Sytuacja już z 2 takim arduino. Załączam cały kod, może coś przeoczyłem. Pozdrawiam, Kamil #include <Keypad.h> char password[9] = {'2','2','4','4','2', '2','5','5','5'}; //char password1[5] = {'1','1','1','1','1'}; char dane[9] = {}; const byte ROWS = 4; //four rows const byte COLS = 3; //three columns int x = 0; char hexaKeys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte rowPins[ROWS] = {5, 6, 7, 8}; //connect to the row pinouts of the keypad byte colPins[COLS] = {2, 3, 4}; //connect to the column pinouts of the keypad Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS ); void setup(){ Serial.begin(9600); pinMode(11, OUTPUT); digitalWrite(11, HIGH); // keypad.addEventListener(keypadEvent); } void loop(){ char customKey = customKeypad.getKey(); if (customKey == '*')reset(); else if (customKey) { dane[x]= customKey; x++; } if ( dane[0]== password[0] && dane[1]==password[1] && dane[2] == password[2] && dane[3] == password[3] && dane[4] == password[4] && dane[5] == password[5] && dane[6] == password[6] && dane[7] == password[7] && dane[8] == password[8] ) { Serial.println("DZIAŁA"); digitalWrite(11, LOW); delay(500); digitalWrite(11, HIGH); delay(500); reset(); } } void reset() { for(int i=0; i<9; i++) { dane[i]=0; x=0; Serial.println("RESET"); digitalWrite(11, HIGH); } }
  9. Witam, przymierzam się do projektowania układu. Mam jedną kwestię, którą nie wiem jak rozwiązać, żeby było to jak najbardziej poprawne. Chcę mieć dwustronną komunikację z bazą danych. Tzn. zapisywać dane oraz sterować z poziomu strony www poprzez bazę danych i tutaj myślę czy wykorzystać: Moduł sieciowy Ethernet ENC28J60 czy esp ? Czy oba nadają się do dwustronnej komunikacji czy może jakoś inaczej to ugryź. Z góry bardzo dziękuję za każdą radę.
  10. Mam takie pytanie. Czy mieliście może kiedyś problemy z czujnikiem DHT 22? Mój przysparza mi problemów od samego początku. Czujnik zamontowany jest w lodówce ok 5 -6 metrów od arduino. Na początku wykorzystałem jako kabel żyłkę 3 x 1,5. Odczyt był stabilny ale często zrywało połączenie czy coś. Kiedy wypiąłem czujnik i wpiąłem go od nowa odczyt wracał na kilkanaście godzin i znów znikał. Obwiniałem więc kabel. W ramach radykalnej poprawy przesyłu danych zastosowałem przewód FTP CAT. 7. Uziemiłem oplot jak Pan Bóg przykazał i... poprawiła się dokładność odczytu ale czujnik nadal wymaga ręcznego wypinania co kilkanaście godzin. Pomyślałem no dobra, to ja Ci DHT bokiem podeślę(dwoma żyłami 1.5 biegnącymi innym peszlem) 5v i GND a odczyt sobie zgarnę po jednej żyle FTP CAT 7. DHT zareagował pozytywnie a jakże odsyłając jeszcze dokładniejszy pomiar. Niestety po kilkunastu godzinach znów zaprosił mnie na audiencję by ręcznie pomasować mu plecki. Pomyślałem więc - w lodówce cholera jest. Jak otworzę drzwiczki ciepłe powietrze i zimne - się pewnie wilgoć na nim zbiera i stąd problemy. Zamówiłem spray Plastik 70 i obfukałem go izolacyjnie. Ucieszył się niezmiernie i dał jeszcze większą dokładność - na kilkanaście godzin. I tu trafił mnie szlak. Albo to jakieś totalne g... albo ja robię jakiś kardynalny błąd. Ktoś może coś doradzić?
  11. Pytanie jak w tytule. Jest jakiś sposób by wszelkie dane odczytywać z monitora portu przez Ethernet lub Wifi? Kiedy na moim yun włączam taką opcję dostaje info że jakiegoś mostka nie mam.
  12. Cześć, wiecie może jak zrobić średnią z 10-20 pomiarów ADC(odczyt prądu z układu ACS712) aby działała w tle bez opóźnień programu? Musi w tle ciągle obliczać średnią ale jednocześnie musi działać inna część kodu.
  13. Hej, zbudowałem sobie takie samodzielne Arduino w oparciu o ATmega328p, jako mój programator służy arduino, z jego pomocą wgrałem bootloader na wyżej wymienioną atmege. I pojawił się problem gdy wgrywam za pomocą programatora(arduino as isp) program(miganie diodą) i podpinam zewnętrzne zasilanie, odpinam programator wszystko działa okej, ale gdy wgrałem sobie drugi program(sterowanie serwomechanizmem z pomocą modułu bluetooth HC-05) to jeśli jestem na zasilaniu z programatora(arduino) to program działa, natomiast jeśli odepnę i podłącze zewnętrzne zasilanie 5V to wtedy nie działa, (chyba) układ jest zasilony bo zapala się dioda z funkcji setup(), ale to co dzieje się w loop() tak jakby już nie działało bo nie ma mrugnięcia diodą a więc tym samym i sam serwomechanizm nie działa. Będę wdzięczny za wszystkie pomysły które mogą pomóc rozwiązać problem. Poniżej fragment kodu gdyby był potrzebny. Dodałem również schemat rozważałem rozdzielenie zasilania atmegi 5V i serwomechanizmy odzielnie na 6V(docelowo 4 serwomechanizmy), ale jeszcze nie wiem jak to się do końca łączy czy masy zasilania razem czy osobno czy w jakiś inny sposób(fajnie jakby ktoś się również tą wiedzą podzielił) ale na ten moment jest na jednym zasilaniu 5V całość atmega jak i 1 serwomechanizm. Na rx/tx dałem konwerter poziomów logicznych 5V/3.3V i jest też stabilizator żeby zrobić 3.3V. JP2 na schemacie to goldpiny na podpięcie serwa. #include <Servo.h> #include <SoftwareSerial.h> Servo s1; int bluetoothTx = 11; int bluetoothRx = 10; SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); unsigned int servopos = 0; unsigned int servopos1 = 0; unsigned int servopos2 = 0; unsigned int realservo = 0; void setup() { s1.attach(9); bluetooth.begin(9600); pinMode(8, OUTPUT); digitalWrite(8, HIGH); } void loop() { if(bluetooth.available() >= 2) { digitalWrite(8, LOW); delay(700); digitalWrite(8, HIGH); servopos1 = bluetooth.read(); servopos2 = bluetooth.read(); realservo = servopos1 + (servopos2*256); Serial.print("Realservo - odczyt: "); Serial.println(realservo); if(realservo >=0 && realservo <=180) { digitalWrite(8, LOW); delay(300); digitalWrite(8, HIGH); digitalWrite(8, LOW); delay(300); digitalWrite(8, HIGH); s1.write(realservo); Serial.print("Pozycja serwo s1 "); Serial.println(realservo); delay(200); } }
  14. Witam, Natknąłem się problem z odpowiednim wykonywaniem warunków w funkcji SwitchCase. w poniższym kodzie program nie chce wejść w case 2, oraz case 3. void sensorTypeUpDate () { switch (actualSensor) { case 1: Serial.print("wszedl w 1 petle"); int odczyt = analogRead(lightSensor); light = map(odczyt, 0, 1023, 0, 100); sensorType = "Jasnosc:"; sensorValue = String(light) + "%"; break; case 2: Serial.print("wszedl w 2 petle"); humidity = dht.getHumidity(); if (dht.getStatusString() == "OK") { sensorType = "Wilgotnosc:"; sensorValue = String(humidity) + "RH%"; } break; case 3: Serial.print("wszedl w 3 petle"); temperature = dht.getTemperature(); if (dht.getStatusString() == "OK") { sensorType = "Temperatura:"; sensorValue = String(temperature) + "*C"; } break; } } Linia Serial.print potrzebna mi była do sprawdzenia czy program wchodzi w dany warunek. O dziwo gdy zmienię kolejność warunków program działa poprawnie. Nie jest to pierwszy raz, jak się z tym spotykam. Poniższy kod działa. void sensorTypeUpDate () { switch (actualSensor) { case 3: Serial.print("wszedl w 3 petle"); temperature = dht.getTemperature(); if (dht.getStatusString() == "OK") { sensorType = "Temperatura:"; sensorValue = String(temperature) + "*C"; } break; case 2: Serial.print("wszedl w 2 petle"); humidity = dht.getHumidity(); if (dht.getStatusString() == "OK") { sensorType = "Wilgotnosc:"; sensorValue = String(humidity) + "RH%"; } break; case 1: Serial.print("wszedl w 1 petle"); int odczyt = analogRead(lightSensor); light = map(odczyt, 0, 1023, 0, 100); sensorType = "Jasnosc:"; sensorValue = String(light) + "%"; break; } } Z góry dziękuje za pomoc.
  15. Witam wszystkich z góry prosilbym o wyrozumiałość jestem osobą początkująca więc nie wszystko rozumiem tak jak Wy:) Przygodę z ardurinio zacząłem jakiś czas temu, przeczytałem większość poradników krok po kroku jednak nadal nie mogę połączyć dwóch funkcji na których mi bardzo zależy a chodzi mi dokładnie o taki projekt ( chciałbym aby rozjasnianie i przygasanie trzech ledow kontrolować w czasie millis oraz określając czas każdego leda z osobna kierować jego stanem po rozjasnieniu aby świecił przykładowo przez 3 sek. Próbowałem połączyć te 2 funkcje fade oraz millis ale coś mi nie wychodzi. Chciałbym coś z tego zrozumieć robię to wyłącznie dla siebie z upodobań do elektryki lecz z programowania jestem zielony. Pozdrawiam i przepraszam że jestem taki głupcem.
  16. Witam chciał bym zaprezentować , drugą "lepszą wersję " kierownicy do komputera opartej na Arduino Leonardo. Film pokazujący jak dziala kierownica i Force Feedback: Jest to wersja elektronicznie taka sama jak poprzednia, wszystko opisane wcześniej link do poprzedniej tutaj : W tej wersji zmieniłem obudowę na znacznie mniejszą , lżejszą , łatwa do zamocowania przy stole, biurku itp. Obudowa została wykorzystana z kupionej przeze mnie za 50 zł kierownicy Logitech Formula Force Ex o obrocie 180* i Force Feedback. Dzięki temu że kierownica miała już przekładnie i ogólnie jest prosta w budowie , bardzo łatwo i tanio można ją przerobić tak aby miala kąt skrętu taki jak ustawimy sobie w programie np 720*,900* i Force Feedback do tego kąta obrotu. Tutaj link do gotowego software na Arduino Leonardo , od razu mówię że na Arduino Uno nie zadziała , link do pobrania w opisie filmu: Ja zrobiłem to tak: Na początku przez środek starej przekładni , dodałem pręt gwintowany o średnicy 10mm ,do którego z jednej strony mocowana jest kierownica, a z drugiej enkoder z drukarki canon ip2770. Aby zamocować enkoder musiałem wyciąć dziure jak widać na zdjęciu poniżej : Aby enkoder nie tarł o blat , dodałem plastikowe podkładki : A tak wygląda już gotowa sama kierownica: Wyjścia enkodera i do silnika , zostały przerobione na standardowych wyjściach które były w kierownicy i wchodzą do dodatkowej skrzynki w której znajduje się reszta elektroniki czyli w sumie tylko Arduino Leonardo i sterownik silników BTS7960: Jeszcze pedal box został przerobiony na taki aby miał 3 jednakowe pedały więc musiałem dokupić drugie takie same i wyciąć jeden i dokleić tak jak na zcjeciach . Schemat podłączenia wszystkiego w linku do wcześniejszej wersji. Efekt końcowy (pedały jeszcze stare): To by było na tyle , jeśli czegoś ktoś potrzebuje , śmiało pisać
  17. Dzień Dobry wszystkim, założyłem ten temat ponieważ nigdzie nie moge znaleść odpowiedzi na swoje pytanie a mianowicie, dlaczego nie otrzymuje adresu konwertera i2c ? Po załączonych zdjęciach widac ze magistrala i2c nie kończy transmisji , ktoś byłby to w stanie wytłumaczyc ?
  18. Witajcie, ostatnio zajmuję się projektem, aby wprowadzić w firmie system zdalnego zapisywania stanu towarów, i do tego planu postanowiłem wykorzystać arduino. Niestety napotkałem na problem z którym nie mogę sobie poradzić z błędem którego nie potrafię wyłapać. Mam wrażenie że mikro kontroler w tym przypadku jakby się cofał. a oto mój kod pod piny <13,7> podpięta klawiatura 4x4, Jeśli ktoś miałby jakiś pomysł co z kodem może być nie tak to bardzo proszę o pomoc gdyż siedzę nad tym już około tygodnia i nie mogę ruszyć dalej Wielkie dzięki za pomoc ! #include <Keypad.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // set the LCD address to 0x27 for a 16 chars and 2 line display //deklaracja typu wyświetlacza // włączenie podwietlenia const byte ROWS = 4; // Ilość wierszy klawiatury const byte COLS = 4; // Ilość kolumn klawiatury byte rowPins[ROWS] = {13, 12, 11, 10}; //numery pinów w arduino dla wierszy byte colPins[COLS] = {9, 8, 7, 6}; //numery pinów w arduino dla kolumn char keys[ROWS][COLS] = { {'A','#','0','*'}, {'B','3','2','1'}, {'C','6','5','4'}, {'D','9','8','7'} }; Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //Zmienne do przechowywania wartości long Numer1, Numer2, Numer; char klawisz; char akcja; boolean wynik = false; char Stan = 'M'; long kod; long szt; // sa 3 stany, stan 'M' oznacza Menu i wlacza sie tylko po skoncu innego stanu // stan 'O' oznacza odejmowanie towaru ze stanu i po jego koncu wlacza sie menu // stan 'D' oznacza dodawanie towaru i dziala podobie jak 'O' // stan 'S' oznacza eksport listy towaru na komputer void setup() { pinMode(4, INPUT_PULLUP); // przycisk oznaczajacy odejmowanie pinMode(3, INPUT_PULLUP); // przycisk oznaczajacy dodawanie lcd.begin(16, 2); //deklaracja typu wyświetlacza lcd.backlight(); // włączenie podwietlenia Serial.begin(9600); // Print a message to the LCD. lcd.backlight(); } int tablica_stan [70]; // numer tabeli to kod towaru a wartosc tabeli to ilosc na magazynie // I 1 I 2 I 3 I X(up) I // I 4 I 6 I 6 I Y(down) I // I 7 I 8 I 9 I C(kasuj) I // I Z(wstecz) I puste IW(wyb. tow)I K(zatwierdz) I void loop() { while (Stan == 'M') { lcd.setCursor(0, 0); lcd.print("wybierz -> aby dod"); lcd.setCursor(0, 1); lcd.print("wybierz -> aby odj"); while (digitalRead(3) == LOW) { Serial.println ("przycisk dodawania"); Stan = 'D'; } while (digitalRead(4) == LOW) { Serial.println ("przycisk odejmowania"); Stan = 'O'; } } while (Stan == 'O') { lcd.clear(); lcd.setCursor(0, 0); lcd.print("wybrales usuwanie"); lcd.setCursor(0, 1); lcd.print("wprowadz kod"); delay(1000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz kod "); lcd.setCursor(0, 1); lcd.print("towaru"); delay(1000); INKL(); while (Numer =! kod){ Numer = kod; Numer = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz ilosc "); lcd.setCursor(0, 1); lcd.print("sztuk"); INKL(); Numer = szt; tablica_stan[kod] = tablica_stan[kod] + szt; if (tablica_stan[kod] == ( tablica_stan[kod] + szt) && tablica_stan[kod] > 0) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("dodanie towaru "); lcd.setCursor(0, 1); lcd.print("powiodlo sie"); szt = 0; kod = 0; Numer = 0; Stan = 'M'; delay(1000); lcd.clear(); } } } while (Stan == 'D') { lcd.clear(); lcd.setCursor(0, 0); lcd.print("wybrales dodawanie"); lcd.setCursor(0, 1); lcd.print("towaru"); delay(1000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz kod "); lcd.setCursor(0, 1); lcd.print("towaru"); delay(1000); INKL(); Numer = kod; Numer = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz ilosc "); lcd.setCursor(0, 1); lcd.print("sztuk"); INKL(); Numer = szt; tablica_stan[kod] = tablica_stan[kod] + szt; if (tablica_stan[kod] == ( tablica_stan[kod] + szt) && tablica_stan[kod] > 0) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("dodanie towaru "); lcd.setCursor(0, 1); lcd.print("powiodlo sie"); szt = 0; kod = 0; Numer = 0; Stan = 'M'; delay(1000); lcd.clear(); } } } void INKL() { // Oznacza inicacje klawisza klawisz = klawiatura.getKey(); //pobranie wartości i przypisanie do zmiennej klawisz if (klawisz != NO_KEY) //jeśli nie ma wartości wzmiennej klawisz WykryjKlawisz(); // wykonaj "WykryjKlawisz" if (wynik == true) //jeśli wartość wynik jest prawdziwa Wyswietl(); // wykonaj "Wyswietl" } //Wykryj klawisz void WykryjKlawisz() { lcd.clear(); //wyczyszczenie wyswietlacza if (klawisz == '*') //jeżeli wciśnięty klawisz C { Serial.println ("klawisz c"); //w monitorze portu wyświetl "klawisz c" Numer = Numer1 = Numer2 = 0; wynik = false; //Przypisz 0 do zmiennych Numer, Numer1, Numer2 } if (klawisz == '1') //jeżeli klawisz 1 wciśnięty { Serial.println ("klawisz 1"); // w konsoli wyświetl klawisz 1 if (Numer == 0) //jeżeli zmienna jest pusta Numer = 1; //zmień wartość zmiennej na 1 else // jeżeli w zmiennej jest już jakaś liczba/cyfra Numer = (Numer * 10) + 1; //wpisz 1 za tą liczbą/cyfrą } if (klawisz == '2') { Serial.println ("klawisz 2"); if (Numer == 0) Numer = 2; else Numer = (Numer * 10) + 2; } if (klawisz == '3') { Serial.println ("klawisz 3"); if (klawisz == 0) Numer = 3; else Numer = (Numer * 10) + 3; } if (klawisz == '4') { Serial.println ("klawisz 4"); if (Numer == 0) Numer = 4; else Numer = (Numer * 10) + 4; } if (klawisz == '5') { Serial.println ("klawisz 5"); if (Numer == 0) Numer = 5; else Numer = (Numer * 10) + 5; } if (klawisz == '6') { Serial.println ("klawisz 6"); if (Numer == 0) Numer = 6; else Numer = (Numer * 10) + 6; } if (klawisz == '7') { Serial.println ("klawisz 7"); if (Numer == 0) Numer = 7; else Numer = (Numer * 10) + 7; } if (klawisz == '8') { Serial.println ("klawisz 8"); if (Numer == 0) Numer = 8; else Numer = (Numer * 10) + 8; } if (klawisz == '9') { Serial.println ("klawisz 9"); if (Numer == 0) Numer = 9; else Numer = (Numer * 10) + 9; } if (klawisz == '0') { Serial.println ("klawisz 0"); if (Numer == 0) Numer = 0; else Numer = (Numer * 10) + 0; } if (klawisz == '#') { Serial.println ("klawisz ="); Numer2 = Numer; wynik = true; } delay(100); } } void Wyswietl() { lcd.setCursor(0, 0); if (wynik == true) { } lcd.setCursor(0, 1); lcd.print(Numer); }
  19. Cześć, może komuś by się chciało napisać coś na temat pisania bibliotek do Arduino? Temat nie poruszany a potrzebny. Baaaaaardzo potrzebny
  20. Witam Mam pewien problem z podłączeniem wyświetlacza poniżej (WM-C2002M). Podłączam piny zgodnie z notą katalogową jednak po wgraniu na arduino na wyświetlaczu pojawiają sie kwadraty i <;> i "chińskie krzaczki".Regulacja potencjometrem nie pomogła wyeliminować pojawiania się kwadratów. Dodam iż znaki te przechodzą z prawego boku na lewy i czsami pojawia się ich więcej. Nie wiem w czym leży problem. Prosiłbym o pomoc. P.S. Kod jest identyczny jak przy wyświetlaczu 16x2 podanym w kursie. Testowałem na Arduino Uno i na jego klonie.
  21. Witam, napisałem kod wyświetlający niestandardowe znaki: #include <LiquidCrystal.h> LiquidCrystal lcd(2,3,4,5,6,7); byte first[8] = { B00000, B10001, B00000, B00000, B10001, B01110, B00000, }; byte two[] = { B11111, B11111, B01110, B00100, B00100, B01110, B01110, B11111 }; void setup() { lcd.createChar(0, first); lcd.createChar(1, two); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(1,1); lcd.write(byte(0)); lcd.write(byte(1)); } void loop() {} piszę ten komentarz dlatego że nie rozumiem powodów pewnych błędów kompilacji przy edycji tego kodu występujących niemal randomowo, np. tu usunąłem clear() przed ustawieniem pozycji kursora: lcd.createChar(0, first); lcd.createChar(1, two); lcd.begin(16, 2); //lcd.clear(); lcd.setCursor(1,1); lcd.write(byte(0)); lcd.write(byte(1)); miałem błąd ( nie pisało w ogóle z jakiego powodu ) i programu nie dało się rzecz jasna wgrać na arduino, teraz kiedy dzisiaj usuwam clear to już błędu nie ma. Podobnie było kiedy napisałem lcd.begin(...) przed lcd.createChar(...), program nie mógł zostać skompilowany, teraz problem znikł. Nie wiem kompletnie co jest grane i co mogę mieć zepsute ( na pewno nie arduino ani lcd bo to jest błąd kompilacji a nie problemu z wgraniem i uruchomieniem programu na docelowej platformie ). Jeżeli będę miał te błędy znowu to na pewno dam screena ( bo wtedy nie zrobiłem ). Z góry dziękuje za pomoc.
  22. Witam, buduję swojego jeżdżącego robota sterowanego z aplikacji na telefon. Znalazłem w internecie poniższy kod: #include <math.h> /*BTS7960 Motor Driver Carrier*/ const int MotorRight_R_EN = 4; // Pin to control the clockwise direction of Right Motor const int MotorRight_L_EN = 5; // Pin to control the counterclockwise direction of Right Motor const int MotorLeft_R_EN = 8; // Pin to control the clockwise direction of Left Motor const int MotorLeft_L_EN = 9; // Pin to control the counterclockwise direction of Left Motor const int Rpwm1 = 6; // pwm output - motor A const int Lpwm1 = 7; // pwm output - motor B const int Rpwm2 = 2; // pwm output - motor A const int Lpwm2 = 3; // pwm output - motor B long pwmLvalue = 255; long pwmRvalue = 255; byte pwmChannel; const char startOfNumberDelimiter = '<'; const char endOfNumberDelimiter = '>'; int robotControlState; int last_mspeed; void setup(){ /* For Arduino Mega 2560 Serial1 RX - pin 19 Serial1 TX - pin 18 */ Serial1.begin(9600);//Default Bluetooth Baudrate for HC-05 //Setup Right Motors pinMode(MotorRight_R_EN, OUTPUT); //Initiates Motor Channel A1 pin pinMode(MotorRight_L_EN, OUTPUT); //Initiates Motor Channel A2 pin //Setup Left Motors pinMode(MotorLeft_R_EN, OUTPUT); //Initiates Motor Channel B1 pin pinMode(MotorLeft_L_EN, OUTPUT); //Initiates Motor Channel B2 pin //Setup PWM pins as Outputs pinMode(Rpwm1, OUTPUT); pinMode(Lpwm1, OUTPUT); pinMode(Rpwm2, OUTPUT); pinMode(Lpwm2, OUTPUT); stop_Robot(); }// void setup() void loop(){ //int i = 0; if (Serial1.available()) { processInput(); } }// void loop() void processInput (){ static long receivedNumber = 0; static boolean negative = false; byte c = Serial1.read (); switch (c){ case endOfNumberDelimiter: if (negative) SetPWM(- receivedNumber, pwmChannel); else SetPWM(receivedNumber, pwmChannel); // fall through to start a new number case startOfNumberDelimiter: receivedNumber = 0; negative = false; pwmChannel = 0; break; case 'f': // Go FORWARD go_Forward(255); //Serial.println("forward"); break; case 'b': // Go BACK go_Backwad(255); break; case 'r': turn_Right(255); break; case 'l': turn_Left(255); break; case 'c': // Top Right move_RightForward(255); break; case 'd': // Top Left move_LeftForward(255); break; case 'e': // Bottom Right move_RightBackward(255); break; case 'h': // Bottom Left move_LeftBackward(255); break; case 's': stop_Robot(); break; case 'x': pwmChannel = 1; // Rpwm1 break; case 'y': // Lpwm1 pwmChannel = 2; break; case '0' ... '9': receivedNumber *= 10; receivedNumber += c - '0'; break; case '-': negative = true; break; } // end of switch } // void processInput () void stop_Robot(){ // robotControlState = 0 if(robotControlState!=0){ //SetMotors(2); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, 0); robotControlState = 0; } }// void stopRobot() void turn_Right(int mspeed){ // robotControlState = 1 if(robotControlState!=1 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=1; last_mspeed=mspeed; } }// void turn_Right(int mspeed) void turn_Left(int mspeed){ // robotControlState = 2 if(robotControlState!=2 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=2; last_mspeed=mspeed; } }// void turn_Left(int mspeed) void go_Forward(int mspeed){ // robotControlState = 3 if(robotControlState!=3 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=3; last_mspeed=mspeed; } }// void goForward(int mspeed) void go_Backwad(int mspeed){ // robotControlState = 4 if(robotControlState!=4 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=4; last_mspeed=mspeed; } }// void goBackwad(int mspeed) void move_RightForward(int mspeed){ // robotControlState = 5 if(robotControlState!=5 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed*0.4); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=5; last_mspeed=mspeed; } }// void move_RightForward(int mspeed) void move_LeftForward(int mspeed){ // robotControlState = 6 if(robotControlState!=6 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed*0.4); analogWrite(Lpwm2, 0); robotControlState=6; last_mspeed=mspeed; } }// move_LeftForward(int mspeed) void move_RightBackward(int mspeed){ // robotControlState = 7 if(robotControlState!=7 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed*0.4); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=7; last_mspeed=mspeed; } }// void move_RightBackward(int mspeed) void move_LeftBackward(int mspeed){ // robotControlState = 8 if(robotControlState!=8 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed*0.4); robotControlState=8; last_mspeed=mspeed; } }// void move_LeftBackward(int mspeed) void stopRobot(int delay_ms){ SetMotors(2); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, 0); delay(delay_ms); }// void stopRobot(int delay_ms) void SetPWM(const long pwm_num, byte pwm_channel){ if(pwm_channel==1){ // DRIVE MOTOR analogWrite(Rpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm1, pwm_num); analogWrite(Lpwm2, pwm_num); pwmRvalue = pwm_num; } else if(pwm_channel==2){ // STEERING MOTOR analogWrite(Lpwm1, 0); analogWrite(Lpwm2, 0); analogWrite(Rpwm1, pwm_num); analogWrite(Rpwm2, pwm_num); pwmLvalue = pwm_num; } }// void SetPWM (const long pwm_num, byte pwm_channel) void SetMotors(int controlCase){ switch(controlCase){ case 1: digitalWrite(MotorRight_R_EN, HIGH); digitalWrite(MotorRight_L_EN, HIGH); digitalWrite(MotorLeft_R_EN, HIGH); digitalWrite(MotorLeft_L_EN, HIGH); break; case 2: digitalWrite(MotorRight_R_EN, LOW); digitalWrite(MotorRight_L_EN, LOW); digitalWrite(MotorLeft_R_EN, LOW); digitalWrite(MotorLeft_L_EN, LOW); break; } }// void SetMotors(int controlCase) I nie mogę zrozumieć jakie zdanie mają zmienne : startOfNumberDelimiter oraz endOfNumberDelimiter ? Co one w tym programie robią ?
  23. Witam mam problem z projektem przepustnicy do gier. Pod podpięciu Arduino do komputera jako kontroler wykrywa tyko oś Z i obrót osi Z. Kontroler ma działać jako Throttle. Prosił bym o pomoc. Kod programu. #include "UnoJoy.h" void setup(){ setupPins(); setupUnoJoy(); } void loop(){ // Always be getting fresh data dataForController_t controllerData = getControllerData(); setControllerData(controllerData); } void setupPins(void){ // Set all the digital pins as inputs // with the pull-up enabled, except for the // two serial line pins for (int i = 2; i <= 12; i++){ pinMode(i, INPUT); digitalWrite(i, HIGH); } pinMode(A4, INPUT); digitalWrite(A4, HIGH); pinMode(A5, INPUT); digitalWrite(A5, HIGH); } dataForController_t getControllerData(void){ // Set up a place for our controller data // Use the getBlankDataForController() function, since // just declaring a fresh dataForController_t tends // to get you one filled with junk from other, random // values that were in those memory locations before dataForController_t controllerData = getBlankDataForController(); // Since our buttons are all held high and // pulled low when pressed, we use the "!" // operator to invert the readings from the pins controllerData.triangleOn = !digitalRead(2); controllerData.circleOn = !digitalRead(3); controllerData.squareOn = !digitalRead(4); controllerData.crossOn = !digitalRead(5); controllerData.dpadUpOn = !digitalRead(6); controllerData.dpadDownOn = !digitalRead(7); controllerData.dpadLeftOn = !digitalRead(8); controllerData.dpadRightOn = !digitalRead(9); controllerData.l1On = !digitalRead(10); controllerData.r1On = !digitalRead(11); controllerData.selectOn = !digitalRead(12); controllerData.startOn = !digitalRead(A4); controllerData.homeOn = !digitalRead(A5); // Set the analog sticks // Since analogRead(pin) returns a 10 bit value, // we need to perform a bit shift operation to // lose the 2 least significant bits and get an // 8 bit number that we can use controllerData.leftStickX = analogRead(A0) >> 2; controllerData.leftStickY = analogRead(A1) >> 2; controllerData.rightStickX = analogRead(A2) >> 2; controllerData.rightStickY = analogRead(A3) >> 2; controllerData.throttle = analogRead(A5)>>2; // And return the data! return controllerData; } oraz kod biblioteki /* UnoJoy.h * Alan Chatham - 2012 * RMIT Exertion Games Lab * * This library gives you a standard way to create Arduino code that talks * to the UnoJoy firmware in order to make native USB game controllers. * Functions: * setupUnoJoy() * getBlankDataForController() * setControllerData(dataForController_t dataToSet) * * NOTE: You cannot use pins 0 or 1 if you use this code - they are used by the serial communication. * Also, the setupUnoJoy() function starts the serial port at 38400, so if you're using * the serial port to debug and it's not working, this may be your problem. * * === How to use this library === * If you want, you can move this file into your Arduino/Libraries folder, then use it like a normal library. * However, since you'll need to refer to the details of the dataForController_t struct in this file, I would suggest you use * it by adding it to your Arduino sketch manually (in Arduino, go to Sketch->Add file...) * * To use this library to make a controller, you'll need to do 3 things: * Call setupUnoJoy(); in the setup() block * Create and populate a dataForController_t type variable and fill it with your data * The getBlankDataForController() function is good for that. * Call setControllerData(yourData); where yourData is the variable from above, * somewhere in your loop(), once you're ready to push your controller data to the system. * If you forget to call sendControllerData in your loop, your controller won't ever do anything * * You can then debug the controller with the included Processing sketch, UnoJoyProcessingVisualizer * * To turn it into an actual USB video game controller, you'll reflash the * Arduino's communication's chip using the instructions found in the 'Firmware' folder, * then unplug and re-plug in the Arduino. * * Details about the dataForController_t type are below, but in order to create and use it, * you'll declare it like: * * dataForController_t sexyControllerData; * * and then control button presses and analog stick movement with statements like: * * sexyControllerData.triangleOn = 1; // Marks the triangle button as pressed * sexyControllerData.squareOn = 0; // Marks the square button as unpressed * sexyControllerData.leftStickX = 90; // Analog stick values can range from 0 - 255 */ #ifndef UNOJOY_H #define UNOJOY_H #include <stdint.h> #include <util/atomic.h> #include <Arduino.h> // This struct is the core of the library. // You'll create an instance of this and manipulate it, // then use the setControllerData function to send that data out. // Don't change this - the order of the fields is important for // the communication between the Arduino and it's communications chip. typedef struct dataForController_t { uint8_t triangleOn : 1; // Each of these member variables uint8_t circleOn : 1; // control if a button is off or on uint8_t squareOn : 1; // For the buttons, uint8_t crossOn : 1; // 0 is off uint8_t l1On : 1; // 1 is on uint8_t l2On : 1; uint8_t l3On : 1; // The : 1 here just tells the compiler uint8_t r1On : 1; // to only have 1 bit for each variable. // This saves a lot of space for our type! uint8_t r2On : 1; uint8_t r3On : 1; uint8_t selectOn : 1; uint8_t startOn : 1; uint8_t homeOn : 1; uint8_t dpadLeftOn : 1; uint8_t dpadUpOn : 1; uint8_t dpadRightOn : 1; uint8_t dpadDownOn : 1; uint8_t padding : 7; // We end with 7 bytes of padding to make sure we get our data aligned in bytes uint8_t leftStickX : 8; // Each of the analog stick values can range from 0 to 255 uint8_t leftStickY : 8; // 0 is fully left or up uint8_t rightStickX : 8; // 255 is fully right or down uint8_t rightStickY : 8; // 128 is centered. uint8_t throttle :8; // Important - analogRead(pin) returns a 10 bit value, so if you're getting strange // results from analogRead, you may need to do (analogRead(pin) >> 2) to get good data } dataForController_t; // Call setupUnoJoy in the setup block of your program. // It sets up the hardware UnoJoy needs to work properly void setupUnoJoy(void); // You can also call the set void setupUnoJoy(int); // This sets the controller to reflect the button and // joystick positions you input (as a dataForController_t). // The controller will just send a zeroed (joysticks centered) // signal until you tell it otherwise with this function. void setControllerData(dataForController_t); // This function gives you a quick way to get a fresh // dataForController_t with: // No buttons pressed // Joysticks centered // Very useful for starting each loop with a blank controller, for instance. // It returns a dataForController_t, so you want to call it like: // myControllerData = getBlankDataForController(); dataForController_t getBlankDataForController(void); //----- End of the interface code you should be using -----// //----- Below here is the actual implementation of // This dataForController_t is used to store // the controller data that you want to send // out to the controller. You shouldn't mess // with this directly - call setControllerData instead dataForController_t controllerDataBuffer; // This updates the data that the controller is sending out. // The system actually works as following: // The UnoJoy firmware on the ATmega8u2 regularly polls the // Arduino chip for individual bytes of a dataForController_t. // void setControllerData(dataForController_t controllerData){ // Probably unecessary, but this guarantees that the data // gets copied to our buffer all at once. ATOMIC_BLOCK(ATOMIC_FORCEON){ controllerDataBuffer = controllerData; } } // serialCheckInterval governs how many ms between // checks to the serial port for data. // It shouldn't go above 20 or so, otherwise you might // get unreliable data transmission to the UnoJoy firmware, // since after it sends a request, it waits 25 ms for a response. // If you really need to make it bigger than that, you'll have to // adjust that timeout in the UnoJoy ATmega8u2 firmware code as well. volatile int serialCheckInterval = 1; // This is an internal counter variable to count ms between // serial check times int serialCheckCounter = 0; // This is the setup function - it sets up the serial communication // and the timer interrupt for actually sending the data back and forth. void setupUnoJoy(void){ // First, let's zero out our controller data buffer (center the sticks) controllerDataBuffer = getBlankDataForController(); // Start the serial port at the specific, low-error rate UnoJoy uses. // If you want to change the rate, you'll have to change it in the // firmware for the ATmega8u2 as well. 250,000 is actually the best rate, // but it's not supported on Macs, breaking the processing debugger. Serial.begin(38400); // Now set up the Timer 0 compare register A // so that Timer0 (used for millis() and such) // also fires an interrupt when it's equal to // 128, not just on overflow. // This will fire our timer interrupt almost // every 1 ms (1024 us to be exact). OCR0A = 128; TIMSK0 |= (1 << OCIE0A); } // If you really need to change the serial polling // interval, use this function to initialize UnoJoy. // interval is the polling frequency, in ms. void setupUnoJoy(int interval){ serialCheckInterval = interval; setupUnoJoy(); } // This interrupt gets called approximately once per ms. // It counts how many ms between serial port polls, // and if it's been long enough, polls the serial // port to see if the UnoJoy firmware requested data. // If it did, it transmits the appropriate data back. ISR(TIMER0_COMPA_vect){ serialCheckCounter++; if (serialCheckCounter >= serialCheckInterval){ serialCheckCounter = 0; // If there is incoming data stored in the Arduino serial buffer while (Serial.available() > 0) { pinMode(13, OUTPUT); //digitalWrite(13, HIGH); // Get incoming byte from the ATmega8u2 byte inByte = Serial.read(); // That number tells us which byte of the dataForController_t struct // to send out. Serial.write(((uint8_t*)&controllerDataBuffer)[inByte]); //digitalWrite(13, LOW); } } } // Returns a zeroed out (joysticks centered) // dataForController_t variable dataForController_t getBlankDataForController(void){ // Create a dataForController_t dataForController_t controllerData; // Make the buttons zero controllerData.triangleOn = 0; controllerData.circleOn = 0; controllerData.squareOn = 0; controllerData.crossOn = 0; controllerData.l1On = 0; controllerData.l2On = 0; controllerData.l3On = 0; controllerData.r1On = 0; controllerData.r2On = 0; controllerData.r3On = 0; controllerData.dpadLeftOn = 0; controllerData.dpadUpOn = 0; controllerData.dpadRightOn = 0; controllerData.dpadDownOn = 0; controllerData.selectOn = 0; controllerData.startOn = 0; controllerData.homeOn = 0; //Set the sticks to 128 - centered controllerData.leftStickX = 128; controllerData.leftStickY = 128; controllerData.rightStickX = 128; controllerData.rightStickY = 128; controllerData.throttle = 128; // And return the data! return controllerData; } #endif
  24. Witam. mam problem z modułem ESP8266 - 01, ponieważ po podłączeniu komputer ani smartfon nie może go wykryć. Moduł połączony jest do Arduino Pro Mini 5V 16Mhz poprzez konwerter poziomów logicznych. Firmware wgrany do modułu zgodnie z filmikiem Elektroprzewodnika na YT: https://www.youtube.com/watch?v=RaYZxqUTNWU Do zasilania modułu próbowałem użyć konwerter typu CP2102 jak również zasilacz(parametry w załączniku) z przetwornicą impulsową LM2596S. Podejrzewam tutaj problem z zasilaniem, ponieważ wcześniej moduł czasami wykrywał sieć, teraz jest totalna kaplica. Próbowałem do przetwornicy wlutować po kondensatorze 10uF na wejście i wyjście oraz kondensator 10nF pomiędzy vcc oraz gnd modułu ale nie dało to rezultatu. Próbwałem też innych zasilaczy jak np. ładowarka do starej Nokii. W związku z tym moje pytanie: jak powinienem zasilić ten moduł ? użyć 2 baterii alkaidowych 1,5V? zmienić przetwornicę na inną? zastosować jakiś filtr do eliminacji tętnień napięcia przetwornicy? zaprojektować taki filtr? jeśli tak to jakich elementów użyć? czy może to po prostu wadliwe ESP? Proszę o wskazówki osób które najlepiej miały już z tym modułem styczność.
  25. Jestem tutaj nowy a jedyne co do tej pory programowałem to PLC w technikum. Robię sobie ćwiczenie, w którym 4 diody zapalają się i gasną jedna po drugiej. Gdy ostatnia dioda gaśnie zapala się pierwsza i tak w nieskończoność. Problem polega na tym, że za rozpoczęcie i zakończenie pracy układu odpowiada jeden tact switch. Z zainicjowaniem pętli nie mam żadnego problemu. Problem jest z jej przerwaniem. Założenie jest takie, że przyciśnięcie przycisku drugi raz w jakimkolwiek miejscu pętli natychmiastowo ją łamie i z niej wychodzi nawet wtedy, gdy nie wypełniła się do końca. Wszystkie diody mają zgasnąć, a program ma wrócić na swój początek. Jak pewnie się domyślacie pętla ta w ogóle się nie przerywa bez względu na to ile razy wciskam przycisk. Szukałem rozwiązania tego problemu w kursie z Forbota, ale to rozwiązanie nie sprawdza się w moim programie. Moglibyście mi doradzić jak rozwiązać ten problem? Może istnieje jakaś komenda, która jest w stanie wykonać to w elegancki sposób? Ta funkcja będzie mi potrzebna w przyszłości w bardziej zaawansowanych projektach. Z góry dziękuję za pomoc.
×
×
  • Utwórz nowe...