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 i 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 252 wyników

  1. Cześć, mam problem ze swoim małym projektem - Rejestrator Czasu Pracy. Jestem początkującym w programowaniu oraz w zabawach z Arduino. Przechodząc do głównego problemu zaprezentuje wam kawałek kodu w którym utknąłem. void loop() { // Sprawdzamy, czy są nowe karty if ( mfrc522.PICC_IsNewCardPresent()) { //odczyt karty if ( mfrc522.PICC_ReadCardSerial()){ unsigned long czasStart1 = 0; unsigned long czasStop1 = 0; unsigned long czas1 = 0; unsigned long czasStart2 = 0; unsigned long czasStop2 = 0; unsigned long czas2 = 0; tone(8, 2000, 100); if (mfrc522.uid.uidByte[0] == 0x09 && mfrc522.uid.uidByte[1] == 0x87 && mfrc522.uid.uidByte[2] == 0xF3 && mfrc522.uid.uidByte[3] == 0x97&& odczyt1 == 0){ lcd.setCursor(0,2); lcd.print("Wejscie "); Serial.print("Wejscie "); odczyt1++; unsigned long czasStart1 = millis(); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" "); if (hour<10) { Serial.print("0"); Serial.print(hour, DEC); } else { Serial.print(hour, DEC); } Serial.print(":"); if (minute<10) { Serial.print("0"); Serial.print(minute, DEC); } else { Serial.print(minute, DEC); } Serial.print(" "); lcd.setCursor(0,3); Serial.println("Jan Nowak "); lcd.print("Jan Nowak "); delay(1000); lcd.clear(); } else if (mfrc522.uid.uidByte[0] == 0x09 && mfrc522.uid.uidByte[1] == 0x87 && mfrc522.uid.uidByte[2] == 0xF3 && mfrc522.uid.uidByte[3] == 0x97&& odczyt1 == 1){ lcd.setCursor(0,2); odczyt1=odczyt1-1; unsigned long czasStop1 = millis(); unsigned long Czas1 = czasStop1 - czasStart1; unsigned long Czas_w_s1 = Czas1 / 1000; unsigned long posrednie = (Czas_w_s1/3600)*60; unsigned long Czas_w_h1 = Czas_w_s1/3600; unsigned long Czas_w_m1 = (posrednie%60); lcd.print("Wyjscie"); Serial.print("Wyjscie "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" "); if (hour<10) { Serial.print("0"); Serial.print(hour, DEC); } else { Serial.print(hour, DEC); } Serial.print(":"); if (minute<10) { Serial.print("0"); Serial.print(minute, DEC); } else { Serial.print(minute, DEC); } Serial.print(" "); lcd.print(" Time "); Serial.print("Jan Nowak "); Serial.print("Czas pracy "); if (Czas_w_h1 < 10) { lcd.print("0"); Serial.print("0"); lcd.print(Czas_w_h1, DEC); Serial.print(Czas_w_h1, DEC); } else { lcd.print(Czas_w_h1, DEC); Serial.print(Czas_w_h1, DEC); } lcd.print(":"); Serial.print(":"); if (Czas_w_m1<10) { lcd.print("0"); Serial.print("0"); lcd.print(Czas_w_m1, DEC); Serial.print(Czas_w_m1, DEC); Serial.println(" "); } else { lcd.print(Czas_w_m1, DEC); Serial.print(Czas_w_m1, DEC); Serial.println(" "); } lcd.setCursor(0,3); lcd.print("Jan Nowak "); delay(3000); lcd.clear(); } To jest prosty projekt do szkoły. Mam dwóch pracowników, którzy po przyjściu do pracy "odbijają się" czytnikiem. Na wyświetlaczu jest cały czas wyświetlona data, godzina oraz dzień tygodnia. Jeżeli odbiją się pierwszy raz to wyświetla się "Wejście" do pracy oraz imię i nazwisko pracownika. Jeżeli odbiją się drugi raz to zmienia się "Wejście" na "Wyjście" wyświetla się imię, nazwisko, oraz przepracowany czas!!!! No i tu są schody. Podczas pierwszego odbicia sczytuję unsigned long czasStart1 = millis(); podczas drugiego odbicia sczytuję unsigned long czasStop1 = millis(); oraz chcę od czasStop1-czasStart1 aby wyliczyć czas pracy pracownika. To wszystko jest robione w jednej funkcji void loop() { .... } ale nie przekazuje mi zmiennej czasStart1. Pomocy, jak to mogę rozwiązać inaczej?
  2. Witam, mam problem z wgraniem programu do Arduino. Po kliknięciu wgraj, wszystko się kompiluje, ale gdy rozpoczyna się wgrywanie, pasek postępu dochodzi do końca, a samo wgrywanie nie kończy się w ogóle, mogło by to trwać w nieskończoność (żadne błędy nie wyskakują). Gdy odłączę Arduino mogę dopiero zobaczyć błędy które wyskoczyły: avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x4a Nie jest to raczej związane z programem, bo na każdym wszystko dzieje się tak samo. Reinstall programu już robiłem. Proszę o pomoc i z góry dziękuję
  3. Witam Tworzę robota który będzie w stanie podążać za pomocą GPS za GPSem w telefonie. Aktualnie posiadam GPS NEO 6M -0-001. Problem jest jaki, że GPS ten nie jest za bardzo dokładny. W karcie katalogowej miał napisane, że dokładność wynosi około 2,5m. Dokładność ta chyba dotyczy wartości przy dostępnych 12 satelitach bo u mnie błąd to od 20m do 15m przy dostępnych 7-9 satelitach. Żeby robot działał w miarę poprawnie potrzebował bym dokładności do 5m. Nie chciałbym wydawać na moduł GPS z 200 - 300 zł więc zacząłem zastanawiać się nad modułami z glonass. Czy ktoś coś o tym wie? Czy to się nada na do mojego projektu? Jeśli tak jaki model polecacie ?
  4. Cześć, jakiś czas temu postanowiłem zaprojektować robota, którego mógłby zbudować każdy z dostępem do drukarki 3d i dość skromnym budżetem. Rozwiązania konstrukcyjne częściowo opierałem na BCN3D MOVEO i innych podobnych konstrukcjach, jednak chciałem żeby manipulator był bardziej precyzyjny w czym miało pomóc zastosowanie łożysk w każdej z osi. Przekładnie w pierwszej i czwartej osi to wydrukowane koła zębate, przełożenia kolejno 1:7 i 1:6, w osiach 3 i 5 zastosowano przekładnie pasowe zębate, przełożenia kolejno 1:8,435 i 1:6.125. Jak widać manipulator jest jeszcze nie skończony, brak mu osi drugiej. Początkowo oś 2 i 3 miały być takie same, jednak ze względu na większe obciążenia, musiałem przeprojektować drugą oś, zastosować większy pasek (T5x10 zamiast gt2x6mm) oraz dodatkową przekładnię planetarną. Oś druga jest jeszcze w fazie projektowej. Koszt (bez kosztów przesyłki): "mechanika": silniki krokowe używane z allegro: około 40zł łożyska: około 60 zł śruby/nakrętki: około 50 zł filament do drukarki ABS 2x 1kg: 120 zł serwomechanizm do chwytaka (wziąłem jaki miałem pod ręka, ale można użyć tańszy): 50 zł co daje około 320 zł elektronika: Płytka zgodna z Arduino Mega: 40 zł RAMPS 1.4: 20 zł StepSticki : 30 zł Zasilacz 250W: 48 zł = 138 + przewody czyli powiedzmy 160 zł W sumie wyszło około 480 zł czyli trochę drożej niż planowałem jednak można przyoszczędzić np. nie kupując nowego zasilacza itp. Obecnie planuję: skończyć projekt osi drugiej i zrobić prototyp oraz przetestować go razem z całym robotem wydrukować i zamontować przekładnie planetarną do osi trzeciej dokończyć komunikację robota z ROSem przez bibliotekę rosserial arduino
  5. Witam Mam problem z modułem GPS a dokładnie z Ublox NEO-6m. Otóż po podłączeniu modułu pod Arduino UNO wgraniu biblioteki TinyGPS oraz uruchomieniu przykładu test_with_gps_device po uruchomieniu monitora portu, zamiast danych dostaję tylko gwiazdki (***). Moduł podłączam TX pin 10 VCC 5, GND. W programie testowych zmieniam dane dotyczące Baudu oraz piny niestety bez większego rezultatu. Oglądałem filmiki oraz czytałem odnośnie podłączenia tego modułu ale nic nie pomaga. Może ktoś wie co robię nie tak.
  6. Cóż, winny się tłumaczy, po obfitości tłumaczenia można wnioskować o wadze winy. Oj @Elvis , @Elvis jak pijesz to nie śpiewaj bo fałszujesz. I żebyś nie zapomniał, łap mordę, hah
  7. Witam, zakupiłem ostatnio arduino uno, moduł ethernet enc28j60 oraz shield do sterowania silnikami DC. Bardzo mi zależy żebym mógł sterować prędkością i kierunkiem tych silników z przeglądarki internetowej z modułu ethernet podłączonego kablem do PC (chciałbym żeby był to np. wirtualny joystick, z którego obrót myszką pozwoli na sterowanie poszczególnymi silnikami). Dodam, że nie za bardzo wiem jak przesłać dane z silników do arduino oraz jak stworzyć takie sterowanie (joystick). Nigdzie nie znalazłem podpowiedzi i utknąłem w martwym punkcie z prostą stroną html i silnikami sterowanymi z poziomu programu. Wiem, że to może dość trudne zadanie, ale bardzo mi zależy na takim rozwiązaniu. Może macie jakieś porady lub wskazówki gdzie mógłbym zaczerpnąć informacji jak to zrobić?
  8. Witam. Mam problem z czujnikiem odległości. Gdy wgram program na sam czujnik to działa normalnie, ale jak dołączę do tego ekran LCD 240*240 IPS 1,3", to czujnik pokazuje mi ciągle 0cm. Ma ktos pomysł co to może być ? #define trigPin 12 #define echoPin 10 #define TFT_DC 7 #define TFT_RST 8 #define SCR_WD 240 #define SCR_HT 240 // 320 - to allow access to full 240x320 frame buffer #include <SPI.h> #include <Adafruit_GFX.h> #include <Arduino_ST7789_Fast.h> Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); //Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST, TFT_CS); void setup(void) { Serial.begin(9600); pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście lcd.init(SCR_WD, SCR_HT); lcd.fillScreen(BLACK); lcd.setCursor(0, 0); lcd.setTextColor(WHITE,BLUE); lcd.setTextSize(3); //lcd.println(dystans); } void loop() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; Serial.print(dystans); Serial.println(" cm"); lcd.println(dystans); delay(1000); }
  9. Dzień dobry Mam połączone Arduino Mega z Uno przy pomocy I2C do komunikacji. Mega jest "master", który po wciśnięciu przycisku wysyła wartość zmiennej "stan". Uno jako "slave" ma tą wartość odczytać i wykonać odpowiednie polecenie. I tu jest problem, ponieważ o ile Mega wysyła wartość (gdy sprawdzam status transmisji komendą: unsigned char statuss = Wire.endTransmission(); Serial.println (statuss); to wartość "statuss" = 0, czyli sukces) to gdy sprawdzam monitor Uno, to nic tam nie ma do wyświetlenia. Czy mógłby mi ktoś powiedzieć gdzie występuje błąd w mojej pracy ? Kod dla Mega: // Enable debug prints to serial monitor #define MY_DEBUG // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Enable inclusion mode #define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway #define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button #define MY_INCLUSION_MODE_BUTTON_PIN 3 #define MY_REPEATER_FEATURE //----------------biblioteki----------------------------- #include <SPI.h> #include <MFRC522.h> //RFID RC522 #include <Wire.h> //Dla I2C #include <Bounce2.h> //Obsługa przycisków #include <MySensors.h> //------------------------------------------------------- //----------------definiowanie elementów----------------- #define BUTTON_PIN 31 #define RELAY_1 24 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 1 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay //------------------------------------------------------- //----------------zmienne-------------------------------- Bounce debouncer = Bounce(); volatile boolean stan = true; //------------------------------------------------------- //------------------------------------------------------- void before() { for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } } //------------------------------------------------------- //------------------------------------------------------- void setup() { // Setup locally attached sensors delay(5000); // Setup the button. pinMode(BUTTON_PIN, INPUT_PULLUP); // After setting up the button, setup debouncer. debouncer.attach(BUTTON_PIN); debouncer.interval(5); digitalWrite(RELAY_1, LOW); //Inne Serial.begin(9600); SPI.begin(); } //------------------------------------------------------- //------------------------------------------------------- // Główna funkcja sterująca void loop() { // Send locally attached sensor data here if (debouncer.update()) { // Get the update value. int value = debouncer.read(); // Send in the new value. if(value == LOW) { stan = !stan; Serial.println(stan); Wire.beginTransmission(1); Wire.write(stan); // sends one byte Wire.endTransmission(); unsigned char statuss = Wire.endTransmission(); Serial.println (statuss); } } } //------------------------------------------------------- Kod dla Uno: //----------------biblioteki----------------------------- #include <Servo.h> //Servo #include <Wire.h> //Dla I2C //------------------------------------------------------- //----------------zmienne-------------------------------- volatile byte stan = 1; //------------------------------------------------------- //------------------------------------------------------- void setup() { Serial.begin(9600); Wire.begin(1); } //------------------------------------------------------- //------------------------------------------------------- // Główna funkcja sterująca void loop() { Wire.onReceive(czytaj); } //------------------------------------------------------- //------------------------------------------------------- void czytaj(int howMany) { if (Wire.available()) { stan = Wire.read(); // receive byte as a character Serial.println(stan); } } //------------------------------------------------------- Jeśli chodzi o połączenia to na pewno są dobrze, ponieważ gdy wczytam przykłady z biblioteki "Wire" to komunikacja działa poprawnie. Może źle korzystam z biblioteki "MySensors" ?
  10. #include <FastLED.h> // Druga biblioteka sterowania diodami #define PIN 2 // Pin do sterowania diodami #define NUMPIXELS 30 // Ilosc diod #define COLOR_ORDER RGB #define LED_TYPE WS2811 #define MAX_BRIGHTNESS 255 char OdebraneDane[20]; int indeks=0; char data; float Dioda_R = 0; // wartosc jasnosci dla diod czerwonych float Dioda_G = 0; // wartosc jasnosci dla diod zielonych float Dioda_B = 100; // wartosc jasnosci dla diod niebieskich char znak =""; int x=6; CRGB led[NUMPIXELS]; void setup() { Serial.begin(9600); FastLED.setBrightness(MAX_BRIGHTNESS); FastLED.addLeds<NEOPIXEL, PIN>(led, NUMPIXELS); FastLED.clear(); } void loop() { wybor_funkcji(); } void wybor_funkcji() { if (Serial.available() > 0 ) { if (Serial.read() == 'f') { x = 0; } Serial.println(x); } delay(200); while (x == 0){ ustawienie_koloru(); } } void ustawienie_koloru() { while (1 == 1) { x=8; Serial.print("ustawienie koloru:"); Serial.println(indeks); if (Serial.available() > 0 ) { delay(200); do{ Serial.print("przerwa"); znak = (char)Serial.read(); OdebraneDane[indeks] = znak; indeks++; } while(znak != '\n'); OdebraneDane[indeks] = 0; indeks=0; delay(200); } } } Powyżej zamieściłem kod o którym mowa. Zamieszczę również zdjęcie bloków z MIT app inventor. Aplikacja ma służyć do sterowania LED'ami. Z niewiadomej dla mnie przyczyny po wysłaniu kilka razy informacji do bluetooth poprzez moduł HC-05 wyskakuje błąd "516 - broken pipe". Aplikacja mobilna była tworzona w MIT app inventor oraz w kotlinie (android studio). Wciąż ten sam problem. Wiem, że broken pipe występuje ze względu na problem z połączeniem użytkownik-odbiorca. W blokach w MIT app inventor zamieściłem fragment, który łączy mnie z powrotem z arduino. Niestety jest to połowiczne rozwiązanie, bo ponowne łączenie trwa z 6 sekund (co jest irytujące). Ciekawe, że kiedy korzystam z aplikacji RoboRemo, wszystko działa jak należy... Ktoś miał podobny problem? Ktoś wie jak go rozwiązać?
  11. Witam. Mam problem z sterownikiem ESC do silnika BLDC. Dodatkowo silnik bardzo mi się nagrzewa po kilku sekundach pracy bez obciążenia nie da się go dotknąć. Jestem początkujący i chciałem uruchomić silnik aby w ogóle zaczął się kręcić. Wszystko się grzeje a ze sterownika poszedł nawet dym. Używam następujących podzespołów: https://abc-rc.pl/product-pol-12358-ESC-ABC-Power-Air-40A-2-3S-BEC-1A-Prosty-regulator-silnikow.html https://allegro.pl/oferta/bateria-li-po-11-1v-3s-1000mah-25c-35c-zippy-rc-7787929208?snapshot=MjAxOS0xMS0wNVQxNTo1NTozNi4wODFaO2J1eWVyO2EzNDFmMTJkMzhjYTAzMjVkNTk3ODg5NDA0NmRkNzZkOWM3ZDJhNmRiODIzZmFiNjc2MzBmOGJhOWU4MjkwYmE%3D https://pl.aliexpress.com/item/32822131805.html?src=google&src=google&albch=shopping&acnt=494-037-6276&isdl=y&slnk=&plac=&mtctp=&albbt=Google_7_shopping&aff_platform=google&aff_short_key=UneMJZVf&&albagn=888888&albcp=6459808507&albag=76872920869&trgt=743612850874&crea=pl32822131805&netw=u&device=c&gclid=Cj0KCQiA2vjuBRCqARIsAJL5a-JQrX5JscoqziVYoLqq4Xq4TNgpofR3NcNXMkl321WQCJxTgm_MvF0aAn6SEALw_wcB&gclsrc=aw.ds Użyłem podłączenia jak na filmie tylko że zwarłem A0 z 3.3V gdyż nie mam potencjometru. Czy wina jest w źle dobranym sprzęcie? Pozdrawiam
  12. Cześć, to mój pierwszy post, poza powitalnym. Przechodząc do rzeczy: problem dotyczy zakupionego joysticka (link https://allegro.pl/show_item.php?item=5152872458). Chcę stworzyć sterowany joystickiem samochód, dlatego potrzebuję odczytu analogowego osi joysticka w zakresie 0 - 1023 na Arduino, To udało mi się uzyskać, tzn program odczytuje wartości w tym zakresie. Problem polega na tym, że wartości skrajne 0 lub 1023 (w zależności od strony wychylenia) uzyskuję przy połowie wychylenia joysticka. Czyli przykładowo dla osi Y: gdy joystick jest w naturalnej pozycji środkowej, odczyt wynosi 470. Wraz z (bardzo bardzo!) delikatnym ruszeniem joysticka w górę, wartość ta rośnie stopniowo aż wychylam do połowy możliwego wychylenia i uzyskuję odczyt 1023. Dalsze zwiększanie wychylenia nic nie zmienia, pozostaje wartość 1023. Tak dzieje się w każdym kierunku (ewentualnie wartość zamiast rosnąć maleje do 0 w połowie wychylenia, w przypadku przeciwnych kierunków). I teraz pytanie: czy ja coś źle podłączyłem? Co robię źle? Kupiłem dwie sztuki tych joysticków i obie identycznie się zachowują, co sugeruje, że błąd może leżeć po mojej stronie. Pozdrawiam serdecznie, Michał
  13. Cześć, zabieramy się z kolegą do zrobienia line followera na arduino nano, chcielibyśmy się zapytać, czy jest on przygotowany poprawnie. Wszystko będzie zasilane przez Li-Pol 7.4 V. Poniżej wrzucam schematy naszego układu
  14. Cześć! Tak jak w temacie mam problem z wyjściami typu +5V, Vin, +3V itd. Konstruuje nowy projekt i te wyjście +5V miało zasilać wyświetlacz lcd i diodę LED. Wszystko złożyłem, przyszła pora na testy i oczywiście nic nie działało. Na początku myślałem, że coś źle podłączyłem, ale sprawdziłem wszystko i nie zauważyłem żadnych błędów. Zastanawiał mnie ten LED, był on podłączony równolegle do zasialnia w roli sygnalizatora podłączenia urządzenia do prądu, no i on powinnien świecić. Z ciekawości pomierzyłem wyjścia multimetrem. Jest na nich napięcie, ale nie wypływa prąd. Nie wiem co może być tego przyczyną, może faktycznie coś robię źle. Będę wdzięczny za pomoc albo chociaż nakierowanie na źródło problemu. Pozdrawiam!
  15. Cześć, Mam spory problem z gotowym projektem, który chciałem odtworzyć. Dokładnie jest to urządzenie do malowania światłem LED Light painter. Projekt opiera się na rozwiązaniu Adafruit z Neopixel-ami, natomiast ma dodatkowo wyświetlacz lcd i guziki do sterowania plikami. No i tutaj zaczyna się komplikacja dla mnie. Jeśli chodzi o połączenia to wszystko zrobiłem dobrze, przetestowałem na innych prostych programach i teoretycznie powinno wszystko działać (led podpięty i działa, wyświetlacz lcd też, karta sd nie bo nawet nie wiem jak to przetestować). Zaznaczam, że jestem straszną pierdołą w tych sprawach, a projekt jest bardziej fotograficzny niż elektroniczny dlatego nieoceniona będzie Wasza pomoc. Po wgraniu szkicu z Arduino IDE nie dzieje się nic, zapala się tylko podświetlenie w lcd i to wszystko. Natomiast podczas kompilacji wyświetlają mi się błędy: C:\Users\ThinkPad\Desktop\student\led\ArduinoUNO\Light-painter-master\Light-painter-master\Light_painter\Light_painter.ino:510:7: warning: extra tokens at end of #else directive #else if CONSISTENT ^ C:\Users\ThinkPad\Desktop\student\led\ArduinoUNO\Light-painter-master\Light-painter-master\Light_painter\Light_painter.ino: In function 'void getFileName(char*, uint8_t, uint8_t)': C:\Users\ThinkPad\Desktop\student\led\ArduinoUNO\Light-painter-master\Light-painter-master\Light_painter\Light_painter.ino:610:64: warning: default argument given for parameter 3 of 'void getFileName(char*, uint8_t, uint8_t)' [-fpermissive] void getFileName(char* fileName, uint8_t index, uint8_t ext = 0) { ^ C:\Users\ThinkPad\Desktop\student\led\ArduinoUNO\Light-painter-master\Light-painter-master\Light_painter\Light_painter.ino:110:6: note: previous specification in 'void getFileName(char*, uint8_t, uint8_t)' here void getFileName(char* fileName, uint8_t index, uint8_t ext = 0); ^ Szkic używa 22240 bajtów (68%) pamięci programu. Maksimum to 32256 bajtów. Zmienne globalne używają 1420 bajtów (69%) pamięci dynamicznej, pozostawiając 628 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów. Ja tego niestety nie rozumiem i nie mam czasu zrozumieć, gdyż deadline mnie goni bardzo. Zadałem już pytanie do autora na githubie ale mam nadzieję, że ktoś z Was może wiedzieć o co chodzi. Będę bardzo wdzięczny.
  16. Witam, zwracam się o pomoc w sprawie modułu bluetooth hc 05 (link poniżej) https://botland.com.pl/pl/moduly-bluetooth/2570-modul-bluetooth-hc-05-5903351241311.html?gclid=Cj0KCQiAn8nuBRCzARIsAJcdIfPQ8LjBcnih59HeXEDxQcFq0KBOiIap5HYn692tBzV40nsWWlcnsO0aAiISEALw_wcB Wykorzystuję go do sterowania samochodzikiem razem z arduino Uno i sterownikiem silników L239D (dodaje zdjęcie). Mam z nim taki problem, że po kilkunastu sekundach samoczynnie rozłącza się z telefonem. Sprawdziłem już czy wszystkie piny są dobrze podłączone czy nie ma błędów w lutowaniu, ale na moje oko wszystko wydaje się w porządku. Do wejścia TX na module zastosowałem dzielnik napięcia a napięcie zasilania wynosi 5V. Myślę że wszystko robię poprawnie, no chyba że jest cos o czym nie wiem
  17. Cześć Przychodzę z problemem z Arduino. Mianowicie robię projekt od sterowania ogrzewaniem w domu i używam wyświetlacza 20x2(zwykły, bez I2C), czujnika temperatury LM35(będą używane 3, ale na czas pisania kodu używam tylko jednego) oraz modułu RTC DS3231(I2C). Problem polega na tym, że gdy podłącze wszystko razem wychodzi mi zła temperatura(45*C). W momencie, gdy odłączę RTC(który jest podpięty pod SDA,SCL) to temperatura pokazuję się dobra(28*C). I teraz nie wiem czy to kwestia obliczeń, które zapisałem w kodzie, czy czegoś innego. I jeszcze jakby ktoś mógł podpowiedzieć, chcę dodać zmianę czasu z letniego na zimowy. Miałem pomysł aby zrobić dwa voidy(jeden odpowiadałby za czas letni, drugi za zimowy), ale zrezygnowałem z tego pomysłu. Stąd drugie pytanie: Macie jakieś pomysły jak by to zrobić? Pozdrawiam #include <DS3231.h> #include <LiquidCrystal.h> // includes the LiquidCrystal Library DS3231 rtc(SDA, SCL); LiquidCrystal lcd(12,11,5,4,3,2); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) void setup() { rtc.begin(); // Initialize the rtc object // The following lines can be uncommented to set the date and time //rtc.setTime(18,3,20); // Set the time to 12:00:00 (24hr format) //rtc.setDate(2, 11, 2019); // Set the date to January 1st, 2014 pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); Serial.begin(9600); lcd.begin(20,4); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } void loop() { float odczyt = analogRead(A5); float temp = analogRead(A5) * (5.0/1024.0) * 10; Serial.print("Odczyt: "); Serial.println(odczyt); Serial.print("Temp: "); Serial.println(temp); delay(1000); }
  18. Witam Zwracam się z prośbą o pomoc dotyczącej robota którego właśnie tworzę. Zaczynając od początku, robot działa na Arduino UNO posiada moduł GPS, BT, kompas oraz w przyszłości będzie posiadał napęd składający się z 2 silników. Zamysł był taki aby korzystając z aplikacji Blynk (wybrałem taką ponieważ jest bardzo prosta a ja nie będę potrzebował dużo zadań wykonywanych z telefonu) poprzez moduł BT, telefon łączył się z robotem, następnie odczytał wartość GPS z robota porównał ją z GPS z telefonu następnie obliczając dystans kąt i kilka innych rzeczy rozpoczął podążać z telefonem podłączonym do robota. Niestety mam problemy z danymi które szczytuje z GPS ponieważ wyświetla mi on co tylko 0. Każdy program z osobna działa poprawnie i odczytuje poprawne wartości GPSów. Niestety podczas łączenia ich w jedno nie działa. Myślałem na początku ,że problem może być ze strony portów które nie nadążają wysyłać i odbierać dane z BT oraz z 2 GPS. Wtedy zacząłem korzystać z biblioteki ALTSerial i początkowo dało to jakiś progres jednak GPS w telefonie zaczął przypisywać wartości GPS z robota. Aktualnie mam robota który nie działa poprawnie gdy są 2 GPS podłączone i próbują odczytać dane. Oto kod : #include "TinyGPS++.h" // GPS #include "SoftwareSerial.h" #include <AltSoftSerial.h> #include <BlynkSimpleSerialBLE.h> // Biblioteka odpowiadająca za BT #include <QMC5883LCompass.h> // Compas Library #define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT // BT #define BLYNK_PRINT BT_Serial // BT SoftwareSerial BT_Serial(2, 3); // BT podłączony do Seriala na pinach 2-RX, 3-TX SoftwareSerial GPS_Serial (10, 11); //GPS nowy Serial 10-TX, 11-RX TinyGPSPlus gps2; // GPS z robota fizyczny WidgetTerminal terminal(V2); // przypisanie terminala do V2 QMC5883LCompass compass; // deklaracja char auth[] = "ok3q9uiJKllXv9dtOR7XyewQq0EL-_H6"; // Token przypisany do aplikacji BLYNK struct GeoLoc { float szer; float dlu; }Phone,Robo; void Distance () // in KM { float X = ((Phone.szer - Robo.szer) * 6378,14 * cos(Robo.dlu)) / 360.0; float Y = ((Phone.dlu - Robo.dlu) * 6356,75) / 360.0; float X2 = X * X; float Y2 = Y * Y; float Distance = sqrt(X2 + Y2); Serial.println("Distance"); Serial.println(Distance); } //---------------------------------------------------------------------------------------------------------------------------- void Compas() { int x, y, z; // Read compass values compass.read(); // Return XYZ readings x = compass.getX(); y = compass.getY(); z = compass.getZ(); Blynk.virtualWrite(V2," X:",x ," Y:",y ," Z:",z ); } void GPS_robot() // Data GPS form robot --------------------------------------------------------------------------------- { while(GPS_Serial.available() > 0) { gps2.encode(GPS_Serial.read()); } if(gps2.location.isUpdated()) { Serial.print("Lotitude"); Serial.println((gps2.location.lat()),6 ); Serial.print("Longitude:"); Serial.println((gps2.location.lng()),6 ); Robo.szer = gps2.location.lat(); Robo.dlu = gps2.location.lng(); } } BLYNK_WRITE (V0) // GPS Stream Widget Data from Phone ------------------------------------------------------------ { GpsParam gps(param); Serial.println("Received remote GPS: "); // Print 7 decimal places for Lat Serial.print(gps.getLat(), 7); Serial.print(", "); Serial.println(gps.getLon(), 7); Phone.szer = gps.getLat(); Phone.dlu = gps.getLon(); } BLYNK_WRITE (V1) // Wirtualny przycisk -------------------------------------------------------------------------------------- { } BLYNK_WRITE (V2) // Terminal Widget ------------------------------------------------------------------------------------------ { if (String("clear") == param.asStr()) { terminal.clear (); } else if (String("compas") == param.asStr()) { Compas(); } else if (String("rob") == param.asStr()) { } } void setup() //------------------------------------------------------------------------------------------- { //Debugging Serial.begin(9600); //GPS GPS_Serial.begin(9600); //Bluetooth BT_Serial.begin(9600); Blynk.begin(BT_Serial, auth); //Terminal terminal.clear(); //Compas compass.init(); } void loop() //------------------------------------------------------------------------------------------------------- { Blynk.run(); Serial.println("dane z tele"); Serial.println(Phone.szer, 5); Serial.println(Phone.dlu, 5); Serial.println("dane z robota"); Serial.println(Robo.szer, 5); Serial.println(Robo.dlu, 5); delay (2000); Distance (); delay (2000); } Czy ktoś mógłbym pomóc mi z otrzymywaniem poprawnych danych z 2 GPS ( z telefonu oraz robota) ?
  19. Cześć wszystkim! Zostałem postawiony przed koniecznością stworzenia pewnego mechanizmu. Jedna z jego części ma działać w następujący sposób: Przy załączonym przycisku klapka ma otwierać się w stronę krańcówki K1. W momencie osiągnięcia K1 krańcówka wysyła sygnał do arduino i napęd ma się wyłączyć. Przy wyłączeniu przycisku klapka powinna wrócić w położenie K2. Klapka ma pokonać dystans 80mm w czasie ~2sek. Pierwotna koncepcja zakładała wykorzystanie zwykłego silniczka ze śrubą pociągową, lecz niestety gabaryty nie pozwalają na zastosowanie takiego rozwiązania. Zdecydowałem się więc na użycie serwomechanizmu (jest mały, zapewnia duży moment, łatwo sterować prędkością otwierania klapki). Ogólnie po napisaniu programu wszystko działało zgodnie z założoną logiką, lecz problem pojawił się po ponownym uruchomieniu arduino. Po osiągnięciu pozycji K1 i przy załączonym przycisku odłączyłem zasilanie. Po ponownym uruchomieniu, serwomechanizm ustawił się szybko na pozycję 90 stopni, choć przycisk cały czas był wciśnięty serwo nie dążył do pozycji K1. Dopiero po wyciśnięciu przycisku serwo wykonało ruch (niestety szybki, a nie powolny jak zaprogramowałem) w pozycję K2. Do stworzenia prototypu użyłem elementów z zestawu startowego arduino. Niestety, ale w swoim projekcie nie mogę sobie pozwolić na to by po ponownym podłączeniu zasilania serwo wykonywało jakieś szybkie ruchy na pozycje 0. Czy jest jakiś sposób, który może rozwiązać mój problem? Dodam, że moja wiedza z programowania jest podstawowa, więc proszę o prosty język i wyrozumiałość. W kodzie mam sterowanie na dwa przełączniki, ale nie ma to większego znaczenia. #include<Servo.h> int pos =0; Servo servo; void setup() { pinMode(10, INPUT); //przelacznik 1 pinMode(9, INPUT); //przelacznik 2 pinMode(8, INPUT); //krancowka na otwarciu pinMode(7, INPUT); //krancowka na zamknieciu servo.attach(3); } void loop() { //ruch przesłony if(((digitalRead(10)==HIGH || digitalRead(9)==HIGH)&&(digitalRead(8)==LOW)) && pos< 180) {pos++; servo.write(pos); delay(15);} //servo otwiera przesłone else {digitalWrite(2,LOW);} //servo nie działa if((digitalRead(10)==LOW && digitalRead(9)==LOW && digitalRead(7)==LOW) && pos>0) {pos--; servo.write(pos); delay(15);} //servo zamyka przesłone else {digitalWrite(2,LOW);} //servo nie działa }
  20. Cześć Chcę sobie zrobić prosty tachometr na bazie podczerwieni. Czy ten odbiornik będzie dobry? http://electropark.pl/odbiorniki-podczerwieni/2880-odbiornik-podczerwieni-38khz-tsop31238.html a taki nadajnik http://electropark.pl/diody-ir-podczerwieni/1529-ir-tsal6400-dioda-nadawcza-ir-25st.html Na wirującym elemencie będzie naklejony biały pasek, który powinien odbijać podczerwień. Czy te elementy będą działać ze sobą? Jaki może być zasięg takiego tachometru? Jaka dokładność jeżeli pomiary będą w przedziale 1400-3000 rpm? A może polecicie coś lepszego? Będę używał ardunino uno do sterowania i liczenia rpm. Dziękuję
  21. 1. Wprowadzenie Od dawna zafascynowany jestem kaligrafią, nie tylko w kontekście naszego języka ojczystego, ale także innych bardziej egzotycznych jeżyków. Mimo wielokrotnych prób zmierzenia się z tym tematem od strony praktycznej doszedłem do wniosku, że forma biernego obserwatora daje mi więcej satysfakcji niż sam udziel w procesie kaligrafowania. Może to niektórym wydawać się dziwne, może nie, no cóż, tak mam. Po pewnym czasie w mojej głowie narodziła się myśl, a raczej pytanie. Czy jestem w stanie zbudować maszynę do kaligrafii? Uprzedzając nieco fakty - odpowiedź brzmi: tak. Więc zapraszam do zapoznania się, z krótką historią mojego plotera. Po przejrzeniu zasobów sieci zdecydowałem się na ploter CNC, jako urządzenie, które spełni moje wymagania. W przyszłości może będzie dodatkowo rozbudowane i zyska funkcję na przykład laserowego grawera. Na początek, krótko o samym urządzeniu. Jak podaje Wikipedia ploter to komputerowe urządzenie peryferyjne, służące do pracy z dużymi płaskimi powierzchniami, mogące nanosić obrazy, wycinać wzory, grawerować itp. Plotery są również używane do kreślenia map. Są to urządzenia z powiedzeniem używane od lat w różnych gałęziach przemysłu. Pod naszymi strzechami, czyli w domu przeciętnego Kowalskiego się ich jednak nie widuje ponieważ funkcję tego typu urządzenia pełni drukarka, gdyż raczej na co dzień nie ma konieczności "generowania" pisma ręcznego na dużym formacie. Jest to pewien skrót myślowy, ale mam nadzieje, że większość osób rozumie o co mi chodzi. Założenia są takie, że urządzenia ma być stosunkowo tanie, łatwe w budowie i obsłudze. 2. Projekt i Thingiverse Thingiverse to serwis, w którym ludzie dzielą się swoimi projektami różnych maszyn, urządzeń, czy gadżetów, które można następnie wydrukować we własnym zakresie na drukarce 3D. Tak też postanowiłem zrobić, wykorzystać jeden z bardzo wielu istniejących już projektów na którego bazie zbuduję swój ploter. Konkretnie z projektu "Drawing Robot - Arduino Uno + CNC Shield + GRBL", który sam bazuje na innym tego typu projekcie. 2.1. Oryginalny projekt, źródło: thingiverse.com/thing:2349232 Do projektu zostały wykorzystane części stworzone na drukarce 3D, w przypadku gdy ktoś nie ma dostępu do tego typu urządzenia polecam skorzystać z ogłoszeń społeczności związanej z drukiem 3D. Takie usługi powinny być dostępne na miejscu we wszystkich większych miastach, a koszt to w tym przypadku to do kilkudziesięciu złotych. Nie zapominajmy to też, o naszej forumowej braci. 3. Części i narzędzia Po za wydrukowanymi częściami będą potrzebne jeszcze: Elementy elektroniczne, elektryczne Silnik krokowy NEMA 17 - 2 sztuki. Stalowy pręt o średnicy 8mm (oś X, Y) - 4 sztuki, w moim przypadku jest to 4x po 400mm. Stalowy pręt o średnicy 3mm (oś Z) - 2 sztuki, 2x 8mm. Stalowy pręt gwintowany o średnicy 8mm - 1 sztuka. Łożysko liniowe LM8UU - 8 sztuk. Serwomechanizm SG-90 - 1 sztuka. Sprężynka od długopisu lub gumka recepturka - od jednej do kilku sztuk w zależności od użytego uchwytu. Koło zębate GT2, 16 zębów - 2 sztuki. Łożysko 624zz - 5 sztuk. Pasek zębaty GT2 - w zależności od długości zastosowanych prętów dla osi X i Y, w moim przypadku wystarczyło 2000mm. Arduino Uno - 1 sztuka. Sterownik CNC Shield dla Arduino Uno - 1 sztuka. Zworki - 6 sztuk. Sterownik silnika krokowego A4988 - 2 sztuki. Zasilacz 12V minimum 2A - 1 sztuka. Przyciski krańcowe - 4 sztuki, opcjonalnie, zabezpieczenie osi X i Y z obu stron. Gniazdo DC - 1 sztuka. Nakrętki M8 - 4 sztuki. M4 - 5 sztuk. M3 - 7 sztuk. Śruby M4 x 35mm - 5 sztuk. M3 x 20mm - 1 sztuka. M3 x 16mm - 13 sztuk. M3 x 6mm - 4 sztuki. Podkładki M8 - 4 sztuki. M3 - 4 sztuki. Inne Przewody do silników krokowych, kupne czy też zrobione własnoręcznie. Wszelkie narzędzia, które mogą się przydać pod czas budowy, jak na przykład piła do przycięcia stalowych prętów, cążki do metalu, czy stacja lutownicza, ale to raczej oczywiste. 4. Elektronika i mechanika Sercem urządzenia jest Arduino Uno z płytką rozszerzeń CNC, w której osadzone są 2 sterowniki A4988. Płytkę rozszerzeń wpinamy zgodnie z opisem pinów, powinny być one opisane na obu płytkach. Tak samo postępujemy z A4988 dla osi X i Y. 4.1. Diagram połączeń elektrycznych z CNC Shield. 4.2. Zmontowany układ, gotowy do pracy. Ploter wykorzystuje system CoreXY do poruszania karetką. Według opinii krążących w internecie taki system jest bardziej precyzyjny i prostszy do wykonania w porównaniu do starowania osiami X i Y niezależnie. Nie jestem ekspertem i ciężko mi stwierdzić czy tak rzeczywiście jest. Bez względu na to czy ma to odzwierciedlenie w rzeczywistości, to dość spora część tego typu maszyn budowanych przez hobbystów wykorzystuje właśnie CoreXY, jeśli nie mamy do czynienia z dużymi obciążeniami karetki. 4.3. Wizualizacja układu CoreXY. 4.4. Schemat ruchu układu CoreXY. 5. Oprogramowanie Oprogramowanie Arduino zostało wykonane zgodnie z poniższym poradnikiem: https://electricdiylab.com/grbl-cnc-shield-z-axis-servo-migrbl/ Należy jedynie pamiętać, że przez samym zaprogramowaniem mikro kontrolera należy w pliku config.h zmienić linie: // #define COREXY // Default disabled. Uncomment to enable. na #define COREXY // Default disabled. Uncomment to enable. czyli usunąć komentarz, przez co zostanie włączona opcję COREXY ponieważ właśnie takiego starowania używa ploter. W przeciwnym wypadku nasza maszyna będzie działać, ale wszystko co stworzy będzie obrócone o 45 stopni. 6. Efekt końcowy Tak oto prezentuje się efekt końcowy, wymaga jeszcze kilku końcowych szlifów, jak dobór odpowiednich sprężyn, przetestowanie różnych podkładek do pisania, piór, długopisów, wykonanie nowego "trzymaka", dodaniu kilku trytytek, ect. Mimo tych drobnych aspektów maszyna działa bardzo dobrze i jestem zaskoczony jej dokładnością. 6.1. Wybrane ujęcia gotowego plotera. 6.2. Film obrazujący pracę plotera. Film ukazuje również problemy z dociskiem długopisu spowodowane nierównym podłożem.
  22. Trochę cheat gadżet przede wszystkim dla licealistów którzy są leniwi tak jak ja. Dużo czasu w trakcie liczenia zadań zajmują same operacje matematyczne przy których także łatwo się pomylić. Najprostszym rozwiązaniem jest kalkulator naukowy lecz są one zabronione w szkole oraz na maturze. Stworzyłem więc własny kalkulator który tylko z pozoru wygląda jak prosty lecz ma ukryte funkcje. Oczywiście nie wygląda on idealnie ale to kwestia wydrukowania obudowy oraz zmiany klawiatury. Nawet użytkownik nie zapoznany z kalkulatorem nie odkryje specjalnych funkcji ponieważ wymagają one wciśnięcia specjalnej konfiguracji klawiszy. Kalkulator posiada takie funkcje jak Dodawanie Mnożenie Dzielenie Odejmowanie Obliczanie dowolnych potęg Obliczanie pierwiastka dowolnegos stopnia Obliczanie pierwiastków funkcji kwadratowej Obliczanie wszystkich funkcji trygomoterycznych Obliczanie logarytmu o dowolnej podstawie Całość zaprogramowana jest na arduino nano.
  23. Opis konstrukcji Całość jest wynikiem obserwacji innych tego typu konstrukcji oraz własnych przemyśleń i możliwości. Konstrukcja to typowy drewniak (tania w budowie). Część elementów posiadałem z innych projektów. Całość jest sterowana z wykorzystaniem GRBL 0.9j i Arduino Nano 3.0. Dodatkowo, aby uniezależnić się od PC gcode wysyłany jest z Rasp Pi Zero W bezpośrednio do Arduino. Pole robocze frezarki to ok 240x 200mm. Wstępnie zostanie ono ograniczone limitami w oprogramowaniu GRBL. Docelowo prawdopodobnie zainstaluję krańcówki. Prześwit osi Z 64mm. Formatki ze względu na cenę całości zostały zamówione ze sklejki szalunkowej co było błędem. Różnice w grubości poszczególnych arkuszy dochodziły do 2mm (z tego powodu dostałem zwrot 50% opłaconych za sklejkę środków). Wykaz głównych elementów konstrukcji: 1. Łożyska liniowe SC12UU -12 sztuk 2. Łożyska liniowe SC12VUU -2 sztuki 3. Śruba trapezowa Tr10x2 - 540mm, 440mm, 220mm 4. Sprzęgła elastyczne 6,35x10 -4 sztuki 5. Uchwyty prowadnic liniowych 12mm - 4 sztuki 6. Sklejka szalunkowa 21mm (ok. 1,5m kwadratowego) 7. Arduino Nano 3.0 8. Rasp Pi Zero W - 1szt 9. Zasilacz 12VDC, 24VDC, 48VDC - po kilka sztuk 10. Silnik krokowy NEMA23 - 4sztuki 11. Prowadnica liniowa 12mm - 3x400mm, 2x500mm, 2x200mm 12. Nakrętka śruby Tr10x2 - 3 sztuki 13. Uchwyty śruby - łożyskowane - 6 sztuk 14. Uchwyty prowadnic liniowych 12mm - 10szt 15. Wrzeciono 300W - 1 sztuka 16. Uchwyt wrzeciona 52mm - 1 sztuka 17. Sklejka szalunkowa 21mm z cięciem (formatki wg projektu) 18. Śruby wg potrzeb 19. Sterownik silnika krokowego - klon TB6600 3 sztuki Wykaz formatek ze sklejki: 500x400 1x - podstawa 542x350 2x - boki 400x59 1x - przód (pod montaż uchwytu śruby poruszającej stolik oś Y) 400x70 1x - tył (pod montaż uchwytu śruby poruszającej stolik oraz silnika krokowego oś Y) 400x200 1x - podstawa osi X 400x121 2x - tylne półki tworzące wnękę na elektronikę 390x280 1x - stolik 142x242 1x - podstawa osi Z 142x38 1x - dół podstawy osi Z (montaż łożyska śruby osi Z) 142x50 1x - góra podstawy osi Z (montaż łożyska śruby osi Z oraz silnika krokowego) 142x130 1x - oś Z (pod montaż wrzeciona) Soft - kontroler GRBL W moim przypadku, posiadam klon arduino nano z układem CH341 instaluję driver Arduino driver ch341ser tworzący wirtualny port COM do komunikacji z mikroprocesorem. Następnie oprogramowaniem Xloader wgrywamy soft na Arduino i gotowe. Soft - wysyłanie g-code do kontrolera GRBL Teraz potrzebny nam soft na PC do wysyłania komend dla naszego kontrolera GRBL. Soft jest zarówno pod windows jak i pod linuxa. Ja w tym celu wykorzystuję minikomputer Rasp Pi Zero W (zamiast stacjonarnego PC). Wykorzystanie Rasp Pi Zero W jako PC do wysyłania G-code niesie ze soba pewne następstwa. Zasięg Wi-fi okazał się mały ze względu na słabą antenkę w malinie. Dodatkowo wydajność 1 rdzeniowego PC z 512MB RAM jest mizerna. Z tego powodu testowałem wiele rozwiązań by wybrać najbardziej dla mnie optymalną wersję. Skończyło się na instalacji Raspbian Lite, doinstalowaniu lekkiego środowiska graficznego oraz serwera VNC (by w łatwy sposób przegrywać nowe g-code do wykonania). Testowałem 2 programy do obsługi frezarki z systemu linux maliny: 1. bCNC. 2. Universal Gcode Sender - ten program pozostawiłem. Po wgraniu oprogramowania na malinkę wystarczy podpiąć do malinki po USB Arduino z wgranym Grbl, wybrać port COM i połączy się z oprogramowaniem. Zobaczymy wtedy ustawienia konfiguracyjne naszego softu. Ich opis jest zależny od wersji. W moim wypadku Konfiguracja GRBL 0.9 Schemat elektryczny Poza schematem jest chińskie wrzeciono 300W, które załączam ręcznie. Prędkość jest sterowana z wykorzystaniem regulatora PWM 60VDC, 20A i zasilana napięciem 48VDC. Działanie Po wstępnej konfiguracji możemy przystąpić do testów naszego CNC. 1. Frezowanie napisów w płytkach plastikowych 2. Wyfrezowane płytki pod ESP8266 A oto filmiki z działania urządzenia: Podsumowanie Na pewno konstrukcja nie jest najlepsza, 3 prowadnice na jednej osi (wykorzystałem posiadane prowadnice i łożyska).Dość cienkie prowadnice, dodatkowo swobodnie wiszące. Przy pierwszych testach wyszło, iż śruba trapezowa na osi X jest do wymiany (na odcinku 100mm ma luz ponad 0,3mm). Pozostało zrobić osłony śrub trapezowych i prowadnic osi Y, w planach osłona z pleksy aby wióry nie rozsypywały się przy frezowaniu poza urządzenie. Być może później jakiś odciąg. Oczywiście pojawi się wyłącznik awaryjny oraz krańcówki. W sumie jestem zadowolony. Podstawowy cel - grawerowanie PCB wraz z wierceniem, wycinanie formatek ze sklejki i pleksy bezproblemowe. W razie dodatkowych pytań postaram się w miarę możliwości udzielić odpowiedzi. Jeśli ktoś chciałby dokładniejsze informacje na temat wykonania całości po polecam pobranie i przejrzenie pliku Frezarka CNC.zip (33 strony powinny zaspokoić ciekawość). Frezarka CNC.zip
  24. Tak to jest, jak się najpierw ustala nazwę, a potem dopiero traktuje jako akronim i szuka jakiegoś sensownego określenia Ale jeśli ktoś czytał "Cieplarnię" Aldissa powinien już w tym momencie domyślać się, do czego służy SMARDZ (a jeśli nie to warto przeczytać). Kilka słów wyjaśnienia: bardzo lubię Arduino Pro Mini (choćby ze względu na cenę klonów i brak jakichkolwiek niepotrzebnych wodotrysków - ot, po prostu atmega z kwarcem i pinami na zgrabnej płytce). Niestety - o ile programowanie różnych mniej lub bardziej stacjonarnych urządzeń typu automatyka domowa jest całkiem wygodne (o ile się zadba o odpowiedni konwerter) - o tyle przy robotach, które jeżdżą, szwendają się po podłodze i ogólnie starają się usilnie zerwać wszystkie możliwe kable, sprawa staje się bardziej skomplikowana. Próbowałem jakichś wariackich rozwiązań na ESP8266 (coś w stylu "Serial over IP"), ale rezultaty były raczej mało interesujące. Postanowiłem więc przestać bawić się w oszczędzanie i użyć Raspberry Pi Zero W. Rozwiązanie (oprócz tego że działa bezproblemowo) ma jeszcze jedną zaletę: wszystkie pliki trzymane są na karcie pamięci malinki, układ katalogów zgodny jest z oryginalnym układem Arduino, a do komunikacji z malinką możemy użyć dowolnego komputera z zainstalowanym jakimś klientem SSH (np. PuTTY). I tu uwaga: mimo że opisuję dość dokładnie jak takie coś można sobie zrobić - zakładam u potencjalnego użytkownika podstawową wiedzę na temat Linuksa, Arduino i ogólnie elektroniki. Tak że proszę - bez pytań typu "a jak się przegrywa pliki na RPi" i "po co tam Arduino IDE jeśli go nie używam" Jak zwykle postanowiłem użyć elementów "wyciągniętych z szuflady". Co prawda jest mało prawdopodobne, aby wiele osób miało w szufladzie jakieś niepotrzebne malinki, ale ponieważ wymagania SMARDZa są bardzo małe, można po prostu na chwilę wyjąć ją z innego urządzenia. Nawet zakup RPi specjalnie do tego celu nie będzie niepotrzebnym wydatkiem - albo posłuży do programowania, albo znajdzie zastosowanie w innym urządzeniu (np. kamerze, serwerze octoprinta co tam sobie wymyślimy). Co do wymagań - potrzeba niewiele. Wystarczy stały adres IP w domowej sieci WiFi, dostępny interfejs Serial na ttyS0 i wolny pin BCM17. Co do malinki - można kupić wersję z wlutowanymi pinami, ale to chyba szczyt lenistwa, SMARDZ jest przeznaczony dla osób, które potrafią się lutownicą posługiwać i wlutowanie czterdziestopinowego gniazda nie powinno stanowić problemu. Zaoszczędzić też możemy na karcie SD, wcale nie musimy kupować najdroższej, wystarczy taka za kilkanaście złotych. Potrzebny będzie jeszcze konwerter napięć i jakieś drobne elementy montażowe. Tak więc mamy już malinkę (z pinami). Zakładam, że większość z tych, którzy chcieliby sobie coś takiego zrobić ma jakiś zasilacz (wystarczy mocniejsza ładowarka od komórki) - ja trafiłem w Tesco ostatnio ładowarkę 2.5A za niecałą dychę przy okazji kupowania jakichś bułeczek Instalacja jest prosta, chociaż trochę potrwa. Należy zacząć od skonfigurowania systemu tak, aby otrzymywał stały adres IP w sieci wewnętrznej. Ponieważ sposobów na to jest wiele i wybór ściśle zależy od warunków technicznych - odsyłam do oficjalnych instrukcji konfiguracji RPi. Potrzeba również, aby malinka miała dostęp do Internetu. Również pamiętajmy, że będzie nam potrzebny UART, czyli konfigurujemy malinkę tak, aby UART był aktywny, ale konsola serial wyłączona. W tym celu łączymy się z malinką przez SSH, wydajemy polecenie: sudo raspi-config i kolejno: Wybieramy punkt "Interfacing options" Z nastpnego menu wybieramy "Serial" Na pytanie "Would you like a login shell to be accessible over serial?" odpowiadamy "Nie" Na pytanie "Would you like the serial port hardware to be enabled?" odpowiadamy "Tak" Jako że najprawdopodobniej konfigurować to będziemy w trybie headless (nie bardzo sobie wyobrażam po co komu graficzne środowisko na komputerze bez podłączonego monitora - ale może ktoś ma takie upodobania) - na komputerze z którego przeprowadzamy instalację potrzebny będzie jeszcze vncviewer. I tu znów odsyłam do materiałów dotyczących używanego systemu operacyjnego - w przypadku Ubuntu czy Debiana najprostszy będzie xtightvncviewer. Oczywiście, jeśli mamy graficzne środowisko i podłączony monitor możemy z tego skorzystać! Zaczynamy od instalacji najpotrzebniejszych programów. Jeśli używamy otoczenia graficznego, wystarczy WiringPi i pyserial: sudo apt install wiringpi python-serial Jeśli instalujemy w trybie headless, potrzebne będą dodatkowe programy: sudo apt install wiringpi python-serial x11vnc xserver-xorg-video-dummy Teraz musimy zainstalować Arduino IDE. Tu znów w przypadku graficznego środowiska postępujemy zgodnie z oficjalnymi instrukcjami - Arduino IDE należy co najmniej raz uruchomić! Zajmijmy się więc wersją headless. Należy do katalogu domowego wgrać najnowszą wersję Arduiono IDE dla Linuxa ARM 32-bity (w chwili pisania jest to wersja 1.8.9) i rozpakować poleceniem: tar -xJf arduino-1.8.9-linuxarm.tar.xz Utworzony zostanie katalog arduino-1.8.9 zawierający wszystko, co potrzebne do pracy. Teraz należałoby uruchomić Arduino IDE - niestety, bez grafiki się nie da... trzeba więc nieco oszukać Javę żeby myślała, że wszystko jest w porządku. Najprostszym sposobem jest uruchomienie IDE w symulowanym środowisku graficznym. W tym celu wydajemy polecenie: xvfb-run arduinio-1.8.9/arduino i po odczekaniu dłuższej chwili (IDE musi wystartować, a tego nie widać) zatrzymanie programu przez ctrl-c. Powinny zostać utworzone katalogi ~/Arduino zawierający katalog libraries oraz ~/.arduino15 z (między innymi) plikiem preferences.txt. Jednak lepiej jest widzieć co się dzieje, poza tym nie wszyscy lubią zabawy z zipami i ściąganie bibliotek z githuba, w większości przypadków użycie okienkowego interfejsu jest po prostu wygodniejsze. A więc aby ujrzeć (teraz i następnym razem) interfejs Arduino IDE należy postąpić nieco inaczej. Wydajemy kolejno polecenia: Xvfb -display :20 & x11vnc -display :20 & DISPLAY=:20 arduino-1.8.9/arduino a na komputerze na którym pracujemy uruchamiamy przeglądarkę VNC i łączymy się z naszą malinką. Należy pamiętać, że x11vnc uruchomiony w ten sposób pozwala tylko na jedną sesję! Teraz po prostu po pokazaniu się właściwego interfejsu IDE możemy go zamknąć, a na konsoli malinki wydać polecenie: killall Xvfb Spowoduje to wyłączenie graficznego środowiska oraz serwera VNC. Tak więc nasza malinka jest już gotowa, możemy przystąpić do instalacji plików SMARDZa. Tu już jest to wręcz trywialne. Z załącznika do posta (smardz.zip) trzeba wyciągnąć plik smardz.tgz, przegrać go na naszą malinkę do katalogu domowego i rozpakować poleceniem: tar -xzf smardz.tgz Powinien zostać utworzony katalog bin, a w nim pliki wykonywalne: ardureset arducomp.py ardupload.py arduserial.py Możemy teraz sprawdzić, czy wersja Arduino IDE w pliku ardupload.py zgadza się z wersją zainstalowaną, ew. poprawić linijkę: aversion='1.8.9' zgodnie z zainstalowaną wersją Arduino IDE. Należy pamiętać, że w przypadku wgrania nowej wersji IDE trzeba będzie tę linijkę poprawić ponownie! Jeśli nie stosujemy malinki do innych celów lub żaden zainstalowany program nie używa pinu BCM17 możemy do /etc/rc.local dopisać: /usr/bin/gpio -g mode 17 output /usr/bin/gpio -g write 17 1 Jeśli tego nie zrobimy, może okazać się konieczne wydanie polecenia ardureset zaraz po uruchomieniu systemu. Mamy więc wszystko zainstalowane... ale jakoś to trzeba z naszym Arduino połączyć! Tu już wszystko zależy od inwencji użytkownika. Schemat połączeń będzie oczywiście podobny w każdym przypadku, zworka w obwodzie zasilania jest opcjonalna i służy do rozdzielenia zasilanie, jeśli chcemy oddzielnie zasilać Arduino i SMARDZa. Połączenia między Arduino a RPi powinny przechodzić poprzez konwerter napięć (wykorzystane trzy z czterech par), a więc sprowadzą się do: DTR/1 - GPIO17/11 TxD/2 - RxD/10 RxD/3 - TxD/8 Ja w swoim rozwiązaniu użyłem kawałka dwustronnej płytki uniwersalnej, gniazda zostały wycięte z jednej 40-pinowej pojedynczej listwy żeńskiej, ale to już zależy od własnych potrzeb i możliwości, każdy ma inne. Pozostaje jeszcze kwestia obudowy. Początkowo użyłem wersji z Thingiverse (nota bene bardzo wygodnej), postanowiłem jednak nieco ją zmodyfikować. Pliki STL oraz SCAD w załączniku! No i pora na testy. Potrzebne jest Arduino Pro Mini z wlutowanymi kątowymi pinami do programowania (ja stosuję zawsze pięć). Podłączamy Arduino do SMARDZa, podłączamy zasilanie do RPi, powinna zaświecić się dioda zasilania w Arduino. Teraz łączymy się przez SSH z naszą malinką. Potrzebny jest jakiś dowolny szkic (np. blink) umieszczony w katalogu Arduino (możemy go przegrać choćby z ~/arduino-1.8.9/examples/01.Basics/Blink). Wchodzimy do katalogu Arduino/Blink: cd ~/Arduino/Blink i wydajemy polecenie arducomp.py Program powinien się skompilować, zostać przesłany na Arduino i po chwili powinniśmy zobaczyć migającą diodę. Kolej na użycie monitora serial. W tym celu otwieramy drugie połączenie z malinką i wpisujemy polecenie arduserial.py Powinniśmy zobaczyć ekran monitora. Obsługa jest intuicyjna, wspomnę tylko że wpisanie czegokolwiek jest możliwe tylko przy aktywnym monitorze (przełączanym klawiszem F2), a prędkości przełącza się klawiszami kursora po wciśnięciu F3 przy nieaktywnym monitorze. Na pierwszej konsoli musimy skompilować jakiś program używający seriala. Jeśli nie macie nic takiego pod ręką, przygotowałem taki bardzo krótki test pozwalający sprawdzić zarówno nadawanie, jak i odbiór: void setup(void) { Serial.begin(9600); Serial.println("Program wystartował"); } void loop() { if (Serial.available()) { Serial.println((int)Serial.read()); } } Jeśli wszystko będzie w porządku - możemy już zająć się prawdziwą pracą z naszym robotem. Należy tylko zadbać o to, aby piny interfejsu Arduino zwrócone były w stronę umożliwiającą podłączenie SMARDZa bez konieczności użycia dodatkowych kabli: ...a następnie przystąpić do programowania i monitorowania naszego robota (robot na zdjęciu jest wersją próbną w trakcie powstawania, zrzut ekranu monitora pochodzi z tego właśnie robota). Wszystkie pliki potrzebne do odtworzenia SMARDZa w załączniku: smardz.zip Jak zwykle w przypadku pytań pozostaję do dyspozycji.
  25. Sam tytuł mówi prawie wszystko na temat tej zabawki. Co do genezy to od jakiegoś czasu miałem chęć zrobić pada opartego o arduino. Sam pad nie miał służyć do grania a bardziej do sterowania czymś innym. Całość najpierw powstała w SimulIDE Tak jak widać do każdego przycisku są przypisane diody czyli 4 po lewej jedna po prawej (plus led na pinie13) i cztery diody sygnalizacyjne na środku. Po dostarczeniu zasilania diody zaświecają się jedna po drugiej a naszym celem jest wcisnąć odpowiadający danej diodzie przycisk co powoduje jej zgaszenie. Jeśli nie wciśniemy przycisku lub wciśniemy go po czasie zapala się dioda sygnalizacyjna. Możemy pominąć trzy diody a przy czwartej jest game over . W raz z postępem rozgrywki diody gasną i zapalają się coraz szybciej. Cel był taki żeby rozgrywka była możliwie krótka a stopień trudności narastał dając nam odczuć wyraźną zmianę. tak wygląda efekt końcowy. Chciałem kupić diody w kształcie kwadrat 12x12mm ale nie było ich w sklepie więc trudno. Za brakujące elementy zapłaciłem 7 zł resztę miałem. W załączniku przesyłam plik do simulIDE wraz z kodem (całym). Można skompilować i wgrać bezpośrednio z simulIDE i zobaczyć jak to działa w symulacji. void setup() { Serial.begin(9600); DDRC = 15; // A0..A3 Output DDRB = 48; //D8...D11 INPUT, D12 and D13 Output PORTB = 15; //D8...D11 High impedance DDRD = 60; //D2...D5 OUTPUT PORTD = 192; //D6 D7 High impedance PCICR = 5; // enable pin change interrupt bank 0 and 2 PCMSK0 = 15; //enable pin change interrupt PCINT0...PCINT3/D8...D11 PCMSK2 =192; // enable pin change interrupt D6 D7 } void loop() { start(randomPin,ledOn,ledOff); } ISR(PCINT0_vect) { for (byte i=0; i<4; i++) { if (bitRead(PINB,i)==0 && bitRead(PIND,2+i)==1) {score++; bitClear(PORTD, 2+i);} } } ISR(PCINT2_vect) { for (byte i=0; i<2; i++) { if (bitRead(PIND,i+6)==0 && bitRead(PINB,i+4)==1) {score++; bitClear(PORTB,i+4);} } } Polecam zrobienie podglądu w rejestry (jeśli ktoś wcześniej tego nie robił) z poziomu simulIDE naprawdę bardzo przydatna sprawa. I to by było na tyle. A co do samego refleksu to udało mi się zgasić ponad 100 diod. Pin_interruptPad.zip
×
×
  • Utwórz nowe...