Arduino och stegmotor, välja antal steg via LCD

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Arduino och stegmotor, välja antal steg via LCD

Inlägg av Jonaz »

Håller på med en fodermatare och har kört fast.
Behöver hjälp med en funktion, att med två knappar (mer eller färre steg) kunna ställa in hur många steg stegmotorn skall ta och detta skall visas på en LCD så man vet, och här har jag kört fast helt.

Detta värde skall senare kunna sparas i eeprom, men det känns om ett senare problem.
Är det någon som vet hur man skall gå vidare, länk eller förslag?
Lite luddig förklaring kanske men ni har förhoppningsvis sett värre...
Användarvisningsbild
gOry
Inlägg: 5090
Blev medlem: 6 juni 2003, 22:41:25
Ort: Stockholm
Kontakt:

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av gOry »

Inget svar på frågan, men..
Måste de användas en stegmotor? På vilket sätt matar den fram foder?
I en vendingmaskin så matar man kaffe/choklad/socker osv med en precision nära 0.1g med enbart dc/ac motorer och tid.
Väldigt lågt växlade motorer, skulle tro att de är typ 40-80-rpm
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Jonaz »

Det skall matas som en vendingmaskin.
Beror väl egentligen mest på att jag har två små stegmotorer.
Användarvisningsbild
gOry
Inlägg: 5090
Blev medlem: 6 juni 2003, 22:41:25
Ort: Stockholm
Kontakt:

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av gOry »

Om du är intresserad kan jag kika ifall jag har några behållare och motorer liggandes. Fast de beror ju på vad de är för foder funkar ju inte med större bitar..
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Jonaz »

Kanske skulle tillägnas att det är för fiskfoder.
Det är för pellets från 0,8mm upp till 5mm
Och sedan tänkte jag ha en för flingor/flakes som är väldigt tunna.

Ja om du har lust och kasta ett öga, dock så vill man inte att det blir för stort/klumpigt

Här är en bild på hur tanken är att det skall vara.
Bild
Bild

Jag har en sådan som är på bilden med den matar på tok för mycket, minsta inställning är ett varv.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Icecap »

Jag är ganska osäker på vari problemet ligger.

Det mekaniska ska såklart lösas men hur beror på stegmotorernas storlek osv. så jag antar att det rör sig om programmeringen.

Att koppla till ett LCD till en Ardunånting ska knappast vara ett problem, det finns ju färdiga rutiner för det.
Att visa antal steg bör inte vara ett problem heller, alltså är det stegningen som är kvar.

Och stegningen av stegmotorn är inget större problem. Jag vill föreslå att det körs med halvsteg men att den bara räknas helsteg, då kan enheten stanna på ett helsteg och sedan släcka för strömmen när det ska vilas.

På en unipolär stegmotor finns det 5 (eller 6) anslutningar:
A1: Ena "sida" av lindning A
A2: Andra "sida" av lindning A
B1: Ena "sida" av lindning B
B2: Andra "sida" av lindning B
Common: Gemensam för lindningarna, kan vara 2 ledare.

Oftast kopplar man var sin NPN/N-MOSFET transistor mellan GND och lindningarnas utgångar.
Common lägger man då till VCC.

En stegsekvens är då som följer:
* A1 på.
* A1 & B1 på.
* B1 på. Räkna 1 steg.
* B1 & A2 på.
* A2 på. Räkna 1 steg.
* A2 & B2 på.
* B2 på. Räkna 1 steg.
* B2 & A1 på.
* A1 på. Räkna 1 steg. Detta är även första steget i tabellen och "cirkeln" är alltså sluten.

För varje steg i tabellen får man vänta en viss tid, hur lång beror på motorn och drivningen men det är ganska kort tid. Och hela sekvensen kan enkelt byggas som en tabell som "rullas" i det dubbla antal steg för att kompensera för halvstegen.

När stegningen sedan är klart (efter att matningen är utförd) kan styrenheten släcka spänningen helt, då ska magnetkraften hålla motorn i läge. Ska det stegas igen är det bara att slå på ström igen och fortsätta från samma läge.
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av SeniorLemuren »

Eller också köper du en sådan här. Eller liknande, beroende på vad du har för stegmotor. Sedan stegar du den med en enkel loop i ditt program. Då behöver du inte bry dig om stegsekvener m.m. det sköter stegmoptor-drivern om åt dig.
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Jonaz »

Efter Icecap´s inlägg så ser jag att att jag var ganska otydlig.

Att få igång LCD är inga problem, lika så med stegmotorn.
Jag har hittat och modifierat en alarmsketch bytt utgångs pinnar, lagt till en DS1307 klocka och tagit bort visningen av år/månad.
Men när ett alarm blir aktivt så skall stegmotorn börja snurra, och hur mycket den skall snurra skall ställas in i förväg.

Det är just konsten att ställa in i förväg som är problemet, efter som man inte vill ha den inkopplad till datorn.

>>Senioren
Det är sådana jag har.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Klas-Kenny »

Som vanligt,
Det är få som har tid eller lust att sitta och skriva färdig kod till dig. Börja gärna med att visa upp vad du försökt med, som inte verkar fungera (för du har väl försökt?) så kan man utgå ifrån det och berätta vad som kan vara fel i ditt försök.

Vad jag förstår så har du fått ihop kod för att köra stegmotorn ett visst antal steg, då är det ju bara att byta ut det hårdkodade värdet mot en variabel. Sen ställa variabeln genom att kort och gott skriva ut den på displayen och trycker man på en knapp minskar du variabeln och skriver ut den igen på displayen, trycker man på andra knappen ökar du variabeln och skriver ut den på displayen igen. Inget särskilt svårt. :)
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av SeniorLemuren »

Det beror lite på hur du använder din µC. antingen så väljer du att känna av resp. port från knapparna i din main-loop eller så väljer du att hoppa till en avbrottsrutin när någon av knapparna trycks in.

I båda fallen måste du förstås ta hand om kontaktstuds. Sedan är det ju bara att addera på ett värde på en variabel varje gång öka_knappen trycks in eller subtrahera samma värde när minska_knappen trycks in, skriv ut variabeln, spara de i Eprom och vänta på ny knapptryckning. Ett annat sätt är att räkna upp/ned variabeln så länge du håller resp. knapp intryck.

Skall flera värden programmeras så gör du en meny där du kan välja vilken variabel du vill programmera. Den kan ju funka på precis samma sätt. Addera en variabel med ett vid varje tryck på menyknappen och hoppa till det menynummer du vill programmera. Om du t.ex har 5 olika menyer så börjar du om från början när du nått sista menyvalet, på så vis räcker det med en knapp till menyval.

Hoppas jag förstått vad du frågade efter, annars får vi ta det igen. :)

Klas-Kenny slank in före mig men jag postar detta i alla faal.
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Jonaz »

Klas-Kenny>>"Sen ställa variabeln genom att kort och gott skriva ut den på displayen och trycker man på en knapp minskar du variabeln och skriver ut den igen på displayen, trycker man på andra knappen ökar du variabeln och skriver ut den på displayen igen. Inget särskilt svårt."

Precis vad jag är på jakt efter.

Jo jag har letat, tyvärr har jag dålig koll på _vad_ jag skall leta efter.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Klas-Kenny »

Själva rutinen i sig kan ju se ut bara typ så här (Förutsatt att den inte behöver köra stegmotorer eller göra något annat samtidigt, då får man ju gå lite andra vägar)

Kod: Markera allt

void changeSteps() {
	while(1) {
		lcd.setCursor(0,0);
		lcd.print(StepsVar);
		while(digitalRead(UP) == HIGH && digitalRead(DOWN) == HIGH && digitalRead(SAVE) == HIGH));
		if(digitalRead(UP) == LOW)
			StepsVar++;
		else if(digitalRead(DOWN) == LOW)
			StepsVar--;
		else {
						//Add code to save to EEPROM here
			return;
		}
		delay(100);			//debounce
	}
}
Som sagt, ska något annat göras samtidigt, som inte görs via interrupter, är det en lite taskig väg eftersom att det tar all uppmärksamhet hos processorn, och lite går att göra bättre, men som enklaste modell kan det fungera.
Där har du något att bygga på i alla fall.

Notera att UP, DOWN och SAVE är konstanter du definierar till vilka port-pinnar du använder till de olika knapparna, vilken som gör vad säger ju sig självt.
Och den här koden är gjord för att knappen ger 0 när den är nedtryckt och 1 när den är opåverkad, lätt ändrat om man vill.
Senast redigerad av Klas-Kenny 7 maj 2013, 12:59:04, redigerad totalt 1 gång.
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Jonaz »

Ahh tack. Skall kolla på detta när jag kommer hem ikväll.

Ingenting skall göras samtidigt som detta ställs in, för när larmet triggas så skall dessa värden hämtas hoch stegmotorn skall göra sitt förhoppningsvis.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino och stegmotor, välja antal steg via LCD

Inlägg av Icecap »

Om det är själva det att styra värdet upp och ner är det i grunden enkelt.

Jag antar att Ardunånting har internt EEPROM, däri kan värdet sparas.

Det "svåra" är att avkänna knapptryckningen på ett stabilt sätt (finns ju en låååång tråd om detta) men sedan får man välja: Ska det vara "1 tryck = 1 steg" eller "Auto-repeat".

Om det är ett "stort" område som stegen kan vara inom kan det bli tungt med "1 tryck = 1 steg" och då är autorepeat att föredra - vilket direkt leder till en timer-interrupt som styr avkänningen av knappar, debounce osv.

Sedan kan man göra "auto-save" om man vill. Man laddar då en räknare med ett värde för varje knapptryckning och sedan räknas denna räknare ner ett steg för varje timer-interrupt. Om den då hinner stega ner till noll OCH värdet är ändrat är det bara att aktivera "spara i EEPROM"-rutinen, då är saken biff.

När man har knappat klart går det alltså t.ex. 5 sek efter att man har släppt knappen varefter värdet sparas automatisk.

Vill man ha autorepeat är det inte svårt alls. Jag har kommit fram till att en initial vänt på 0,5 sek och en repeat-rate på 10Hz är lagom för mig. Oftast (alltid?) åstadkommer jag detta vid att ha en timer att ge interrupt med 20Hz eller mer om det behövs av andra saker.
Först debouncer jag med 2 avläsningar som ska vara lika, sedan är det bara att ha en räknare som ställs till 0,5 sek vid släppta knappar. Vid 20 Hz är det alltså 10.

Om man sedan trycker ner t.ex. '+' kommer den att läsas av två gg. innan den accepteras av interruptrutinen.
Denna accept utlöser sedan en "Det är tryckt på +"-flagga som main-loop använder till att avkänna detta.
Sedan aktiveras en bit i YTTERLIGARE en variabel som indikerar för interruptrutinen att den bit redan är reagerat på.

I mitt fall hade jag helt enkelt lagt in '+' i en variabel och main-loop hade då avkänd om den variabel var icke-noll och då reagerat på detta. När den reaktion (t.ex. "Räkna upp antal steg med 1") var klar hade jag nollat variablen, fortfarande i main-loopen.

Under tiden håller man inne '+' och räknaren räknas ner till noll. När noll nås laddas räknaren om med 2 (för 10Hz repeat-rate) och variabeln som används för att markera att knappen redan är "avhandlat" nollad, detta utlöser en ny '+'. Main-loop tar då hand om detta osv.

När man släpper knappen eller håller inne en kombination som är ogiltig återställs räknaren till 0,5 sek värdet och ingen ny knapptryckning matas in i variabeln.

Om vi utgår ifrån att det finns '-', '+' och 'OK' knappar är det ganska enkelt:
Om villkoren med bara en knapp OCH debounce avklarat är det bara att mata in vilket värde i variablen, i main-loop kan man sedan använda en switch() eller liknande:

Kod: Markera allt

switch(Incoming_Key)
  {
  case '+':
    if(Number_Of_Steps < MAX_NUMBER_OF_STEPS) Number_Of_Steps++;
    Incoming_Key = 0; // Done with that
  break;
  case '-':
    if(Number_Of_Steps) Number_Of_Steps--;
    Incoming_Key = 0; // Done with that
  break;
  case 'O':
    // Same as OK-button
    ... Save in EEPROM...
    Incoming_Key = 0; // Done with that
  break;
  }
Skriv svar