• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z projektem bluetooth
#1
Lightbulb 
Witam. Buduję układ mający być sterowaniem w zdalnie sterowanym samochodzie. W skrócie: Sygnał z telefonu idzie do modułu bluetooth hc-06, arduino go odczytuje i daje napięcie i informację o prędkości do modułu l298n który napędza silnik. na podobnej zasadzie działa serwo. Całość zasilana jest z baterii 7,4v. Serwo jest podłączone do baterii przez regulator napięcia, który napięcie zmniejsza do 5v. Problem jest następujący: napisałem dwa osobne programy. Jeden do kontroli serwa, a drugi do silnika. Osobno oba działają jak należy, problem pojawił się gdy połączyłem je w jeden, wtedy działa tylko serwo. W załączonych plikach przesyłam zdjęcia układu jak i program. Z góry dziękuję za pomoc.
   
       

const int ENA = 8;  // Pin PWM dla kanału A
const int IN1 = 7;  // Pin IN1 dla kanału A
const int IN2 = 6;  // Pin IN2 dla kanału A
#include <Servo.h>
Servo myservo;
int pos = 0;    // variable to store the servo position
int motor = 0;

void setup() {
   pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 
  Serial.print("Arduino control Servo Motor Connected OK");
  Serial.print('\n');
}  
char znak;
void loop() {                                  
  if (Serial.available() > 0) {
    znak = Serial.read();
  }
  if (znak == 'W') {
    analogWrite(ENA, 128); // 50% z 255 (128 -9V())
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  }
  if(znak == 'w'){
    digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  }
{ motor = Serial.parseInt();
   
    // do it again:
    pos = Serial.parseInt();
 
    // look for the newline. That's the end of your  sentence:
    if (Serial.read() == '\n') {
             
       myservo.write(pos);              // tell servo to go to position in variable 'pos'
       delay(15);                       // waits 15ms for the servo to reach the position
     
      // print the three numbers in one string as hexadecimal:
      Serial.print("Data Response : ");
      Serial.print(motor, DEC);
      Serial.print(pos, DEC);      
      }
}
}
 
Odpowiedź
#2
Źle podłączone dwa programy i pierwszy if (Serial.available() > 0) {
znak = Serial.read();
} odczytuje więc drugi na serwo nic nie odczytuje.

Więc byś musiał wymyślę coś własnego jak odczytać by było do dwuch zdań
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
W poprzednim poście otrzymałeś drobne wyjaśnienie. Dodam eszcze być najpierw określił jak chcesz sterować (protokół komunikacyjny)> Według przedstawionego programu wysyłasz 'W' lub 'w' do sterowania silnikiem a potem oczekujesz liczby określającej pozycje serwa. Czy program sterujący faktycznie wysyła dane w taki sposób? Skoro miałeś dwa oddzielne programy na arduino to i programy sterujące były chyba dwa. W jaki sposób dwa programy mają wysyłać dane pzez jeden RS/BT?
 
Odpowiedź
#4
Dziękuję za odpowiedzi. czyli krótko mówiąc nie da się tego zrobić tak jak zakładałem. chciałem by serwo było sterowane w miarę precyzyjnie (przez suwak na smartfonie) a silnik poprzez przycisk. Suwak wysyła informację o położeniu serwa jako liczby. Więc przycisk ustawiłem tak, by wysyłał litery. Napiszę nowy program gdzie serwo nie będzie sterowane precyzyjnie, tylko na przyciski- lewo prawo. Bo innego wyjścia nie widzę. Dziękuję za pomoc.
 
Odpowiedź
#5
(15-01-2024, 17:05)MajsteRF_120rc napisał(a): Dziękuję za odpowiedzi. czyli krótko mówiąc nie da się tego zrobić tak jak zakładałem. chciałem by serwo było sterowane w miarę precyzyjnie (przez suwak na smartfonie) a silnik poprzez przycisk. Suwak wysyła informację o położeniu serwa jako liczby. Więc przycisk ustawiłem tak, by wysyłał litery. Napiszę nowy program gdzie serwo nie będzie sterowane precyzyjnie, tylko na przyciski- lewo prawo. Bo innego wyjścia nie widzę. Dziękuję za pomoc.

