Klasické jízdní kolo. Zatím testuju jen na stole tím, že přikládám a oddaluji magnet.jankop píše: ↑21 kvě 2019, 10:30Hodnota 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.
Bluetooth přijímá jiné hodnoty, než posílám z telefonu
Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu
-
- Příspěvky: 1030
- 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
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.
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);
}
- 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
SLAVE
probíhá rychle dle cyklu arduina
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 ?
- 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íš
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;
}
}
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)
{ .....
- 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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu
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ý
-
- Příspěvky: 1030
- 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
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.
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.
- 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
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)"
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu
Podle Tvého návodu to funguje hezky Jsem spokojen. Moc děkuji.jankop píše: ↑21 kvě 2019, 11:36Ož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.
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...
-
- Příspěvky: 1030
- 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
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);
}
Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu
Reset neprobíhá...jankop píše: ↑21 kvě 2019, 12:12No 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); }
-
- Příspěvky: 1030
- 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
Reset čeho? Nešlo by to stručněji?
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů