Styra motor m ljussensorer / encoder via Arduino kod

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av fosfor »

Hej!

Jag skulle vilja veta hur jag med hjälp av signalen jag får (se foto) från min rotary encoder motor, kan styra den mer exakt.
Ser signalen korrekt ut? Vad bör jag tänka på etc? Vilken kod är bra? :humm:
Som det är just nu är allt upphakat till en Arduiono.

Motorn har egen strömförsörjning. Jag kan höja sänka hastighet, och reversera riktning, från några knappar kopplade via Arduinon.
Är alltså ute efter att Arduion läser signalerna från Encodern, och att jag på så vis kan styra motorn mer exakt.

En annan amatör jag var i kontakt med säger att det inte går utan viss elektronik mellan den här signalen och Arduinon?
Tack på förhand.

Mvh F
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av Icecap »

Tja - det borde väl gå, själv med en Arduino... som ju bara är en trött gammal µC.

Oftast gör man så att man fångar tiden mellan pulserna (t.ex. förkant-till-förkant) och jämför med vad den "ska" vara för att sedan justera drivningen efter de mätningar. Upprepas snabbast möjligt helt enkelt.

Detta sätt ger konstant hastighet på långt men ger rimligt säkert en del variationer på kort sikt.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av fosfor »

OK! Tack

Här kommer lite mätresultat på den som jag gjorde nyss.

Om jag kopplar in Oscilloskopet mellan 1 och 4 och handrullar encodern
+0.9 Volt i lågt läge på sensorn
och
+2.12 Volt i högt läge på sensorn

Om jag kopplar in Oscilloskopet mellan 1 och 3 och handrullar encodern
-2 Volt
och
+2.1 Volt
Den stannar även ibland på +0.8 Volt och -0.8V

Vad tror ni om det?
Det borde väl räcka för att kunna låta Arduinon läsa av detta?
Resten är väl bara kod?

Jag skulle vilja ha så att den räknar i nummer med hjälp av encodern.
Så att den blir väldigt exakt. Finns även i viss kod att den korrigerar om den råkar åka något för långt t.ex.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av hawkan »

"Problemet" är de fyra signalnivåerna som gör att det inte går att rakt av använda en digital input-pinne och koppla en interrupt till den. Digital input klarar bara att skilja på två nivåer hög och låg.

Det jag tror man kan göra är att använda en AD-pinne. Specifikt sätta den i "ADC free running mode" och höja AD-frekvensen på bekostnad av upplösningen som inte behöver vara jättebra för att skilja på de fyra nivåerna. Kring 38000 analoga samplingar per sekund verkar vara möjligt att uppnå. För mer info t ex https://chisight.wordpress.com/2016/03/ ... mega-328p/

Går det inte att få de två signalerna separerade? Isåfall skull ett färdigt encoder-bibliotek kunna användas t ex https://playground.arduino.cc/Main/RotaryEncoders (kallas för quadrature).
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av KLset »

Blev intresserad av detta, så här är vad jag grävt fram...
600px-Quadrature_Diagram.svg.png
dual_sensor_track_figure4.png
Det verkar vara en optisk pulsgivare (roterande och inkrementell). Det är två optiska sensorer som läser av strecken på skivan. Sensorerna är placerade så att de är 90 ur fas, om du räknar det som en fas att skivan roteras med ett streck (från början på ett streck, över till "vitt" och stopp precis innan nästa streck). Det du mätt up är således signalerna från dessa två optiska sensorer som är 90 grader ur fas. När pulsgivaren snurrar medurs anländer A först, följt av B och vice versa när den snurrar moturs. Det är bara när A och B ändras samtidigt från en mätning till en annan som en förändring har skett i riktningen. Se tabellen nedan.
xtruth_table_figure6.png
Läs av dem genom interrupt eller polling. Som jag förstått det kan du få konstiga värden om du inte läser av tillräckligt ofta, vilket kan få det att se ut som att pulsgivaren rör sig i motsatt riktning.

Sedan kan det finnas en Z-signal också som anländer en gång per rotation på skivan, vilket kan användas som en fast referens.

Från Arduino-dokumentationen till analogRead(): "The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023."

(Fina bilder från Wikipedia och revotics.com.)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av KLset »

fosfor skrev: Här kommer lite mätresultat på den som jag gjorde nyss.

Om jag kopplar in Oscilloskopet mellan 1 och 4 och handrullar encodern
+0.9 Volt i lågt läge på sensorn
och
+2.12 Volt i högt läge på sensorn

Om jag kopplar in Oscilloskopet mellan 1 och 3 och handrullar encodern
-2 Volt
och
+2.1 Volt
Den stannar även ibland på +0.8 Volt och -0.8V
Bilden du bifogade med mätningen, är det mellan 1 och 3? Gissade med tanke på mätningarna som du skrivit. Då verkar det ut som att signalerna A och B går på 3. Snurrar du i andra riktningen så borde signalen spegelvändas.

Vad är det då som är på 4? :humm: Går det bara mellan +0.9 och +2.12 mellan 1 och 4, hela varvet runt?
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av fosfor »

Hej! KLset

Ja, det är till 1 och 3.
Precis, den bilden blir helt spegelvänd om motorn snurrar åt andra hållet.

Känns ju som att denna signal borde kunna användas som
1. Startar åt högra hållet
2. Kör konstant åt högra hållet.
3. Bromsar åt högra hållet.
4. Stoppar.

Och viceversa i reverserat tillstånd. Typ :humm:
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av KLset »

fosfor skrev: Känns ju som att denna signal borde kunna användas som
1. Startar åt högra hållet
2. Kör konstant åt högra hållet.
3. Bromsar åt högra hållet.
4. Stoppar.

Och viceversa i reverserat tillstånd. Typ :humm:
Jag tror att B har högre spänning än A. Se bilden jag bifogat. Den svarta vågen är den sammanlagda (A + B) vilket är vad du uppmätt. Jag har delat upp den i A (grön) och B (röd). Nu är det bara att mäta och följa tabellen.
signal.jpg
En kodsnutt nedan i Python eller pseudokod som jag ibland kallar det. Kolla i bilden med tabellen som jag postade tidigare. I den första kolumnen från vänster är fyra rader eller tillstånd. Jag kallar dessa fyra tillstånd för 1 till 4. normalize2state() är en funktion som normaliserar spänningen till ett av de fyra tillstånden.

Kod: Markera allt

current_state = None
while True:
    voltage = analogRead()
    next_state = normalize2state(voltage)  # normalize voltage to one of four states

    if current_state is None:
        current_state = next_state

    if current_state == 1 and next_state == 2:
        print("reverse")
    elif current_state == 1 and next_state == 3:
        print("forward")
    elif current_state == 2 and next_state == 1:
        print("forward")

    # and so on for the rest

    elif current_state == next_state:
        print("stopped")
Jag hoppas att jag förstått det hela rätt. Kanske någon mer erfaren EF:are vill komma med en kommentar. Vad gäller spänningen är det nog bäst att kolla vad för spänning Arduinon klarar av på sina pinnar innan du kopplar.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av hawkan »

Erfarenhet av att leta efter arduino-bibliotek kanske jag har :)
Bra beskrivning, separering av signalerna och få rätt signalnivå för en Arduino är väl det som behövs.
Sedan skulle jag utnyttja ett färdigt bibliotek som https://www.pjrc.com/teensy/td_libs_Encoder.html
som har både beskrivning och kod-exempel.
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av KLset »

hawkan: Det går ju att ta signalen som den är, eftersom man kan skilja på de fyra tillstånden med Arduinons analogRead(). Men om man inte kan köra räknaren - loopen i min exempelkod - snabbare än vad pulserna anländer då motorns hastighet är som störst kommer räknaren att missa pulser och det blir ju inte bra. Kan man göra det snabbt nog då? Från dokumentationen till analogRead(): "It takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second." Om det räcker vet jag inte.

fosfor: A och B borde gå på olika trådar, inte samma. Något annat verkar orimligt. Är det inte en pinout som syns på nedre sidan? Ta fler bilder och lägg upp!
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av fosfor »

Tack för alla svar!

KLset, jag är helt med på vad du tänker, tycker också det borde finnas två separata kanaler.
Men jag kan bara få den där trappstegssignalen från ett enda ställe, vilket är de pinnarna på det här fotot där krokodilklämmorna inte är inkopplade.

Där krokodilklämmorna Är inkopplade går det 3V och 30mA till själva sensorn. De andra två, röd och blå, är matning till motorn.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av fosfor »

Jahapp... forumet roterade fotot automatiskt till fel vinkel. Fast det var rättroterat på datorn :roll:
Testar igen efter lite redigering.

Alltså, där krok-klämmorna inte är inkopplade. Dvs på 1 och 3, det är enda stället jag får min trappstegssignal på oscilloskopet. Som syns uppe i tråden på ett foto.
De andra 4 inkopplingar är matning till sensor/mottagare och motorn.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av fosfor 2 januari 2018, 11:18:56, redigerad totalt 2 gånger.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av fosfor »

Övrig info:

Motorn har suttit i en Canon bläckstråleskrivare.
Har googlat på all text och siffror jag kunnat hitta på motorn men ej lyckats hitta något datablad.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av Micke_s »

För få digitala signaler kan du titta på komparatorer...
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Styra motor m ljussensorer / encoder via Arduino kod

Inlägg av fosfor »

Nu gjorde jag ett vilt test och tror mig ha hittat kanal 1 och 2 för sensorerna.


1 = Sannolikt Sensor 1
Kopplade in ett 4.7k ohms motstånd och mellan motståndet och sensorn så kan voltskillnad mätas.
Långsamt handrullat switchar den mellan 0,8 - 1,6V
Med motorn igång ligger den stadigt på 1.2V

2 = Matning till LED, kör 2V och 50mA
Mäts 2V stadigt hela tiden

3 = Sannolikt Sensor 2
Kopplade in ett 4.7k ohms motstånd och mellan motståndet och sensorn så kan voltskillnad mätas.
Långsamt handrullat switchar den mellan 0,14 - 2V
Med motorn igång ligger den stadigt på 1V

4 = GND

Jag tycker att jag här borde kunna mäta två olika fyrkantsvågar från dessa sensorer.
Som ju ska agera signaler in till Arduinon. Men hittils visas inget på Oscilloscopet?? :humm:
Ska testa vidare.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar