Motor draadjes

30 replies [Last post]
stienoo
Offline
Member since: 2010-01-01

In de tutorial om een licht-etende robot te bouwen wordt er gewerkt met een paar lege motortjes.
Nu wil ik echter doodgewone motortjes aansturen uit een oude rc auto.
Helaas hebben deze maar 2 draadjes.
Hoe moet ik deze nu aansluiten om deze toch te kunnen gebruiken zo als in die tutorial uitgelegd?

Michiel
Offline
Member since: 2009-04-17

De motors van de power functions serie van lego hebben 4 draden, maar er zijn er in feite maar 2 aangesloten intern in de motor. De overige 2 kabels zijn er enkel om compatibel te zijn met andere lego power functions modules, zoals sensors. Het is dus normaal dat je motor uit je rc auto 2 aansluitingen heeft. De motordriver op het dwengobordje kan 2 dergelijke motoren onafhankelijk aansturen. Als je naar de motor-connector kijkt, zal je zien dat hier M1 en M2 te vinden is bij 2 paar aansluitingen. Op beide paar pinnen kun je je motor aansluiten.
Ik weet niet over welk kaliber race auto je spreekt, maar zorg er wel voor dat je de motordrivers niet te zwaar belast. Ze kunnen een piekstroom van 2A leveren. Voor zwaardere motoren zul je een externe motordriver moeten voorzien.

stienoo
Offline
Member since: 2010-01-01

En waar dienen die + en die - dan voor naast M1 en M2?

Michiel
Offline
Member since: 2009-04-17

Op deze pinnen bevinden zich eenvoudigweg de massa en de voedingsspanning van het bordje. Deze kunnen enerzijds gebruikt worden om gemakkelijk externe clamping diodes toe te voegen om beter met inductieve lasten overweg te kunnen. Anderzijds laten deze toe om 4 onafhankelijke uitgangen aan te sturen ten opzichte van + of -, bijvoorbeeld 4 powerleds, waarvan je 1 kant gemeenschappelijk met + of - verbindt, of 1 unipolaire stappenmotor, of 4 motoren die enkel in 1 richting moeten kunnen draaien, enz...

Om twee (niet te zware) motoren in beide richtingen te laten ronddraaien, zul je die + en - pinnen dus niet gebruiken. Maar het bordje is flexibel opgezet en voorziet dus ook in andere toepassingen voor de drivertrap, waarbij deze pinnen handig kunnen zijn.

stienoo
Offline
Member since: 2010-01-01

Ik heb die licht-etende robot gemaakt maar mijn motor krijg een maximum van zo'n 45 mV.
Nu heeft mijn motor min 1,5V nodig om goed te kunnen werken.
Moet ik mijn MAX_SPEED dan gewoon zo'n 30-40 keer verdubbelen?

Francis
Offline
Member since: 2009-04-16

Nee, de maximale waarde die je doorgeeft aan de PWM-module is 1023 (en de minimale waarde is 0). De PWM-module is immers slechts 10-bit. Als je de motoren niet aansluit en de 2 PWM-modules instelt op 1023 terwijl je de pinnen RA4 en RB3 op 0 zet. Wat is de spanning dan die je meet over de twee pinnen van M1 en over de twee pinnen van M2?

stienoo
Offline
Member since: 2010-01-01

Ik heb enkele metingen gedaan.
Hiervoor heb ik deze code gebruikt:

  1. #include <p18f4550.h>
  2. #include <timers.h>
  3. #include <delays.h>
  4. #include <pwm.h>
  5.  
  6. // Fuses configuration
  7. #pragma config PLLDIV = 5 // Divide by 5 (20 MHz oscillator input)
  8. #pragma config FOSC = HSPLL_HS // HS oscillator, PLL enabled, HS used by USB
  9. #pragma config IESO = OFF // Oscillator Switchover mode disabled
  10. #pragma config PWRT = OFF // PWRT disabled
  11. #pragma config BOR = OFF // Brown-out Reset enabled in hardware only (SBOREN is disabled)
  12. #pragma config WDT = OFF // HW Disabled - SW Controlled
  13. #pragma config WDTPS = 32768 // 1:32768
  14. #pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled
  15. #pragma config LVP = OFF // Disable low-voltage programming
  16. #pragma config CCP2MX = ON // CCP2 multiplexed to RC1 and not to RB3
  17. #pragma config PBADEN = OFF // PORB digital IO on powerup
  18.  
  19. #define TRUE 1
  20. #define MAX_SPEED 1023 // maximal speed setting
  21.  
  22. void main(void) {
  23.  
  24. // set motor pins as output
  25. TRISAbits.TRISA4 = 0;
  26. TRISBbits.TRISB3 = 0;
  27. TRISCbits.TRISC1 = 0;
  28. TRISCbits.TRISC2 = 0;
  29.  
  30. PORTAbits.RA4 = 0; //ground
  31. PORTBbits.RB3 = 0; //ground
  32.  
  33. // PWM period = (0xFF + 1)*4*Tosc*T2Prescaler
  34. OpenPWM1(0xFF); // configuring PWM module 1
  35. OpenPWM2(0xFF); // configuring PWM module 2
  36.  
  37. // Configuring timer 2 which provides timing for PWM
  38. // TIMER_INT_OFF: disable timer interrupt
  39. // T2_PS_1_4: Timer2 prescaling set to 4
  40. // T2_POST_1_1: Timer2 postscaling set to 1
  41. OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
  42.  
  43. SetDCPWM1(MAX_SPEED); // sets PWM duty cycle
  44. SetDCPWM2(MAX_SPEED); // sets PWM duty cycle
  45. }

Tussen M1 of M2 meet ik nu maar 6mV
Als ik meet tussen de + van M1 of M2 en de - (niet die van M1 of M2 maar die er naast staat) meet ik 546mV.
Als ik meet tussen de + en de - meet ik 3,77V vreemd genoeg werkt mijn motor hier niet op terwijl hij wel werkt op een gewone 1.2V AA batterij...

Francis
Offline
Member since: 2009-04-16

En zet eens een while(TRUE); na lijn 44. Want nu stopt de uC met werken na lijn 44 omdat je geen oneindige lus hebt. Hierdoor wordt de main opnieuw opgeroepen. En zo de hele tijd door waardoor je de PWM-modules geen kans geeft om een PWM-signaal te genereren.

Daarnaast moet je de spanning meten over de twee pinnen aangeduid met M1. Vervolgens meet je de spanning over de twee pinnen aangeduid met M2. Tenslotte is het ook eens interessant de spanning te meten over de + en de - maar die is 3,77 V zeg je wat bijzonder laag is (staan alle jumpers goed?). Wat voor spanningsbron heb je aangesloten op het bord? Je moet een spanningsbron van meer dan 7 V gebruiken (anders zal de microcontroller niet werken), bvb een 9 V battery-pack van lego ofzo. Voed het bord ook nooit met meer dan 20V!

