Arduino Polska Forum

Pełna wersja: Problem z projektem bluetooth
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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.
[attachment=1411]
[attachment=1412][attachment=1413]

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);      
      }
}
}
Ź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ń
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?
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.
(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.
(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.
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.
Dziękuję za pomoc