Skocz do zawartości

Robot z kursu robotów + moduł bluetooth


Pomocna odpowiedź

Witam, mam następujący problem i bardzo proszę o poradę.

Mianowicie chciałem podłączyć do robota z "kursu robotów" moduł bluetooth aby móc sterować robotem za pomocą smartfona.

W tym celu zamówiłem moduł bluetooth HC-05, ale dzisiaj zamiast tego dostałem z tego co wygooglowałem prawdopodobnie moduł "PL2303" (link poniżej) :

https://www.instructables.com/id/USB-to-TTL-Converter-PL2303HX/

Zdjęcia realne modułu.

20190508_131028.thumb.jpg.39d092db2af4ec83c8f4e4dbd1839436.jpg20190508_131002.thumb.jpg.6a7accca137824a554ef1ab28ac877d4.jpg

Moje pytanie brzmi czy jestem w stanie go podłączyć do robota z kursu? i sterować robotem przez smartfon ???.

Chciałem wykonać podobny projekt jak ten: https://circuitdigest.com/microcontroller-projects/g-sensor-controlled-robot-car-arduino

Czy jest to wykonalne?.

Z góry dziękuje za pomoc i pozdrawiam.

Link do komentarza
Share on other sites

@borpio, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

17 minut temu, borpio napisał:

W tym celu zamówiłem moduł bluetooth HC-05, ale dzisiaj zamiast tego dostałem z tego co wygooglowałem prawdopodobnie moduł "PL2303" (link poniżej) :

To co otrzymałeś to nie jest moduł Bluetooth tylko konwerter USB<>UART, którego w tym przypadku nie potrzebujesz, bo masz już coś takiego wbudowane w Arduino. Niestety taki moduł nie pozwoli na realizację bezprzewodowej komunikacji z telefonem.

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Dziękuje za szybką odpowiedź. Mam pytanie czy takie podłączenie wykorzystując UART jak na poniższym schemacie będzie poprawne do komunikacji i sterowania robotem?. Czy może trzeba wykorzystać wyprowadzenia oznaczone w żółtej ramce (5V, GND i np. D13 D12)?. A może obie opcje będą złe :)?. Z góry dziękuje za odpowiedź.

349389231_ukad.thumb.png.bd1e9ac7d7b1bfd052866f8663160129.png

Edytowano przez borpio
Link do komentarza
Share on other sites

Witam ponownie,

do projektu robota dodałem moduł bluetooth HC-05 i podłączyłem go przez UART (zdjęcie w załączniku),

oraz zainstalowałem na smartfon aplikacje do sterowania 'Blue control V2.0' (zdjęcie w załączniku).

Działa to dobrze i oprogramowane są przyciski:

  • strzałka w górę: jazda (niby :D) do przodu,
  • środkowy przycisk stop,
  • strzałka w dół: jazda do tyłu
  • strzałki w lewo i w prawo: obrót w lewo i w prawo.

Serwo zamocowałem najpierw na recepturkę, ale przypadkowo znalazłem odpowiednie wkręty (recepturka została na zdjęciu...). Następnie dodałem czujnik odległości, z tymże wersja zamocowania na gumki u mnie się nie sprawdza, czujnik po chwili jazdy i paru wykryciach przeszkody skierowuje się w dół więc cały czas wykrywa przeszkodę (siebie). Dzisiaj próbowałem go przykleić kropelką bo nie mam wspomnianego w kursie hot glue, niestety ta opcja też wypadła podobnie jak z gumką za mało jest miejsca na "styk" (tylko ten brzeg kółka z 2 stron) myślę że może wypełnię to koło jakimś małym kółkiem i przykleję je, a potem czujnik, jak to też wyjdzie słabo to kupie hot glue.

Jeśli chodzi o kod to oprócz kodu z kursu z ostatniego odcinka dodałem kod związany z komunikacją bluetooth i przyciskami z aplikacji.

Zastanawiam się i proszę o pomoc co mógłbym tu jeszcze dodać fajnego i żeby mi wystarczyło na to zasilania??? (może dodać koszyk na baterie) może oświetlenie???  (posiadam części z kursu elektroniki: poziom 1 i 2 Arduino: 1 i 2 i techniki cyfrowej). Na koniec zamieszczam kod:

#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165
#define BUZZER 10
#define trigPin 7
#define echoPin 8

#include <Servo.h>
Servo serwo;
#define SERWO_PIN 11

void setup() {
  //konfiguracja pinów od mostka H
  pinMode(L_DIR, OUTPUT);
  pinMode(R_DIR, OUTPUT);
  pinMode(L_PWM, OUTPUT);
  pinMode(R_PWM, OUTPUT);

  //buzzer
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, 0); //wyłączenie buzzera

  //czujnik odleglosci
  pinMode(trigPin, OUTPUT); //trig jako wyjście
  pinMode(echoPin, INPUT); //echo jako wejście

  serwo.attach(SERWO_PIN); //serwo do pinu 11
  serwo.write(90); //serwo na pozycje 90 (bo zakres 0-180)

  Serial.begin(9600);

}
void loop() {
  if (Serial.available() > 0)
  {
    char data = Serial.read(); //odczyt danych z modułu hc-05
    switch (data)
    {
      case 'U': //do przodu
        leftMotor(95);
        rightMotor(95);
        delay(2000);
        break;

      case 'D': //do tyłu
        leftMotor(-95);
        rightMotor(-95);
        delay(2000);
        break;

      case 'C': //stop
        leftMotor(0);
        rightMotor(0);
        break;

      case 'L': //obrót w lewo
        leftMotor(-95);
        rightMotor(95);
        break;

      case 'R': //obrót w prawo
        leftMotor(95);
        rightMotor(-95);
        break;
    }
  }
  //czy wykryto przeszkode w zakresie 0-40 cm
  if (zmierzOdleglosc() > 40) {
    leftMotor(40); //jeśli nie to jedź prosto
    rightMotor(40);
  } else {
    //jeśli przeszkoda
    stopMotors(); //zatrzymaj robota
    serwo.write(20); //skręć czujnikiem w prawo
    delay(800); //poczekaj 800 ms dla ustabilizowania konstrukcji

    //sprawdź, czy po prawej stronie jest przeszkoda
    if (zmierzOdleglosc() > 40) {
      //jeśli jest pusto
      leftMotor(40);
      rightMotor(-40);
      delay(400); //obracaj w prawo przez 400 ms
    } else {
      //jeśli po prawej jest przeszkoda
      serwo.write(160); //obróć czujnik w lewo
      delay(800); //poczekaj 800 ms dla ustabilizowania konstrukcji

      //sprawdź, czy po lewej stronie jest przeszkoda
      if (zmierzOdleglosc() > 40) {
        //jeśli jest pusto
        leftMotor(-40);
        rightMotor(40);
        delay(400); //obracaj w lewo przez 400 ms
      } else {
        //jeśli z przodu, z lewej i prawej jest przeszkoda
        digitalWrite(BUZZER, 1);
        delay(500);
        digitalWrite(BUZZER, 0);
        //daj sygnał buzzerem
      }
    }
    //po sprawdzeniu przeszkód po bokach
    //ustaw czujnik prosto
    serwo.write(90);
  }
  //opoznienie 100ms ponieważ nie ma potrzeby sprawdzać przeszkód częściej
  delay(100);
}

int zmierzOdleglosc() {
  long czas, dystans;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  czas = pulseIn(echoPin, HIGH);
  dystans = czas / 58;
  return dystans;
}

void leftMotor(int V) {
  if (V > 0) { //jeśli prędkość jest większa od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 0); //kierunek do przodu
    analogWrite(L_PWM, V); //ustawienie prędkości
  } else {
    V = abs(V); //funkcja abs() zwróci wartość V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 1); //kierunek: do tyłu
    analogWrite(L_PWM, V); //ustawienie prędkości
  }
}
void rightMotor(int V) {
  if (V > 0) { //jeśli predkość jest większa od 0 (dodatnia)
    V = map(V, 0, 130, 0, PWM_MAX); //130 bo prawy silnik słabszy
    digitalWrite(R_DIR, 0); //kierunek: do przodu
    analogWrite(R_PWM, V); //ustawienie predkości
  } else {
    V = abs(V); //funkcja abs() zwróci wartość V  bez znaku
    V = map(V, 0, 130, 0, PWM_MAX); //130 bo prawy silnik słabszy
    digitalWrite(R_DIR, 1); //kierunek: do tyłu
    analogWrite(R_PWM, V); //ustawienie prędkości
  }
}
void stopMotors() {
  analogWrite(L_PWM, 0); //wyłączenie lewego silnika
  analogWrite(R_PWM, 0); //wyłączenie prawego silnika
}

DSCN0377.JPG DSCN0378.JPG screen-0.jpg

  • Lubię! 2
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@borpio super, że udało się wszystko uruchomić 😉 

Jeśli masz elementy z kursu Arduino 2 to warto na pewno podłączyć cyfrowo sterowane diody RGB - będzie sporo ciekawych możliwości 😉

Link do komentarza
Share on other sites

Dzięki za szybką odpowiedź 🙂.

43 minuty temu, Treker napisał:

@borpio super, że udało się wszystko uruchomić 😉 

Jeśli masz elementy z kursu Arduino 2 to warto na pewno podłączyć cyfrowo sterowane diody RGB - będzie sporo ciekawych możliwości 😉

W przypadku cyfrowo sterowanych diod RGB mam do wykorzystania na płytce sterownika dwa wolne piny D12 i D13 oraz masę np. przy wyprowadzeniach ADC?.

Czy linijka diod programowalnych WS2812 też wchodzi w grę?, aby ją podłączyć konieczne było by (chyba) umieszczenie małej płytki stykowej np. na koszyku z bateriami żeby podłączyć do niej rezystory i kondensator ?. Dobrze kombinuje? bo wariant z "wiszeniem rezystorów i kondensatorów w powietrzu" ze względów estetycznych nie wchodzi w grę. Linijkę chyba bym umieścił z przodu i chciałbym uzyskać efekt jak w serialu knight rider :D.

Pozdrawiam

Piotr

Link do komentarza
Share on other sites

Tak, oczywiście - możesz podłączyć linijkę WS2812. Możesz dodać małą płytkę stykową i zaryzykować podłączenie linijki bez kondensatora i bez tego rezystora, raczej też będzie działać. Można zrobić tutaj taką prowizorkę dla testu 😉

Link do komentarza
Share on other sites

Witam, dzięki za odpowiedź =). Dodałem małą płytkę stykowa i zamocowalem ją 2 trytytkami na koszu od baterii wygląda to nienajgorzej. Podłączyłem linijkę identycznie jak w kursie 2 z arduino z C i dwoma R do shieldu i wszystko działa, linijce dałem kod wariant 2 czerwono niebieski. Przejrzałem co prawda przykłady z biblioteki ale na razie odpuscilem ten temat (knight ridera ;). Niestety na te chwile nie kupiłem hot glue. Próbowałem kropelka i poxipol ale nic z tego. Więc nie wiem czy czujnik odległości dodam. Czy jeśli bym jednak chciał go dodać i podłączyć serwo czy obecne zasilanie to wytrzyma? Nie odejmujac linijki mam na myśli. Z jednej strony mocno zależy mi na projekcie ale nie wiem czy dam radę mądrze zmienić kod z odcinka o czujniku aby się to nie gryzlo z sterowaniem przez telefon w sensie ja sobie a robót sobie =)) bo taki uzyskalem efekt ale co prawda przy źle przymocowanym czujniku odległości.

20190518_193129.jpg

  • Lubię! 1
Link do komentarza
Share on other sites

Nie masz co się martwić o zasilanie - raczej nic nie zepsujesz. Najwyżej robot przestanie działać i będzie się zawieszał. Trwałego uszkodzenia raczej nie dasz rady zrobić w taki sposób. Można więc śmiało eksperymentować.  Największy pobór prądu będzie przy szybkim miganiu wszystkimi diodami na wszystkie kolory (czyli na biało). Jak nie robisz takich ekstremalnych efektów to powinno być dobrze 🙂

  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)

Witam, mam taki oto problem i 2 pytania zarazem, chciałem zmodyfikować swój projekt (robot sterowany przez smartfona z modułem bluetooth hc-05), ale nie posiadam obecnie na komputerze kodu programu - ale jest on wgrany w Arduino w robocie:

1. pytanie: czy jest możliwość otwarcia tego kodu programu lub zgrania go w formie pliku na komputer?.

2. drugie pytanie i prośbę o ewentualną pomoc próbowałem wgrać ten kod który był wtedy wykorzystany (mam jego zdjęcie) ale nie działa wyskakuje błąd (linijka z funkcją switch i case 'U': leftMotor(95); - pojawia się błąd jak poniżej:

exit status 1
'leftMotor' was not declared in this scope

poniżej zamieszczam kod:

#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165
#define BUZZER 10
#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel diodes = Adafruit_NeoPixel(8,A2,NEO_GRB+NEO_KHZ800);

void setup(){
  pinMode(L_DIR,OUTPUT);
  pinMode(R_DIR,OUTPUT);
  pinMode(L_PWM,OUTPUT);
  pinMode(R_PWM,OUTPUT);

  pinMode(BUZZER,OUTPUT);
  digitalWrite(BUZZER,0);

  diodes.begin();
  diodes.show();

  Serial.begin(9600);
}

void loop()
{
  if (Serial.available()>0)
  {
    char data = Serial.read();
    switch (data)
    {
      case 'U':
        leftMotor(95);
        rightMotor(95);
      break;

      case 'D':
        leftMotor(-95);
        rightMotor(-95);
      break;

      case 'C':
        leftMotor(0);
        rightMotor(0);
      break;

      case 'L':
        leftMotor(-45);
        rightMotor(45);
      break;

      case 'R':
        leftMotor(45);
        rightMotor(45);
      break;

      case 'a':
        digitalWrite(BUZZER,1);
        delay(1000);
        digitalWrite(BUZZER,0);
      break;
    }
  }
}
int i=0;
for (i=0;i<8;i++){
  if (i<4){
    diodes.setPixelColor(i,diodes.Color(255,0,0));
 }else{
  diodes.setPixelColor(i,diodes.Color(0,0,255));
 }
 diodes.show();
 delay(100);
}
diodes.clear();
}

