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

  1. Witam, Natknąłem się problem z odpowiednim wykonywaniem warunków w funkcji SwitchCase. w poniższym kodzie program nie chce wejść w case 2, oraz case 3. void sensorTypeUpDate () { switch (actualSensor) { case 1: Serial.print("wszedl w 1 petle"); int odczyt = analogRead(lightSensor); light = map(odczyt, 0, 1023, 0, 100); sensorType = "Jasnosc:"; sensorValue = String(light) + "%"; break; case 2: Serial.print("wszedl w 2 petle"); humidity = dht.getHumidity(); if (dht.getStatusString() == "OK") { sensorType = "Wilgotnosc:"; sensorValue = String(humidity) + "RH%"; } break; case 3: Serial.print("wszedl w 3 petle"); temperature = dht.getTemperature(); if (dht.getStatusString() == "OK") { sensorType = "Temperatura:"; sensorValue = String(temperature) + "*C"; } break; } } Linia Serial.print potrzebna mi była do sprawdzenia czy program wchodzi w dany warunek. O dziwo gdy zmienię kolejność warunków program działa poprawnie. Nie jest to pierwszy raz, jak się z tym spotykam. Poniższy kod działa. void sensorTypeUpDate () { switch (actualSensor) { case 3: Serial.print("wszedl w 3 petle"); temperature = dht.getTemperature(); if (dht.getStatusString() == "OK") { sensorType = "Temperatura:"; sensorValue = String(temperature) + "*C"; } break; case 2: Serial.print("wszedl w 2 petle"); humidity = dht.getHumidity(); if (dht.getStatusString() == "OK") { sensorType = "Wilgotnosc:"; sensorValue = String(humidity) + "RH%"; } break; case 1: Serial.print("wszedl w 1 petle"); int odczyt = analogRead(lightSensor); light = map(odczyt, 0, 1023, 0, 100); sensorType = "Jasnosc:"; sensorValue = String(light) + "%"; break; } } Z góry dziękuje za pomoc.
  2. Witam wszystkich z góry prosilbym o wyrozumiałość jestem osobą początkująca więc nie wszystko rozumiem tak jak Wy:) Przygodę z ardurinio zacząłem jakiś czas temu, przeczytałem większość poradników krok po kroku jednak nadal nie mogę połączyć dwóch funkcji na których mi bardzo zależy a chodzi mi dokładnie o taki projekt ( chciałbym aby rozjasnianie i przygasanie trzech ledow kontrolować w czasie millis oraz określając czas każdego leda z osobna kierować jego stanem po rozjasnieniu aby świecił przykładowo przez 3 sek. Próbowałem połączyć te 2 funkcje fade oraz millis ale coś mi nie wychodzi. Chciałbym coś z tego zrozumieć robię to wyłącznie dla siebie z upodobań do elektryki lecz z programowania jestem zielony. Pozdrawiam i przepraszam że jestem taki głupcem.
  3. Dzień Dobry wszystkim, założyłem ten temat ponieważ nigdzie nie moge znaleść odpowiedzi na swoje pytanie a mianowicie, dlaczego nie otrzymuje adresu konwertera i2c ? Po załączonych zdjęciach widac ze magistrala i2c nie kończy transmisji , ktoś byłby to w stanie wytłumaczyc ?
  4. Krzysiek97

    Kierownica PC - wersja 2

    Witam chciał bym zaprezentować , drugą "lepszą wersję " kierownicy do komputera opartej na Arduino Leonardo. Film pokazujący jak dziala kierownica i Force Feedback: Jest to wersja elektronicznie taka sama jak poprzednia, wszystko opisane wcześniej link do poprzedniej tutaj : W tej wersji zmieniłem obudowę na znacznie mniejszą , lżejszą , łatwa do zamocowania przy stole, biurku itp. Obudowa została wykorzystana z kupionej przeze mnie za 50 zł kierownicy Logitech Formula Force Ex o obrocie 180* i Force Feedback. Dzięki temu że kierownica miała już przekładnie i ogólnie jest prosta w budowie , bardzo łatwo i tanio można ją przerobić tak aby miala kąt skrętu taki jak ustawimy sobie w programie np 720*,900* i Force Feedback do tego kąta obrotu. Tutaj link do gotowego software na Arduino Leonardo , od razu mówię że na Arduino Uno nie zadziała , link do pobrania w opisie filmu: Ja zrobiłem to tak: Na początku przez środek starej przekładni , dodałem pręt gwintowany o średnicy 10mm ,do którego z jednej strony mocowana jest kierownica, a z drugiej enkoder z drukarki canon ip2770. Aby zamocować enkoder musiałem wyciąć dziure jak widać na zdjęciu poniżej : Aby enkoder nie tarł o blat , dodałem plastikowe podkładki : A tak wygląda już gotowa sama kierownica: Wyjścia enkodera i do silnika , zostały przerobione na standardowych wyjściach które były w kierownicy i wchodzą do dodatkowej skrzynki w której znajduje się reszta elektroniki czyli w sumie tylko Arduino Leonardo i sterownik silników BTS7960: Jeszcze pedal box został przerobiony na taki aby miał 3 jednakowe pedały więc musiałem dokupić drugie takie same i wyciąć jeden i dokleić tak jak na zcjeciach . Schemat podłączenia wszystkiego w linku do wcześniejszej wersji. Efekt końcowy (pedały jeszcze stare): To by było na tyle , jeśli czegoś ktoś potrzebuje , śmiało pisać
  5. Witajcie, ostatnio zajmuję się projektem, aby wprowadzić w firmie system zdalnego zapisywania stanu towarów, i do tego planu postanowiłem wykorzystać arduino. Niestety napotkałem na problem z którym nie mogę sobie poradzić z błędem którego nie potrafię wyłapać. Mam wrażenie że mikro kontroler w tym przypadku jakby się cofał. a oto mój kod pod piny <13,7> podpięta klawiatura 4x4, Jeśli ktoś miałby jakiś pomysł co z kodem może być nie tak to bardzo proszę o pomoc gdyż siedzę nad tym już około tygodnia i nie mogę ruszyć dalej Wielkie dzięki za pomoc ! #include <Keypad.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // set the LCD address to 0x27 for a 16 chars and 2 line display //deklaracja typu wyświetlacza // włączenie podwietlenia const byte ROWS = 4; // Ilość wierszy klawiatury const byte COLS = 4; // Ilość kolumn klawiatury byte rowPins[ROWS] = {13, 12, 11, 10}; //numery pinów w arduino dla wierszy byte colPins[COLS] = {9, 8, 7, 6}; //numery pinów w arduino dla kolumn char keys[ROWS][COLS] = { {'A','#','0','*'}, {'B','3','2','1'}, {'C','6','5','4'}, {'D','9','8','7'} }; Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //Zmienne do przechowywania wartości long Numer1, Numer2, Numer; char klawisz; char akcja; boolean wynik = false; char Stan = 'M'; long kod; long szt; // sa 3 stany, stan 'M' oznacza Menu i wlacza sie tylko po skoncu innego stanu // stan 'O' oznacza odejmowanie towaru ze stanu i po jego koncu wlacza sie menu // stan 'D' oznacza dodawanie towaru i dziala podobie jak 'O' // stan 'S' oznacza eksport listy towaru na komputer void setup() { pinMode(4, INPUT_PULLUP); // przycisk oznaczajacy odejmowanie pinMode(3, INPUT_PULLUP); // przycisk oznaczajacy dodawanie lcd.begin(16, 2); //deklaracja typu wyświetlacza lcd.backlight(); // włączenie podwietlenia Serial.begin(9600); // Print a message to the LCD. lcd.backlight(); } int tablica_stan [70]; // numer tabeli to kod towaru a wartosc tabeli to ilosc na magazynie // I 1 I 2 I 3 I X(up) I // I 4 I 6 I 6 I Y(down) I // I 7 I 8 I 9 I C(kasuj) I // I Z(wstecz) I puste IW(wyb. tow)I K(zatwierdz) I void loop() { while (Stan == 'M') { lcd.setCursor(0, 0); lcd.print("wybierz -> aby dod"); lcd.setCursor(0, 1); lcd.print("wybierz -> aby odj"); while (digitalRead(3) == LOW) { Serial.println ("przycisk dodawania"); Stan = 'D'; } while (digitalRead(4) == LOW) { Serial.println ("przycisk odejmowania"); Stan = 'O'; } } while (Stan == 'O') { lcd.clear(); lcd.setCursor(0, 0); lcd.print("wybrales usuwanie"); lcd.setCursor(0, 1); lcd.print("wprowadz kod"); delay(1000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz kod "); lcd.setCursor(0, 1); lcd.print("towaru"); delay(1000); INKL(); while (Numer =! kod){ Numer = kod; Numer = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz ilosc "); lcd.setCursor(0, 1); lcd.print("sztuk"); INKL(); Numer = szt; tablica_stan[kod] = tablica_stan[kod] + szt; if (tablica_stan[kod] == ( tablica_stan[kod] + szt) && tablica_stan[kod] > 0) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("dodanie towaru "); lcd.setCursor(0, 1); lcd.print("powiodlo sie"); szt = 0; kod = 0; Numer = 0; Stan = 'M'; delay(1000); lcd.clear(); } } } while (Stan == 'D') { lcd.clear(); lcd.setCursor(0, 0); lcd.print("wybrales dodawanie"); lcd.setCursor(0, 1); lcd.print("towaru"); delay(1000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz kod "); lcd.setCursor(0, 1); lcd.print("towaru"); delay(1000); INKL(); Numer = kod; Numer = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wprowadz ilosc "); lcd.setCursor(0, 1); lcd.print("sztuk"); INKL(); Numer = szt; tablica_stan[kod] = tablica_stan[kod] + szt; if (tablica_stan[kod] == ( tablica_stan[kod] + szt) && tablica_stan[kod] > 0) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("dodanie towaru "); lcd.setCursor(0, 1); lcd.print("powiodlo sie"); szt = 0; kod = 0; Numer = 0; Stan = 'M'; delay(1000); lcd.clear(); } } } void INKL() { // Oznacza inicacje klawisza klawisz = klawiatura.getKey(); //pobranie wartości i przypisanie do zmiennej klawisz if (klawisz != NO_KEY) //jeśli nie ma wartości wzmiennej klawisz WykryjKlawisz(); // wykonaj "WykryjKlawisz" if (wynik == true) //jeśli wartość wynik jest prawdziwa Wyswietl(); // wykonaj "Wyswietl" } //Wykryj klawisz void WykryjKlawisz() { lcd.clear(); //wyczyszczenie wyswietlacza if (klawisz == '*') //jeżeli wciśnięty klawisz C { Serial.println ("klawisz c"); //w monitorze portu wyświetl "klawisz c" Numer = Numer1 = Numer2 = 0; wynik = false; //Przypisz 0 do zmiennych Numer, Numer1, Numer2 } if (klawisz == '1') //jeżeli klawisz 1 wciśnięty { Serial.println ("klawisz 1"); // w konsoli wyświetl klawisz 1 if (Numer == 0) //jeżeli zmienna jest pusta Numer = 1; //zmień wartość zmiennej na 1 else // jeżeli w zmiennej jest już jakaś liczba/cyfra Numer = (Numer * 10) + 1; //wpisz 1 za tą liczbą/cyfrą } if (klawisz == '2') { Serial.println ("klawisz 2"); if (Numer == 0) Numer = 2; else Numer = (Numer * 10) + 2; } if (klawisz == '3') { Serial.println ("klawisz 3"); if (klawisz == 0) Numer = 3; else Numer = (Numer * 10) + 3; } if (klawisz == '4') { Serial.println ("klawisz 4"); if (Numer == 0) Numer = 4; else Numer = (Numer * 10) + 4; } if (klawisz == '5') { Serial.println ("klawisz 5"); if (Numer == 0) Numer = 5; else Numer = (Numer * 10) + 5; } if (klawisz == '6') { Serial.println ("klawisz 6"); if (Numer == 0) Numer = 6; else Numer = (Numer * 10) + 6; } if (klawisz == '7') { Serial.println ("klawisz 7"); if (Numer == 0) Numer = 7; else Numer = (Numer * 10) + 7; } if (klawisz == '8') { Serial.println ("klawisz 8"); if (Numer == 0) Numer = 8; else Numer = (Numer * 10) + 8; } if (klawisz == '9') { Serial.println ("klawisz 9"); if (Numer == 0) Numer = 9; else Numer = (Numer * 10) + 9; } if (klawisz == '0') { Serial.println ("klawisz 0"); if (Numer == 0) Numer = 0; else Numer = (Numer * 10) + 0; } if (klawisz == '#') { Serial.println ("klawisz ="); Numer2 = Numer; wynik = true; } delay(100); } } void Wyswietl() { lcd.setCursor(0, 0); if (wynik == true) { } lcd.setCursor(0, 1); lcd.print(Numer); }
  6. Cześć, może komuś by się chciało napisać coś na temat pisania bibliotek do Arduino? Temat nie poruszany a potrzebny. Baaaaaardzo potrzebny
  7. Hej, zbudowałem sobie takie samodzielne Arduino w oparciu o ATmega328p, jako mój programator służy arduino, z jego pomocą wgrałem bootloader na wyżej wymienioną atmege. I pojawił się problem gdy wgrywam za pomocą programatora(arduino as isp) program(miganie diodą) i podpinam zewnętrzne zasilanie, odpinam programator wszystko działa okej, ale gdy wgrałem sobie drugi program(sterowanie serwomechanizmem z pomocą modułu bluetooth HC-05) to jeśli jestem na zasilaniu z programatora(arduino) to program działa, natomiast jeśli odepnę i podłącze zewnętrzne zasilanie 5V to wtedy nie działa, (chyba) układ jest zasilony bo zapala się dioda z funkcji setup(), ale to co dzieje się w loop() tak jakby już nie działało bo nie ma mrugnięcia diodą a więc tym samym i sam serwomechanizm nie działa. Będę wdzięczny za wszystkie pomysły które mogą pomóc rozwiązać problem. Poniżej fragment kodu gdyby był potrzebny. Dodałem również schemat rozważałem rozdzielenie zasilania atmegi 5V i serwomechanizmy odzielnie na 6V(docelowo 4 serwomechanizmy), ale jeszcze nie wiem jak to się do końca łączy czy masy zasilania razem czy osobno czy w jakiś inny sposób(fajnie jakby ktoś się również tą wiedzą podzielił) ale na ten moment jest na jednym zasilaniu 5V całość atmega jak i 1 serwomechanizm. Na rx/tx dałem konwerter poziomów logicznych 5V/3.3V i jest też stabilizator żeby zrobić 3.3V. JP2 na schemacie to goldpiny na podpięcie serwa. #include <Servo.h> #include <SoftwareSerial.h> Servo s1; int bluetoothTx = 11; int bluetoothRx = 10; SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); unsigned int servopos = 0; unsigned int servopos1 = 0; unsigned int servopos2 = 0; unsigned int realservo = 0; void setup() { s1.attach(9); bluetooth.begin(9600); pinMode(8, OUTPUT); digitalWrite(8, HIGH); } void loop() { if(bluetooth.available() >= 2) { digitalWrite(8, LOW); delay(700); digitalWrite(8, HIGH); servopos1 = bluetooth.read(); servopos2 = bluetooth.read(); realservo = servopos1 + (servopos2*256); Serial.print("Realservo - odczyt: "); Serial.println(realservo); if(realservo >=0 && realservo <=180) { digitalWrite(8, LOW); delay(300); digitalWrite(8, HIGH); digitalWrite(8, LOW); delay(300); digitalWrite(8, HIGH); s1.write(realservo); Serial.print("Pozycja serwo s1 "); Serial.println(realservo); delay(200); } }
  8. 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.
  9. Witam, napisałem kod wyświetlający niestandardowe znaki: #include <LiquidCrystal.h> LiquidCrystal lcd(2,3,4,5,6,7); byte first[8] = { B00000, B10001, B00000, B00000, B10001, B01110, B00000, }; byte two[] = { B11111, B11111, B01110, B00100, B00100, B01110, B01110, B11111 }; void setup() { lcd.createChar(0, first); lcd.createChar(1, two); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(1,1); lcd.write(byte(0)); lcd.write(byte(1)); } void loop() {} piszę ten komentarz dlatego że nie rozumiem powodów pewnych błędów kompilacji przy edycji tego kodu występujących niemal randomowo, np. tu usunąłem clear() przed ustawieniem pozycji kursora: lcd.createChar(0, first); lcd.createChar(1, two); lcd.begin(16, 2); //lcd.clear(); lcd.setCursor(1,1); lcd.write(byte(0)); lcd.write(byte(1)); miałem błąd ( nie pisało w ogóle z jakiego powodu ) i programu nie dało się rzecz jasna wgrać na arduino, teraz kiedy dzisiaj usuwam clear to już błędu nie ma. Podobnie było kiedy napisałem lcd.begin(...) przed lcd.createChar(...), program nie mógł zostać skompilowany, teraz problem znikł. Nie wiem kompletnie co jest grane i co mogę mieć zepsute ( na pewno nie arduino ani lcd bo to jest błąd kompilacji a nie problemu z wgraniem i uruchomieniem programu na docelowej platformie ). Jeżeli będę miał te błędy znowu to na pewno dam screena ( bo wtedy nie zrobiłem ). Z góry dziękuje za pomoc.
  10. komo23

    Wyjaśnienie kodu

    Witam, buduję swojego jeżdżącego robota sterowanego z aplikacji na telefon. Znalazłem w internecie poniższy kod: #include <math.h> /*BTS7960 Motor Driver Carrier*/ const int MotorRight_R_EN = 4; // Pin to control the clockwise direction of Right Motor const int MotorRight_L_EN = 5; // Pin to control the counterclockwise direction of Right Motor const int MotorLeft_R_EN = 8; // Pin to control the clockwise direction of Left Motor const int MotorLeft_L_EN = 9; // Pin to control the counterclockwise direction of Left Motor const int Rpwm1 = 6; // pwm output - motor A const int Lpwm1 = 7; // pwm output - motor B const int Rpwm2 = 2; // pwm output - motor A const int Lpwm2 = 3; // pwm output - motor B long pwmLvalue = 255; long pwmRvalue = 255; byte pwmChannel; const char startOfNumberDelimiter = '<'; const char endOfNumberDelimiter = '>'; int robotControlState; int last_mspeed; void setup(){ /* For Arduino Mega 2560 Serial1 RX - pin 19 Serial1 TX - pin 18 */ Serial1.begin(9600);//Default Bluetooth Baudrate for HC-05 //Setup Right Motors pinMode(MotorRight_R_EN, OUTPUT); //Initiates Motor Channel A1 pin pinMode(MotorRight_L_EN, OUTPUT); //Initiates Motor Channel A2 pin //Setup Left Motors pinMode(MotorLeft_R_EN, OUTPUT); //Initiates Motor Channel B1 pin pinMode(MotorLeft_L_EN, OUTPUT); //Initiates Motor Channel B2 pin //Setup PWM pins as Outputs pinMode(Rpwm1, OUTPUT); pinMode(Lpwm1, OUTPUT); pinMode(Rpwm2, OUTPUT); pinMode(Lpwm2, OUTPUT); stop_Robot(); }// void setup() void loop(){ //int i = 0; if (Serial1.available()) { processInput(); } }// void loop() void processInput (){ static long receivedNumber = 0; static boolean negative = false; byte c = Serial1.read (); switch (c){ case endOfNumberDelimiter: if (negative) SetPWM(- receivedNumber, pwmChannel); else SetPWM(receivedNumber, pwmChannel); // fall through to start a new number case startOfNumberDelimiter: receivedNumber = 0; negative = false; pwmChannel = 0; break; case 'f': // Go FORWARD go_Forward(255); //Serial.println("forward"); break; case 'b': // Go BACK go_Backwad(255); break; case 'r': turn_Right(255); break; case 'l': turn_Left(255); break; case 'c': // Top Right move_RightForward(255); break; case 'd': // Top Left move_LeftForward(255); break; case 'e': // Bottom Right move_RightBackward(255); break; case 'h': // Bottom Left move_LeftBackward(255); break; case 's': stop_Robot(); break; case 'x': pwmChannel = 1; // Rpwm1 break; case 'y': // Lpwm1 pwmChannel = 2; break; case '0' ... '9': receivedNumber *= 10; receivedNumber += c - '0'; break; case '-': negative = true; break; } // end of switch } // void processInput () void stop_Robot(){ // robotControlState = 0 if(robotControlState!=0){ //SetMotors(2); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, 0); robotControlState = 0; } }// void stopRobot() void turn_Right(int mspeed){ // robotControlState = 1 if(robotControlState!=1 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=1; last_mspeed=mspeed; } }// void turn_Right(int mspeed) void turn_Left(int mspeed){ // robotControlState = 2 if(robotControlState!=2 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=2; last_mspeed=mspeed; } }// void turn_Left(int mspeed) void go_Forward(int mspeed){ // robotControlState = 3 if(robotControlState!=3 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=3; last_mspeed=mspeed; } }// void goForward(int mspeed) void go_Backwad(int mspeed){ // robotControlState = 4 if(robotControlState!=4 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=4; last_mspeed=mspeed; } }// void goBackwad(int mspeed) void move_RightForward(int mspeed){ // robotControlState = 5 if(robotControlState!=5 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed*0.4); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=5; last_mspeed=mspeed; } }// void move_RightForward(int mspeed) void move_LeftForward(int mspeed){ // robotControlState = 6 if(robotControlState!=6 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed*0.4); analogWrite(Lpwm2, 0); robotControlState=6; last_mspeed=mspeed; } }// move_LeftForward(int mspeed) void move_RightBackward(int mspeed){ // robotControlState = 7 if(robotControlState!=7 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed*0.4); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=7; last_mspeed=mspeed; } }// void move_RightBackward(int mspeed) void move_LeftBackward(int mspeed){ // robotControlState = 8 if(robotControlState!=8 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed*0.4); robotControlState=8; last_mspeed=mspeed; } }// void move_LeftBackward(int mspeed) void stopRobot(int delay_ms){ SetMotors(2); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, 0); delay(delay_ms); }// void stopRobot(int delay_ms) void SetPWM(const long pwm_num, byte pwm_channel){ if(pwm_channel==1){ // DRIVE MOTOR analogWrite(Rpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm1, pwm_num); analogWrite(Lpwm2, pwm_num); pwmRvalue = pwm_num; } else if(pwm_channel==2){ // STEERING MOTOR analogWrite(Lpwm1, 0); analogWrite(Lpwm2, 0); analogWrite(Rpwm1, pwm_num); analogWrite(Rpwm2, pwm_num); pwmLvalue = pwm_num; } }// void SetPWM (const long pwm_num, byte pwm_channel) void SetMotors(int controlCase){ switch(controlCase){ case 1: digitalWrite(MotorRight_R_EN, HIGH); digitalWrite(MotorRight_L_EN, HIGH); digitalWrite(MotorLeft_R_EN, HIGH); digitalWrite(MotorLeft_L_EN, HIGH); break; case 2: digitalWrite(MotorRight_R_EN, LOW); digitalWrite(MotorRight_L_EN, LOW); digitalWrite(MotorLeft_R_EN, LOW); digitalWrite(MotorLeft_L_EN, LOW); break; } }// void SetMotors(int controlCase) I nie mogę zrozumieć jakie zdanie mają zmienne : startOfNumberDelimiter oraz endOfNumberDelimiter ? Co one w tym programie robią ?
  11. Witam mam problem z projektem przepustnicy do gier. Pod podpięciu Arduino do komputera jako kontroler wykrywa tyko oś Z i obrót osi Z. Kontroler ma działać jako Throttle. Prosił bym o pomoc. Kod programu. #include "UnoJoy.h" void setup(){ setupPins(); setupUnoJoy(); } void loop(){ // Always be getting fresh data dataForController_t controllerData = getControllerData(); setControllerData(controllerData); } void setupPins(void){ // Set all the digital pins as inputs // with the pull-up enabled, except for the // two serial line pins for (int i = 2; i <= 12; i++){ pinMode(i, INPUT); digitalWrite(i, HIGH); } pinMode(A4, INPUT); digitalWrite(A4, HIGH); pinMode(A5, INPUT); digitalWrite(A5, HIGH); } dataForController_t getControllerData(void){ // Set up a place for our controller data // Use the getBlankDataForController() function, since // just declaring a fresh dataForController_t tends // to get you one filled with junk from other, random // values that were in those memory locations before dataForController_t controllerData = getBlankDataForController(); // Since our buttons are all held high and // pulled low when pressed, we use the "!" // operator to invert the readings from the pins controllerData.triangleOn = !digitalRead(2); controllerData.circleOn = !digitalRead(3); controllerData.squareOn = !digitalRead(4); controllerData.crossOn = !digitalRead(5); controllerData.dpadUpOn = !digitalRead(6); controllerData.dpadDownOn = !digitalRead(7); controllerData.dpadLeftOn = !digitalRead(8); controllerData.dpadRightOn = !digitalRead(9); controllerData.l1On = !digitalRead(10); controllerData.r1On = !digitalRead(11); controllerData.selectOn = !digitalRead(12); controllerData.startOn = !digitalRead(A4); controllerData.homeOn = !digitalRead(A5); // Set the analog sticks // Since analogRead(pin) returns a 10 bit value, // we need to perform a bit shift operation to // lose the 2 least significant bits and get an // 8 bit number that we can use controllerData.leftStickX = analogRead(A0) >> 2; controllerData.leftStickY = analogRead(A1) >> 2; controllerData.rightStickX = analogRead(A2) >> 2; controllerData.rightStickY = analogRead(A3) >> 2; controllerData.throttle = analogRead(A5)>>2; // And return the data! return controllerData; } oraz kod biblioteki /* UnoJoy.h * Alan Chatham - 2012 * RMIT Exertion Games Lab * * This library gives you a standard way to create Arduino code that talks * to the UnoJoy firmware in order to make native USB game controllers. * Functions: * setupUnoJoy() * getBlankDataForController() * setControllerData(dataForController_t dataToSet) * * NOTE: You cannot use pins 0 or 1 if you use this code - they are used by the serial communication. * Also, the setupUnoJoy() function starts the serial port at 38400, so if you're using * the serial port to debug and it's not working, this may be your problem. * * === How to use this library === * If you want, you can move this file into your Arduino/Libraries folder, then use it like a normal library. * However, since you'll need to refer to the details of the dataForController_t struct in this file, I would suggest you use * it by adding it to your Arduino sketch manually (in Arduino, go to Sketch->Add file...) * * To use this library to make a controller, you'll need to do 3 things: * Call setupUnoJoy(); in the setup() block * Create and populate a dataForController_t type variable and fill it with your data * The getBlankDataForController() function is good for that. * Call setControllerData(yourData); where yourData is the variable from above, * somewhere in your loop(), once you're ready to push your controller data to the system. * If you forget to call sendControllerData in your loop, your controller won't ever do anything * * You can then debug the controller with the included Processing sketch, UnoJoyProcessingVisualizer * * To turn it into an actual USB video game controller, you'll reflash the * Arduino's communication's chip using the instructions found in the 'Firmware' folder, * then unplug and re-plug in the Arduino. * * Details about the dataForController_t type are below, but in order to create and use it, * you'll declare it like: * * dataForController_t sexyControllerData; * * and then control button presses and analog stick movement with statements like: * * sexyControllerData.triangleOn = 1; // Marks the triangle button as pressed * sexyControllerData.squareOn = 0; // Marks the square button as unpressed * sexyControllerData.leftStickX = 90; // Analog stick values can range from 0 - 255 */ #ifndef UNOJOY_H #define UNOJOY_H #include <stdint.h> #include <util/atomic.h> #include <Arduino.h> // This struct is the core of the library. // You'll create an instance of this and manipulate it, // then use the setControllerData function to send that data out. // Don't change this - the order of the fields is important for // the communication between the Arduino and it's communications chip. typedef struct dataForController_t { uint8_t triangleOn : 1; // Each of these member variables uint8_t circleOn : 1; // control if a button is off or on uint8_t squareOn : 1; // For the buttons, uint8_t crossOn : 1; // 0 is off uint8_t l1On : 1; // 1 is on uint8_t l2On : 1; uint8_t l3On : 1; // The : 1 here just tells the compiler uint8_t r1On : 1; // to only have 1 bit for each variable. // This saves a lot of space for our type! uint8_t r2On : 1; uint8_t r3On : 1; uint8_t selectOn : 1; uint8_t startOn : 1; uint8_t homeOn : 1; uint8_t dpadLeftOn : 1; uint8_t dpadUpOn : 1; uint8_t dpadRightOn : 1; uint8_t dpadDownOn : 1; uint8_t padding : 7; // We end with 7 bytes of padding to make sure we get our data aligned in bytes uint8_t leftStickX : 8; // Each of the analog stick values can range from 0 to 255 uint8_t leftStickY : 8; // 0 is fully left or up uint8_t rightStickX : 8; // 255 is fully right or down uint8_t rightStickY : 8; // 128 is centered. uint8_t throttle :8; // Important - analogRead(pin) returns a 10 bit value, so if you're getting strange // results from analogRead, you may need to do (analogRead(pin) >> 2) to get good data } dataForController_t; // Call setupUnoJoy in the setup block of your program. // It sets up the hardware UnoJoy needs to work properly void setupUnoJoy(void); // You can also call the set void setupUnoJoy(int); // This sets the controller to reflect the button and // joystick positions you input (as a dataForController_t). // The controller will just send a zeroed (joysticks centered) // signal until you tell it otherwise with this function. void setControllerData(dataForController_t); // This function gives you a quick way to get a fresh // dataForController_t with: // No buttons pressed // Joysticks centered // Very useful for starting each loop with a blank controller, for instance. // It returns a dataForController_t, so you want to call it like: // myControllerData = getBlankDataForController(); dataForController_t getBlankDataForController(void); //----- End of the interface code you should be using -----// //----- Below here is the actual implementation of // This dataForController_t is used to store // the controller data that you want to send // out to the controller. You shouldn't mess // with this directly - call setControllerData instead dataForController_t controllerDataBuffer; // This updates the data that the controller is sending out. // The system actually works as following: // The UnoJoy firmware on the ATmega8u2 regularly polls the // Arduino chip for individual bytes of a dataForController_t. // void setControllerData(dataForController_t controllerData){ // Probably unecessary, but this guarantees that the data // gets copied to our buffer all at once. ATOMIC_BLOCK(ATOMIC_FORCEON){ controllerDataBuffer = controllerData; } } // serialCheckInterval governs how many ms between // checks to the serial port for data. // It shouldn't go above 20 or so, otherwise you might // get unreliable data transmission to the UnoJoy firmware, // since after it sends a request, it waits 25 ms for a response. // If you really need to make it bigger than that, you'll have to // adjust that timeout in the UnoJoy ATmega8u2 firmware code as well. volatile int serialCheckInterval = 1; // This is an internal counter variable to count ms between // serial check times int serialCheckCounter = 0; // This is the setup function - it sets up the serial communication // and the timer interrupt for actually sending the data back and forth. void setupUnoJoy(void){ // First, let's zero out our controller data buffer (center the sticks) controllerDataBuffer = getBlankDataForController(); // Start the serial port at the specific, low-error rate UnoJoy uses. // If you want to change the rate, you'll have to change it in the // firmware for the ATmega8u2 as well. 250,000 is actually the best rate, // but it's not supported on Macs, breaking the processing debugger. Serial.begin(38400); // Now set up the Timer 0 compare register A // so that Timer0 (used for millis() and such) // also fires an interrupt when it's equal to // 128, not just on overflow. // This will fire our timer interrupt almost // every 1 ms (1024 us to be exact). OCR0A = 128; TIMSK0 |= (1 << OCIE0A); } // If you really need to change the serial polling // interval, use this function to initialize UnoJoy. // interval is the polling frequency, in ms. void setupUnoJoy(int interval){ serialCheckInterval = interval; setupUnoJoy(); } // This interrupt gets called approximately once per ms. // It counts how many ms between serial port polls, // and if it's been long enough, polls the serial // port to see if the UnoJoy firmware requested data. // If it did, it transmits the appropriate data back. ISR(TIMER0_COMPA_vect){ serialCheckCounter++; if (serialCheckCounter >= serialCheckInterval){ serialCheckCounter = 0; // If there is incoming data stored in the Arduino serial buffer while (Serial.available() > 0) { pinMode(13, OUTPUT); //digitalWrite(13, HIGH); // Get incoming byte from the ATmega8u2 byte inByte = Serial.read(); // That number tells us which byte of the dataForController_t struct // to send out. Serial.write(((uint8_t*)&controllerDataBuffer)[inByte]); //digitalWrite(13, LOW); } } } // Returns a zeroed out (joysticks centered) // dataForController_t variable dataForController_t getBlankDataForController(void){ // Create a dataForController_t dataForController_t controllerData; // Make the buttons zero controllerData.triangleOn = 0; controllerData.circleOn = 0; controllerData.squareOn = 0; controllerData.crossOn = 0; controllerData.l1On = 0; controllerData.l2On = 0; controllerData.l3On = 0; controllerData.r1On = 0; controllerData.r2On = 0; controllerData.r3On = 0; controllerData.dpadLeftOn = 0; controllerData.dpadUpOn = 0; controllerData.dpadRightOn = 0; controllerData.dpadDownOn = 0; controllerData.selectOn = 0; controllerData.startOn = 0; controllerData.homeOn = 0; //Set the sticks to 128 - centered controllerData.leftStickX = 128; controllerData.leftStickY = 128; controllerData.rightStickX = 128; controllerData.rightStickY = 128; controllerData.throttle = 128; // And return the data! return controllerData; } #endif
  12. Witam. mam problem z modułem ESP8266 - 01, ponieważ po podłączeniu komputer ani smartfon nie może go wykryć. Moduł połączony jest do Arduino Pro Mini 5V 16Mhz poprzez konwerter poziomów logicznych. Firmware wgrany do modułu zgodnie z filmikiem Elektroprzewodnika na YT: https://www.youtube.com/watch?v=RaYZxqUTNWU Do zasilania modułu próbowałem użyć konwerter typu CP2102 jak również zasilacz(parametry w załączniku) z przetwornicą impulsową LM2596S. Podejrzewam tutaj problem z zasilaniem, ponieważ wcześniej moduł czasami wykrywał sieć, teraz jest totalna kaplica. Próbowałem do przetwornicy wlutować po kondensatorze 10uF na wejście i wyjście oraz kondensator 10nF pomiędzy vcc oraz gnd modułu ale nie dało to rezultatu. Próbwałem też innych zasilaczy jak np. ładowarka do starej Nokii. W związku z tym moje pytanie: jak powinienem zasilić ten moduł ? użyć 2 baterii alkaidowych 1,5V? zmienić przetwornicę na inną? zastosować jakiś filtr do eliminacji tętnień napięcia przetwornicy? zaprojektować taki filtr? jeśli tak to jakich elementów użyć? czy może to po prostu wadliwe ESP? Proszę o wskazówki osób które najlepiej miały już z tym modułem styczność.
  13. Jestem tutaj nowy a jedyne co do tej pory programowałem to PLC w technikum. Robię sobie ćwiczenie, w którym 4 diody zapalają się i gasną jedna po drugiej. Gdy ostatnia dioda gaśnie zapala się pierwsza i tak w nieskończoność. Problem polega na tym, że za rozpoczęcie i zakończenie pracy układu odpowiada jeden tact switch. Z zainicjowaniem pętli nie mam żadnego problemu. Problem jest z jej przerwaniem. Założenie jest takie, że przyciśnięcie przycisku drugi raz w jakimkolwiek miejscu pętli natychmiastowo ją łamie i z niej wychodzi nawet wtedy, gdy nie wypełniła się do końca. Wszystkie diody mają zgasnąć, a program ma wrócić na swój początek. Jak pewnie się domyślacie pętla ta w ogóle się nie przerywa bez względu na to ile razy wciskam przycisk. Szukałem rozwiązania tego problemu w kursie z Forbota, ale to rozwiązanie nie sprawdza się w moim programie. Moglibyście mi doradzić jak rozwiązać ten problem? Może istnieje jakaś komenda, która jest w stanie wykonać to w elegancki sposób? Ta funkcja będzie mi potrzebna w przyszłości w bardziej zaawansowanych projektach. Z góry dziękuję za pomoc.
  14. Witam, Mam następujący problem. Mianowicie chce wypalić bootloader w "arduino" nano przy pomocy arduino leonardo, lecz po uruchomieniu wypalania otrzymuje taki komunikat błędu i nie wiem co z tym zrobić sprawdzałem połączenia. Połączenia do "arduino" nano robiłem przy pomocy zdjęcia poniżej. Arduino:1.8.9 (Windows Store 1.8.21.0) (Windows 10), Płytka:"Arduino Nano, ATmega328P" avrdude: ser_open(): can't open device "\\.\COM6": Nie mo�na odnale�� okre�lonego pliku. Błąd przy wgrywaniu bootloadera.
  15. 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
  16. Cześć Otóż postanowiłem zrobić automatyczne wyłączanie pompy wodnej gdy nie będzie już wody w zbiorniku i cały zamysł jest taki: - water sensor sprawdza co 1ms czy jest woda - SRD-05VDC-SL-C z modułem wyłącza zasilanie w gniazdku gdy nie ma wody i w załącznikach podsyłam jak wszystko podłączyłem i chciałbym zapytać czy pomógłby ktoś z kodem Byłbym bardzo wdzięczny
  17. Witam serdecznie. Jestem nowym użytkownikiem, niedawno dopiero zacząłem zabawę ze środowiskiem arduino. Wykonuje projekt, który będzie zakładał sterowanie blatem stołu drukarki 3D imitując fale morskie (ruch powinien być sinusoidalny, przyspieszać, zwalniać i odwracać kierunek). Ponadto w celu sprawdzenia czy ruch zgadza się z założeniami, chciałbym weryfikować odległość punktu na stole poprzez czujnik ultradźwiękowy HC-SR04. Do napędu zamierzam wykorzystać silnik krokowy Nema 17, gdyż akurat taki wpadł mi w rękę. O ile sam kod do silnika nie był dużym problemem, gdyż znalazłem bibliotekę, w której można sterować ilością obrotów na sekundę, prędkością i przyspieszeniem to nie jestem w stanie połączyć kodu od czujnika echo w jednym skrypcie. Wrzucam wszystko w pętle główną loop i niestety wartości odległości podawana jest dopiero po całym cyklu pracy silnika, mi natomiast zależy na tym aby ta wartość podawana była w bardzo krótkich i ciągłych odstępach czasu. Czy ktoś z obecnych tutaj miał podobny problem lub znajdzie się ktoś kto poratuje dobrą radą. Z góry serdecznie dziękuje za pomoc
  18. 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( "/" ); }
  19. 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.
  20. 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
  21. 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
  22. 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.
  23. 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 ...
  24. 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); }
  25. 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?.
×