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 154 wyników

  1. Cześć, może komuś by się chciało napisać coś na temat pisania bibliotek do Arduino? Temat nie poruszany a potrzebny. Baaaaaardzo potrzebny
  2. Siemka, to mój pierwszy post ale pewnie zabawię tu dłużej. Pracuję nad cyfrowym celownikiem do wiatrówek lub asg. Do generowania krzyża na ekranie postanowiłem użyć płytki minimOSD popularnej w środowiskach latających fpv. Jest to właściwie arduino pro mini i max7456 na jednej płytce. Działać ma w ten sposób, że układ generuje krzyż celowniczy, którego położenie możemy zmienić przyciskami. W czasie normalnej pracy przyciski są ignorowane, gdyż do flagi ustawienia ładowane jest 0 przy starcie programu. Aby zmienić wartości współrzędnych należy najpierw wcisnąć środkowy przycisk, który zmienia stan zmiennej ustawienia na przeciwny oraz aktualizuje wartości zmiennych x i y w pamięci eeprom. Na sucho (to znaczy w terminalu, pracując na samych liczbach) wszystko działa. W pełnym programie kiedy wciskam lewy przycisk wszystko się wiesza. Kolejny problem to duch dolnego fragmentu krzyża. Widać to trochę na filmie: Program oparłem głównie o przykład helloworld z biblioteki max7456 wspierając się wiadomościami z forbotowego kursu arduino. #include <SPI.h> #include <MAX7456.h> #include <EEPROM.h> // Pin Mapping ///////////////////////////////////////////////////////////////// // pinValue = 0 means "not connected" // FDTI Basic 5V --- Arduino VCC (AVCC,VCC) // FDTI Basic GND --- Arduino GND (AGND,GND) // FDTI Basic CTS --- Arduino GND (AGND,GND) // FDTI Basic DTR --- Arduino GRN // FDTI Basic TXO ---> Arduino TXO [PD0](RXD) // FDTI Basic RXI <--- Arduino RXI [PD1](TXD) // Max7456 +5V [DVDD,AVDD,PVDD] --- Arduino VCC (AVCC,VCC) // Max7456 GND [DGND,AGND,PGND] --- Arduino GND (AGND,GND) // Max7456 CS [~CS] <--- Arduino 10 [PB2](SS/OC1B) // Max7456 CS [~CS] <--- Mega2560 43 [PL6] const byte osdChipSelect = 6; //6 for micro minimosd board // Max7456 DIN [SDIN] <--- Arduino 11 [PB3](MOSI/OC2) // Max7456 DIN [SDIN] <--- Mega2560 51 [PB2](MOSI) const byte masterOutSlaveIn = MOSI; // Max7456 DOUT [SDOUT] ---> Arduino 12 [PB4](MISO) // Max7456 DOUT [SDOUT] ---> Mega2560 50 [PB3](MISO) const byte masterInSlaveOut = MISO; // Max7456 SCK [SCLK] <--- Arduino 13 [PB5](SCK) // Max7456 SCK [SCLK] <--- Mega2560 52 [PB1](SCK) const byte slaveClock = SCK; // Max7456 RST [~RESET] --- Arduino RST (RESET) const byte osdReset = 0; // Max7456 VSYNC [~VSYNC] -X- // Max7456 HSYNC [~HSYNC] -X- // Max7456 LOS [LOS] -X- // Global Constants //////////////////////////////////////////////////////////// const unsigned long debugBaud = 9600; // Initial serial baud rate for // Debug PC interface // Global Variables //////////////////////////////////////////////////////////// HardwareSerial Debug = Serial; // Set debug connection MAX7456 OSD( osdChipSelect ); #define key_left 10 //przyciski #define key_right 9 #define key_up 8 #define key_down 7 #define key_mode 5 int x; //wspolrzedne int y; boolean ustawienia=0; //flaga ustawien // Hardware Setup ////////////////////////////////////////////////////////////// void setup() { unsigned char system_video_in=NULL; // Initialize the Serial connection to the debug computer: Debug.begin( debugBaud ); // Initialize the SPI connection: SPI.begin(); SPI.setClockDivider( SPI_CLOCK_DIV2 ); // Must be less than 10MHz. // Initialize the MAX7456 OSD: OSD.begin(); // Use NTSC with default area. OSD.setSwitchingTime( 5 ); system_video_in=OSD.videoSystem(); if(NULL!=system_video_in) { OSD.setDefaultSystem(system_video_in) ; } else { OSD.setDefaultSystem(MAX7456_NTSC) ; } OSD.display(); // Activate the text display. OSD.setCharEncoding(MAX7456_ASCII); // Use non-decoded access. OSD.noLineWrap(); // Set wrap behaviour. OSD.noPageWrap(); x = EEPROM.read(1); //zapis wartosci z eeprom do zmiennej y = EEPROM.read(2); //Serial.begin(9600); //do testow w terminalu pinMode(key_left, INPUT_PULLUP); pinMode(key_right, INPUT_PULLUP); pinMode(key_up, INPUT_PULLUP); pinMode(key_down, INPUT_PULLUP); pinMode(key_mode, INPUT_PULLUP); } // Main Code /////////////////////////////////////////////////////////////////// void loop() { while (OSD.notInVSync()); // Wait for VSync to start to CrossPrint(); //while (true); if (digitalRead(key_mode) == LOW) { ustawienia ^= 1; //zmiana stanu flagi ustawien //Serial.println("key_mode"); // do testow w terminalu EEPROM.update(1, x); //zapis do eeprom wartosci zmiennej EEPROM.update(2, y); while (digitalRead(key_mode) == LOW) { delay(100);} } if ((digitalRead(key_left) == LOW) && (ustawienia==1)) //jesli stan na key_left niski i flaga ustawien = 1 (wcisniety) { //Serial.println("key_left"); //wyswietl "key_left" x-=1; //odejmij 1 i zapisz wynik do zmiennej x while (OSD.notInVSync()); OSD.clear(); CrossPrint(); //wyswietl krzyz while (digitalRead(key_left) == LOW) { delay(100);} //dopuki key_left wcisniety pozostan w petli bezczynnej. jedno wcisniecie = zmiana x o jedna jednostke } if ((digitalRead(key_right) == LOW) && (ustawienia==1)) { //Serial.println("key_right"); x+=1; while (OSD.notInVSync()); OSD.clear(); CrossPrint(); while (digitalRead(key_right) == LOW) { delay(100);} } if ((digitalRead(key_up) == LOW) && (ustawienia==1)) { //Serial.println("key_up"); y-=1; while (OSD.notInVSync()); OSD.clear(); CrossPrint(); while (digitalRead(key_up) == LOW) { delay(100);} } if ((digitalRead(key_down) == LOW) && (ustawienia==1)) { //Serial.println("key_down"); y+=1; while (OSD.notInVSync()); OSD.clear(); CrossPrint(); while (digitalRead(key_down) == LOW) { delay(100);} } } void CrossPrint() { OSD.setCursor( (x+4), y ); OSD.print( "/" ); OSD.setCursor( (x+4), (y+1) ); OSD.print( "/" ); OSD.setCursor( x, (y+2) ); OSD.print( "----+----" ); OSD.setCursor( (x+4), (y+3) ); OSD.print( "/" ); OSD.setCursor( (x+4), (y+4) ); OSD.print( "/" ); }
  3. Witam Mam pytanie odnośnie zasilania silników 5V (2 silniki). Otóż zbudowałem robota który takowe silniki posiada. Aktualnie sterowany jest przez arduino i przekaźnik. Arduino oraz same silniki są zasilane z power banka. Teraz chciałbym przekaźnik zmienić na układ sterowania silnikami dc L298N. Problem z tym że na układzie występuje strata 2V. Ja z mojego power banka mogę uzyskać 5V. Stąd moje pytanie czy mogę do zasilania silników użyć przetwornicy XL6009? W ramach dopowiedzenia power bank ma 2 USB które mogą równocześnie ładować. Jedno 1A na arduino i jedno 2.1A na silniki. Pozdrawiam i dziękuję za odpowiedzi.
  4. Witam, jakiś czas temu przy próbie sterowania silnikiem przez Arduino UNO, płytka uległa spaleniu. Silnik był oczywiście zasilany przez tranzystor, którym sterowało Arduino, jednak uległ on spaleniu i napięcie zasilające silnik( 24V DC) przedostało się na pin Arduino. Wtedy własnie po zaistniałej sytuacji pomyślałem, aby zrobić jakiś układ elektroniczny, który skutecznie zabezpieczy moje Arduino. Pierwsza myśl jaka przyszła mi do głowy to użycie przekaźnika, jednak jest on dosyć duży i po chwili namysłu odrzuciłem go. Lecz po krótkiej chwili spojrzałem do swojego organizera i zobaczyłem kieszonkę z transoptorami i właśnie czegoś takiego szukałem. Transoptor w przeciwieństwie do przekaźnika jest niewielki i dzięki czemu można układ w łatwy sposób w przyszłości przekształcić z przewlekanego na SMD. Zdjęcia gotowego modułu. Do złożenia tego modułu użyłem dwóch transoptorów, dwóch diod prostowniczych(ponieważ gdy podłączałem silnik to cewka w nim zawarta powodowała niepożądane działanie układu, raz doprowadziła nawet do spalenia jednego z transoptorów), dwóch tranzystorów DB911, czterech podwójnych gniazd na przewody i jednego potrójnego. Schemat układu. Zasada działania układu: Aby uruchomić układ należy zdecydować, z których transoptorów będziemy korzystać( z pierwszego, z drugiego, z obu). Załóżmy, że będziemy korzystać z pierwszego transoptora. W tym wypadku musimy podłączyć baterię 1,5 V plusem do pierwszego zacisku potrójnego gniazda, gdyż on jest połączony z kolektorem fototranzystora wewnątrz pierwszego transoptora. Minus baterii podłączamy do ostatniego zacisku potrójnego gniazda( ostatnie gniazdo jest połączone z emiterem zarówno pierwszego jak i drugiego transoptora). Dalej do pierwszego gniazda w lewym górnym rogu podłączamy urządzenie wraz z zasilaniem według schematu układu. Teraz należy zasilić diodę wewnątrz transoptora, w tym celu podłączamy się wyprowadzeniami np. z Arduino do pierwszego gniazda w lewym dolnym rogu minusem do GND, a plusem do wybranego portu Arduino. Ostatni krok jaki należy wykonać to napisać program do Arduino i cieszyć się bezpiecznie działającym układem Zdjęcie przykładowego podłączenia układu zrealizowanego według pomysłu autora wpisu: Sterowanie silnikiem 5V DC. Prosty program testowy: void setup() { pinMode(7, OUTPUT); } void loop() { digitalWrite(7,HIGH); delay(50); digitalWrite(7,LOW); delay(1000); } Dziękuję za odczytanie
  5. Tak jak w temacie. Sytuacja wygląda tak: "Wypaliłem" mikrokontroler za pomocą arduino i dla przetestowania wgrałem na niego prosty program który migał diodą. Wszystko działało. W celach testowych zmieniałem prędkość włączania się i wyłączania tejże diody. Po trzecim wgraniu programu, wgrany na mikrokontroler program działał, ale nie mogłem już wgrać żadnego innego programu. Szukałem problemów na stykach, czytałem różne wątki, zmieniałem ustawienia programatora, włożyłem ATMEG'ę bezpośrednio do innego arduino. Nic nie działa. Za każdym razem ten sam komunikat. Arduino nie może połączyć się z mikrokontrolerem. Być może ktoś już spotkał się z podobną sytuacją i byłby w stanie mi pomóc. (załączam zdjęcia z błędami i sposób podpięcia przewodów) Z góry dziękuję, Konrad
  6. 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.
  7. Witam, Posiadam Arduino nano wraz modułem czasowym i przekaźnikami. Generalnie bawię się w uruchamianie przekaźników o określonej godzinie lub przez przełącznik. Jeżeli jest włączanie przekaźników przez przełącznik - wszystko jest ok. delay(1000); /////////////////////////////////////////////////////////////// // Przycisk Strefa 1 if (digitalRead(12) == LOW) { //Jeśli przycisk jest wciśnięty digitalWrite(przekaznik1, LOW); // ON lcd.setCursor(11, 1); lcd.print("S 1"); } else { //Jeśli przycisk nie jest wciśnięty digitalWrite(przekaznik1, HIGH); // OFF lcd.setCursor(11, 1); lcd.print(" "); } Natomiast jeżeli chodzi o włączanie czasowe - o określonej godzinie -t to już jest problem, przekaźnik zamiast raz się włączyć to uruchamia się co sekundę. if ((22 == tm.Hour) && (51 == tm.Minute) && (6 == tm.Wday)) { digitalWrite(przekaznik1, LOW); // ON lcd.setCursor(11, 1); lcd.print("S 1"); } if ((22 == tm.Hour) && (52 == tm.Minute) && (6 == tm.Wday)) { digitalWrite(przekaznik1, HIGH); // OFF } Generalnie powinien włączyć się o określonej godzinie - która jest określona w if oraz wyłączyć się również o określonej godzinie. Proszę o pomoc w tej kwestii.
  8. Cześć Mam problemy z Arduino i z programatorem. 1 . Kupiłem Arduino z chin podziałało chwile i kaput , no trudno pomyślałem że kupie nówkę sztukę orginalną , no ale też nie działa więc ... „I CAŁY MISTERNY PLAN W PIZDU” Arduino:1.8.9 (Windows 8.1), Płytka:"Arduino/Genuino Uno" Opcje projektu zmienione, przeładuj całość Szkic używa 444 bajtów (1%) pamięci programu. Maksimum to 32256 bajtów. Zmienne globalne używają 9 bajtów (0%) pamięci dynamicznej, pozostawiając 2039 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów. avrdude: ser_open(): can't open device "\\.\COM3": Nie mo�na odnale�� okre�lonego pliku. Problem z wgrywaniem na płytkę. Sprawdź http://www.arduino.cc/en/Guide/Troubleshooting#upload w poszukiwaniu sugestii. Ten raport powinien zawierać więcej informacji jeśli w File -> Preferencje zostanie włączona opcja "Pokaż szczegółowe informacje podczas kompilacji" 2. Z programatorem to jest taka sprawa że w szkole na warsztatach sprawdziliśmy i działa atmega z płytki z chin ale sama płytka nie działa ( nie ważne ) , kupiłem programator ISP i nwm jak to podłączyć , żeby działało hehe ( oraz dalsze kroki postępowania ). PS . nie jestem jakimś mistrzem ale z schematów to umiem czytać , gorzej z programowaniem ... Z ewent. błędy ort. to sorry ...
  9. Cześć, To mój pierwszy post. Zrobiłem sobie nadajnik radiowy z fotorezystorem i odbiornik z mostkiem h i dwoma silnikami. Wszystko działało. Jeszcze podłaczyłem przetwornicę, ale to później rozmontowałem i jak dostałem joystick to postanowiłem złożyć ponownie. Efekt jest taki, że wszystko działa na diodach jak należy, a jak podłaczę silnik, to zawiesza się. Skręcam joystick diody świecą a silnik kreci się w nieskonczoność, na Monitorze portu szeregowego przestają wyskakiwać wiadomości i wystarczy, ze odłączę silnik i program leci dalej. Czym to może być spowodowane? #include <VirtualWire.h> #define receive_pin 11 unsigned long czas; String stringHash = "99999999"; void setup() { Serial.begin(9600); Serial.println("setup"); // przygotowujemy potrzebne informacje dla biblioteki pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1 pinMode(8, OUTPUT); pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1 pinMode(5, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 2 pinMode(4, OUTPUT); pinMode(3, OUTPUT); //Sygnał PWM silnika nr 2 czas = millis(); vw_set_rx_pin(receive_pin); vw_setup(2000); vw_rx_start(); // startujemy odbieranie danych (uruchamiamy) } void loop() { // częśc wymagana do poprawnego działania biblioteki uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) // jeśli odbierzemy dane { czas = millis(); int i, last; String wiadomosc, liczbaX, liczbaY; // w pętli zczytujemy dane z odbiornika int lastfirst=0; for (i = 0; i < 8; i++) { wiadomosc += char(buf[i]); // wiadomość last = i; } if (wiadomosc == stringHash) { String tt=""; for(i=last+1;i<buflen;i++) { tt=""; tt+=char(buf[i]); if(tt=="_") { lastfirst=i-1; break; } } for (i = last+1; i < lastfirst+1; i++) { liczbaX += char(buf[i]); // liczba } for (i = lastfirst+2; i < buflen; i++) { liczbaY += char(buf[i]); // liczba } //Serial.println (liczbaY); int x = atoi(liczbaX.c_str())-100; //w prawo w lewo int y = atoi(liczbaY.c_str())-100; //do przodu do tyłu int x1=1* abs(x); int y1=1* abs(y); if(x<0) MakeWalk(8, 7); else MakeWalk(7, 8); if(y<0) MakeWalk(5, 4); else MakeWalk(4, 5); analogWrite(6, x1); analogWrite(3, y1); Serial.print ("------ "); Serial.print (x1); Serial.print (";"); Serial.println (y1); } } } void MakeWalk(int pin1, int pin2) { digitalWrite(pin1, HIGH); digitalWrite(pin2, LOW); }
  10. Czy mógł by ktoś wysłać jakiś schemat fritzing z awaryjnym zasilaniem arduino z jakiejś bateri lub akumulatora (normalnie zasilany będzie z zasilacza dc 12v) kiedy mam prosty zamek na serwo i nie chciał bym braku dostępu w czasie braku prądu?.
  11. Dzień dobry. chciałbym zbudować układ pomiaru czasu założenia: OBIEKT PRZEKRACZA LINIĘ START-u PO PRZEKROCZENIU PUNKTU POMIARU „META” WYŚWIETLA SIĘ CZAS KTÓRY UPŁYNĄŁ OD STARTU Czujniki: Cyfrowy czujnik odległości 150cm – Waveshare (x2) LUB Moduł detektora przeszkód z czujnikiem IR (x2) WYŚWIETLACZ: JAZDA NACZAS „LINE FOOLOWER’ META : 00:00:000 CZAS WYŚWIETLANY: 00:00:000 (MINUTY : SEKUNDY : TYSIĘCZNE SEKUNDY) POMIAR CZASU_1.pdfPOMIAR CZASU_1.pdf START – JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU STOP - JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU RESET POMIARÓW ZA POMOCĄ JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU) UKŁAD NA „KABLACH” ZASILANIE BATERIA 5V {POWERBANK) CZY UKŁAD MOŻE DZIAŁAĆ NA JEDNYM CZUJNIKU (BRAMCE). TRASA JAKO OKRĄŻENIE I EWENTUALNIE DWA OKRĄŻENIA? dziękuję za wszelką pomoc Paweł I ZAŁĄCZNIK POMIAR CZASU_1.pdf
  12. Witam, mam problem z wgraniem programu do ESP8266 D1 mini. Na samym poczatku dalo sie wgrac jaki kolwiek program, pozniej bawilem ze troche w micropythona, a teraz wgl nie moge wgrac programu. Czytalem ze ktos wspominal o porcie szeregowym i predkosci wgrywania w pliku preferences.txt, lecz nawet po zmianie recznej na odpowiednie parametry, nic sie nie ruszylo. Urzywam Ubuntu, probowalem tez z RPi przez Arduino IDE wgrac i jest podobnie. Prosiłbym o pomoc i wyrozumialosc, początkujący jestem ze srodowiskiem Arduino. Pozdrawiam
  13. Dzień dobry, jestem świeżym użytkownikiem forum jak i Arduino. Zwracam się z prośbą o pomoc w rozwiązaniu problemu. Chcę wysyłać dane z Arduino Uno przy pomocy modułu ESP8266-01 (piny 2 i 3) do serwera MySQL (Xampp) przy pomocy skryptu PHP na serwerze i metody GET. Po uruchomieniu kodu (załącznik) moduł łączy się z siecią, problem jest jednak w połączeniu z serwerem. Połączenie albo nie zostaje nawiązane w ogóle, albo w pierwszym obrocie pętli (czasem kilka pierwszych obrotów) łączy się z serwerem, ale zwraca błędy. Później już połączenie z serwerem nie zostaje nawiązane. Informacje z Serial Monitora: [WiFiEsp] Connecting to 192.168.43.165 !!!Connected!!! [WiFiEsp] >>> TIMEOUT >>> [WiFiEsp] Data packet send error (2) [WiFiEsp] Failed to write to socket 3 [WiFiEsp] Disconnecting 3 [WiFiEsp] >>> TIMEOUT >>> [WiFiEsp] Connecting to 192.168.43.165 [WiFiEsp] >>> TIMEOUT >>> --> connection failed [WiFiEsp] Connecting to 192.168.43.165 [WiFiEsp] >>> TIMEOUT >>> --> connection failed i tak dalej... Po przeszukaniu podobnych tematów na forach polsko- i angielskojęzycznych niestety nie znalazłem rozwiązania. Jako, że dopiero zaczynam przygodę z Arduino, być może błąd jest bezpośrednio w kodzie, a ja nie potrafię go wychwycić. Mój kod: #include <WiFiEsp.h> #include <WiFiEspClient.h> #include <WiFiEspUdp.h> #include <SoftwareSerial.h> #include <PubSubClient.h> #include <SPI.h> char ssid[] = "OWN_NETWORK"; // network SSID char pass[] = "12345678"; // network password char server[] = "192.168.43.165"; int status = WL_IDLE_STATUS; // the Wifi radio's status WiFiEspClient espclient; SoftwareSerial soft(2,3); // RX, TX void setup() { Serial.begin(115200);// initialize serial for debugging soft.begin(115200); // initialize serial for ESP module WiFi.init(&soft); // initialize ESP module delay(5000); if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); while (true); // don't continue } while ( status != WL_CONNECTED) { Serial.print("Attempting to connect to "); Serial.println(ssid); status = WiFi.begin(ssid, pass); } } void loop() { if (espclient.connect(server, 80)) { Serial.println("!!!Connected!!!"); espclient.println("Connection: close\r\n"); espclient.println(); } else { Serial.println("--> connection failed\n"); } delay(5000); } Znalazłem natomiast informacje o bibliotece MySQL Connector, która pozwala na bezpośrednie połączenie z bazą danych i wykonanie kwerendy. Rozwiązanie wydaje się być lepsze, jednak tutaj podobnie utknąłem na etapie połączenia z bazą danych. Połączenie zupełnie nie jest nawiązywane, tzn. zwracane jest w kółko "Connecting to..." i timeout . Kod dla podglądu: IPAddress ip(192,168,43,199); IPAddress server_addr(192,168,43,165); char ssid[] = "OWN_NETWORK"; // network SSID char pass[] = "12345678"; // network password char user[] = "arduino"; // MySQL user login username char password[] = "haslo"; // MySQL user login password int status = WL_IDLE_STATUS; // the Wifi radio's status WiFiEspClient espclient; SoftwareSerial soft(2,3); // RX, TX MySQL_Connection conn((Client *)&espclient); void setup() { Serial.begin(115200); // initialize serial for debugging soft.begin(115200); // initialize serial for ESP module WiFi.init(&soft); // initialize ESP module delay(5000); if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); while (true); // don't continue } while ( status != WL_CONNECTED) { Serial.print("Attempting to connect to "); Serial.println(ssid); status = WiFi.begin(ssid, pass); } } void loop() { if (conn.connect(server_addr, 3306, user, password)) { delay(2000); Serial.println("Print po udanym polaczeniu"); } else { Serial.println("Connection failed."); } delay(10000); } Niestety zmagam się z tym problemem od kilku dni i brakuje mi już pomysłów co może być nie tak. Ponadto dodam, że urządzenia w sieci się wzajemnie pingują, wchodząc na serwer przez telefon mogę uruchomić skrypt PHP, który działa poprawnie.
  14. Dzień dobry, Zlecę opracowanie programu do Arduino Nano, opracowanie schematu elektrycznego całego układu oraz wykonanie prototypu. Układ ma proste zadanie - w skrócie, ma sterować interwałowo pracą diody LED, umożliwiać jej natychmiastowe załączanie dedykowanym przyciskiem i oraz komunikować przy pomocy błyśnięć diody stan baterii. Podzespoły są już dobrane, arkusz do stworzenia algorytmu gotowy do wysłania zainteresowanym. Proszę o kontakt osoby z doświadczeniem w programowaniu Arduino. Temat jest raczej szybki, ale pracy też niewiele. Dane kontaktowe do mnie wyślę na priv. Pozdrawiam
  15. Witajcie, Pisze na forum gdyż ciężko znaleźć mi odpowiedź na moje pytanie. Zastanawiam się jak bezpiecznie połączyć taki zestaw: Raspbbery Pi na stałe połączony przez kabel USB z Arduino Uno (Komunikacja przez Firmate - python) Arduino Pi podłączony ma do siebie L293D i dwa silniki DC - wszystko działa dobrze, aczkolwiek silniki (pompki) maja za mało mocy. Zastanawiam się jak w bezpieczny sposób wprowadzić dodatkowe zasilanie 12V? - Czy podłączając: 1. Baterie Vcc +12V --> Pin16 z L293D 2. GND z baterii --> Pin4,5,12,13 z L293D Nie ugotuje niczego, czy powinienem zrobić jakieś dodatkowe zabezpieczenia?
  16. Witam, Moim celem jest stworzenie 2 urządzeń: odbiornika oraz nadajnika. Urządzenie "Odbiornik": Ma się składać z Arduino Uno, odbiornika fs100A 433 MHz, wyświetlacza LCD oraz konwertera I2C. Urządzenie "Nadajnik": Ma się składać z Arduino Uno, nadajnika fs100A 433 MHz, wyświetlacza LCD, konwertera I2C oraz czujnika odległości HC-SR04. Jak to ma działać? Część nadawcza sprawdza odległość od danego przedmiotu, wyświetla ją u siebie na lcd oraz wysyła do odbiornika, który również u siebie wyświetla tą odległość. Problem: Do momentu, gdy nie podłączam do Urządzenia "Nadajnik" ( a także nie dodaję w kodzie odpowiednich poleceń ) nadajnika to wszystko działa. Mówię tutaj o mierzeniu odległości oraz wyświetlaniu jej na wyświetlaczu lcd. Gdy tylko dodam nadajnik ( oraz polecenia w kodzie ) to czujnik odległości za każdym razem pokazuje zero. Urządzenie "Nadajnik" też oczywiście nic nie odbiera, ale myślę, że warto zacząć od znalezienia przyczyny, dlaczego czujnik podaje złą odległość. Jednym z powodów może być połączenie. Aktualnie do VCC mam podłączone 3 rzeczy: wyświetlacz LCD, czujnik odległości oraz nadajnik i nie ma żadnego dodatkowego źródła zasilania ( baterii ). Tutaj kod: #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <VirtualWire.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu na 0x27 int trigPin=8; int echoPin=12; int transmit_pin=10; void setup() { lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); vw_setup(2000); vw_set_tx_pin(transmit_pin); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(10); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2.0) / 29.1; delay(500); lcd.clear(); lcd.setCursor(0,0); lcd.print(distance); String toSend=""; if(distance>200) distance=0; toSend = (String(distance, DEC)); // tekst wiadomości char msg[23]; // tworzymy tablicę typu char toSend.toCharArray(msg, toSend.length() + 1); // konwertujemy nasz tekst do tablicy charów vw_send((uint8_t *)msg, strlen(msg));// wysyłamy vw_wait_tx(); delay(2000); } Pozdrawiam
  17. Witam, mam problem z działaniem serwomechanizmu firmy TowardPro (tak wiem że jest to tańsza wersja TowerPro jednak nie zorientowałem się podczas zakupu przez internet i pokusiłem niższą ceną), posiadam serwomechanizm TowardPro MG996r i podczas podłączania go pod Arduino aby przez prosty program sterować nim za pomocą potencjometru to nie działa, kod jest poprawny sprawdzałem na innym serwie. Gdy podłączam serwo pod samo zasilanie ono zaczyna pracować jak zwykły silnik a jakby nie odczytuje pozycji potencjometru(?).Jako zasilania używam baterii 9V przez stabilizator 5V/2A.
  18. Witam. W mojej płytce arduino (nano) zepsuł się port usb. Jeśli podłącze płytkę do zewnętrznego zasilania, to wszystko działa, więc płytka jest sprawna. I tu moje pytanie: w jaki sposób mogę wgrać program na płytkę, nie korzystając z portu usb? Z góry dziękuje za pomoc
  19. Co to jest timelapse? W razie, gdyby ktoś nie wiedział, co mało prawdopodobne, ale jednak - jest to przeciwieństwo slow-motion, czyli film, który jest kilka albo kilkanaście razy przyspieszony. Filmy takie pozwalają obejrzeć zjawiska, które ze swojej natury są bardzo wolne, na przykład wyrastanie ciasta, płynięcie chmur na niebie, rośnięcie roślin i tak dalej. Nagranie timelapse nie jest jakimś wielkim wyczynem, bo większość aparatów i kamerek sportowych ma taki tryb wbudowany, a na telefony komórkowe istnieją tysiące aplikacji realizujących takie właśnie nagranie. Do czego więc może służyć maszyna do timelapse? Najbardziej podstawową wersją timelapse jest oczywiście nieruchomy kadr - ustawiamy kamerę na statywie, uruchamiamy proces nagrywania i zostawiamy wszystko na odpowiedni czas. Filmy takie same w sobie robią już wrażenie, ale znacznie ciekawiej jest, gdy kadr jest zmienny, na przykład gdy zastosujemy panoramowanie (czyli powolny obrót) albo liniowe przesunięcie. Kłopot polega na tym, że obrót taki musi być realizowany bardzo wolno - w tempie dopasowanym do tempa robienia zdjęć. 45 stopni to być może dużo, ale jeżeli kamera ma zarejestrować, powiedzmy, 40 minut materiału przy 30 klatkach na sekundę, to mamy prędkość obrotu rzędu 45/(40*60) = 0,01875 stopnia na sekundę. Żeby było trudniej, kamera musi obracać się płynnie, bo timelapse będzie wyraźnie poszarpany. Do czegoś takiego trzeba już dedykowanego urządzenia: kupionego albo - co znacznie ciekawsze - zrobionego samodzielnie. Komponenty Tym razem kontrolerem stało się Arduino Uno, między innymi dlatego, że razem z shieldem z wyświetlaczem i klawiaturą zapewniło dosyć niskim kosztem interfejs użytkownika. Płynny i w pełni kontrolowany obrót zapewni silnik krokowy, a ten konkretny, czyli SY35ST26-0284A wybrałem w dużej mierze dlatego, że można go zasilić bezpośrednio dwucelowym akumulatorem LiPo. Do silnika należało oczywiście również kupić odpowiedni sterownik. Oprócz tego wyposażyłem się też w obudowę - być może efekt końcowy nie powala estetyką, ale bardzo nie lubię kończyć projektów z gmatwaniną sterczących przewodów i po ukończeniu jeżdżącego robota stwierdziłem, że będę dbał również o wygląd moich projektów. To nie był koniec zakupów - silnik krokowy oferuje 200 kroków na obrót, co daje 1,8 stopnia na krok. Tymczasem ja potrzebowałem stukrotnie większej dokładności, dlatego konieczne było zbudowanie przekładni zębatej. Zębatki Z przekonaniem, że w Internecie można znaleźć wszystko zacząłem szukać zębatek i okazało się, że wcale nie tak łatwo jest znaleźć zębatki do takiego projektu. Byłem ograniczony ich rozmiarem oraz sposobem montażu - nie posiadając wtedy drukarki 3D (na której pewnie sam wydrukowałbym potrzebne koła), miałem też ograniczone możliwości związane z montażem komponentów. W akcie desperacji napisałem email z zapytaniem ofertowym do krakowskiej firmy, która specjalizuje się w produkcji kół zębatych, ale koszty rzędu (o ile dobrze pamiętam) 800 PLN za cztery koła zębate przekraczały wielokrotnie mój budżet na ten projekt. Wróciłem więc do poszukiwań i w końcu znalazłem odpowiednie koła zębate w sklepie conrad.pl. Kupiłem dwa czterdziestozębowe i dwa trzydziestozębowe - w przypadku, gdyby te pierwsze nie zmieściły się wewnątrz obudowy. Oprócz tego kupiłem jedną piętnastkę oraz dwunastkę - ta ostatnia miała otwór na oś pasujący do kupionego przeze mnie silnika krokowego. Przekładnia Teraz musiałem zaprojektować przekładnię - skorzystałem w tym celu z darmowego Solid Edge Drafting - świetnego dwuwymiarowego cada. Pomierzyłem wszystkie przestrzenie suwmiarką i wyszło na to, że przekładnia zmieści się w całości w przedniej, podwyższonej części obudowy. Nie dysponuję żadną maszyną CNC, ale otwory w aluminiowych płytkach musiałem zrobić bardzo dokładnie, bo inaczej zębatki nie zazębiłyby się (w jedną albo drugą stronę) albo obracały ze zbyt dużym oporem. Wpadłem więc na pomysł - wydrukowałem układ otworków w obu płytkach przygotowany wcześniej w cadzie na papierze samoprzylepnym i przykleiłem go na obrabianym aluminium. Potem dociąłem płytki zgodnie z ramkami i wywierciłem otwory w oznaczonych miejscach - okazało się, że taka dokładność była wystarczająca i wszystko ładnie wskoczyło na swoje miejsca. Montaż Po zbudowaniu przekładni nie zostało już zbyt dużo do roboty - zamontowałem wewnątrz obudowy Uno z shieldem LCD, podłączyłem do przygotowanej wcześniej płytki prototypowej ze sterownikiem silnika, a do niej sam silnik. Potem skręciłem wszystko i dostałem (w miarę) zgrabne urządzenie. Programowanie Na potrzeby tego projektu napisałem specjalnie własny zestaw bibliotek, które ułatwiają budowanie wielopoziomowych menu na shieldzie LCD. Programik jest stosunkowo prosty - należy obrócić silnik w położenie źródłowe i docelowe, ustalić czas obrotu - i uruchomić. Program oblicza o jaki kąt obrócić silnik w jakim czasie i powolutku obraca oś z jednego położenia do drugiego. Ponieważ program z bibliotekami jest dosyć duży, nie będę go tu zamieszczał, ale można go ściągnąć z mojego repozytorium na gitlabie. Efekty Czy cel został osiągnięty? Definitywnie tak - nagrane filmy poddaję niewielkiej obróbce w VirtualDub (korzystam z plugina o nazwie deshaker), żeby odrobinę poprawić ich jakość, ale nawet i bez tej obróbki filmiki wyglądają całkiem przyzwoicie. Przykładowy poniżej: Wnioski Po pierwsze, maszyna jest niestety przeraźliwie głośna. Obracanie (przynajmniej na początku, podczas ustawiania zakresów) osi generuje dźwięk przypominający skrzyżowanie kosiarki do trawy i piły łańcuchowej. Winne są najprawdopodobniej pancerne zębatki oraz luzy na osiach - teraz, mając już drukarkę 3D, wydrukowałbym sobie wszystko z PLA spasowane do dziesiątych milimetra, podczas budowy tego urządzenia skazany byłem jednak tylko na własne ręce i montaż przekładni na pewno nie jest tak dokładny jaki mógłby być. Poza tym warto byłoby rozważyć również zastosowanie mniejszych, plastikowych zębatek, tylko obawiałem się trochę, czy będę w stanie zamontować je pewnie do osi - tak, by nie wyrobiły się i nie zaczęły obracać w miejscu. Plusem tej przekładni jest natomiast fakt, że jest po prostu pancerna - myślę, że spokojnie mógłbym zamontować na niej lustrzankę z solidnym obiektywem i ani przekładnia ani silnik nawet by nie sapnęły. Zdecydowanie warto było zainwestować w obudowę - kosztowała mnie raptem 15 złotych, a znacząco podniosła estetykę projektu (i przynajmniej w pewnym stopniu chroni elektronikę przed warunkami atmosferycznymi i kurzem. Wbrew pozorom dosyć wygodne okazało się zasilenie urządzenia z zewnątrz - wyprowadziłem sobie ze środka kabelek zakończony wtyczką T-Dean i gdy chcę uruchomić narzędzie, po prostu łapię jeden z dwucelowych akumulatorów LiPo walających się gdzieś po domu i maszyna może na nim działać naprawdę długo. Choć urządzenie powstało już jakiś czas temu, nie użyłem go jeszcze zbyt wiele razy; tak naprawdę zbudowałem je pod kątem filmowego projektu, który mam zamiar nakręcić, ale wymaga on dosyć dużo czasu w plenerze, a tego zasobu od jakiegoś czasu niestety trochę mi brakuje. Ale też nie tracę nadziei - być może za kilka lat zrealizujemy go razem z córką? Czas pokaże...
  20. Trudne początki Tak naprawdę to jest chyba mój pierwszy projekt w świecie Arduino! Zamarzyłem sobie zbudowanie własnego, terenowego pojazdu zdalnie sterowanego - takiego, na którym można potem zamontować jakiś chwytak, ramię albo kamerkę z przekaźnikiem FPV. Kontroler Tu akurat nie miałem większego wyboru, bo wtedy pod ręką miałem akurat Arduino Leonardo. Zaletą tej płytki jest kompatybilność z popularnymi shieldami do Uno a także złącze microUSB typu B (zamiast mało popularnego złącza "drukarkowego" w Uno). Na potrzeby tego niezbyt skomplikowanego projektu moc obliczeniowa tej płytki jest również całkowicie wystarczająca. Podwozie Moim planem było zbudowanie definitywnego i niepokonanego łazika marsjańskiego, więc zwykłe podwozie nie wchodziło w grę - koniecznie musiało być terenowe. Przegrzebałem naprawdę połowę Internetu w poszukiwaniu tego idealnego podwozia (ale - nie ukrywajmy - mieszczącego się również w moim budżecie) i w końcu mój wybór padł na podwozie Dagu DG012-ATV z napędem na cztery koła. Nieco podwyższony prześwit w stosunku do innych podwozi (dający nadzieję na pokonywanie niewielkich przeszkód), napęd na cztery koła - wszystko to brzmiało bardzo zachęcająco. Czterema silnikami coś oczywiście musi obracać, razem z podwoziem nabyłem więc również czterokanałowy sterownik silników DFRobota (w postaci shieldu dla Arduino). Serwo i czujnik Żeby urozmaicić nieco projekt, dodałem do niego serwo modelarskie, na którym zamontowałem ultradźwiękowy czujnik odległości z założeniem, że spróbuję kiedyś napisać program do autonomicznego poruszania się. RC Od długiego czasu używam do zdalnego sterowania aparatury FrSky Taranis, więc oczywiście musiałem skorzystać z kompatybilnego odbiornika - w tym przypadku X8R. Zasilanie Projekt oczywiście musiał być mobilny, więc zdecydowałem się na zasilenie go dwucelowym akumulatorem Lipo; konieczne okazało się też zastosowanie układu BEC, który obniżył napięcie akumulatora do 5V. Teraz pozostało już tylko zmontować wszystko w całość. Montaż podwozia Tu obyło się bez niespodzianek i problemów, po prostu skręciłem wszystko zgodnie z instrukcją i wyprowadziłem na zewnątrz przewody, którymi zasilane miały być silniki. Potem sprawy nieco się skomplikowały. Wszystko rozbiło się generalnie o to, że jak bym nie ułożył elementów na podwoziu, po prostu nie było takiego ułożenia, żeby wszystko się zmieściło. Sprawy utrudniał również fakt zastosowania Leonardo, które - umówmy się - jest raczej kobylaste i znacznie lepiej sprawdziłoby się tu kompatybilne z tą płytką Arduino Micro. Do tego dochodził BEC, odbiornik, serwo (którego nota bene nie miałem jak zamocować, bo w wersji 4WD podwozia miejsce na serwo zajmowane było przez dwa dodatkowe silniki) no i oczywiście akumulator. Dlatego zdecydowałem się na umieszczenie wszystkiego ponad podwoziem, pozostawiając na dole sam akumulator. Przykleiłem więc na dolnym pokładzie rzep, na którym mocowany jest akumulator - przeciążenia podczas poruszania robota są tak znikome, że jest to naprawdę pewny i sprawdzony sposób montażu (pozwalający też szybko zamontować albo zdemontować akumulator w razie potrzeby). Oprócz tego przykręciłem w narożnikach podwozia długie dystanse (kupione kiedyś w Chinach na potrzeby projektu quadrokoptera) i zabrałem się za przygotowywanie górnej części pojazdu. Górne podwozie wykonałem z fragmentu płytki aluminiowej, którą dociąłem tak, by znalazła się dokładnie ponad górną częścią podwozia - i jednocześnie dzięki temu przykryła koła, z których pył mógł się dostawać do elektroniki. W płytce wyciąłem otwór na serwo; ponieważ nie dysponuję żadnym sprzętem CNC, który pomógłby mi wyciąć równy, parametryczny otwór, rad nierad wziąłem do ręki wiertarkę, najpierw nawierciłem otwory, potem zamontowałem w niej frez i zacząłem ręcznie wycinać aluminium, a na końcu doszlifowałem wszystko pilnikami o zmniejszającej się ziarnistości. Cały proces poniżej: Teraz można było powoli przystąpić do montażu. Na pierwszy ogień poszło serwo, które na szczęście wpasowało się w wycięty przeze mnie otwór po prostu idealnie. Następnym krokiem było zamontowanie BECa, którego umieściłem pod górnym pokładem. Przewód zasilający (zakończony złączem T-Dean) musiałem rozgałęzić, ponieważ jedna para przewodów musiała zostać połączona z BECem, który obniży napięcie do 5V dla części elektroniki, zaś druga para - do sterownika silników, który będzie potem je zasilał. Szczęśliwie silniki akceptują napięcie dwucelowego akumulatora LiPo - trzeba to koniecznie sprawdzić przed zakupem/montażem! Arduino Leonardo można zasilić bezpośrednio z akumulatora, natomiast konieczne było przylutowanie odpowiedniej wtyczki (na zdjęciu po prawej stronie). Na koniec pozostało podłączenie wszystkich komponentów i otrzymujemy następujący efekt: Programowanie Pierwszym programikiem, który napisałem, był tester silników, który uruchamiał każdy z nich na pół sekundy. Kod wygląda następująco: const int E1 = 3; // Motor1 Speed const int E2 = 11; // Motor2 Speed const int E3 = 5; // Motor3 Speed const int E4 = 6; // Motor4 Speed const int M1 = 4; // Motor1 Direction const int M2 = 12; // Motor2 Direction const int M3 = 8; // Motor3 Direction const int M4 = 7; // Motor4 Direction void M1_advance(char Speed) { digitalWrite(M1, HIGH); analogWrite(E1, Speed); } void M2_advance(char Speed) { digitalWrite(M2, LOW); analogWrite(E2, Speed); } void M3_advance(char Speed) { digitalWrite(M3, LOW); analogWrite(E3, Speed); } void M4_advance(char Speed) { digitalWrite(M4, HIGH); analogWrite(E4, Speed); } void M1_back(char Speed) { digitalWrite(M1, LOW); analogWrite(E1, Speed); } void M2_back(char Speed) { digitalWrite(M2, HIGH); analogWrite(E2, Speed); } void M3_back(char Speed) { digitalWrite(M3, HIGH); analogWrite(E3, Speed); } void M4_back(char Speed) { digitalWrite(M4, LOW); analogWrite(E4, Speed); } void setup() { for (int i = 3; i < 9; i++) pinMode(i, OUTPUT); for (int i = 11; i < 13; i++) pinMode(i, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); M1_advance(100); delay(500); M1_advance(0); M2_advance(100); delay(500); M2_advance(0); M3_advance(100); delay(500); M3_advance(0); M4_advance(100); delay(500); M4_advance(0); digitalWrite(LED_BUILTIN, LOW); delay(2000); // Delay 2S } Jak widać, sterowanie silnikami odbywa się poprzez podawanie kierunku poprzez piny cyfrowe i prędkości poprzez piny analogowe - proste, jak konstrukcja cepa. Teraz przyszła kolej na odbiornik RC i tu zaczęły się schody. Odbiorniki klasycznie podają stan każdego kanału poprzez sygnał PWM. W praktyce jest to seria naprzemiennych zer i jedynek, z których każda para 1+0 trwa 1/55 sekundy. Wartość możemy odczytać mierząc czas trwania sygnału 1: jeżeli jest to 1 milisekunda, przyjmujemy wartość minimalną ("-1"), jeżeli 1.5 milisekundy, to wartość środkową ("0"), zaś jeśli 2 milisekundy, to wartość maksymalną ("1"). Niektóre odbiorniki pozwalają na nieco szerszy zakres - od 0.5ms do 2.5ms, X8R domyślnie podaje wartości z tego pierwszego zakresu. Ponieważ musiałem mierzyć wartości na dwóch różnych kanałach, zdecydowałem się skorzystać z mechanizmu przerwań. Działa on mniej więcej następująco: gdy zajdzie wybrane zdarzenie (na przykład zmiana stanu danego pinu z niskiego na wysoki), wykonanie programu jest przerywane, zostaje wykonana funkcja oznaczona jako tzw. handler przerwania, a po jej zakończeniu program wznawia wykonanie w miejscu, w którym został przerwany. Na Arduino można znaleźć bardzo wygodną bibliotekę EnableInterrupt, która uogólnia sposób dodawania i usuwania handlerów przerwań pomiędzy różnymi wersjami Arduino, a korzysta się z niej w następujący sposób: #include "EnableInterrupt.h" volatile int microsStart = 0; void pin0Rising() { microsStart = micros(); disableInterrupt(0); enableInterrupt(0, pin0Falling, FALLING); } void pin0Falling() { int microsEnd = micros(); int diff = microsEnd - microsStart; if (diff > 1500) { digitalWrite(LED_BUILTIN, HIGH); } else { digitalWrite(LED_BUILTIN, LOW); } disableInterrupt(0); enableInterrupt(0, pin0Rising, RISING); } void setup() { enableInterrupt(0, pin0Rising, RISING); pinMode(LED_BUILTIN, OUTPUT); } void loop() { } Po wpięciu przewodu sygnałowego do pinu 0 i uruchomieniu programiku na kontrolerze, wbudowana dioda powinna się zapalić w momencie, gdy ustawimy drążek w położeniu większym niż połowa. Zwrócę jeszcze uwagę na magiczne słówko "volatile" przy deklaracji zmiennej - informuje ono kompilator, że zmienna ta nie może zostać zoptymalizowana (kompilator, a dokładniej optymalizator w niektórych przypadkach może w locie usunąć zmienną, na przykład jeżeli nie jest ona używana lub przez cały czas trwania programu ma zawsze tę samą wartość). Dodam tu jeszcze jedną ważną informację: program obsługi przerwania powinien być tak krótki, jak to tylko możliwe! Ma to sporo sensu jeżeli się nad tym nieco dłużej zastanowić, ale ja na to nie wpadłem i w pierwotnej wersji programu cała obsługa silników umieszczona była właśnie w programie obsługi przerwania. I ku mojemu zdziwieniu, po uruchomieniu programu, pomimo tego, że drążki były w położeniu zerowym, dwa silniki zaczęły się obracać. Okazało się, że obsługa przerwania obliczającego czas trwania PWM na pierwszym kanale trwała tak długo, że sztucznie opóźniała wywołanie drugiego przerwania wykonującego te same obliczenia dla drugiego kanału, przez co podawało ono zawyżone wartości. Wystarczyło przebudować program w taki sposób, by obsługa silników znalazła się poza programami obsługi przerwań i wszystko wróciło do normy. Pamiętajmy - to może oczywiste, ale mimo wszystko warto to powiedzieć - że mikrokontrolery nie są wielowątkowe, a przerwania nie są wątkami: wykonują się tylko jedno na raz. Drugie przerwanie musi czekać, aż pierwsze zostanie do końca obsłużone. Przed napisaniem końcowego programu pozostało mi już tylko przetestować obsługę czujnika ruchu, programik wygląda następująco: #include <NewPing.h> #define ULTRASONIC_TRIGGER_PIN 9 #define ULTRASONIC_ECHO_PIN 10 #define MAX_DISTANCE 400 NewPing sonar(ULTRASONIC_TRIGGER_PIN, ULTRASONIC_ECHO_PIN, MAX_DISTANCE); void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(50); digitalWrite(LED_BUILTIN, LOW); delay(50); int ping = sonar.ping_cm(); if (ping < 30) digitalWrite(LED_BUILTIN, HIGH); else digitalWrite(LED_BUILTIN, LOW); delay(200); } Również i tu korzystam z wbudowanej diody, która powinna zapalić się, gdy zmierzona przez czujnik odległość będzie mniejsza niż 30 cm. Wreszcie program obsługujący całego robota: #include <NewPing.h> #include "EnableInterrupt.h" #include "NewPing.h" // Motor constants // Motor1 Speed #define MOTOR_1_SPEED_PIN 3 // Motor2 Speed #define MOTOR_2_SPEED_PIN 11 // Motor3 Speed #define MOTOR_3_SPEED_PIN 5 // Motor4 Speed #define MOTOR_4_SPEED_PIN 6 // Motor1 Direction #define MOTOR_1_DIR_PIN 4 // Motor2 Direction #define MOTOR_2_DIR_PIN 12 // Motor3 Direction #define MOTOR_3_DIR_PIN 8 // Motor4 Direction #define MOTOR_4_DIR_PIN 7 // Ultrasonic constants #define ULTRASONIC_TRIGGER_PIN 9 #define ULTRASONIC_ECHO_PIN 10 #define MAX_DISTANCE 400 // Servo constants #define SERVO_PIN 13 // AI constants #define DISTANCE_THRESHOLD_2 80 #define DISTANCE_THRESHOLD_1 40 // Ultrasonic control NewPing sonar(ULTRASONIC_TRIGGER_PIN, ULTRASONIC_ECHO_PIN, MAX_DISTANCE); // Motor control functions void M1_advance(byte Speed) ///<Motor1 Advance { digitalWrite(MOTOR_1_DIR_PIN, HIGH); analogWrite(MOTOR_1_SPEED_PIN, Speed); } void M2_advance(byte Speed) ///<Motor2 Advance { digitalWrite(MOTOR_2_DIR_PIN, LOW); analogWrite(MOTOR_2_SPEED_PIN, Speed); } void M3_advance(byte Speed) ///<Motor3 Advance { digitalWrite(MOTOR_3_DIR_PIN, LOW); analogWrite(MOTOR_3_SPEED_PIN, Speed); } void M4_advance(byte Speed) ///<Motor4 Advance { digitalWrite(MOTOR_4_DIR_PIN, HIGH); analogWrite(MOTOR_4_SPEED_PIN, Speed); } void M1_back(byte Speed) ///<Motor1 Back off { digitalWrite(MOTOR_1_DIR_PIN, LOW); analogWrite(MOTOR_1_SPEED_PIN, Speed); } void M2_back(byte Speed) ///<Motor2 Back off { digitalWrite(MOTOR_2_DIR_PIN, HIGH); analogWrite(MOTOR_2_SPEED_PIN, Speed); } void M3_back(byte Speed) ///<Motor3 Back off { digitalWrite(MOTOR_3_DIR_PIN, HIGH); analogWrite(MOTOR_3_SPEED_PIN, Speed); } void M4_back(byte Speed) ///<Motor4 Back off { digitalWrite(MOTOR_4_DIR_PIN, LOW); analogWrite(MOTOR_4_SPEED_PIN, Speed); } // PWM control volatile int microsYStart = 0; volatile int microsXStart = 0; volatile int microsZStart = 0; volatile int yMicros = 0; volatile int xMicros = 0; volatile int zMicros = 0; int UScounter = 0; int USlock = 0; // Pin 0 interrupt handling void pin0Rising() { microsYStart = micros(); disableInterrupt(0); enableInterrupt(0, pin0Falling, FALLING); } void pin0Falling() { yMicros = micros() - microsYStart; disableInterrupt(0); enableInterrupt(0, pin0Rising, RISING); } // Pin 1 interrupt handling void pin1Rising() { microsXStart = micros(); disableInterrupt(1); enableInterrupt(1, pin1Falling, FALLING); } void pin1Falling() { xMicros = micros() - microsXStart; disableInterrupt(1); enableInterrupt(1, pin1Rising, RISING); } // Pin2 interrupt handling void pin2Rising() { microsZStart = micros(); disableInterrupt(2); enableInterrupt(2, pin2Falling, FALLING); } void pin2Falling() { zMicros = micros() - microsZStart; disableInterrupt(2); enableInterrupt(2, pin2Rising, RISING); } void setup() { for (int i = 3; i < 9; i++) pinMode(i, OUTPUT); for (int i = 11; i < 13; i++) pinMode(i, OUTPUT); pinMode(ULTRASONIC_TRIGGER_PIN, OUTPUT); pinMode(ULTRASONIC_ECHO_PIN, INPUT); pinMode(SERVO_PIN, OUTPUT); enableInterrupt(0, pin0Rising, RISING); enableInterrupt(1, pin1Rising, RISING); enableInterrupt(2, pin2Rising, RISING); } void loop() { // Eval motor signals int yValue = (yMicros - 1500) / 2; int xValue = (xMicros - 1500) / 2; if (yValue > 260 || yValue < -260) yValue = 0; if (xValue > 260 || xValue < -260) xValue = 0; int leftEngines = constrain(xValue + yValue, -250, 250); int rightEngines = constrain(yValue - xValue, -250, 250); // Check for obstacles every 10th iteration UScounter++; if (UScounter >= 10) { UScounter = 0; int frontDistance = sonar.convert_cm(sonar.ping_median(5)); if (frontDistance != 0 && frontDistance < DISTANCE_THRESHOLD_2) { if (frontDistance > DISTANCE_THRESHOLD_1) USlock = 1; else USlock = 2; } else USlock = 0; } if (USlock == 1) { leftEngines = constrain(leftEngines, -250, 128); rightEngines = constrain(rightEngines, -250, 128); } if (USlock == 2) { leftEngines = constrain(leftEngines, -250, 0); rightEngines = constrain(rightEngines, -250, 0); } if (abs(leftEngines) < 20) { M3_advance(0); M4_advance(0); } else if (leftEngines > 0) { M3_advance(leftEngines); M4_advance(leftEngines); } else { M3_back(-leftEngines); M4_back(-leftEngines); } if (abs(rightEngines) < 20) { M1_advance(0); M2_advance(0); } else if (rightEngines > 0) { M1_advance(rightEngines); M2_advance(rightEngines); } else { M1_back(-rightEngines); M2_back(-rightEngines); } } Pozwala on na kontrolowanie robota przy pomocy jednego drążka aparatury (dwóch kanałów). Oprócz tego program cyklicznie sprawdza odległość przed robotem i zabezpiecza przed wjechaniem w ścianę: w przypadku przeszkody znajdującej się bliżej niż 80 cm od robota, zostanie ograniczona jego maksymalna prędkość, natomiast jeżeli odległość ta będzie mniejsza niż 40cm, robot zatrzyma się całkowicie i niemożliwe będzie ruszenie nim do przodu. Wnioski To była prawdziwa frajda zobaczyć, jak robot rusza i jeździ zgodnie z instrukcjami z aparatury! Pierwszy skończony projekt. Nauczyłem się na nim dużo, bo okazało się, że w trakcie pracy podjąłem bardzo dużo nietrafnych decyzji. Robot tak naprawdę nigdy nie wyjechał z domu, ma bardzo otwartą konstrukcję, która sprzyja dostawaniu się do obudowy pyłu i piachu. W domowych warunkach wystarczyłby natomiast napęd na dwa koła - w ten sposób miałbym też trochę miejsca wewnątrz obudowy. Arduino Leonardo jest świetne, ale wielkie. Znacznie lepiej sprawdziłoby się Arduino Micro albo Teensy. To drugie nawet bardziej, bo shield do sterowania silnikami pożera dużo pinów i niewiele zostaje na odbiór sygnału z odbiornika RC. Udało mi się jeszcze podłączyć czujnik odległości, ale serwo wpiąłem już bezpośrednio w odbiornik, bo po prostu zabrakło mi pinów. Nie ma większego sensu robić żadnych projektów (innych niż wstępne prototypy) na przewodzikach połączeniowych. Lepiej kupić sobie płytkę prototypową, złącza goldpinowe, przewodziki kydexowe i polutować wszystko na płytce - układ zajmuje znacznie mniej miejsce i jest znacznie mniej podatny np. na przypadkowe wyjęcie przewodu. Chodzi mi po głowie wskrzeszenie projektu - właśnie przy pomocy Teensy oraz drukarki 3D, przy pomocy której mogę wydrukować całe nadwozie szyte na miarę. Ale podejrzewam, że zajmę się tym dopiero za jakiś czas...
  21. Witam, od kiedy kupiłem swoje arduino (było to ze trzy lata temu) to chciałem zbudować frezerkę do płytek pcb. Obejrzałem w Internecie wiele projektów i w końcu postanowiłem zbudować swoją własną frezarkę :). Pochłonęła ona dużo pieniędzy i jeszcze więcej czasu. Swoje prace zacząłem od kupienia profili 25mmx 1.5mm x 2000mm (dwie sztuki) i kilkanaście kątowników. Wymierzyłem całą konstrukcję i zacząłem składać stelarz stołu a następnie go pomalowałem podkładem i czarną farbą matową. Gdy farba schła zamówiłem wsporniki wałków, wałki fi 12, łożyska oraz kupiłem skleję 10mm na stół. następnym krokiem było położenie blachy na stół żeby nie zniszczyć sklejki potem zacząłem składać oś Z z wałków fi 8 Kilkanaście dni później kontrukcja wyglądała następująco została postawiona brama, została ona wzmocniona zastrzałami z tyły oraz lewa i prawa strona bramy została połączona płaskownikiem stalowym 4mm x 20mm. Cała konstrukcja była bardzo solidna. Pozostało pomalowanie bramy na kolor czarny mat ale to dopiero w wakacje jak zrobi się ciepło Dzisiaj odbyły się pierwsze testy bezpieczeństwo przede wszystkim Całość wymaga oczywiście kalibracji oraz muszę kupić nakrętki bezluzowe na śruby trapezowe. Całość jest sterowana a pomocą GCode. Obszar roboczy to 40cm x 40cm. Elementy potrzebne do budowy to: 4 wałki fi12 (dwa na oś X i dwa na oś Y) 2 wałki fi8 8 wsporników wałków fi 12 4 wsporniki wałków fi 8 profile na stelarz blacha aluminiowa na oś Z trzy zestawy składające się z śruby trapezowej wraz z nakrętką, uchwytem nakrętki, łożyskami samonastawnymi, sprzęgła elastycznego (po komplecie na każdą oś) 3 silniki krokowe 3 mocowania silników arduino 3 sterowniki silnków krokowych CNC shield zasilacz 12V 4A frezy V 20 stopni komplet wierteł od 0.6mm do 1.5mm Potrzebujemy jeszcze silnik do wrzeciona, ja użyłem "pisaka" i dremela. Kosztów nie liczę gdyż nie chcę się załamać ale frajda z budowy była ogromna. Płytki pcb projektuje w Eaglu następnie tworzę gerbery które ląduję do programu flatcam. W tym programie ustawiam wymiary frezu, wierteł i generuje gcode który przesyłam do Arduino za pomocą programu source rabbit gcode sender. Ważna rzecz, przed zaladaowanie pliku drill do flatcamu musimy się upewnić ze każda współrzędna składa się z takiej samej ilości znaków jeśli nie to musimy dopisać odpowiednią ilość zer na początku (tzn po X lub Y ) następnie gdy załamujemy plik drill do flatcamu musimy zmniejszyć skalę tego pliku. Wchodzimy właściwości> scale i ustawiamy na 0.1
  22. Ze zrobieniem tego typu urządzenie nosiłem się od dłuższego czasu. Przeznaczenie oczywiście dla dzieci i tak jak w tytule są to podstawowe działania matematyczne. Zanim powstał ten projekt sam program był już napisany w codeblocksie. Smartfon całkowicie się nie sprawdził bo córkę interesowało wszystko tylko nie nauka prostych zadań. Na PC już lepiej to wyglądało ale nadal te ikonki w tle trochę odciągały uwagę a samo włączanie komputera tylko dla uruchomienia takiego prostego programu chwilami było irytujące. Więc powstało coś takiego... Wiem, że dla wielu osób może okazać się to śmieszne ale u mnie sprawdziło się idealnie. Nie muszę włączać komputera dziecko zajmuje się tylko tym co powinno bo niema tu niczego co mogło by odciągać uwagę. Nawet wieczorem przed snem można na chwilę włączyć tą zabawkę i poćwiczyć. Opcji jest niewiele a w zasadzie tylko te najpotrzebniejsze czyli zmiana zakresu liczb co jeden w górę i w dół i wyłączenie/włączenie podświetlenia. tak prawie wygląda bez podświetlenia. Napisałem prawie bo zdjęcie było robione z włączonym podświetleniem ale w rzeczywistości wygląda dokładnie tak samo. Zanim za zabawka powstała to było to coś nieokreślonego co służyło w różnych celach tam gdzie potrzebny był wyświetlacz i klawiatura. Wyglądało to tak... Takie były tego początki chyba dwa lata temu. Obudowa powycinana mało estetycznie aczkolwiek trudno jest to zrobić ręcznie w lepszy sposób. Celem zamaskowania i zabezpieczenia została oklejona taśmą Następnie przykleiłem paski z taśmy obustronnie klejącej (do wklejania LCD) i przykleiłem szablon , który widać na pierwszych zdjęciach. I w zasadzie to by było tyle od zewnątrz a od środka najpierw wyglądało to tak. Wiele tu nie trzeba mówić natomiast w takiej konfiguracji obudowy nie dało się zamknąć. Zarówno arduino jak i konwerter lcd wystawały ponad obrys obudowy. Konwerter z wyświetlaczem był połączony na "wsuwki" więc musiałem wylutować goldpiny i zalutować konwerter na wyświetlacz i tak pomału jeden za jednym zostawiłem tylko zworkę od podświetlenia. Następnie zastanawiałem się jak to zrobić z tą klawiaturą żeby pozbyć się tych kabli bo jak by nie było to wprowadzają sporo zamętu. I tak sobie pomyślałem , że może by spróbować zalutować arduino na goldpiny od klawiatury tak jak konwerter lcd. Mialem akurat arduino pro mini , które przymierzyłem na piny od klawiatury i bomba pasowało idealnie. Jak tak na to popatrzyłem to na początku zastanawiałem się co by tu zrobić i tym wolnym miejsce bo zrobiło się go naprawdę sporo. I na początku myślałem o czytniku kart SD pod SPI ale ostatecznie stwierdziłem , że zrobię to w najprostszy możliwy sposób. Zasilanie było już na miejscu więc zostało wgranie skecza przez konwerter. Całość świetnie się sprawdziła. Można wygodnie położyć na łóżku i obserwować postępy jakie robi dziecko i to bez komputera czy smartfona.
  23. Elektroniczny Multitool Jak się zaczęło? Ano zaczęło się od tego, że zanabyłem sobie hulajnogę elektryczną. Długo i sumiennie przeglądałem różne recenzje, opisy, wertowałem informacje, aż w końcu zdecydowałem się na Airwheel Z5 Strong, którą na marginesie polecam. Pomimo wielu zalet - w tym kilku rozwiązań unikalnych w tym segmencie urządzeń, jak na przykład wygodne podesty albo łatwo wymienny akumulator - ma jednak pewną niewielką wadę: brak wyświetlacza informującego na przykład o bieżącej prędkości czy o przejechanej drodze. Ponieważ od jakiegoś czasu bawię się Arduino, stwierdziłem, że stosunkowo łatwo powinno dać się skonstruować taki licznik samodzielnie - wystarczy przecież zastosować GPS, który uniezależnia mnie od rozwiązań zastosowanych w hulajnodze. Zacząłem więc powoli kolekcjonować wszystkie niezbędne komponenty. Wyświetlacz Zacząłem trochę nietypowo, bo od wyświetlacza. Zrobiłem już kilka projektów na wyświetlaczach znakowych, ale - oczywiście - nie dają one takich możliwości, jak solidny, kolorowy, a najlepiej dotykowy wyświetlacz. Mój wybór padł na dotykowy wyświetlacz 2.4", pracujący z rozdzielczością 320x240 i komunikujący się przez popularny protokół SPI. Mój wygląda nieco inaczej niż ten w sklepie, ale różnią się płytką z kontrolerem, wyświetlacz jest ten sam. Kontroler Obejrzałem sobie sporo filmików dotyczących podłączania wyświetlaczy do Arduino i uderzyło mnie to, że w większości przypadków liczba klatek na sekundę osiągała bardzo często wartości jednocyfrowe. Jest to zrozumiałe - wszelkie Uno, Leonardo, Micro i tak dalej są taktowane ze stosunkowo małymi częstotliwościami, a przynajmniej zbyt małymi, by osiągnąć zadowalające rezultaty graficzne. Dlatego tym razem porzuciłem całę rodzinę *ino na rzecz chyba nieco mniej znanego kontrolera, Teensy 3.5. Kosztuje swoje, ale dostajemy naprawdę ciężką artylerię: 120 Mhz, 512 kB Flash, 192 kB RAMu, 62 piny, zintegrowany zegar czasu rzeczywistego (trzeba go tylko zasilić bateryjką CR2032), czytnik kart microSD i oczywiście możliwość programowania przez micro USB, bez konieczności stosowania programatorów. Polecam, korzystanie z takiego kombajnu to naprawdę czysta przyjemność. GPS Ta decyzja była stosunkowo prosta, zdecydowałem się na rozwiązanie ekonomiczne i kupiłem prosty GPS komunikujący się przez UART (szeregowo). Przyznam szczerze, że po zakupie Teensy trochę szkoda było mi poświęcić taki świetny kontroler li tylko na licznik do hulajnogi. Dlatego zanabyłem jeszcze popularny czujnik pogodowy BME280 i stwierdziłem, że w czasie, gdy nie będę korzystał z urządzenia jako licznika, zrobię z niego małą stację pogodową. Na wyposażeniu urządzenia znalazł się również czujnik położenia MPU9250, bo zamierzałem napisać rejestrator pochyłości podłoża (i ewentualnie również jego jakości), ale w końcu z tego pomysłu zrezygnowałem. Być może za jakiś czas dopiszę sobie do urządzenia cyfrową poziomicę. Konstrukcja Zacząłem od płytki prototypowej, która błyskawicznie zamieniła się na totalnie zagmatwaną pajęczą sieć przewodów kydexowych. Myślałem na początku, że poprzestanę na niej, ale plątanina ta wyglądała tak dramatycznie, że z pomysłu w końcu zrezygnowałem, traktując go tylko jako prototyp. Sprawdziłem, czy wszystkie urządzenia będą pracowały prawidłowo i generalnie każdy moduł udało mi się uruchomić i pobrać z niego dane, z tym wyjątkiem, że BME280 i MPU9250 odmawiały współpracy podłączone do jednej szyny I2C. Szczęśliwie Teensy oferuje tych szyn chyba z pięć, więc przepiąłem BME na inną i wszystko wstało bez problemu. Kiedy wszystko działało, siadłem do Eagle'a i zaprojektowałem PCB, który miał zastąpić tę nieszczęsną płytkę prototypową. W Polsce jest kilka firm, które wykonują nawet pojedyncze sztuki takich płytek, a moją zamówiłem w firmie Satland Prototype. Musiałem poczekać dwa tygodnie, ale w końcu płytka doszła pocztą i mogłem zacząć lutować. Jakiś czas temu wyposażyłem się w drukarkę 3D, więc po zlutowaniu (i uruchomieniu) wszystkiego siadłem do Fusion 360 i zaprojektowałem obudowę na całe urządzenie. Zadbałem o to, żeby BME został odseparowany wewnętrzną ścianką od reszty urządzenia, bo ekran LCD potrafi się grzać i zafałszowuje odczyty. GPS zamocowałem w osobnym miejscu, wsunięty w odpowiedni slot i zabezpieczony ścianką z drugiej strony, ponieważ niestety wersja, którą kupiłem, nie posiadała żadnych otworów montażowych. Płytka z komponentami siedzi w przygotowanym na jej wymiary wgłębieniu i jest ściśnięta pomiędzy dwiema częściami obudowy, więc nie ma możliwości się przesunąć. Do tego otwór na wyświetlacz, siateczka w przedniej ściance przepuszczająca powietrze do czujnika pogodowego i tyle. Słowo komentarza, bo pewnie padnie takie pytanie: schemat dotyczy nowej wersji płytki z usuniętym radyjkiem NRF, na zdjęciu jest starsza wersja - szczegóły na końcu artykułu. Programowanie Proces programowania musiałem rozłożyć w czasie, ale projekt szedł powoli do przodu. Zacząłem od części pogodowej, ogrom miejsca w programowalnej pamięci kontrolera pozwolił mi poszaleć, więc przygotowałem sobie w C++ klasy odpowiedzialne za obsługę interfejsu użytkownika, spięcie różnych modułów w jedną całość, wyświetlanie grafiki i tak dalej. Również i tym razem dałem się ponieść - nie mogłem znaleźć w Internecie dobrego programu do generowania czcionek w formacie zrozumiałym dla biblioteki ILI9341_t3 przygotowanej przez twórcę Teensy (działa ona szybciej od regularnej biblioteki), a zależało mi na czcionce siedmiosegmentowej - takiej trochę "retro" (widać na screenach). Zapytałem więc Paula o kilka rzeczy, siadłem któregoś wieczoru i wyrzeźbiłem edytor czcionek dla ILI9341_t3. Mój prosty programik może się podobać lub nie, ale najlepszą alternatywą jaką znalazłem jest gigantyczne makro w Excelu, więc sami rozumiecie... Dużym odkryciem było dla mnie, że na platformę Arduino można już programować w Visual Studio Code - Arduino Studio jest wciąż wymagane (bo zawiera wszystkie narzędzia potrzebne do zbudowania programu dla kontrolerka), ale tak naprawdę wszystkie operacje - budowanie, wrzucanie na płytkę, monitor portu szeregowego - można już obsłużyć bezpośrednio w tym świetnym środowisku. Tylko że... niestety Teensy nie jest całkowicie zgodne z Arduino i do budowania na tę platformę potrzebny jest dodatkowy programik, Teensyduino, który nieco modyfikuje Arduino Studio i nie jest kompatybilny z VS Code. Tym niemniej, większość developmentu zrealizowałem w tym ostatnim, jedynie budując i wrzucając aplikację na urządzenie przy pomocy AS. Zastosowałem też własny mechanizm podwójnego buforowania: cały obraz buduję w RAMie i wyświetlam go hurtem w jednym kroku. Ogranicza to trochę lag związany z wyświetlaniem poszczególnych elementów, opóźnienie wciąż jest, ale jest znacznie mniej zauważalne. Kosztowało mnie to prawie połowę pamięci RAM, ale z uwagi na to, że pozostałe komponenty aplikacji prawie go nie zużywają, mogłem sobie na to pozwolić. Źródła trzymam na Gitlabie, chcecie obejrzeć - sklonujcie sobie repo. Efekt W chwili obecnej płytka w trybie stacji pogodowej wyświetla klasycznie: temperaturę, ciśnienie i wilgotność, a także wykresy: bieżący (jasna linia - jeden piksel to 15 sekund) i historia - 1h, 8h lub 24h wstecz.Tryby można przełączać po dotknięciu ekranu - pojawia się wtedy proste menu. Aplikacja wyposażona jest w wygaszacz ekranu, który zapobiega wypaleniu pikseli - szczególnie, że w trybie stacji pogodowej bardzo dużo z nich mogłoby być na to narażone. Po 30 sekundach ekran się wyłącza (wygasza), a włącza ponownie po dotknięciu. Niestety nie udało mi się wyłączyć jego podświetlenia - doczytałem, że w tym ekranie programowo nie da się tego zrobić. Szkoda. W trybie GPS wyświetlane są na razie podstawowe informacje wczytane z odbiornika: prędkość, wysokość n.p.m., kierunek jazdy, liczba satelit, z których odczytywane są dane oraz położenie geograficzne - długość i szerokość. Za jakiś czas dopiszę pewnie tryb "rowerowy", czyli przebyta droga, średnia i maksymalna prędkość i tak dalej. Aplikację mam napisaną na tyle modularnie, że teraz taki moduł mogę już sobie praktycznie niewielkim kosztem poskładać "z klocków". Problemy Człowiek uczy się na błędach, a mądry człowiek na błędach innych. Podczas rozwijania tego projektu nadziałem się na mnóstwo problemów, więc podzielę się moimi rozwiązaniami - być może komuś oszczędzi to czasu i nerwów. Po pierwsze, zasilanie - w dwóch odsłonach. Pierwsza odsłona - pierwotnie na płytce znajdowało się jeszcze radyjko NRF24, ponieważ jakiś czas temu zbudowałem sobie "satelitę" - małą płytkę z czujnikiem temperatury i wilgotności zasilaną z bateryjki CR2032: miałem nadzieję, że w trybie stacji pogodowej urządzenie będzie również ściągało informacje z tego źródła. Testy bez GPSu wypadły pozytywnie - to widać na zdjęciach - ale po podłączeniu wszystkiego i włączeniu zasilania, ekran rozbłysł na chwilę, a potem powolutku przygasł i zgasł całkowicie. Podejrzewałem od razu NRF, chciałem go rozlutować, ale w trakcie tego procesu oderwałem jeden pad na płytce, więc nie miałem już możliwości łatwego sprawdzenia, czy to on jest winien. Żeby uniknąć dalszych uszkodzeń, podrzuciłem płytkę ojcu, który w pracy ma wysokiej klasy rozlutownicę, a ja zaprojektowałem w międzyczasie drugą, tym razem już bez NRFa. Warto zawsze sprawdzić, czy uda się zasilić wszystkie komponenty - ja leniwie pociągnąłem zasilanie wszystkiego z płytki, a mogłem przecież wstawić na płytkę port microSD i pociągnąć dodatkowe ścieżki bezpośrednio z niego - wtedy obciążyłbym zasilacz (który pewnie nawet by nie sapnął), a nie samą płytkę. Druga kwestia - hulajnoga, którą kupiłem, ma w baterii wyjście USB - można (według instrukcji) doładowywać sobie na przykład komórkę (traktować akumulator jako powerbank). Również do tego portu podłączana jest latareczka, którą można sobie włączyć podczas jazdy. Niestety podczas prób terenowych okazało się, że przysiad napięcia podczas rozpędzania jest tak duży, że płytka gaśnie albo się zawiesza. Musiałem więc zasilić ją z osobnego powerbanku, w przyszłości pomyślę nad zasileniem płytki z osobnego akumulatora albo po prostu baterii. Teraz BME280 - małe ostrzeżenie. Układzik jest rewelacyjny, malutki i stosunkowo dokładny... ale się grzeje! Potrafi rozgrzać się na tyle, że zafałszowuje informacje o temperaturze o 1.5-2 stopnie. Rozwiązanie (proponowane nawet przez Boscha) polega na zmniejszeniu dokładności pomiaru (urządzenie może działać w trybie oversampling, czyli robi np. 8 pomiarów i uśrednia - należy to wyłączyć), wyłączeniu filtrowania (które również poprawia jakość pomiarów), przełączyć się w tryb "forced" - wtedy płytka robi pomiar tylko na życzenie - i ograniczyć pomiary do jednego na minutę (!). Ja nie ograniczyłem się tak bardzo, pomiary mam co 15 sekund, ale mimo wszystko układ się grzeje i na początku na wykresie widać delikatny skok temperatury, który po chwili się stabilizuje. Jest również prawdopodobne, że grzeje się nie tyle BME, co wyświetlacz - podobny problem miałem w innej stacji pogodowej z wyświetlaczem znakowym. Tam temperatura skakała do góry o kilka stopniu po uruchomieniu. Kwestia estetyki - nie zadbałem o to, żeby schować obramowanie ekranu z widocznymi ścieżkami panelu dotykowego. W innych projektach nie popełniam już tego błędu, widoczny jest sam ekran (wygląda to o niebo lepiej). Ogólnie jednak jestem zadowolony, płytka jest rozwojowa, a nowe funkcjonalności mogę dodawać programowo, więc podejrzewam, że wzbogacę ją jeszcze o kilka dodatkowych trybów pracy.
  24. Cześć, arduino będzie odczytywać prąd silnika z modułu ACS712 , moduł daje wartości dodatnie lub ujemne zależenie od kierunki prądu, co zrobić aby wynik(wartość prądu) była zawsze dodatnia?
  25. Cześć! Skończyłem budowę mojego pierwszego robota. Jest to też mój pierwszy większy projekt, więc proszę o wyrozumiałość, komentarze, porady mile widziane. Z racji tego, że posiadam jeszcze dwa komplety lego, postanowiłem je wykorzystać do budowy pojazdu. Początkowo miały być silniki lego, ale stwierdziłem, że lepiej będzie zrobić to na zwykłych, uniwersalnych częściach. Konstrukcja miała być mała, zwinna, sterowana przez WIFI. Przednia oś, jak widać, sterowana za pomocą micro serwa. Nie było większych oporów, serwo bez problemów sobie radziło ze sterowaniem. Zacząłem szukać jakiegoś ciekawego i małego silnika DC. Postanowiłem wybrać silnik z podwójnym wałem. Kolejnym zadaniem było przebudowanie konstrukcji tak, żeby silnik się zmieścił i nie wadził w poruszaniu się robota. Z racji tego, że wolałem zaoszczędzić kilkanaście złotych na przejściówkę lego-wał, rozwierciłem otwory w częściach które miałem. Zacząłem myśleć jak wyglądałoby połączenie iPhone - ESP, ale w międzyczasie na uczelni dziekan zapowiedział nam dodatkowy projekt na zajęciach z mikrokontrolerów ( pierwsze takie zajęcia na drugim roku studiów ) - dowolny robot na platformie Arduino lub STM. Chłopaki na Facebookowej grupie Arduino uświadomili mi, że nie ma sensu robić projektu na ESP, bo musiałbym się łączyć tylko przez sieć i lepszym wyborem byłby bluetooth. Tak też się stało, zakupiłem moduł HM-10, który współpracuje z używanym przeze mnie iOS. Do tego całość przeniosłem na klona płytki Arduino. Jako aplikacji sterującej użyłem ArduinoBlue, wraz z biblioteką. Inne aplikacje nie chciały działać. W dodatku albo na iOS nie ma żadnych popularnych aplikacji do sterowania przez BLE albo nie udało mi się znaleźć. Możecie polecić ciekawe aplikacje na iOS, na pewno sprawdzę! Można zauważyć, że na breadbordzie zainstalowałem jakąś płytkę. Jest to sterownik silników DC, polecany, łatwy w użyciu. Dobra, silnik jest, działa, serwo jest, łączność przez BLE również. Wypadało by odpiąć wszystko od zasilania z gniazdka i zastosować akumulatory, baterie. Z początku była to dla mnie czarna magia, większe napięcie, jakieś ampery, przetwornice. Czytałem różne artykuły, oglądałem poradniki, pytałem na Facebookowej grupie. Ostatecznie, zgodnie z zasadami: Arduino + sekcja logiczna zasilana z powerbanka + wyprowadzenie zasilania bezpośrednio do serwa, silnik DC zasilany przez dwa ogniwa litowo-jonowe połączone szeregowo z BMS, napięcie zmniejszane przez przetwornicę Żeby szybko podpinać ogniwa do robota albo ładować, przylutowałem wtyki/gniazda DC 5.5mm. BTW. Bardzo długo męczyłem się z lutowaniem ogniw na 30-watowej lutownicy kolbowej. Metodą prób i błędów wszystko się złączyło. Przed podłączeniem każdego elementu lutowanego, sprawdzałem miernikiem czy nie ma zwarcia! Dodatkowo pokusiłem się o popularny czujnik odległości oraz mała prowizorka - dwie diody z opornikami schowane w obudowie po serwie (spaliło się), informujące o przeszkodzie w danej odległości. Wersja finalna, kilkukrotnie większa i cięższa niż pierwotna wersja. Wzmocniony układ kierowniczy. Jeździ, skręca, hamuje, cofa. Trzymany pod kocem Wszelkie komentarze mile widziane! A tutaj krótki filmik (musiałem zdemontować czujnik odległości, ponieważ powodował zakłócenia całego układu: Tak wygląda sterowanie za pomocą joysticka:
×