Czyli, jak rozumiem, miałeś program który na ruch suwaka wysyłał liczbę, w na jakieś przyciski literki w/W. To najprościej niech suwak wysyła swoją liczbę poprzedzoną jakimś innym znakiem. Wtedy w odbiorniku czytasz znak i na jego podstawie wiesz czy czytać dalej, czy ustawić to PWM. W takich programach komunikacyjnych bardzo ważne jest zaprojektowanie takiego protokołu komunikacyjnego, który jest jednoznaczny (co w ogólności nie jest łatwe) - trzeba pamiętać, że moment włączenia odbiornika może być przypadkowy (w ogólności) i może on zacząć odbierać od połowy komunikatu. Jeśli będziesz miał protokół w którym komunikat zaczyna się literką i trwa np. do kodu enter - to już wygląda na sensowny protokól. Może wręcz wybrać jakiś znak na początek komunikatu - potem treść nie zawierająca tego znaku i jakiś znak na koniec (też unikalny) (ale to nie jest konieczne). Wysyłanie samych liczb ma tę wadę, że mógłbyś ją odczytać od środka - np. nadajesz 128 a odbiornik odczyta 28 i masz zupełnie odjechany od rzeczywistości odczyt.
 
Odpowiedź
#6
(15-01-2024, 17:23)oscarX napisał(a):
(15-01-2024, 17:05)MajsteRF_120rc napisał(a): Dziękuję za odpowiedzi. czyli krótko mówiąc nie da się tego zrobić tak jak zakładałem. chciałem by serwo było sterowane w miarę precyzyjnie (przez suwak na smartfonie) a silnik poprzez przycisk. Suwak wysyła informację o położeniu serwa jako liczby. Więc przycisk ustawiłem tak, by wysyłał litery. Napiszę nowy program gdzie serwo nie będzie sterowane precyzyjnie, tylko na przyciski- lewo prawo. Bo innego wyjścia nie widzę. Dziękuję za pomoc.

Czyli, jak rozumiem, miałeś program który na ruch suwaka wysyłał liczbę, w na jakieś przyciski literki w/W. To najprościej niech suwak wysyła swoją liczbę poprzedzoną jakimś innym znakiem. Wtedy w odbiorniku czytasz znak i na jego podstawie wiesz czy czytać dalej, czy ustawić to PWM. W takich programach komunikacyjnych bardzo ważne jest zaprojektowanie takiego protokołu komunikacyjnego, który jest jednoznaczny (co w ogólności nie jest łatwe) - trzeba pamiętać, że moment włączenia odbiornika może być przypadkowy (w ogólności) i może on zacząć odbierać od połowy komunikatu. Jeśli będziesz miał protokół w którym komunikat zaczyna się literką i trwa np. do kodu enter - to już wygląda na sensowny protokól. Może wręcz wybrać jakiś znak na początek komunikatu - potem treść nie zawierająca tego znaku i jakiś znak na koniec (też unikalny) (ale to nie jest konieczne). Wysyłanie samych liczb ma tę wadę, że mógłbyś ją odczytać od środka - np. nadajesz 128 a odbiornik odczyta 28 i masz zupełnie odjechany od rzeczywistości odczyt.
Dziękuję za radę, spróbuję, ale wydaje mi się że to nie na mój stopień zaawansowania.
 
Odpowiedź
#7
W Arduino niewiele jeszcze można wymyślić nowego, to czego szukasz to parsowanie danych, z programu wysyłasz ciąg danych zaczynających się od charakterystycznego znaku np. &^%$#, potem wartości oddzielone np. ",", i linia tekstu zakończona znakiem nowej linii, parsujesz te dane do zmiennych i masz bardzo prosto przekazane w parę us cały zestaw:
%predkosc,kierunek,swiatlaMijania,klakson,CoTamJeszczeCiPrzyjdzieDoGlowyNL.
Dane powinny być przekazywane w racjonalnych interwałach czasowych, np. co 50ms.
W programie mierz upływ czasu, masz do tego millis, jeśli przez jakiś czas (np. powyżej 100ms) nie przyleci nowy zestaw danych zatrzymaj pojazd.
https://forum.arduinopolska.pl/watek-por...-zmiennych
https://forum.arduinopolska.pl/watek-ste...%C5%82-gsm
i tysiące innych przykładów z GOOGLE.
 
Odpowiedź
#8
Dziękuję za pomoc
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości