MikroBasic en Servomotor

Bavelt

Golden Member

Die potmeter wordt gedraaid door de tandwielen. Daarmee wordt dus blijkbaar bepaald wanneer de motor moet stoppen. (ipv een mechanische blokade).

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Potmeter zit er altijd in. Hoe moet de servo anders weten waar te stoppen?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Voor "motortje" toepassingen zijn servos ook wel aardige dingen: Kleine motor, stuur electronica en vertragingsbak in een.

Een normale servo kan "ongeveer 180" graden draaien dat is voor vliegtuigjes prima. Dat is ook in theorie de 1ms-2ms range.

Nu is een standaard potmeter iets van 270 graden. Dus als je geen andere beperkingen in het ding stopt, dan zou een bereik van ongeveer 270 gr mogelijk moeten zijn. Vandaar dat je hem vaak wat kan "oversturen". Anderzijds, als dat ding ergens tegenaanloopt en dan kracht gaat proberen te zetten terwijl ie niet verder kan is dat zonde van de stroom die daarvoor nodig is. Vandaar dat "men" 180 of iets meer specificeert om zeker te weten dat dat haalbaar is en alles wat je meer kan is dan meegenomen.

Om van een normale servo een "geschikt voor motor toepassing" versie te maken, moet je hem open halen, de verbinding tussen de uitgangsas en de potmeter verbreken en de potmeter in het midden zetten. Eventueel zijn er nog andere palletjes die voorkomen dat je hele rondjes kan draaien: ook die moeten er uit.

Over het algemeen worden servos die deze mod hebben ondergaan 360 graden servos genoemd. Omdat de mod voor sommige mensen een beetje tricky is, en het best vaak gedaan wordt, zijn ze ook "pre-modded" te koop tegenwoordig.

Je hebt nu een quote gestuurd dat dat extra palletje er uit zou zijn. Of ze de verbinding met de potmeter verbroken hebben weet ik niet.

Als de verbinding met de pot verbroken is (en de pot in het midden staat), dan is het gedrag dat ie bij 2ms de ene kant op gaat draaien en bij 1ms de andere. Om stil te staan moet je 1.5ms sturen. (en daar zit behoorlijk wat exemplaar spreiding in).

Ik krijg de indruk dat jou servo noch het standaard servo gedrag noch het "gemodde" gedrag vertoont. Ik weet niet wat je nu in huis hebt....

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Er zit wel een mechanische stop op, ik heb 2 dezelfde en daar zit dat ook in.
In deze video aan 1.27min zie je wat dat is.
https://www.youtube.com/watch?v=zV_5wUo7Kxs

LDmicro user.
Arco

Special Member

Stop is er uit:

Let op: Deze servo wordt geleverd zonder eindpin (begin- en eindpositie wordt bepaald door potmeter).

Wat een achterlijke gladiool met die video / pokkenherrie...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Maken ze dan zoveel verschillende servo's onder hetzelfde typenummer? Die herrie hoor ik niet, heb geen speakers enkel een koptelefoon ;)

LDmicro user.
Bavelt

Golden Member

Er zit wel een mechanische stop op, ik heb 2 dezelfde en daar zit dat ook in.
In deze video aan 1.27min zie je wat dat is.
https://www.youtube.com/watch?v=zV_5wUo7Kxs

Aan de buitenkant lijkt deze dezelfde als ik heb, ook Tower Pro TM.

Ik heb echter maar 2 schroefjes ipv 4 en er zitten géén stopjes aan de tandwielen...
Het motortje zit er ook anders in dan in deze video...

Fouten zijn het bewijs dat je het probeert..

Dat weten we dan ook weer, opletten dus wat we online kopen.

LDmicro user.
Bavelt

Golden Member

Ik heb hem weer in elkaar gezet.
Ik krijg de positie precies goed met:

3450 = 1,05 ms = linker stand.
6825 = 2,08 ms = middenstand.
10200 = 3,112 = rechterstand.

Wanneer ik de waarde hoger maak dan 11000 (= 3,36 ms) dan gaat-ie ronddraaien.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Maar...Je mag niet switchen van 1,05 ms naar 2,08 ms in één keer.
Dan bedankt de motor voor de eer en neemt siësta... :Z

Je moet dat in stapjes doen van bijvoorbeeld 75us.
Dan wil hij wel van positie veranderen.

Blijft erg vreemd allemaal.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 12 augustus 2020 15:47:17 schreef MGP:
Dat weten we dan ook weer, opletten dus wat we online kopen.

Deze komt uit de reguliere electronca winkel...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Om hier toch nog even op door te gaan (De aanhouder wint zeggen ze wel eens..) :)

Ik heb het motortje even aangesloten op de Arduino UNO met een simpele sketch. En dat werkt direkt: het doet precies wat ik in MikroBasic Wilde doen: de motor 90 graden laten draaien zonder (zichtbare ) stapjes.
Dat gebeurt in de library servo.h met het commando servo(...) waarbij je de hoek opgeeft.

De sketch:

c code:

#include <Servo.h>
Servo servo;

void setup() {
 servo.attach (8);
 servo.write(0);
 delay(2000);

}

void loop()  {

  servo.write(90);
  delay(1000);
  servo.write(0);
  delay(1000);
  
}

Wat doeet de Arduino nu wel wat in MikroBasic niet lukt?
De library servo.h heb ik bijgevoegd.

Het MB-Programma:

pic basic code:

program PWM_1572

'=====================================================
' Processor: 12F1571/72 - 32MHz (8MHz int * 4xPLL)
'=====================================================

Dim   Duty As LongInt
      Cnt  As LongInt

Const MINPWM = 3450                'Min value puls (65536/20000) * uS min
      MAXPWM = 10300               'Max value puls (65536/20000) * uS max
      MEDPWM = (MAXPWM - MINPWM) / 2 + MINPWM  'Neutral position
main:


  TRISA         = %00000000
  ANSELA        = 0
  LATA          = 0
  OSCCON        = %11110000
  OSCTUNE       = 0
  Pwm3_init(50,64)
  Pwm3_Start()

  While True
    Duty = 3300              '1 ms
    Pwm3_Set_Duty(Duty)
    Delay_ms(1000)

    Duty = 6875              '1,5 ms
    Pwm3_Set_Duty(Duty)
    Delay_ms(1000)
  Wend
  
End.
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Geen idee wat servo.attach(8) en servo.write(0) doen (ik wil het ook niet weten... ;) )
Heb je het ook al geprobeerd met dezelfde waardes als in arduino? (544,1500,2400)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 12 augustus 2020 23:00:24 schreef Arco:
Geen idee wat servo.attach(8) en servo.write(0) doen (ik wil het ook niet weten... ;) )
Heb je het ook al geprobeerd met dezelfde waardes als in arduino? (544,1500,2400)

Servo attach(8) koppelt pin 8 van het UNO board aan de PWM output. Write(0) is het schrijven naar de beginpositie (0 Gr).

De waarden van Arduino heb ik (nog) niet geprobeerd.
Ga ik morgen doen..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Vandaag de draad maar weer eens opgepakt. En kwam tot een opmerkelijke constatering.
Om de servo 90 graden te laten draaien geeft de Arduin een puls van 05 - 1,5 ms. Heen en weer. Werkt.

Dus heb ik het MB programma hetzelfde laten doen. Gecheckt met een 2-kanaals scope. Beide signalen gelijk.

Toch doet aansluiten op de Arduino het wel en op de PIC12F1572 via Pickit niet.
Dat was vreemd.

Dus heb ik eens naar de voeding gekeken. En wat blijkt?
Als ik de voeding van de servomotor op de Arduio aansluit, maar de puls uit het MB project pak, dan werkt het!
Ik kan MB nu aanpassen op andere getallen, werkt allemaal. Maar du moment dat de voeding uit de Pickit komt, gaat het mis.
Beide zijn 5 Volt.

Wat kan hier nu aan de hand zijn?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Een mens zal af en toe moeten aanvaarden dat sommige dingen onverklaarblaar blijven.. :/

Ik had het na alle voorgaande ervaringen zo gedaan: eerst programmeren, dan met een externe voeding van 5V het ding aanzetten. Dat werkt dus gewoon. ;)

En nu terug naar de Pickit...die de schakeling van power voorziet. in de verwachting dat het niet werkt.
Maar het werkt nu ook gewoon. Zelfde programma. :)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je voedt de servo toch niet uit de pickit hoop ik? (die is niet geschikt en/of bedoeld om motors van stroom te voorzien)
De servo moet je een normale losse voeding aan hangen...

