Sida 1 av 1

Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 11 september 2016, 22:37:12
av Trigger
Hej.

Försöker lära mig att programera lite, det går framåt men nu har jag kört fast ordentligt:(

Lite kort om vad jag vill göra:

Jag ska ha en steppmotor monterad på en axel, på axel sitter ett fäste som drar en avståndsmätare fram och tillbaks.
Detta värde från sensor vill jag ha på en lcd.



Nu till problemet:

Kör jag koden utan sensorkoden i, så rör sig motor som den ska, lägger jag in sensorkoden så fungerar det att läsa värdet till lcd men motor går nästan inte alls, den rör sig bara lite när jag trycker på knapparna som styr den.
Vad jag förstår så är det mycket för kortet att uppdatera därför blir det så??

Har läst om något som heter "MSTimer2" som tydligen ska göra att det ska fungera ändå, men pga att jag är nybörjare har jag inte en aning om hur jag ska få in denna i koden eller lösa problemet på annat sätt.

Är det någon här som har någon ide om hur jag kan lösa detta problem?

Tack på förhand

/David

Kod: Markera allt

#include <NewPing.h>
#include <LiquidCrystal.h>
LiquidCrystal LCD(8, 9, 4, 5, 6, 7);


#define step_pin 3    // Define pin 3 as the steps pin
#define dir_pin 2    // Define pin 2 as the direction pin
#define MS1 A1     // Define pin 5 as "MS1"
#define MS2 A2      // Define pin 4 as "MS2"
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
#define trigPin 11
#define echoPin 12




int button;
int direction;    // Variable to determine the sense of the motor
int steps = 500;      // Number of steps that you want to execute (for full steps, 200 = 1 turn)

void setup() {
  
   LCD.begin(16,2); //Starta Lcd Med 16 columner och 2 Rader
  LCD.setCursor(0,0);  //Sätt Rad Uppe Till Vänster, column 0, Rad 0
  LCD.print("    Pall 120");  //Skriv På Första Raden
   
   pinMode(trigPin, OUTPUT);
   pinMode(echoPin, INPUT);
   
   pinMode(MS1, OUTPUT);     // Configures "MS1" as output
   pinMode(MS2, OUTPUT);     // Configures "MS2" as output
   pinMode(dir_pin, OUTPUT);    // Configures "dir_pin" as output
   pinMode(step_pin, OUTPUT);    // Configures "step_pin" as output
   
  
  
   digitalWrite(MS1, LOW);      // Configures the steps division (see above)
   digitalWrite(MS2, LOW);    // Configures the steps division (see above)
   
  
}

void loop() { 
  
  
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance =(((duration/2)/29.4)*2) ;
  
  LCD.setCursor(0,1);  //Sätt Till Andra Raden
  LCD.print("                "); //Skriv Inget För Att Rensa Raden
  LCD.setCursor(0,1);   //Sätt Till Andra Raden
  LCD.print(distance); //Skriv Kod Från Sensor
  LCD.print(" cm");  //Skriv Enhet
  delay(250); //Pausa För Att Ordna Siffror
 
 
  int buttonVal = read_buttons();
  if(buttonVal == btnLEFT)
{
    digitalWrite(dir_pin, HIGH);
    digitalWrite(step_pin, HIGH);
    delay(1);
    digitalWrite(step_pin, LOW);
    delay(2);
    steps--;
}

if(buttonVal == btnRIGHT)
{
    digitalWrite(dir_pin, LOW);
    digitalWrite(step_pin, LOW);
    delay(3);
    digitalWrite(step_pin, HIGH);
    steps--;
}  
  
  
}  
int read_buttons() {
  
 int adc_key_in = analogRead(0);
 
 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
}

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 11 september 2016, 22:40:37
av Icecap
delay(250); //Pausa För Att Ordna Siffror

Den raden stoppar upp det mesta ganska duktigt.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 11 september 2016, 22:56:58
av Trigger
Tack för hjälpen!!

Det blev bättre men motorn börjar hacka vid mätning över 50cm,och tyvärr så blir det konstigt i lcd´n, ser knappt
vad det står, siffrorna "rullar" och blir väldigt mörka.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 12 september 2016, 09:42:45
av Icecap
Problemet är i grunden att din struktur i programmet är fel.

* Man kan bara skriva till displayen med en viss hastighet.
* Motorn väntar inte gärna på stegpulser.

Alltså måste du hitta ett sätt att bara skriva ut med en begränsat hastighet samtidig som motorn kan få pulser som du vill.

Detta kan nog ses som en del mer avancerat programmering och då jag avskyr Arduino varken kan eller vill jag ge råd.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 12 september 2016, 09:53:44
av Jan Almqvist
Den här raden är nog lite giftig.

Kod: Markera allt

duration = pulseIn(echoPin, HIGH);
Jag tror att du bör skicka med en maxtid i den tredje parametern.

https://www.arduino.cc/en/Reference/PulseIn



----------------------------------------------------------
http://www.idea-teknik.com/hmi_droid.html
Används i mer än 40 länder på 5 kontinenter.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 12 september 2016, 10:53:20
av slft
jag skulle nog gjort så att jag plockade ut lcd-skrivningen ur huvudloopen och gjort den till en egen funktion

och i huvudloopen kollat om en förändring skett och i så fall skriva ut den
pseudo kod:

if distance<>olddistance {
olddistance==distance
printlcd(distance)
}

varken syntax eller programmering är min starka sida men detta kanske kan ge dig (eller någon annan) en ide till lösningen

//Ola

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 12 september 2016, 11:33:01
av SeniorLemuren
Det hjälper föga. Den kommer ju då att hoppa ut och skriva vid varje puls som går till motorn. Bättre att köra motorn i en avbrottsrutin som alltid hanterar motorn först tills den har nått sin nya position och därefter uppdatera displayen.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 14 september 2016, 15:36:31
av Trigger
Jag vill tacka för all input och hjälp jag fått, uppskattas verkligen!!

Det jag gjorde var att minska mellanrummet "LCD.print(" "); //Skriv Inget För Att Rensa Raden
vilket gjorde att motorn gick bättre, hur eller varför vet jag inte men det fungerade i alla fall:).

STORT TACK!!

/David

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 14 september 2016, 15:59:20
av Icecap
Trigger: Hur du än gör är du på fel spår faktisk.

Det primära är att få motorn att köra rätt och sedan får displayen "klara sig bäst den kan" så att säga.

Detta är just vad som får mig att se ner på Arduino som läromedel - men inte på dig.

Nåväl, hade jag varit i samma situation hade jag dels skippat allt detta med de tillhörande LCD-rutiner, det går nämligen alldeles utmärkt att lösa dom på egen hand, jag har gjort det riktigt många gångar.

Nåväl, det viktiga är att motorn kör stabilt, detta vid att använda en timer-interrupt till att ge pulser med stabil hastighet. Ja, sånt har jag redan löst på PIC i ett "lära dig att programmera"-lek-program.

Sedan hade jag skrivit data till LCD i minnet och för varje interrupt som jag (kanske) stegar motorn kommer jag att skriva ut ett tecken åt gången.

Detta betyder att motorn är det enda viktiga och resten får hänga på bäst det kan - samt att hela strukturen blir mycket annorlunda och definitivt inget man "bara hoppar på" som nybörjare. Å andra sidan blir det skitbra.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 14 september 2016, 18:08:31
av Trigger
Jag är med på vad du menar, men med 4veckors erfarenhet så får detta duga till mig just nu.

När jag lärt mig mer så får jag gå tillbaks och göra om saker till det bättre.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 14 september 2016, 20:14:51
av SeniorLemuren
Jag kör stegmotorer i styrsystemet till båtmotorer med interupt och skriver ut pådragen procent på en LCD. Jag har programmerat det för en PIC18FXXX men du kanske kan förstå hur det funkar och överföra det till Arduino.

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 14 september 2016, 21:58:47
av SeniorLemuren
Här har du ett komplett bibliotek för drivning av stegmotorer i Arduino. Innehåller exempel för drivning av 2 st stegmotorer, acceleration, retardation m.m.
AccelStepper-1.53.zip

Re: Nybörjar hjälp med Arduino, Stepper och Lcd Shield

Postat: 14 september 2016, 22:07:00
av Trigger
Tack så mycket, ska ta en titt på det och se om jag kan försöka förstå de.