Stránka 1 z 2

NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 15 srp 2019, 22:09
od sinuhet
Zdravím,
mám NodeMCU s ESP8266 a k němu motor shield ( https://arduino-shop.cz/arduino/1456-sh ... p-12e.html ). Připojil jsem dva motory, řízení přes PWM mi funguje v pořádku, ale pokud zkusím změnit směr (ten driver by měl mít H můstek), motory se zastaví.

Ať dělám, co dělám, kdykoli nastavím piny 0 nebo 2 na LOW, odpovídající motor zastaví na tak dlouho, dokud pin nevrátím na HIGH.

Motory a shield jsou napájeny zvlášť (dva zdroje se společnou zemí), obojí 6V. Jumper nastavení napájení na motor shieldu jsem sundal.

Vycházel jsem hlavně tady z toho:
https://hackaday.io/project/8856-incuba ... tor-shield
Po dlouhém googlení jsem narazil na problém, že někomu trvalo 10-15 vteřin, než se motory v opačném směru rozjely. Zkusil jsem různé kombinace (např. PWM na 0, DIR na LOW, počkat, PWM na 1000, počkat) s dobou čekání 5 minut, nic se nezměnilo.
Dokonce jsem zkoušel otočit i polaritu na motorech, jestli se vůbec umí točit na opačnou stranu, umí :D
Vzhledem k tomu, že na ty piny reaguje a jiné už by ten motor shield neměl používat, předpokládám, že nastavuji správné piny.

Demonstrační příklad:

Kód: Vybrat vše

#include <Wire.h> 
#define DIRL 0
#define DIRR 2
#define PWML 5
#define PWMR 4
;

void setup() {
  pinMode(DIRL, OUTPUT);
  pinMode(DIRR, OUTPUT);
  pinMode(PWML, OUTPUT);
  pinMode(PWMR, OUTPUT);
  analogWrite(PWMR,0);
  analogWrite(PWML,0);
  digitalWrite(DIRL,HIGH);
  digitalWrite(DIRR,HIGH);
  delay(3000);
  //směrové piny jsou na HIGH, PWM nastavím na 1000, motory jedou dopředu
  analogWrite(PWMR,1000);
  analogWrite(PWML,1000);
  delay(3000);
  //směrové piny nastavím na LOW, PWM zase na 1000, motory se zastaví
  digitalWrite(DIRL,LOW);
  digitalWrite(DIRR,LOW);
  analogWrite(PWMR,1000);
  analogWrite(PWML,1000);
  delay(3000);
  //směrové piny vrátím na HIGH, PWM na 1000, motory zase jedou
  digitalWrite(DIRL,HIGH);
  digitalWrite(DIRR,HIGH);
  analogWrite(PWMR,1000);
  analogWrite(PWML,1000);
  delay(3000);
}

void loop() {
}
Jsem začátečník, hraju si s MCU teprve měsíc, navíc doteď jen s Arduinem, takže lze očekávat i nějakou dost amatérskou chybu. Předem díky za ochotu a trpělivost.

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 15 srp 2019, 22:43
od jankop
Byl jsem teď s kamarádem na pivo, tak můj úsudek a vyjadřovací schopnosti tím mohou být ovlivněny :D , ale domnívám se, že tvůj program je v podstatě v pořádku. Jen si musíš uvědomit, že při reverzaci směru se změní nastavený plný výkon na nulový výkon. Prostě když reverzuješ směr, musíš udělat inverzi výkonu. Pokud točíš s parametrem analogWrite(PWMR,1023); na plný výkon, tak pro reverzaci motoru na plný výkon musíš dát analogWrite(PWMR,0);
Tak to po čtyřech pivech chápu já.
Ještě doplním, podle mé teorie, pokud dáš analogWrite(PWMR,512), tak bude reverzace fungovat a motor se bude točit polovičními otáčkami sem a tam(nebo tam a sem)

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 15 srp 2019, 22:55
od sinuhet
jankop píše:
15 srp 2019, 22:43
Byl jsem teď s kamarádem na pivo, tak můj úsudek a vyjadřovací schopnosti tím mohou být ovlivněny :D , ale domnívám se, že tvůj program je v podstatě v pořádku. Jen si musíš uvědomit, že při reverzaci směru se změní nastavený plný výkon na nulový výkon. Prostě když reverzuješ směr, musíš udělat inverzi výkonu. Pokud točíš s parametrem analogWrite(PWMR,1023); na plný výkon, tak pro reverzaci motoru na plný výkon musíš dát analogWrite(PWMR,0);
Tak to po čtyřech pivech chápu já.
Ještě doplním, podle mé teorie, pokud dáš analogWrite(PWMR,512), tak bude reverzace fungovat a motor se bude točit polovičními otáčkami sem a tam(nebo tam a sem)
Díky za tip.

Zkusil jsem jim nastavit 0, nicméně motory stojí. Zkusil jsem nastavit i -1000, kupodivu to šlo zkompilovat, ale i tak motory stály.
Tady je pro jistotu upravený demonstrační příklad, který jsem do toho teď nahrál:

Kód: Vybrat vše

#include <Wire.h> 
#define DIRL 0
#define DIRR 2
#define PWML 5
#define PWMR 4
;

void setup() {
  pinMode(DIRL, OUTPUT);
  pinMode(DIRR, OUTPUT);
  pinMode(PWML, OUTPUT);
  pinMode(PWMR, OUTPUT);
  analogWrite(PWMR,0);
  analogWrite(PWML,0);
  digitalWrite(DIRL,HIGH);
  digitalWrite(DIRR,HIGH);
  delay(3000);
  //směrové piny jsou na HIGH, PWM nastavím na 1000, motory jedou dopředu
  analogWrite(PWMR,1000);
  analogWrite(PWML,1000);
  delay(3000);
  //směrové piny nastavím na LOW, PWM zase na 1000, motory se zastaví
  digitalWrite(DIRL,LOW);
  digitalWrite(DIRR,LOW);
  analogWrite(PWMR,0);
  analogWrite(PWML,0);
  delay(3000);
  //směrové piny vrátím na HIGH, PWM na 1000, motory zase jedou
  digitalWrite(DIRL,HIGH);
  digitalWrite(DIRR,HIGH);
  analogWrite(PWMR,1000);
  analogWrite(PWML,1000);
  delay(3000);
}

void loop() {
}

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 15 srp 2019, 22:59
od jankop
Testuješ to na ESP8266 nebo na Arduinu?

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 15 srp 2019, 23:08
od sinuhet
jankop píše:
15 srp 2019, 22:59
Testuješ to na ESP8266 nebo na Arduinu?
Na ESP8266 v Arduino IDE.
Ale mám tu i několik Arduino Nano, tak jestli myslíte, že v tom bude nějaký rozdíl, můžu to zkusit nahrát do toho.
Popravdě jsem tím shieldem pěkně znechucený. Datasheet není, popis pinout je takový podivný (vůbec netuším, proč jsou tam 3 řady GPIO pinů, ale zase tak hluboko jsem to zatím nezkoumal) a ani oficiální example jsem k tomu nenašel. Je to můj první shield, doteď jsem používal nepájivé pole a klasicky připravené destičky, a nějak mám pocit, že to nemám pod kontrolou. Jestli se mi to nepovede rozhýbat, vyberu si nějaký ne-shield driver a postavím to buď na ESP32 nebo na Arduinu.
Taky je možné, že je ten shield vadný, nebyla by to první věc, co mi přišla nefunkční. Ale mnohem pravděpodobnější je moje chyba.

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 16 srp 2019, 21:30
od sinuhet
jankop píše:
15 srp 2019, 22:59
Testuješ to na ESP8266 nebo na Arduinu?
Teď jsem zkusil místo ESP8266 Arduino Nano (stejný kód, akorát samozřejmě odpovídající piny), chová se to úplně stejně :( takže asi vadný shield.

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 19 srp 2019, 11:53
od dreamer
A víš jistě že jsou piny 0 a 2 DIR? Nebudou to piny Enable? Zkusil bych oslovit dodavatele ať pošle popis konektorů.

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 20 srp 2019, 18:57
od gilhad
ten L293D je celkem bezny a levny, datasheety k nemu se daji najit vsude, takze by mohlo stacit vzit lupu, zmapovat si ten shield a porovnat s datasheetem - u nekolika cinskych desticek mi to uz dost pomohlo.

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 20 srp 2019, 19:46
od sinuhet
dreamer píše:
19 srp 2019, 11:53
A víš jistě že jsou piny 0 a 2 DIR? Nebudou to piny Enable? Zkusil bych oslovit dodavatele ať pošle popis konektorů.
I na destičce jsou ty piny popsané jako "DA" a "DB". Každopádně když se podívám na pinout L293D, který pin by měl určovat směr? Vidím 4x input, 4x output, 2x enable. Pokud by 0 a 2 byly skutečně propojeny na enable, pak by to celé dávalo perfektní smysl "when the enable input is low, that driver is disabled". Jenže pak netuším, které piny by tedy byly pro změnu směru. Všude píšou, že to obsahuje 2 H můstky...
Obrázek

EDIT:
Lupu nemám, a dost dobře na to nevidím, tak jsem to zkusil propípat. Piny 0 a 2 odpovídají Input 1 a 3. PWMA a PWMB jsem také zkusil propípat v očekávání, že budou tím druhým párem inputů, ale nepípnul mi žádný pin.
Na nákupní seznam si připisuji lupu.

Re: NodeMCU motor shield nefunguje změna směru otáčení

Napsal: 20 srp 2019, 21:45
od gilhad
Tady jsem nasel datasheet k te L293D - neobsahuje 2 H mustky, ale 4 drivery (zapojene podobne jako 4 H-pulmustky) ze kterych lze sestavit napriklad, krome jineho i dva H-mustky. (OK, tohle je technikalie, celkem dobre se za dva H-mustky (s urcitym omezenim) povazovat da)

funguje to tak, ze kazdy INx ovlada prislusny OUTx a Enable1 ovlada OUT1,2 zatimco Enable2 ovlada OUT3,4 - tedy pokud je prislusny Enable povolen, tak to funguje podle prislusnych INx, pokud ze zakazan, tak se ty dva INx ignoruji

https://drive.google.com/file/d/0B4B30j ... NmNzQ/view

Ma zvlast napajeni pro logickou a pro vykonnou cast (takze muzes klidne pouzit 4.5V pro ovladani a napajeni logicke casti a 36V pro silovou cast). Silova cast nesmi mit napajeni mensi, nez logicka, logicka nesmi mit min nez 4.5V, zadna z nich nesmi mit vic jak 36 V. Kazdym kanalem muzez prohanet az 600mA trvale (pokud to uchladis), muzes tim cvicit az na 5kHz a jednorazove tim kanalem muzes po dobu 0.00001s prohnat 1.2A, ale uz ne opakovane (cili to tim v podstate skoro jiste znicis - jinak recene, nechod prez 0.6A a jsi celkem jiste v pohode)

Cili pro jizdu vpred motor zapojis mezi OUT1 a OUT2, IN1 das na + a IN2 na 0 a pomoci pulzu na Enable1 ridis rychlost (delsi pulzy = rychleji). Kdyz chces jet zpatky, vypnes Enable1, IN1 das na 0 a IN2 na 1, a zacnes cvicit s Enable1 (delsi pulzy = rychleji).

Obdobne pro druhy motor s IN3,4 OUT3,4 a Enable2.