[Bericht gewijzigd door Arco op vrijdag 14 augustus 2020 22:37:47 (13%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 14 augustus 2020 22:31:37 schreef Arco:
Je voedt de servo toch niet uit de pickit hoop ik? (die is niet geschikt en/of bedoeld om motors van stroom te voorzien)
De servo moet je een normale losse voeding aan hangen...

Ik had de servo idd uit de PicKit3 gevoed. Ik werk bij het testen van schakelingen tot nu toe altijd met de Pickit. (Nu even niet gerealiseerd dat het met een Servo niet handig is ivm stroomverbruik).

Maar ook omdat de eerste oefening even met de Arduino was, waarbij in de voorbeelden die ik vond er ook geen sprake is van externe voeding. De Arduino UNO hangt ook gewoon aan de USB van de PC, zelfde poort.

Maar OK, niet meer doen dus.. ;(

Het rare en onverklaarbare zit in het feit dat in eerste instantie het ding liep met een for-next loop en niet ineens van bv 0 naar 90 Graden.
Dan zou hij het altijd niet moeten hebben doen lijkt me.

Maar Ok, weer een les (en heeel veel uren verder) verder... :X

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De servomotor trekt bij opstarten waarschijnlijk veel meer als de 100mA die de pickit kan leveren. Dan reset de boel.
Daarom werkt 't in een loop wel. Waarschijnlijk gaan dan ook de eerste instellingen mis, maar dat merk je niet.
(na een paar commando's draait de servo en bij volgende commando's is het stroomverbruik lager, omdat 'ie al draait)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Dat klinkt idd heel logisch. ;) .En verklaart ook het 'vreemde' gedrag.

En inderdaad, het viel me al op dat de voedingsled die ik er altijd aan heb hangen, licht knipperde bij een beweging van de servo.

Zo zie je maar weer...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Waarom mag dit niet in MikroBasic?

pic basic code:

While UART1_Data_Ready() = 1
    Receive = UART1_Read()
    Str = Str + Receive

    If Str = "rood" then ......

Melding: Operand not applicable to these operands "str"

Hoe dan wel de inhoud van een string opvragen?

[Bericht gewijzigd door Bavelt op maandag 17 augustus 2020 17:22:14 (92%)

Fouten zijn het bewijs dat je het probeert..

Even over debuggen: Het is dus handig om je code iets te laten doen wat je herkent als ie opstart. Dat je dus zo'n reboot-loop kan herkennen. Ledje aan, wacht, ledje uit. Of andersom. Als dat ledje dan gaat lopen knipperen weet je dat er iets aan de hand is.

Over de servos: Ik heb eens gemeten: Als je zeg 90 of 180 graden aan "stap" commandeert dan trekt zo'n servo makkelijk 1A aan stroom. Zo'n klein kreng en dan 1A !

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

Moeilijk wat zinnigs te zeggen zo. Wat is Str? Wat is Receive?
Voor strings vergelijken gebruik je StrCmp(stringA, stringB)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Even over debuggen: Het is dus handig om je code iets te laten doen wat je herkent als ie opstart. Dat je dus zo'n reboot-loop kan herkennen. Ledje aan, wacht, ledje uit. Of andersom. Als dat ledje dan gaat lopen knipperen weet je dat er iets aan de hand is.

Deze methode gebruik ik inderdaad veel. Ik heb daar een routine voor gemaakt:

pic basic code:

Sub Procedure Knipper(Dim Aantal as byte)
 For i1 = 1 to Aantal
   LATA.4 = 1
   Delay_ms(500)
   LATA.4 = 0
   Delay_ms(500)
 Next i1
End Sub

En dan kan ik in de code het ledje een herkenbaar aantal keren laten knipperen, bijvoobeeld bij opstarten:

pic basic code:

Knipper(5)

Ik heb de constructie mbt de Pickit gewijzigd: ik haal geen voeding meer uit de PicKit, maar uit een externe 5V Adapter. Dit werkt nu helemaal prima.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Moeilijk wat zinnigs te zeggen zo. Wat is Str? Wat is Receive?
Voor strings vergelijken gebruik je StrCmp(stringA, stringB)

Str is een string, receive de byte (char) die ik één voor één ophaal via UART (vanuit bluetooth).
De string wordt steeds aangevuld met 1 karakter totdat hij compleet is.

En dan wil ik de inhoud van de string vergelijken met een constante.
Maar if Str = "rood" geeft een syntax error. Je mag wel "Str = "rood" doen,
maar met if is dat blijkbaar niet toegestaan.

Maar idd wel dus:

pic basic code:

If Strcmp(Str, StrC) = 0 then .....
Fouten zijn het bewijs dat je het probeert..