Skocz do zawartości

bigthomas

Użytkownicy
  • Zawartość

    8
  • Rejestracja

  • Ostatnio

Reputacja

8 Neutralna

O bigthomas

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Witam, Ciekawy projekt, chciałbym spróbować skonstruować podobnego robota. Chętnie zobaczył bym kod źródłowy dla tego robota.
  2. Witam, jest to mój pierwszy projekt, na którym uczyłem się nieco programowania ... a że w piwnicy leżał mi popsuty odkurzacz to postanowiłem go ożywić po swojemu. Odkurzacz który notabene dostałem jako gratis działał dosłownie 10 minut po czym nie dawał oznak życia. 1.Podwozie jest wykorzystane w 100% z oryginału, nie zmieniałem nic oprócz zrobienia miejsca na elektronikę. 2. Z oryginału wykorzystałem również zasilanie (czyli ogniwa Li-lon) wraz z ładowarką. Zasilanie było oryginalne 7.2 V 3. Elektronika - wykorzystałem Arduino UNO wraz z shield sterownika L293D do 4x silników DC lub 2x krokowych w sumie wykorzystałem taki bo taki miałem, trochę nad wyrost bo zostają nie wykorzystane (a może jeszcze nie wykorzystane) dwa wejścia pod silniki DC. Jako że zaczynałem od podstaw programowanie, przysporzyło mi to trochę problemów. Ale od czego jest forum Na początku udało mi się zrobić aby pojazd sam się poruszał i odbijając od przeszkód (za pomocą dwóch umieszczonych wyłączników krańcowych umieszczonych z przodu odkurzacza) zmieniał kierunek jazdy, nie działało to w 100% tak jak sobie to na początku założyłem, ze względu na ogromny brak wiedzy w programowaniu, ale jednak pierwsze efekty pracy zainspirowały mnie do dalszej pracy nad robotem. #include <AFMotor.h> AF_DCMotor motorP(1); // silnik prawy AF_DCMotor motorL(2); // silnik lewy #define zdL 9 #define zdP 10 void setup() { motorP.setSpeed(255); motorL.setSpeed(255); pinMode(zdP, INPUT_PULLUP); pinMode(zdL, INPUT_PULLUP); } void loop() { bool zderzakL = digitalRead(zdL) == HIGH; bool zderzakP = digitalRead(zdP) == HIGH; // jazda do tyłu if (zderzakL == LOW && zderzakP == LOW) { motorP.run(BACKWARD); motorL.run(BACKWARD); } // // skręt w prawo else if (zderzakL == LOW) { motorP.run(BACKWARD); motorL.run(FORWARD); } // skręt w lewo else if (zderzakP == LOW) { // delay(200); motorP.run(FORWARD); motorL.run(BACKWARD); } // jazda do przodu else { motorP.run(FORWARD); motorL.run(FORWARD); } } Z shelda wykorzystałem piny 9 oraz 10 do serwa jako sterowanie do krańcówek. Kolejną rzecz jaką chciałem zrobić i pobawić się było stworzenie możliwości sterowania odkurzaczem za pomocą bluetooth oraz telefonu z androidem. A więc jak tylko paczuszka ze sklepu pojawiła się w moim domu wraz z modułem bluetooth (2.1 XM-15B 3,3V/5V) postanowiłem działać dalej. Pierwszy problem to połączenie modułu bluetooth z płytką, musiałem dolutować w odpowiednie miejsca przewody aby móc komunikować się z arduino (Rx, Tx) jak również doprowadzenie zasilania. Jednak nie stanowiło to większego wyzwania, udało się za pierwszym razem. Następnie przyszedł czas na połączenie bluetooth z telefonem. Udało mi się to zrealizować również w dość szybkim czasie (wcześniej oczywiście przeglądałem różnego rodzaju poradniki, czy posty kolegów z forum). Przyszedł czas na aplikację do telefonu, jako że gotowe rozwiązania nie podobały się (a może bardziej ambicja wzięła górę) postanowiłem stworzyć coś własnego. Z pomocą przyszła stronka http://ai2.appinventor.mit.edu. Gdzie w sposób prawie że obrazkowy udało mi się zrobił własny interfejs z własna logiką. Przyszedł czas na oprogramowanie w Arduino wszystkich funkcji które chciałem uzyskać tj: możliwość ręcznego sterowania przełączania na tryb automatyczny sterowania prędkością silniczków Udało mi się to za pomocą kodu: #include <AFMotor.h> AF_DCMotor motorP(1); // silnik prawy AF_DCMotor motorL(2); // silnik lewy #define zdL 9 #define zdP 10 String data; void setup() { Serial.begin(9600); Serial.println("Test portu"); pinMode(zdP, INPUT_PULLUP); pinMode(zdL, INPUT_PULLUP); bool zderzakL = digitalRead(zdL) == HIGH; bool zderzakP = digitalRead(zdP) == HIGH; } uint8_t oP = 255; uint8_t oL = 255; int pierwszyStart = 1; void loop() { if (Serial.available() > 0) { delay(1); char znak = Serial.read(); data += znak; pierwszyStart = 2; ///////////// Prędkość silników ///////////// if (data == "X") { oP = oP + 1; } if (data == "x") { oP = oP - 1; } if (data == "Y") { oL = oL + 1; } if (data == "y") { oL = oL - 1; } ///////////// Prędkość silników ///////////// Serial.print("Prędkość silnika prawego: "); Serial.println(oL); Serial.print("Prędkość silnika lewego: "); Serial.println(oP); if (data == "G") { motorP.setSpeed(oP); motorL.setSpeed(oL); motorP.run(FORWARD); motorL.run(FORWARD); } if (data == "B") { motorP.setSpeed(oP); motorL.setSpeed(oL); motorP.run(BACKWARD); motorL.run(BACKWARD); } if (data == "L") { motorP.setSpeed(oP); motorL.setSpeed(oL); motorP.run(BACKWARD); motorL.run(FORWARD); } if (data == "R") { motorP.setSpeed(oP); motorL.setSpeed(oL); motorP.run(FORWARD); motorL.run(BACKWARD); } if (data == "S") { motorP.setSpeed(0); motorL.setSpeed(0); } if (data == "A") { bool zderzakL = digitalRead(zdL) == HIGH; bool zderzakP = digitalRead(zdP) == HIGH; motorP.setSpeed(oP); motorL.setSpeed(oL); // jeżeli oba zderzaki if (zderzakL == LOW && zderzakP == LOW) { motorP.run(BACKWARD); motorL.run(BACKWARD); delay(250); motorP.run(FORWARD); motorL.run(BACKWARD); delay(1150); } // skręt w prawo else if (zderzakL == LOW) { motorP.run(BACKWARD); motorL.run(BACKWARD); delay(100); motorP.run(FORWARD); motorL.run(BACKWARD); delay(100); } // skręt w lewo else if (zderzakP == LOW) { motorP.run(BACKWARD); motorL.run(BACKWARD); delay(100); motorP.run(BACKWARD); motorL.run(FORWARD); delay(100); } // jazda do przodu else { motorP.run(FORWARD); motorL.run(FORWARD); } } data = ""; } else { if (pierwszyStart == 1) { bool zderzakL = digitalRead(zdL) == HIGH; bool zderzakP = digitalRead(zdP) == HIGH; motorP.setSpeed(oP); motorL.setSpeed(oL); // jeżeli oba zderzaki if (zderzakL == LOW && zderzakP == LOW) { motorP.run(BACKWARD); motorL.run(BACKWARD); delay(250); motorP.run(FORWARD); motorL.run(BACKWARD); delay(1150); } // skręt w prawo else if (zderzakL == LOW) { motorP.run(BACKWARD); motorL.run(BACKWARD); delay(100); motorP.run(FORWARD); motorL.run(BACKWARD); delay(100); } // skręt w lewo else if (zderzakP == LOW) { motorP.run(BACKWARD); motorL.run(BACKWARD); delay(100); motorP.run(BACKWARD); motorL.run(FORWARD); delay(100); } // jazda do przodu else { motorP.run(FORWARD); motorL.run(FORWARD); } } } delay(50); } Na pewno nie jest on w 100% zgodny ze sztuką, ale nic dziwnego bo programowania się nie uczyłem. Jest to zlepek funkcji odnalezionych w internecie i przystosowanych do moich potrzeb. Szczerze chciałbym zobaczyć prawidłowy wygląd kodu Na tym chyba zakończę podsumowując że obiekt spełnił moje oczekiwania, a to jest chyba najważniejsze: mogę sterować robotem/odkurzaczem z telefonu przy włączeniu uruchamia się tryb automatyczny bez potrzeby uruchamiania aplikacji w telefonie możliwość włączania/wyłączania na tryb automatyczny z telefonu sterowanie robotem w trybie automatycznym (w przypadku chęci korekty kierunku jazdy) i poza nim odbijanie od przedmiotów Filmik prezentujący funkcjonalność automatycznej jazdy.
  3. Witam, Posiadam arduino UNO + Shield sterownika L293D do 4x silników DC. Za pomocą funkcji switch steruje sobie aby silniczek kręcił się w prawo, lewo lub się zatrzymywał. Zrobiłem również prosta aplikację do androida za pomocą MIT App Invenstor, gdzie wysyłam na serial odpowiednie zmienne. I teraz chciałbym sterować prędkością tych silniczków, za pomocą 4 przycisków ("+" i "-" - dla każdego silniczka). Tylko mam problem z wysyłaniem w taki sposób aby nie przerywać działania poprzedniej komendy np. jazdy na przód. Teoretycznie mógłbym zapamiętać ostatni stan silniczka i dopisać zaraz pow wysłaniu zmiennej określającej obroty silniczka, ale jakoś ten pomysł wydaje mi się dziwny. Czy jest jakiś inny sposób? Szukałem na google ale nie mogłem nic trafić.
  4. Dzięki, szczerze to zanim napisałeś zastosowałem zmienne ...teraz kod wygląda tak, działa prawidłowo tzn działa tak jak tego chcę. Proszę ewentualnie o weryfikację czy jest prawidłowo napisany #include <AFMotor.h> AF_DCMotor motorP(1); // silnik prawy AF_DCMotor motorL(2); // silnik lewy #define zdL A0 #define zdP A1 void setup() { Serial.begin(9600); Serial.println(F("Test portu!")); // motorP.setSpeed(255); // motorL.setSpeed(255); pinMode(zdP, INPUT_PULLUP); pinMode(zdL, INPUT_PULLUP); } // jazda do przodu void loop() { bool zderzakL = digitalRead(zdL) == HIGH; bool zderzakP = digitalRead(zdP) == HIGH; if (zderzakL == LOW && zderzakP == LOW) { // motorP.run(FORWARD); // motorL.run(FORWARD); Serial.println("Jazda do tyłu"); } // // skręt w prawo else if (zderzakL == LOW) { // motorP.run(RELEASE); // motorL.run(RELEASE); // delay(200); // motorP.run(FORWARD); // motorL.run(BACKWARD); Serial.println("Skręt w prawo"); } // skręt w lewo else if (zderzakP == LOW) { // motorP.run(RELEASE); // motorL.run(RELEASE); // delay(200); // motorP.run(FORWARD); // motorL.run(BACKWARD); Serial.println("Skręt w lewo"); } // // jazda do przodu //(digitalRead((zderzakP) == HIGH && (zderzakL) == HIGH)) else { // motorP.run(RELEASE); // motorL.run(RELEASE); // delay(200); // motorP.run(BACKWARD); // motorL.run(BACKWARD); Serial.println("Jazda do przodu"); } // delay(500); }
  5. Szczerze to już trochę zgłupiałem ... zrobiłem mam nadzieję że dobrze według tego co proponowałeś. Teraz steruję pinami 9 i 10 bezpośrednio z adruino kabelkiem. Jednak na konsoli wyświetla się tylko jazda do przodu, pomimo że przyłączam kabelkiem 5V z portu arduino. #include <AFMotor.h> AF_DCMotor motorP(1); // silnik prawy AF_DCMotor motorL(2); // silnik lewy int zderzakP = 9; //zderzak prawy int zderzakL = 10; //zderzak lewy void setup() { motorP.setSpeed(255); motorL.setSpeed(255); pinMode(zderzakP, INPUT_PULLUP); pinMode(zderzakL, INPUT_PULLUP); Serial.begin(9600); Serial.println(F("Test portu!")); } // jazda do przodu void loop() { if (digitalRead(zderzakP && zderzakL == LOW)) { // motorP.run(FORWARD); // motorL.run(FORWARD); Serial.println("Jazda na wprost"); } // // skręt w prawo else if ((digitalRead(zderzakP == HIGH)) && (digitalRead(zderzakL == LOW))) { // motorP.run(RELEASE); // motorL.run(RELEASE); // delay(200); // motorP.run(FORWARD); // motorL.run(BACKWARD); Serial.println("Skręt w prawo"); } // // skręt w lewo else if ((digitalRead(zderzakP == LOW)) && (digitalRead(zderzakL == HIGH))) { // motorP.run(RELEASE); // motorL.run(RELEASE); // delay(200); // motorP.run(BACKWARD); // motorL.run(FORWARD); Serial.println("Skręt w lewo"); } // // jazda do tyłu //(digitalRead((zderzakP) == HIGH && (zderzakL) == HIGH)) else { // motorP.run(RELEASE); // motorL.run(RELEASE); // delay(200); // motorP.run(BACKWARD); // motorL.run(BACKWARD); Serial.println("Jazda do tyłu"); } // delay(500); }
  6. Zmodyfikowałem kod i teraz pozostaje mi tylko problem wyświetlania się razem jazdy do przodu i do tyłu - jeżeli wcisnę przycisk to do tych dwóch dochodzi trzeci stan tj skręt w prawo lub w lewo. Jak wcisnę oba przyciski to wyświetlają się wszystkie informacje. #include <AFMotor.h> AF_DCMotor motorP(1); // silnik prawy AF_DCMotor motorL(2); // silnik lewy int zderzakP = A0; //zderzak prawy int zderzakL = A1; //zderzak lewyt void setup() { motorP.setSpeed(255); motorL.setSpeed(255); pinMode(zderzakP, INPUT_PULLUP); pinMode(zderzakL, INPUT_PULLUP); Serial.begin(9600); Serial.println(F("Test portu!")); } // jazda do przodu void loop() { if (digitalRead((zderzakP) == LOW && (zderzakL) == LOW)) { motorP.run(FORWARD); motorL.run(FORWARD); Serial.println("Jazda na wprost"); delay(500); } // // skręt w prawo if (digitalRead(zderzakP) == HIGH) { motorP.run(RELEASE); motorL.run(RELEASE); delay(200); motorP.run(FORWARD); motorL.run(BACKWARD); Serial.println("Skręt w prawo"); delay(500); } // // skręt w lewo if (digitalRead(zderzakL) == HIGH) { motorP.run(RELEASE); motorL.run(RELEASE); delay(200); motorP.run(BACKWARD); motorL.run(FORWARD); Serial.println("Skręt w lewo"); delay(500); } // // jazda do tyłu if (digitalRead((zderzakP) == HIGH && (zderzakL) == HIGH)) { motorP.run(RELEASE); motorL.run(RELEASE); delay(200); motorP.run(BACKWARD); motorL.run(BACKWARD); Serial.println("Jazda do tyłu"); delay(500); } // }
  7. Witam serdecznie ! Napisałem prosty programik (uczę się ) do Arduino UNO. Który ma sprawdzać który przycisk jest wciśnięty (o nazwach: zderzakP i zderzakL). W zależności od tego który przycisk jest wciśnięty mają uruchomić się silniki w różnej kombinacji. #include <AFMotor.h> AF_DCMotor motorP(1); // silnik prawy AF_DCMotor motorL(2); // silnik lewy int zderzakP = 9; //zderzak prawy int zderzakL = 10; //zderzak lewyt void setup() { motorP.setSpeed(255); motorL.setSpeed(255); pinMode(zderzakP, INPUT); pinMode(zderzakL, INPUT); digitalWrite(zderzakP, LOW); digitalWrite(zderzakL, LOW); Serial.begin(9600); Serial.println(F("Test portu!")); } // jazda do przodu void loop() { if (digitalRead((zderzakP && zderzakL) == LOW)) { motorP.run(FORWARD); motorL.run(FORWARD); Serial.println("Jazda na wprost"); delay(500); } // // skręt w prawo if (digitalRead(zderzakP) == HIGH) { motorP.run(RELEASE); motorL.run(RELEASE); delay(200); motorP.run(FORWARD); motorL.run(BACKWARD); Serial.println("Skręt w prawo"); delay(500); } // // skręt w lewo if (digitalRead(zderzakL) == HIGH) { motorP.run(RELEASE); motorL.run(RELEASE); delay(200); motorP.run(BACKWARD); motorL.run(FORWARD); Serial.println("Skręt w lewo"); delay(500); } // // jazda do tyłu if (digitalRead((zderzakP && zderzakL) == HIGH)) { motorP.run(RELEASE); motorL.run(RELEASE); delay(200); motorP.run(BACKWARD); motorL.run(BACKWARD); Serial.println("Jazda do tyłu"); delay(500); } // } Jednak nie rozumiem pewnych rzeczy tj. 1. Kod jak powyżej generuje jazdę do przodu oraz jazdę do tyłu w tym samym czasie. Dlaczego skoro warunek z "jazdy do tyłu" nie jest spełniony - na pinach nie podaję napięcia 5V. 2. Jak w samym arduino bez podłączonego shield'a sterownika L293D dodam napięcie 5V na PIN9 to na konsoli portu szeregowego wyświetlane są dwie wartości "jazda do przodu" oraz "skręt w prawo" 3. W konsoli portu szeregowego pojawiają się dane jeszcze kilka sekund po odłączeniu 5V z PIN'u 9 czy PIN'u 10
×
×
  • Utwórz nowe...