void leftMotor(int V){
  if (V>0) {
    V=map(V,0,100,0,PWM_MAX);
    digitalWrite(L_DIR,0);
    analogWrite(L_PWM,V);
  }else{
    V=abs(V);
    V=map(V,0,100,0,PWM_MAX);
    digitalWrite(L_DIR,1);
    analogWrite(L_PWM,V);
  }
}
void rightMotor(int V){
  if (V>0) {
    V=map(V,0,130,0,PWM_MAX);
    digitalWrite(R_DIR,1);
    analogWrite(R_PWM,V);
  }else{
    V=abs(V);
    V=map(V,0,130,0,PWM_MAX);
    digitalWrite(R_DIR, 1);
    analogWrite(R_PWM, V);
  }
}
void stopMotors(){
  analogWrite(L_PWM,0);
  analogWrite(R_PWM,0);
}

 

Edytowano przez borpio
Doprecyzowanie postu
Link do komentarza
Share on other sites

(edytowany)

Dobry wieczór, chciałem jeszcze do mojego robota dodać możliwość włączania i wyłączania oświetlenia ale po długich zmaganiach i nie udanych próbach postanowiłem znowu prosić o pomoc 🙂 mianowicie mam problem w funkcji switch, a konkretnie jak zaprogramować wyłączanie linijki diod klawiszem 'b' ???

który chciałem dodać pod 'a' (pod klawiszem a jest kod włączający) próbowałem przez:

pinMode(A5,LOW),

diodes.clear() lub ustawienie kolorów na 0,0,0 odwrotnie jak dla jej włączenia i case a - różne kombinacje z kursów i wszystko na nic 😞, domyślam się że jest to proste, ale jak to zrobić :)?

z góry dziękuje za pomoc.

#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165
#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel diodes = Adafruit_NeoPixel(8,A5,NEO_GRB+NEO_KHZ800);

void setup(){
  pinMode(L_DIR,OUTPUT);
  pinMode(R_DIR,OUTPUT);
  pinMode(L_PWM,OUTPUT);
  pinMode(R_PWM,OUTPUT);
  
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available()>0)
  {
    char data = Serial.read();
    switch (data)
    {
      case 'U':
        leftMotor(95);
        rightMotor(95);
      break;

      case 'D':
        leftMotor(-95);
        rightMotor(-95);
      break;

      case 'C':
        leftMotor(0);
        rightMotor(0);
      break;

      case 'L':
        rightMotor(60);
        leftMotor(-60);
      break;

      case 'R':
        rightMotor(-60);
        leftMotor(60);
      break;

      case 'a':
        diodes.begin();
        diodes.show();
        int i=0;
        for(i=0;i<8;i++){
          diodes.setPixelColor(i,diodes.Color(255,255,255));
        }      
      }
    }
  }
void leftMotor(int V){
  if (V>0) {
    V=map(V,0,100,0,PWM_MAX);
    digitalWrite(L_DIR,0);
    analogWrite(L_PWM,V);
  }else{
    V=abs(V);
    V=map(V,0,100,0,PWM_MAX);
    digitalWrite(L_DIR,1);
    analogWrite(L_PWM,V);
  }
}
void rightMotor(int V){
  if (V>0) {
    V=map(V,0,100,0,PWM_MAX);
    digitalWrite(R_DIR,0);
    analogWrite(R_PWM,V);
  }else{
    V=abs(V);
    V=map(V,0,100,0,PWM_MAX);
    digitalWrite(R_DIR, 1);
    analogWrite(R_PWM, V);
  }
}
void stopMotors(){
  analogWrite(L_PWM,0);
  analogWrite(R_PWM,0);
}

 

Edytowano przez borpio
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.