Bluetooth přijímá jiné hodnoty, než posílám z telefonu

QRocky
Příspěvky: 36
Registrován: 28 zář 2017, 16:30
Reputation: 0

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od QRocky » 21 kvě 2019, 10:40

jankop píše:
21 kvě 2019, 10:30
Hodnota speedk v Master může nabývat až cca 75 a ty ji násobíš ještě AuraPWM = state * 10;
Jaké otáčky, respektive jakou frekvenci hodláš vlastně snímat?
S ohledem na pochybnou konverzi float integer to pochopitelně bude dělat problémy i když opravíš komunikační rychlosti.
Klasické jízdní kolo. Zatím testuju jen na stole tím, že přikládám a oddaluji magnet.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od jankop » 21 kvě 2019, 11:01

Odpoj z Master HC-5, stačí jen jeho TX a nahraj přiložený program.
Na sériovou linku by měl odesílat celočíselné hodnoty max. cca 75. To je první krok.
Pochopitelně na sériovém monitoru nastav stejnou rychlost.

Kód: Vybrat vše

long start;
long elapsed;
float circMetric=2.093; // wheel circumference (in meters)
int speedk;

void setup() {
Serial.begin(38400); // Default communication rate of the Bluetooth module
attachInterrupt(digitalPinToInterrupt(2), speedCalc, RISING); 
start=millis(); 
}
void speedCalc(){
//Function called by the interrupt
if((millis()-start)>100) // 100 millisec debounce{
//calculate elapsed
elapsed=millis()-start;
//reset start
start=millis();
//calculate speed in km/h
speedk=(int)((3600.0*circMetric)/(float)elapsed); 
}
void loop() {
Serial.println(speedk);
//Serial.write(speedk);
delay(100);
}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od pavel1tu » 21 kvě 2019, 11:06

SLAVE

probíhá rychle dle cyklu arduina

Kód: Vybrat vše

if (Serial.available() > 0)     // dokud jsou nějaká data přijatá v buferu proběhne tato podmínka
   {
   state = Serial.read();       // vyčte jeden "byte" - pokud pošleš "50" - vyčte v prvním kole jen "5" podle mne 
                                         // až když podmínka proběhne podruhé tak vyčte tu "0"
   AuraPWM = state * 10;
   if (state != OldState) {
      OldMillis = millis();
      OldState = state;
      }
  }
Jaká to máš vlastně Arduina ?
1) pokud odešleš "50" tato podmínka probíhá rychle za sebou, nejprve přijmeš "5" tak uděláš PWM = 50 (5*10) a v dalším cyklu hned přijmeš "0" PWM = 0 (5*0) - to ani nepostřehneš
2) nemáš to Arduino připojené při testování k PC doufám ? Arduina mívají jenom jeden sériový port a pokud po nahrání jsi připojen a sleduješ co ti Arduino posílá, tak to nemůže komunikovat i s BT modulem - musel by jsi použít knihovnu <SoftwareSerial.h>

Hoď na každý řádek komentář co to dělá - nechápu některé myšlenkové pochody, třeba co má dělat toto ?

Kód: Vybrat vše

if (millis() - OldMillis > 500) {
     OldMillis = millis();
     if (state - OldState == 0) {
          state = 0;
     }
     OldState = state;
}

if (Serial.available() > 0)
{ .....

- jednou za 500ms
- pokud je právě vyčtená hodnota stejná jako předchozí - nastav právě vyčtenou hodnotu na 0
- předchozí hodnotu nastav na 0
celkem nesmysl

- smyčka s vyčítáním pak funguje rychle každý cyklus

*********************************************************************************************************************

Já bych to stavěl jinak:
- jednou za 500ms udělej vše toto
- - vyčti bufer z BT - jeden znak (odesílej jen čísla 0-9)
- - porovnej zda je jiný než naposled přijatý,
- - - pokud ano změń PWM + ulož ho jako naposledy přijatý
- - - pokud ne tak nic
- - konec IF vyčtení c BT
- konec IF 500ms podmínky

1) ODSAZUJ text kodu dle podmínek
2) piš komentáře co který řádek dělá - kvůli nám , aby se vědělo co zamýšlíš
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

QRocky
Příspěvky: 36
Registrován: 28 zář 2017, 16:30
Reputation: 0

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od QRocky » 21 kvě 2019, 11:28

if (millis() - OldMillis > 500) {
OldMillis = millis();
if (state - OldState == 0) {
state = 0;
}
OldState = state;
}

Tohle by mělo vynulovat pwm výstup v případě, že bluetooth posílá 500 ms stejné hodnoty...
Používám Arduino Uno jako slave, a Mega jako master.

Už jsem z toho ztracený :)

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od jankop » 21 kvě 2019, 11:36

Oživ ten Master, jak popisuji. Postupuj systematicky. Vcelku na tom nic není. Uvědom si například, že analogWrite() má parametr integer, který je v rozsahu 0-255. Pokud tam vložíš float , který je ještě k tomu větší než 255, tak dojde nejspíš k podivnému ořezání a fungovat to dobře nemůže.
Když ti Master bude s magnetem dávat rozumné celočíselné hodnoty do serial monitoru, tak zadefinuj Serial1 a přepoj na něj HC-5. Pak teprve řeš Slave.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od pavel1tu » 21 kvě 2019, 11:40

Ještě mne napadlo:
1) def. rychlost je 9600 z výroby
2) modul je def. SLAVE - MASTER musíš nastavit pomocí "AT+ROLE: See role of bt module(1=master/0=slave)"
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

QRocky
Příspěvky: 36
Registrován: 28 zář 2017, 16:30
Reputation: 0

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od QRocky » 21 kvě 2019, 11:41

jankop píše:
21 kvě 2019, 11:36
Oživ ten Master, jak popisuji. Postupuj systematicky. Vcelku na tom nic není. Uvědom si například, že analogWrite() má parametr integer, který je v rozsahu 0-255. Pokud tam vložíš float , který je ještě k tomu větší než 255, tak dojde nejspíš k podivnému ořezání a fungovat to dobře nemůže.
Když ti Master bude s magnetem dávat rozumné celočíselné hodnoty do serial monitoru, tak zadefinuj Serial1 a přepoj na něj HC-5. Pak teprve řeš Slave.
Podle Tvého návodu to funguje hezky :-) Jsem spokojen. Moc děkuji.
Teď už mi jen zbývá vynulovat hodnotu speedk, pokud je na něm dlouho stejná hodnota. Například 2 vteřiny...
Mám to sice zakompované u Slave, ale nefunguje to...
001.PNG

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od jankop » 21 kvě 2019, 12:12

No teď bych přepojil fyzicky HC-5 na Serial1 s drobnou úpravou programu:

Kód: Vybrat vše

long start;
long elapsed;
float circMetric=2.093; // wheel circumference (in meters)
int speedk;

void setup() {
Serial1.begin(38400); // Default communication rate of the Bluetooth module
Serial.begin(38400);
attachInterrupt(digitalPinToInterrupt(2), speedCalc, RISING); 
start=millis(); 
}
void speedCalc(){
//Function called by the interrupt
if((millis()-start)>100) // 100 millisec debounce{
//calculate elapsed
elapsed=millis()-start;
//reset start
start=millis();
//calculate speed in km/h
speedk=(int)((3600.0*circMetric)/(float)elapsed); 
}
void loop() {
Serial.println(speedk);
Serial1.write(speedk);
delay(100);
}

QRocky
Příspěvky: 36
Registrován: 28 zář 2017, 16:30
Reputation: 0

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od QRocky » 21 kvě 2019, 12:27

jankop píše:
21 kvě 2019, 12:12
No teď bych přepojil fyzicky HC-5 na Serial1 s drobnou úpravou programu:

Kód: Vybrat vše

long start;
long elapsed;
float circMetric=2.093; // wheel circumference (in meters)
int speedk;

void setup() {
Serial1.begin(38400); // Default communication rate of the Bluetooth module
Serial.begin(38400);
attachInterrupt(digitalPinToInterrupt(2), speedCalc, RISING); 
start=millis(); 
}
void speedCalc(){
//Function called by the interrupt
if((millis()-start)>100) // 100 millisec debounce{
//calculate elapsed
elapsed=millis()-start;
//reset start
start=millis();
//calculate speed in km/h
speedk=(int)((3600.0*circMetric)/(float)elapsed); 
}
void loop() {
Serial.println(speedk);
Serial1.write(speedk);
delay(100);
}
Reset neprobíhá...

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od jankop » 21 kvě 2019, 12:46

Reset čeho? Nešlo by to stručněji?

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů