Arduino MP3Shield + Stepper motor

Hallo allemaal,

Voor een project moet ik een stepper motor laten draaien, maar daarvoor moet er een geluid worden afgespeeld.

Echter, nu is mijn probleem dat als ik het geluid afspeel dat mijn motor dan gaat trillen en daarna niets meer doet.

Dit is mijn code:

if(buttonState == HIGH)
{
playSong(2);
rotateDeg(360, .5);

}

Code voor roteren motor:

void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(dirpin,dir);

int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) * 70;

for(int i=0; i < steps; i++){
digitalWrite(steppin, HIGH);
delayMicroseconds(usDelay);

digitalWrite(steppin, LOW);
delayMicroseconds(usDelay);
}
}

Code voor MP3 bestanden:

#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>

SdFat sd;
SFEMP3Shield MP3player;

void playSong(int song){

Serial.begin(9600);

//start the shield
sd.begin(SD_SEL, SPI_HALF_SPEED);
MP3player.begin();

MP3player.playTrack(song);
}

Op StackOverflow hadden ze het over de delay van de motor, maar daar werd ik helaas niet veel wijzer uit.

Hopelijk kunnen jullie mij helpen.

Alvast bedankt,

NiSh

Hoi NiSh1995, en welkom.

Je gebruikt een motorshield en een MP3 shield vermoed ik.
Je hebt de quote knop gebruikt in plaats van de code knop (met de # erop) gebruikt, en je hebt delen van je code laten zien en niet je hele code.
Omdat je niet de hele code laat zien, kan ik niet zien of er een conflict zou kunnen zijn met de pinnen die in gebruik zijn, maar dat ligt wel erg voor de hand.
Je gebruikt variabelen waarvan de definitie onbekend is.

Vertel welke shields (en welk Arduino board) je gebruikt en laat de hele code zien, anders word helpen erg lastig.

Hallo,

Bedankt voor jouw reactie.

Ik wist niet dat de code in een code block moest, ik had in de Arduino IDE op kopiëren voor forum geklikt.

Ik gebruik een Arduino UNO en een EasyDriver Stepper Motor Driver van SparkFun voor motorsturing (EasyDriver - Stepper Motor Driver - ROB-12779 - SparkFun Electronics)
Voor het afspelen van MP3 bestanden gebruik ik een MP3 Player Shield ook van SparkFun (SparkFun MP3 Player Shield - DEV-12660 - SparkFun Electronics)

Maar goed, dat ter zijde, hier mijn code:

1e tabblad:

int sensor = A0;
int led1 = A1;
int led2 = A2;
int led3 = A3;
int led4 = A4;
int led5 = A5;
int button = 12;
int dirpin = 10;
int steppin = 11;

int buttonState;
int sensorValue;

void setup()
{
  Serial.begin(9600);

  pinMode(sensor, INPUT);
  pinMode(button, INPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(dirpin, OUTPUT);
  pinMode(steppin, OUTPUT);
}
void loop()
{
  buttonState = digitalRead(button);
  sensorValue = analogRead(sensor);
  Serial.print("button: ");
  Serial.println(buttonState);
  Serial.print("sensor: ");
  Serial.println(sensorValue);
  delay(10);
//-----------------------------------HET GAAT OM DIT GEDEELTE
  if(buttonState == HIGH)
  {
    playSong(2);
    rotateDeg(360, .5);

  }
//-----------------------------------HET GAAT OM DIT GEDEELTE

  if (sensorValue > 515 && sensorValue < 517)
  {
    setLed();
    playSong(4);
  }

  if(sensorValue > 517 && sensorValue < 519)
  {
    setLed();
    playSong(5);
  } 

  if(sensorValue > 519 && sensorValue < 521)
  {
    playSong(6);
  }

  if(sensorValue > 521 && sensorValue < 523)
  {  
    setLed();
    playSong(7);
  }

  if(sensorValue > 523 && sensorValue < 525)
  {
    setLed();
    playSong(5);
  }  

  if(sensorValue > 527 && sensorValue < 529)
  {
    setLed();
    playSong(6);
  }
  if(sensorValue > 529 && sensorValue < 531)
  {
    setLed();
    playSong(7);
  }

  if(sensorValue > 531 && sensorValue < 533)
  {  
    setLed();
    playSong(8);
  }

  if(sensorValue > 535 && sensorValue < 537)
  {
    setLed();
    playSong(9);
  }  

  if(sensorValue > 537 && sensorValue < 539)
  {
    setLed();
    playSong(10);
  }
}

MP3 afspelen tabblad:

#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h> 
#include <SFEMP3Shield.h>

SdFat sd;
SFEMP3Shield MP3player;

void playSong(int song){

  Serial.begin(9600);

  //start the shield
  sd.begin(SD_SEL, SPI_HALF_SPEED);
  MP3player.begin();

  MP3player.playTrack(song);
}

motor roteren tabblad:

void rotateDeg(float deg, float speed){ 
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(dirpin,dir); 

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){ 
    digitalWrite(steppin, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(steppin, LOW); 
    delayMicroseconds(usDelay); 
  } 
}

Willekeurig LED'jes aan en uit laten gaan:

int state = random(0, 2);

void setLed()
{
  state = random(0, 2);
  digitalWrite(led1, state);
  state = random(0, 2);
  digitalWrite(led2, state);
  state = random(0, 2);
  digitalWrite(led3, state);
  state = random(0, 2);
  digitalWrite(led4, state);
  state = random(0, 2);
  digitalWrite(led5, state);
}

Het gaat om het eerste if-statement. De LEDjes aan en uit zetten gaat wel goed, ook in combinatie met het geluid. Alleen als ik geluid afspeel, als de motor is aangesloten, gaat mijn motor trillen en doet daarna niets meer.

Hopelijk hebben jullie zo voldoende informatie.

Bedankt alvast,

NiSh

Je laat je motor 360 graden draaien, met snelheid 0.5.
De functie voor het besturen van je motor doet dan dit:

float usDelay = (1/speed) * 70;
    delayMicroseconds(usDelay);

Daar word eerst de 0.5 omgerekend naar 2, en vervolgens vermenigvuldigd naar 140 en dat word gebruikt in µ seconde.
Dus de stappen voor je motor volgens elkaar op na 0,00014 seconde.
Das best snel.
Wat als je de motor laat draaien met 360,500 ?
Gewoon even om te proberen.
Das 1000 keer zo langzaam en dus volgen de stappen na 0,14 seconden (vermoedelijk wel weer een beetje overdreven langzaam, maar dan heb je in ieder geval iets geprobeerd).
Dat is exact wat "StackOverflow" je ook adviseerde ("werd ik niet veel wijzer van" word ik niets wijzer van want het vertelt me niet of je iets geprobeerd hebt of niet).

De stappen naar je motor kunnen wel heel snel op elkaar volgen, maar als je snel wil draaien, moet je eerst langzamer starten en dan versnellen.
Dat ligt uiteraard ook aan de belasting van je motor.

Hallo,

Ik heb het getest, maar dan draait de motor wel erg langzaam.

Buiten dat schudt de motor alsnog als er een MP3 wordt afgespeeld, ookal hoeft hij niet te draaien.

Op StackOverflow zeiden dat ik anders met interrupts moest gaan werken, maar ik weet niet hoe dat zou moeten. Op internet heb ik ook gezocht, maar kon ik ook niet iets vinden.

Hopelijk kunnen jullie mij helpen, of misschien een uitleg geven van interrupts.

Bedankt alvast,

NiSh

Nou dan draait ie dus wel.
Hoe je m op een door jou gewenste snelheid kan krijgen laat ik graag aan jouw fantasie over, das niet heel moeilijk.

Die motorshield is geen shield, de MP3 speler wel.
Je hebt het motording gekoppeld met pin 10 voor de richting, en met pin 11 voor de step.
Die MP3 speler gebruikt heel veel pinnen.
Pin 11 van je Arduino is ook de MOSI pin voor SPI communicatie, en word gebruikt voor de SD kaartlezer.
Dit is dus je probleem.

De MP3 speler heeft alleen digitale pins 5 en 10 over, de rest eist dat ding op.

Voor zover ik kan zien, gebruik jij pin D5 nog niet.
Dus sluit je step aansluiting op D5 aan en stel dat ook zo in in je sketch.
Dan blijft je motor stil als je dat wil, en draait ie ook als je dat wil.

Voortaan moet je heel goed opletten welke pinnen je gebruikt, en welke niet.
Dat maakt sparkfun je ook heel gemakkelijk want je kunt de schema's van hun producten downloaden en dus bestuderen.

Als je meer pinnen wil gebruiken, zul je functies van je MP3 speler moeten opgeven.
Dan kun je de soldeerjumpers SJ1 en SJ2 niet doorverbinden en moet je zorgen dat de betreffende functies ook niet door je software worden aangesproken.
Dan krijg je D3 en D4 tot je beschikking voor andere functies.
Heb je meer nodig, moet je gaan multiplexen of moet je gaan kijken naar een andere variant van de Arduino.

Ik denk dat ik je hiermee al meer dan voldoende heb geholpen, veel succes ermee.

En, heb je dit al werkend naar je zin ?