Ohja, en als je RC-motor al werkt op 1,5 V kan het zijn dat de spanning van 9 V te hoog is voor je motor. Je moet eens kijken wat die maximaal aankan. Indien hij maar maximaal 5V aankan dan kan je best Jumper 2 uit het bord halen (zie http://www.dwengo.org/nl/board/jumpers) dan werken de motoren op 5V ipv de batterij-spanning.

stienoo
Offline
Member since: 2010-01-01

Om te testen heb ik hem gewoon via de programmer de usb stroom laten gebruiken, ik heb er wel een 9,6V batterij voor gemaakt.
Ik weet niet op hoeveel spanning deze motor in die auto werkte, ik heb hem namelijk nog van vroeger (de auto zelf is nu weg) maar het zal zo iets van een 5-10V zijn.
Als ik hem aansluit op de batterij meet ik zo'n 9.16V over de motor!

Edit

Hoe laat ik de motor trouwens in de andere richting draaien?

Michiel
Offline
Member since: 2009-04-17

Dat klopt, als je geen externe voedingsbron "Vin" aanlegt en jumper 2 staat in de stand "Vin", dan wordt de motordriver gevoed rechtstreeks uit de externe bron, en krijgt dus geen spanning. De USB-voedingsspanning is ook niet geschikt voor het leveren van de benodigde stroom om zware lasten zoals motors aan te drijven. Dus steeds een externe voedingsbron aanleggen als je met de motordriver werkt.

Om de motor in de andere richting te laten draaien moet je eenvoudigweg RA4 en RB3 hoog zetten. De PWM die je nu aanlegt, moet complementair zijn aan de PWM die je in de ene richting aanlegde om dezelfde snelheid te krijgen. Als je dus bv. snelheid 700 aanlegde in de ene richting, moet je nu (1023-700) = 323 instellen.

BInnenkort komen op de site een aantal bibliotheken beschikbaar, die o.a. het aansturen van de motor nog eenvoudiger maken. Dus zeker de site in de gaten houden.

Francis
Offline
Member since: 2009-04-16

Tof dat het probleem is opgelost. Ter aanvulling van Michiel hier een stukje code waar je je kan op baseren:

  1. void instellenSnelheidMotor1(short snelheid, short richting) {
  2. if (richting == 1) {
  3. SetDCPWM1(snelheid); // instellen PWM duty cycle, snelheid <1024 en > 0
  4. PORTAbits.RA4 = 0; // of RB3 (kijk naar schema voor exacte pin)
  5. } else {
  6. SetDCPWM1(1023-speed);
  7. PORTAbits.RA4 = 1;
  8. }
  9. }

Succes met je robot!
PS: laat hem ook eens zien als hij af is, ben wel benieuwd!

stienoo
Offline
Member since: 2010-01-01

Ik heb wat geprobeerd maar het lukt niet zo goed.
Ik heb deze code:

  1. if(S_S == 0){
  2. SetDCPWM2(600);
  3. Delay10KTCYx(240);
  4. SetDCPWM2(0);
  5. }
  6. if(S_N == 0){
  7. SetDCPWM2(1023-600);
  8. PORTAbits.RA3 = 1;
  9. Delay10KTCYx(240);
  10. SetDCPWM2(0);
  11. PORTAbits.RA3 = 0;
  12. }

Wat doe ik mis?

En als ik zo'n functie maak als hier boven, waar moet ik die dan in mijn code zetten?

Karel
Offline
Member since: 2009-04-17

Dag Stienoo

Wat is juist de bedoeling van het stukje code? Volgens mij wil je dat als je op het S knopje drukt dat de motor even in de ene richting draait en als je op het N knopje drukt even in de andere richting.

Hiervoor vertrek je het best van de broncode van de licht-etende robot. Je verwijder daaruit al de code binnnen de while(TRUE) lus, maar laar de lus zelf staan. Binnen die lus plaats je jouw eigen code. Ik heb ze een beetje aangepast.

  1. while(TRUE) {
  2. if(S_S == 0){
  3. SetDCPWM2(600);
  4. PORTAbits.RA3 = 0;
  5. }
  6. if(S_N == 0){
  7. SetDCPWM2(1023-600);
  8. PORTAbits.RA3 = 1;
  9. }
  10. Delay10KTCYx(240);
  11. SetDCPWM2(0);
  12. PORTAbits.RA3 = 0;
  13. }

De while(TRUE)-lus zorgt ervoor dat je programma telkens opnieuw controleert of een van de knopjes ingedrukt is. Zonder die lus gebeurt dat maar 1 maal en moet je heel veel geluk hebben als je op dat moment het knopje aan het indrukken bent.

Ik kan de code op dit moment niet controleren dus er zou nog een foutje in kunnen zitten.

Groeten
Karel

stienoo
Offline
Member since: 2010-01-01

Ik had mijn code al in een oneindige while-lus gezet maar had deze niet op het forum gepost.

Als ik deze code gebruik draait de motor altijd in dezelfde richting, alleen de ene keer iets sneller als de andere.

Mijn volledige code nu:

  1. #include <p18f4550.h>
  2. #include <timers.h>
  3. #include <delays.h>
  4. #include <pwm.h>
  5.  
  6. // Fuses configuration
  7. #pragma config PLLDIV = 5 // Divide by 5 (20 MHz oscillator input)
  8. #pragma config FOSC = HSPLL_HS // HS oscillator, PLL enabled, HS used by USB
  9. #pragma config IESO = OFF // Oscillator Switchover mode disabled
  10. #pragma config PWRT = OFF // PWRT disabled
  11. #pragma config BOR = OFF // Brown-out Reset enabled in hardware only (SBOREN is disabled)
  12. #pragma config WDT = OFF // HW Disabled - SW Controlled
  13. #pragma config WDTPS = 32768 // 1:32768
  14. #pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled
  15. #pragma config LVP = OFF // Disable low-voltage programming
  16. #pragma config CCP2MX = ON // CCP2 multiplexed to RC1 and not to RB3
  17. #pragma config PBADEN = OFF // PORB digital IO on powerup
  18.  
  19. #define TRUE 1
  20. #define S_N PORTBbits.RB4
  21. #define S_E PORTBbits.RB1
  22. #define S_S PORTBbits.RB5
  23. #define S_W PORTBbits.RB0
  24. #define S_C PORTBbits.RB2
  25.  
  26. void main(void) {
  27.  
  28. TRISB = 0xFF; // port B as inputs (buttons)
  29. INTCON2bits.NOT_RBPU = 0; // enable port B pull-up (buttons)
  30.  
  31. // set motor pins as output
  32. TRISAbits.TRISA4 = 0;
  33. TRISBbits.TRISB3 = 0;
  34. TRISCbits.TRISC1 = 0;
  35. TRISCbits.TRISC2 = 0;
  36.  
  37. PORTAbits.RA4 = 0; //ground
  38. PORTBbits.RB3 = 0; //ground
  39.  
  40. // PWM period = (0xFF + 1)*4*Tosc*T2Prescaler
  41. OpenPWM1(0xFF); // configuring PWM module 1
  42. OpenPWM2(0xFF); // configuring PWM module 2
  43.  
  44. // Configuring timer 2 which provides timing for PWM
  45. // TIMER_INT_OFF: disable timer interrupt
  46. // T2_PS_1_4: Timer2 prescaling set to 4
  47. // T2_POST_1_1: Timer2 postscaling set to 1
  48. OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
  49.  
  50. SetDCPWM1(0); // sets PWM duty cycle
  51. SetDCPWM2(0); // sets PWM duty cycle
  52.  
  53. while(TRUE) {
  54. if(S_E == 0){
  55. }
  56. if(S_W == 0){
  57. }
  58. if(S_C == 0){
  59. }
  60. if(S_S == 0){
  61. SetDCPWM2(600);
  62. PORTAbits.RA3 = 0;
  63. }
  64. if(S_N == 0){
  65. SetDCPWM2(1023-600);
  66. PORTAbits.RA3 = 1;
  67. }
  68. Delay10KTCYx(240);
  69. SetDCPWM2(0);
  70. PORTAbits.RA3 = 0;
  71. }
  72. }
Karel
Offline
Member since: 2009-04-17

Dag Stienoo

Vervang eens overal RA3 door RB3?

Karel

stienoo
Offline
Member since: 2010-01-01

62:Error [1205] unknown member 'RB3' in '__tag_33'
62:Error [1131] type mismatch in assignment
66:Error [1205] unknown member 'RB3' in '__tag_33'
66:Error [1131] type mismatch in assignment
70:Error [1205] unknown member 'RB3' in '__tag_33'
70:Error [1131] type mismatch in assignment

Is de fout die ik dan krijg...

Karel
Offline
Member since: 2009-04-17

Dag Stienoo

Je hebt waarschijnlijk PORTAbits.RB3 gebruikt. Het moet PORTBbits.RB3 zijn. Subtiel verschil, maar wel belangrijk.

Groeten
Karel

stienoo
Offline
Member since: 2010-01-01

Nee, zo als in de code hierboven heb ik wel degelijk PORTBbits.RB3 gebruikt.

Nog iets wat fout kan zijn?

Karel
Offline
Member since: 2009-04-17

Hallo

Ik denk toch dat je een foutje getypt hebt. Ik heb de code gecompileerd en bij mij werkt het. Als ik daarentegen een fout schrijf in PORTBbits dan krijg ik dezelfde error als jij. Let ook op de hoofdletters C-code is hoofdletter-gevoelig.

Als dit niet lukt stuur dan je code eens naar Email address info@dwengo.org .

Karel

stienoo
Offline
Member since: 2010-01-01

Nu zit ik met een lastig probleem, namelijk dat ik nu geen spanning meer op mijn motor pinnen krijg.
Op de +/- staat er nochtans wel spanning (10V)
Het vreemde is dat mijn motortjes eerst nog maar in 1 richting wouden draaien en daarna helemaal niet meer, zelfs met eens simpele testcode werken ze niet meer.
Hopelijk kunnen jullie mij helpen.

Karel
Offline
Member since: 2009-04-17

Dag Stienoo

Ik heb jouw code eens getest en die doet wat ze hoort te doen.

Ik vrees dus dat je de motordriver stuk gemaakt hebt, door hem te overbelasten. Dat is geen groot probleem, want je kan hem eenvoudig verwisselen. Hij zit onder het display. Haal hem eruit en ga ermee naar de dichtstbijzijnde elektronica winkel. Normaal kost hij een 3-tal euro, denk ik. Als ze die specifieke chip niet hebben kan je ook een L293D kopen, die is pin-compatibel.

Om in de toekomst te vermijden dat je nieuwe driver stuk gaat, zal je best andere motoren gaan gebruiken. De motoren die je nu gebruikt vragen waarschijnlijk teveel stroom. Die stroom moet door de motordriver. Hij kan maximaal 1.2A voeren.

Groeten
Karel

stienoo
Offline
Member since: 2010-01-01

Als ik er in de winkel naar vraag, moet ik dan naar een SN754410NE vragen of een 76CN6XM?
Het kan inderdaad al een redelijk zware motor geweest zijn.
Is het ook nuttig een voorschakelweerstand voor deze motor te plaatsen om een stroompiek te voorkomen of gaat dit niets helpen?

Karel
Offline
Member since: 2009-04-17

Hallo

Je moet naar een SN754410NE vragen. Zeg erbij dat het een motordriver is.

Een voorschakelweerstand zal de stroom beperken, maar ook het vermogen van de motor. Dat laatste wil je misschien niet.

Het kan ook zijn dat de motor die je gebruikt voor een lagere spanning ontworpen is. Bij een te hoge spanning zal zon'n motor veel stoom vragen.

Heb je de specificaties van die motor? Typenummer?

Groeten
Karel

stienoo
Offline
Member since: 2010-01-01

Nee die heb ik niet.
Het zijn 2 motortjes uit een oude RC-auto maar er staat nieks op.

Michiel
Offline
Member since: 2009-04-17

Weet je nog de batterij-indeling van deze RC-auto? Bijvoorbeeld 4 AA-batterijen geeft 6V.
Let er ook op dat wanneer je de motor van volle snelheid vooruit onmiddellijk naar volle snelheid achteruit schakelt, er een grote stroompiek optreedt, omdat de motor even blijft verder werken als generator in de voorwaartse richting. Vermijd dergelijke situaties dus.

stienoo
Offline
Member since: 2010-01-01

Het zijn idd 4 AA-batterijen!
Dus maximum 6V?
Ik ga waarschijnlijk morge een nieuwe motor driver kopen.

Michiel
Offline
Member since: 2009-04-17

Inderdaad, dan heb je motors voor maximum 6V. Bij gebruik van oplaadbare batterijen is dit zelfs slechts 4.8V. Je zal dus ofwel andere motors moeten gebruiken, ofwel de stroom door je motors beperken, bv. met een serieweerstand van enkele ohms. Deze laatste oplossing is niet bijster efficient, maar wel eenvoudig.

stienoo
Offline
Member since: 2010-01-01

Ik ben er gaan kope! ('k had wienig tijd)
Maar als ik de stroom wil beperken tot 1A dan moet ik 5/1=5ohm gebruiken?
Klopt dit?

Karel
Offline
Member since: 2009-04-17

Dag Stienoo

5 ohm gaat te veel zijn omdat er ook spanning over de motor zal staan, maar je kan daar mee beginnen. Let wel op dat de stroom die door de motor gaat ook door de weerstand gaat en dat deze daar moet op voorzien zijn. Als 1A door een weerstand van 5ohm loopt dan moet die 5 Watt dissiperen, wat veel te veel is voor een standaard elektronica weerstandje.

Groeten
Karel

stienoo
Offline
Member since: 2010-01-01

Oh, en gaat deze 1.2A over de 2 motors te samen of mogen ze ieder 1.2A trekken?

Michiel
Offline
Member since: 2009-04-17

Elke driveruitgang kan 1.2A leveren. Dit staat ook beschreven bij de sectie over de functionaliteit van het bord. Dus dat is 1.2A per motor.