Ny på arduino.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Tommy_Naseem
Inlägg: 274
Blev medlem: 4 januari 2013, 14:40:06
Ort: Tenhult

Ny på arduino.

Inlägg av Tommy_Naseem »

Hejsan.

Sitter och experimenterar med en arduino som i framtiden skall styra en ACC i en bil.

Sitter just nu och kliar mig i huvudet gällande en exempel kod. (Inklistrad nedan.)
https://el.st/stegmotor.html
Jag är med på hur själva tilldelningen av pinnar fungerar och att man läser av en potentiometer i detta fallet på en analog ingång.

Men om man skulle vilja justera stegningen så den går dubbelt så fort. (Använder orginal spjällmotorer från en bil som jag lyckats köra med min Arduino. men det går ganska sakta.)
Jag tror detta ligger under "void setupInterrupt(int potValue)" men jag förstår inte hur det fungerar och vad de olika delarna gör



#define HALFSTEP 1
#define FULLSTEP 2

int stepMode = FULLSTEP;

int POT = 1; // Potentiometer (fart)
int IN1 = 8; // Blå - 28BYJ48 pin 1
int IN2 = 9; // Rosa - 28BYJ48 pin 2
int IN3 = 10; // Gul - 28BYJ48 pin 3
int IN4 = 11; // Orange - 28BYJ48 pin 4

int halfStep[8] = {
B01000,
B01100,
B00100,
B00110,
B00010,
B00011,
B00001,
B01001};

int fullStep[4] = {
B01000,
B00100,
B00010,
B00001};

int phase = 0;
int rotate = 1;
int potValue;
int lastPotValue;

void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);

potValue = analogRead(POT);
setupInterrupt(potValue);
}

void setupInterrupt(int potValue)
{
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 16000 - abs(potValue-512)*30;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A);
sei();
}

ISR(TIMER1_COMPA_vect)
{
setOutput(phase);
phase += rotate;

if(stepMode == HALFSTEP)
{
phase%=8;
if(phase<0)
phase = 7;
}
if(stepMode == FULLSTEP)
{
phase%=4;
if(phase<0)
phase = 3;
}

potValue = analogRead(POT);
if(abs(potValue - lastPotValue) > 3)
{
Serial.println(potValue);
if(potValue>512)
rotate = 1;
else
rotate = -1;
lastPotValue = potValue;
setupInterrupt(potValue);
}
}

void setOutput(int out)
{
if(stepMode == HALFSTEP)
{
digitalWrite(IN1, bitRead(halfStep[out], 0));
digitalWrite(IN2, bitRead(halfStep[out], 1));
digitalWrite(IN3, bitRead(halfStep[out], 2));
digitalWrite(IN4, bitRead(halfStep[out], 3));
}
if(stepMode == FULLSTEP)
{
digitalWrite(IN1, bitRead(fullStep[out], 0));
digitalWrite(IN2, bitRead(fullStep[out], 1));
digitalWrite(IN3, bitRead(fullStep[out], 2));
digitalWrite(IN4, bitRead(fullStep[out], 3));
}
}

void loop()
{

}
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Ny på arduino.

Inlägg av snigelen »

Timern räknar tills den når värdet av OCR1A, ger ett interrupt och börjar om. Så du kan ju prova att ändra raden där värdet sätts till

Kod: Markera allt

 OCR1A = (16000 - abs(potValue-512)*30) / 2; 
så borde det gå dubbelt så fort.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: Ny på arduino.

Inlägg av agehall »

Vänta nu - du försöker inte drive stegmotorn direkt från din Arduino hoppas jag, eller??

Skaffa en steppar driver (finns färdiga på kort hos tex Kjell&Co) så blir ditt liv enklare.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Ny på arduino.

Inlägg av adent »

Välkommen till Makers Jönköping på kvarteret Ödlan vid södra munksjön på tisdagar från ca 17:30 så kan vi nog hjälpa till annars!

MVH: Mikael
Användarvisningsbild
Gorgus
Inlägg: 1997
Blev medlem: 24 april 2006, 22:42:42
Ort: Eskilstuna
Kontakt:

Re: Ny på arduino.

Inlägg av Gorgus »

Om det är 28BYJ48 du använder så tänk också på att de redan är nedväxlade med ungefär 1/64.
Tommy_Naseem
Inlägg: 274
Blev medlem: 4 januari 2013, 14:40:06
Ort: Tenhult

Re: Ny på arduino.

Inlägg av Tommy_Naseem »

Tack för alla svar.
Jag satt och labbade lite och lyckades få upp ganska hygglig fart på spjällrörelserna.
Givetvis använder jag en stegmotordrivare :-)

Jag som är mera van vid den väldigt överskådliga PLC programmeringen som jag pysslat med tidigare, Så skulle jag vilja trycka ut viss data seriellt för att se hur det beter sig och vad jag gör rätt och fel
I programmet ovan kunde jag läsa ut ingången med ett värde mellan 0-1024.
Kan man på enkla sätt välja olika parametrar som skall printas ut seriellt?

Eller finns det andra bra "debug mode" man kan använda sig av?
Tänker även för framtiden när skiten börjar strula och man vill kunna läsa ut vilken givare som har gett sig.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Ny på arduino.

Inlägg av Jan Almqvist »

Varför inte använda en HMI-app t.ex. HMI Droid och Modbus kommunikation?
.

.
Appen finns även för iOS ("Odrid HMI") men då tyvärr utan Bluetooth SPP eftersom support för SPP (Serial Port Profile) saknas i iOS.
Det finns såklart andra HMI-appar också men sällan finns de kvar någon längre tid.
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Ny på arduino.

Inlägg av FormerMazda »

Det finns inget sätt att debugga koden eller "gå online" som med en PLC (kanske som en wago.. ;) ), utan man får bygga in det själv.
Enklast är ju att använda serial.print på de värden som är intressanta, precis som du redan har i ditt program.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Ny på arduino.

Inlägg av Klas-Kenny »

FormerMazda: Eller lämna den urusla Arduino -IDE'n till förmån för en vettig med stöd för riktig debugger. :)
hummel
Inlägg: 2259
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Ny på arduino.

Inlägg av hummel »

Arduino IDE har nu stöd för riktig debugger.
https://docs.arduino.cc/software/ide-v2 ... 2-debugger
Tommy_Naseem
Inlägg: 274
Blev medlem: 4 januari 2013, 14:40:06
Ort: Tenhult

Re: Ny på arduino.

Inlägg av Tommy_Naseem »

FormerMazda.
Känns som du vet vem jag är när du gjorde en Wago referens.
Kan det vara som så att vi jobbar på samma Firma?
Skriv svar